Skip to content

Latest commit

 

History

History
155 lines (132 loc) · 8.45 KB

README.md

File metadata and controls

155 lines (132 loc) · 8.45 KB

Cryptarithmetic Solver

Verbal arithmetic, also known as alphametics, cryptarithmetic, cryptarithm or word addition, is a type of mathematical game consisting of a mathematical equation among unknown numbers, whose digits are represented by letters. The goal is to identify the value of each letter. The name can be extended to puzzles that use non-alphabetic symbols instead of letters.

SEND + MORE = MONEY

https://en.wikipedia.org/wiki/Verbal_arithmetic

This is a general purpose solver that can handle addition, subtraction, multiplication, integer division and raising to powers.

This implementation uses the z3 constraint satisfaction solver

Kaggle Version:

Cryptarithmetic Addition and Subtraction

XY - X == YX
{'XY': 98, 'X': 9, 'YX': 89}
== 1 solutions found in 0.0s ==

TWO + TWO == FOUR
{'TWO': 734, 'FOUR': 1468}
{'TWO': 846, 'FOUR': 1692}
{'TWO': 765, 'FOUR': 1530}
{'TWO': 867, 'FOUR': 1734}
{'TWO': 836, 'FOUR': 1672}
{'TWO': 938, 'FOUR': 1876}
{'TWO': 928, 'FOUR': 1856}
== 7 solutions found in 3.1s ==

EIGHT - FOUR == FOUR
{'EIGHT': 15864, 'FOUR': 7932}
{'EIGHT': 10476, 'FOUR': 5238}
{'EIGHT': 10784, 'FOUR': 5392}
{'EIGHT': 10764, 'FOUR': 5382}
== 4 solutions found in 2.7s ==

Cryptarithmetic Multiplication

ONE * TWO == THREE
{'ONE': 105, 'TWO': 271, 'THREE': 28455}
== 1 solutions found in 2.6s ==

X / Y == 2
{'X': 2, 'Y': 1}
{'X': 4, 'Y': 2}
{'X': 5, 'Y': 2}
{'X': 6, 'Y': 3}
{'X': 7, 'Y': 3}
{'X': 8, 'Y': 3}
{'X': 8, 'Y': 4}
{'X': 9, 'Y': 4}
== 8 solutions found in 0.4s ==

Y == A * X + B
{'Y': 7, 'A': 3, 'X': 2, 'B': 1}
{'Y': 5, 'A': 2, 'X': 1, 'B': 3}
{'Y': 9, 'A': 1, 'X': 7, 'B': 2}
{'Y': 6, 'A': 1, 'X': 4, 'B': 2}
{'Y': 7, 'A': 1, 'X': 5, 'B': 2}
{'Y': 8, 'A': 1, 'X': 6, 'B': 2}
{'Y': 5, 'A': 1, 'X': 3, 'B': 2}
{'Y': 9, 'A': 4, 'X': 2, 'B': 1}
{'Y': 8, 'A': 6, 'X': 1, 'B': 2}
{'Y': 7, 'A': 5, 'X': 1, 'B': 2}
{'Y': 9, 'A': 7, 'X': 1, 'B': 2}
{'Y': 6, 'A': 4, 'X': 1, 'B': 2}
{'Y': 5, 'A': 3, 'X': 1, 'B': 2}
{'Y': 7, 'A': 2, 'X': 3, 'B': 1}
{'Y': 8, 'A': 1, 'X': 3, 'B': 5}
{'Y': 7, 'A': 1, 'X': 3, 'B': 4}
{'Y': 7, 'A': 1, 'X': 4, 'B': 3}
{'Y': 8, 'A': 1, 'X': 5, 'B': 3}
{'Y': 9, 'A': 1, 'X': 5, 'B': 4}
{'Y': 9, 'A': 1, 'X': 4, 'B': 5}
{'Y': 9, 'A': 1, 'X': 6, 'B': 3}
{'Y': 9, 'A': 1, 'X': 2, 'B': 7}
{'Y': 9, 'A': 1, 'X': 3, 'B': 6}
{'Y': 8, 'A': 1, 'X': 2, 'B': 6}
{'Y': 6, 'A': 1, 'X': 2, 'B': 4}
{'Y': 7, 'A': 1, 'X': 2, 'B': 5}
{'Y': 5, 'A': 1, 'X': 2, 'B': 3}
{'Y': 6, 'A': 2, 'X': 1, 'B': 4}
{'Y': 7, 'A': 2, 'X': 1, 'B': 5}
{'Y': 8, 'A': 5, 'X': 1, 'B': 3}
{'Y': 7, 'A': 4, 'X': 1, 'B': 3}
{'Y': 9, 'A': 6, 'X': 1, 'B': 3}
{'Y': 9, 'A': 3, 'X': 1, 'B': 6}
{'Y': 9, 'A': 2, 'X': 1, 'B': 7}
{'Y': 9, 'A': 5, 'X': 1, 'B': 4}
{'Y': 9, 'A': 4, 'X': 1, 'B': 5}
{'Y': 8, 'A': 2, 'X': 1, 'B': 6}
{'Y': 8, 'A': 3, 'X': 1, 'B': 5}
{'Y': 7, 'A': 3, 'X': 1, 'B': 4}
{'Y': 9, 'A': 2, 'X': 4, 'B': 1}
== 40 solutions found in 0.9s ==

( FOUR - TWO ) * ( NINE - ONE ) + TWO == EIGHTEEN
{'FOUR': 7297, 'TWO': 612, 'NINE': 2521, 'ONE': 221, 'EIGHTEEN': 15376112}
{'FOUR': 1904, 'TWO': 119, 'NINE': 9591, 'ONE': 991, 'EIGHTEEN': 15351119}
{'FOUR': 1974, 'TWO': 619, 'NINE': 9091, 'ONE': 991, 'EIGHTEEN': 10976119}
== 3 solutions found in 3228.3s ==

Cryptarithmetic Powers

A**2 + B**2 == C**2
{'A': 3, 'B': 4, 'C': 5}
{'A': 4, 'B': 3, 'C': 5}
== 2 solutions found in 0.7s ==

A**2 + B**2 == CD**2
== 0 solutions found in 3.2s ==

Cryptarithmetic Challenges

WHAT + WAS + THY == CAUSE
{'WHAT': 9206, 'WAS': 903, 'THY': 625, 'CAUSE': 10734}
== 1 solutions found in 1.4s ==

HIS + HORSE + IS == SLAIN
{'HIS': 354, 'HORSE': 39748, 'IS': 54, 'SLAIN': 40156}
== 1 solutions found in 1.1s ==

HERE + SHE == COMES
{'HERE': 9454, 'SHE': 894, 'COMES': 10348}
== 1 solutions found in 0.3s ==

FOR + LACK + OF == TREAD
{'FOR': 540, 'LACK': 9678, 'OF': 45, 'TREAD': 10263}
== 1 solutions found in 2.4s ==

I + WILL + PAY + THE == THEFT
{'I': 8, 'WILL': 9833, 'PAY': 526, 'THE': 104, 'THEFT': 10471}
== 1 solutions found in 2.2s ==

TEN + HERONS + REST + NEAR + NORTH + SEA + SHORE + AS + TAN + TERNS + SOAR + TO + ENTER + THERE + AS + HERONS + NEST + ON + STONES + AT + SHORE + THREE + STARS + ARE + SEEN + TERN + SNORES + ARE + NEAR == SEVVOTH
{'TEN': 957, 'HERONS': 356471, 'REST': 6519, 'NEAR': 7526, 'NORTH': 74693, 'SEA': 152, 'SHORE': 13465, 'AS': 21, 'TAN': 927, 'TERNS': 95671, 'SOAR': 1426, 'TO': 94, 'ENTER': 57956, 'THERE': 93565, 'NEST': 7519, 'ON': 47, 'STONES': 194751, 'AT': 29, 'THREE': 93655, 'STARS': 19261, 'ARE': 265, 'SEEN': 1557, 'TERN': 9567, 'SNORES': 174651, 'SEVVOTH': 1588493}
== 1 solutions found in 802.3s ==

SO + MANY + MORE + MEN + SEEM + TO + SAY + THAT + THEY + MAY + SOON + TRY + TO + STAY + AT + HOME +  SO + AS + TO + SEE + OR + HEAR + THE + SAME + ONE + MAN + TRY + TO + MEET + THE + TEAM + ON + THE + MOON + AS + HE + HAS + AT + THE + OTHER + TEN == TESTS
{'SO': 31, 'MANY': 2764, 'MORE': 2180, 'MEN': 206, 'SEEM': 3002, 'TO': 91, 'SAY': 374, 'THAT': 9579, 'THEY': 9504, 'MAY': 274, 'SOON': 3116, 'TRY': 984, 'STAY': 3974, 'AT': 79, 'HOME': 5120, 'AS': 73, 'SEE': 300, 'OR': 18, 'HEAR': 5078, 'THE': 950, 'SAME': 3720, 'ONE': 160, 'MAN': 276, 'MEET': 2009, 'TEAM': 9072, 'ON': 16, 'MOON': 2116, 'HE': 50, 'HAS': 573, 'OTHER': 19508, 'TEN': 906, 'TESTS': 90393}
== 1 solutions found in 90.2s ==

THIS + A + FIRE + THEREFORE + FOR + ALL + HISTORIES + I + TELL + A + TALE + THAT + FALSIFIES + ITS + TITLE + TIS + A + LIE + THE + TALE + OF + THE + LAST + FIRE + HORSES + LATE + AFTER + THE + FIRST + FATHERS + FORESEE + THE + HORRORS + THE + LAST + FREE + TROLL + TERRIFIES + THE + HORSES + OF + FIRE + THE + TROLL + RESTS + AT + THE + HOLE + OF + LOSSES + IT + IS + THERE + THAT + SHE + STORES + ROLES + OF + LEATHERS + AFTER + SHE + SATISFIES + HER + HATE + OFF + THOSE + FEARS + A + TASTE + RISES + AS + SHE + HEARS + THE + LEAST + FAR + HORSE + THOSE + FAST + HORSES + THAT + FIRST + HEAR + THE + TROLL + FLEE + OFF + TO + THE + FOREST + THE + HORSES + THAT + ALERTS + RAISE + THE + STARES + OF + THE + OTHERS + AS + THE + TROLL + ASSAILS + AT + THE + TOTAL + SHIFT + HER + TEETH + TEAR + HOOF + OFF + TORSO + AS + THE + LAST + HORSE + FORFEITS + ITS + LIFE + THE + FIRST + FATHERS + HEAR + OF + THE + HORRORS + THEIR + FEARS + THAT + THE + FIRES + FOR + THEIR + FEASTS + ARREST + AS + THE + FIRST + FATHERS + RESETTLE + THE + LAST + OF + THE + FIRE + HORSES + THE + LAST + TROLL + HARASSES + THE + FOREST + HEART + FREE + AT + LAST + OF + THE + LAST + TROLL + ALL + OFFER + THEIR + FIRE + HEAT + TO + THE + ASSISTERS + FAR + OFF + THE + TROLL + FASTS + ITS + LIFE + SHORTER + AS + STARS + RISE + THE + HORSES + REST + SAFE + AFTER + ALL + SHARE + HOT + FISH + AS + THEIR + AFFILIATES + TAILOR + A + ROOFS + FOR + THEIR + SAFE == FORTRESSES
{'THIS': 9874, 'A': 1, 'FIRE': 5730, 'THEREFORE': 980305630, 'FOR': 563, 'ALL': 122, 'HISTORIES': 874963704, 'I': 7, 'TELL': 9022, 'TALE': 9120, 'THAT': 9819, 'FALSIFIES': 512475704, 'ITS': 794, 'TITLE': 97920, 'TIS': 974, 'LIE': 270, 'THE': 980, 'OF': 65, 'LAST': 2149, 'HORSES': 863404, 'LATE': 2190, 'AFTER': 15903, 'FIRST': 57349, 'FATHERS': 5198034, 'FORESEE': 5630400, 'HORRORS': 8633634, 'FREE': 5300, 'TROLL': 93622, 'TERRIFIES': 903375704, 'RESTS': 30494, 'AT': 19, 'HOLE': 8620, 'LOSSES': 264404, 'IT': 79, 'IS': 74, 'THERE': 98030, 'SHE': 480, 'STORES': 496304, 'ROLES': 36204, 'LEATHERS': 20198034, 'SATISFIES': 419745704, 'HER': 803, 'HATE': 8190, 'OFF': 655, 'THOSE': 98640, 'FEARS': 50134, 'TASTE': 91490, 'RISES': 37404, 'AS': 14, 'HEARS': 80134, 'LEAST': 20149, 'FAR': 513, 'HORSE': 86340, 'FAST': 5149, 'HEAR': 8013, 'FLEE': 5200, 'TO': 96, 'FOREST': 563049, 'ALERTS': 120394, 'RAISE': 31740, 'STARES': 491304, 'OTHERS': 698034, 'ASSAILS': 1441724, 'TOTAL': 96912, 'SHIFT': 48759, 'TEETH': 90098, 'TEAR': 9013, 'HOOF': 8665, 'TORSO': 96346, 'FORFEITS': 56350794, 'LIFE': 2750, 'THEIR': 98073, 'FIRES': 57304, 'FEASTS': 501494, 'ARREST': 133049, 'RESETTLE': 30409920, 'HARASSES': 81314404, 'HEART': 80139, 'OFFER': 65503, 'HEAT': 8019, 'ASSISTERS': 144749034, 'FASTS': 51494, 'SHORTER': 4863903, 'STARS': 49134, 'RISE': 3740, 'REST': 3049, 'SAFE': 4150, 'SHARE': 48130, 'HOT': 869, 'FISH': 5748, 'AFFILIATES': 1557271904, 'TAILOR': 917263, 'ROOFS': 36654, 'FORTRESSES': 5639304404}
== 1 solutions found in 26153.0s ==