Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import random
- import string
- from math import comb, log
- from timeit import default_timer as timer
- TEST = False
- def main():
- for case in range(1,6):
- run(10**case)
- def run(cases):
- coupons = CouponGenerator(cases)
- coupons.generate()
- coupons.array.sort()
- start = timer()
- codes = coupons.array
- tablesize = round(10**5+7)
- variants = tableVariants(codes)
- #printTable(variants)
- hashesTable = hashes(variants, tablesize)
- #printTable(hashesTable)
- hashTAble = hashTable(hashesTable, codes, tablesize)
- #printTable(hashTAble)
- searchForPairs(hashTAble, tablesize)
- end = timer()
- print("Took {} seconds for the {} cases.".format(end-start, cases))
- def searchForPairs(table, tablesize):
- checkedHashes = []
- hammingPairs = 0
- for i in range(len(table)):
- for j in range(len(table[0])):
- if len(table[i][j]) > 1:
- tempRefHash = [calcHash(code, tablesize) for code in table[i][j]]
- if all(item in checkedHashes for item in tempRefHash) == False:
- hammingPairs += comb(len(table[i][j]), 2)
- checkedHashes.append(tempRefHash)
- print("There are {} hamming pairs.".format(hammingPairs))
- def hashTable(hashes, codes, tablesize):
- table = [[[] for _ in range(len(codes[0]))] for _ in range(tablesize)]
- for i in range(len(codes)):
- for j in range(len(codes[0])):
- if codes[i] in table[hashes[i][j]][j]:
- continue
- table[hashes[i][j]][j].append(codes[i])
- return table
- def calcHash(code, tablesize):
- constant = 137
- codeNum = str2char(code)
- lastHashValue = 0
- for character in codeNum:
- if character == "*":
- continue
- lastHashValue = (ord(character) + constant * lastHashValue) % tablesize
- return lastHashValue
- def hashes(variants, tablesize):
- table = [[[] for _ in range(len(variants[0]))] for _ in range(len(variants))]
- for i in range(len(variants)):
- for j in range(len(variants[0])):
- table[i][j] = calcHash(variants[i][j], tablesize)
- return table
- def tableVariants(codes):
- table = [[[] for _ in range(len(codes[0]))] for _ in range(len(codes))]
- for h in range(len(codes)):
- string = codes[h]
- for i in range(0, len(string)):
- table[h][i] = string[0:i] + "*" + string[i+1:len(string)]
- return table
- def printTable(table):
- for row in table:
- for col in row:
- print(col, end="\t")
- print("\n")
- class CouponGenerator:
- def __init__(self, n):
- self.array = []
- self.n = n
- def printArray(self):
- for i in self.array:
- print(i)
- def generate(self):
- if TEST:
- self.array = ['WELC1234OTHE', 'IEEE1234MEXZ', 'AAAA0000ACAD', 'AAAA0000ACAF', 'AAAA0000ACAB', 'AAAA0000ABAB']
- else:
- for _ in range(self.n):
- self.array.append(''.join((''.join(random.SystemRandom().choice(string.ascii_uppercase) for _ in range(4)),''.join(random.SystemRandom().choice(string.digits) for _ in range(4)),''.join(random.SystemRandom().choice(string.ascii_uppercase) for _ in range(4)))))
- print(self.n, "coupons generated.")
- def str2num(code):
- '''Δέχεται ως όρισμα μία ακολουθία δεδομένων και την μετατρέπει
- σε λίστα τύπου ακέραιου'''
- numCode = []
- for character in code:
- if ord(character) >=65 and ord(character) <= 90:
- numCode.append(ord(character)-54)
- else:
- if character == "*":
- continue
- numCode.append(int(character))
- return numCode
- def str2char(code):
- '''Δέχεται ως όρισμα μία ακολουθία δεδομένων και την μετατρέπει
- σε λίστα τύπου χαρακτήρα'''
- numCode = []
- for character in code:
- numCode.append(character)
- return numCode
- def nextPrime(n):
- notPrime = []
- isPrime = []
- for i in range (n+1, n+200):
- notPrime.append(i)
- for j in notPrime:
- prime = True
- for x in range(2, j-1):
- if j % x == 0:
- prime = False
- break
- if prime:
- isPrime.append(j)
- return min(isPrime)
- if __name__ == "__main__":
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement