problem79.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #!/usr/bin/env python
  2. from itertools import permutations
  3. codes = [319, 680, 180, 690, 129, 620, 762, 689, 762, 318, 368, 710, 720, 710,
  4. 629, 168, 160, 689, 716, 731, 736, 729, 316, 729, 729, 710, 769, 290,
  5. 719, 680, 318, 389, 162, 289, 162, 718, 729, 319, 790, 680, 890, 362,
  6. 319, 760, 316, 729, 380, 319, 728, 716]
  7. def indices(partial):
  8. ind = []
  9. start = 0
  10. for c in partial:
  11. index = passcode[start:].find(c)
  12. if index == -1:
  13. return []
  14. ind.append(index + start)
  15. start = index + 1
  16. return ind
  17. def match(code):
  18. partials = (code, code[1:], code[:2], code[::2], code[0], code[1], code[2])
  19. for i, partial in enumerate(partials):
  20. ind = indices(partial)
  21. if ind:
  22. return partial, i, ind
  23. return None, None, None
  24. #codes.sort()
  25. codes = map(str, set(codes))
  26. passcode = codes.pop(0)
  27. print passcode
  28. while len(codes):
  29. possibilities = [(0, -1, [])]
  30. for index, code in enumerate(codes):
  31. partial, i, ind = match(code)
  32. if ind:
  33. #print code, partial, ind
  34. possibilities.append((index, i, ind, partial))
  35. possibilities.sort(lambda a, b: cmp(len(a[2]), len(b[2])))
  36. #print possibilities
  37. index, i, ind, partial = possibilities[-1]
  38. code = codes.pop(index)
  39. if i == 1:
  40. passcode = code[0] + passcode
  41. elif i == 2:
  42. passcode += code[2]
  43. elif i == 3:
  44. passcode = passcode[:ind[0]] + code[1] + passcode[ind[0]:]
  45. elif i == 4:
  46. passcode += code[1:]
  47. elif i == 5:
  48. passcode = code[0] + passcode + code[2]
  49. elif i == 6:
  50. passcode = code[:2] + passcode
  51. elif i == -1:
  52. passcode += code
  53. print code, partial, passcode
  54. #print len(passcode), len(codes) * 3, passcode
  55. #print passcode