Advertisement
Guest User

Untitled

a guest
Mar 20th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.38 KB | None | 0 0
  1. #/usr/local/bin/python3
  2.  
  3. from collections import defaultdict
  4.  
  5. lines = []
  6. keys = []
  7. digits = []
  8. orderings = defaultdict(set)
  9.  
  10. def recur_orderings(t, d, accum):
  11.     if d not in t:
  12.         return accum
  13.  
  14.     accum.update(t[d])
  15.  
  16.     for i in t[d]:
  17.         recur_orderings(t, i, accum)
  18.  
  19.     return accum
  20.  
  21. with open('keylog.txt') as keylog_file:
  22.     lines = keylog_file.readlines()
  23.  
  24. for l in lines:
  25.     keys.append([int(i) for i in (l[0], l[1], l[2])])
  26.  
  27. for k in keys:
  28.     orderings[k[0]].add(k[1])
  29.     orderings[k[1]].add(k[2])
  30.  
  31. # digit -> set of all digits observed to follow after it
  32. orderings_deep = {
  33.     i:list(recur_orderings(orderings, i, set()))
  34.     for i in orderings.keys()
  35. }
  36.  
  37. # count of unique digits that follow a digit -> the digit
  38. ordering_lengths = {
  39.  len(v):k
  40.  for k,v in orderings_deep.items()
  41. }
  42.  
  43. # the digit that is observed to have no other digits follow it
  44. leaders = set(orderings.keys())
  45. followers = set()
  46. followers.update(*orderings.values())
  47. last = followers.difference(leaders).pop()
  48.  
  49. for k in reversed(sorted(ordering_lengths.keys())):
  50.     digits.append(ordering_lengths[k])
  51.  
  52. digits.append(last)
  53.  
  54. # verify that the digits deduced satisfies the observed keys
  55. run_test = True
  56. if run_test:
  57.     idx = {v:k for k,v in enumerate(digits)}
  58.     for k1, k2, k3 in keys:
  59.         assert(idx[k1] < idx[k2] < idx[k3])
  60.  
  61. print(*digits, sep='')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement