fork download
  1. from itertools import combinations
  2. from collections import Counter
  3. from scipy.stats import entropy
  4.  
  5. alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  6.  
  7. oldDice16 = ['AACIOT', 'ABILTY', 'ABJMOQ', 'ACDEMP', 'ACELRS', 'ADENVZ', 'AHMORS', 'BIFORX', 'DENOSW', 'DKNOTU', 'EEFHIY', 'EGKLUY', 'EGINTV', 'EHINPS', 'ELPSTU', 'GILRUW']
  8. oldDistribution = Counter(''.join(oldDice16))
  9. newDice16 = ['AAEEGN', 'ABBJOO', 'ACHOPS', 'AFFKPS', 'AOOTTW', 'CIMOTU', 'DEILRX', 'DELRVY', 'DISTTY', 'EEGHNW', 'EEINSU', 'EHRTVW', 'EIOSST', 'ELRTTY', 'HIMNUQ', 'HLNNRZ']
  10. newDistribution = Counter(''.join(newDice16))
  11. dice25 = ['AAAFRS', 'AAEEEE', 'AAFIRS', 'ADENNN', 'AEEEEM', 'AEEGMU', 'AEGMNN', 'AFIRSY', 'BJKQXZ', 'CCENST', 'CEIILT', 'CEILPT', 'CEIPST', 'DDHNOT', 'DHHLOR', 'DHLNOR', 'DHLNOR', 'EIIITT', 'EMOTTT', 'ENSSSU', 'FIPRSY', 'GORRVW', 'IPRRRY', 'NOOTUW', 'OOOTTU']
  12.  
  13. def manhattan(distributionA, distributionB):
  14. score = 0
  15. for letter in alphabet:
  16. score += abs(distributionA[letter] - distributionB[letter])
  17. return score
  18.  
  19. def kullbackLeibler(distributionA, distributionB):
  20. pk = []
  21. qk = []
  22. for letter in alphabet:
  23. pk.append(distributionA[letter] / (16 * 6.0))
  24. qk.append(distributionB[letter] / (16 * 6.0))
  25. return entropy(pk, qk)
  26.  
  27. metrics = {'manhattan': manhattan, 'kullbackLeibler': kullbackLeibler}
  28. comparisonDistributions = {'old dice': oldDistribution, 'new dice': newDistribution}
  29.  
  30. for metricName, metric in metrics.items():
  31. for dice16Name, dice16Distribution in comparisonDistributions.items():
  32. bestSelection = None
  33. bestDistance = 16*6
  34. for selection in combinations(dice25, 16):
  35. allLetters = ''.join(selection)
  36. distribution = Counter(allLetters)
  37. score = metric(distribution, dice16Distribution)
  38. if score < bestDistance:
  39. bestSelection, bestDistance = selection, score
  40. print metricName, dice16Name, bestSelection, bestDistance
  41.  
Time limit exceeded #stdin #stdout 5s 46888KB
stdin
Standard input is empty
stdout
Standard output is empty