Example #1
0
 def test_puzzle_with_04_letters(self):
     self.assertEqual(solve("AS + A == MOM"), {
         "A": 9,
         "S": 2,
         "M": 1,
         "O": 0
     })
Example #2
0
 def test_puzzle_with_two_digits_final_carry(self):
     self.assertEqual(
         solve("A + A + A + A + A + A + A + A + A + A + A + B == BCC"), {
             "A": 9,
             "B": 1,
             "C": 0
         })
Example #3
0
 def test_puzzle_with_06_letters(self):
     self.assertEqual(solve("NO + NO + TOO == LATE"), {
         "N": 7,
         "O": 4,
         "T": 9,
         "L": 1,
         "A": 0,
         "E": 2
     })
Example #4
0
 def test_puzzle_with_six_letters(self):
     self.assertEqual(
         solve("NO + NO + TOO == LATE"),
         {"N": 7,
          "O": 4,
          "T": 9,
          "L": 1,
          "A": 0,
          "E": 2})
Example #5
0
 def test_puzzle_with_07_letters(self):
     self.assertEqual(solve("HE + SEES + THE == LIGHT"), {
         "E": 4,
         "G": 2,
         "H": 5,
         "I": 0,
         "L": 1,
         "S": 9,
         "T": 7
     })
Example #6
0
 def test_puzzle_with_seven_letters(self):
     self.assertEqual(
         solve("HE + SEES + THE == LIGHT"),
         {"E": 4,
          "G": 2,
          "H": 5,
          "I": 0,
          "L": 1,
          "S": 9,
          "T": 7})
Example #7
0
def main():
    # RAZ + DWA == TRZY
    # 273 + 957 == 1230

    # RAZ + DWA + TRZY == SZESC
    # 360 + 756 + 9302 == 10418

    # RAZ + DWA + DWA == PIEC
    # 145 + 964 + 964 == 2073

    print(solve("CZAS + NIE + LATA + WCALE + ALE + LECI == STALE"))
Example #8
0
 def test_puzzle_with_eight_letters(self):
     self.assertEqual(
         solve("SEND + MORE == MONEY"),
         {"S": 9,
          "E": 5,
          "N": 6,
          "D": 7,
          "M": 1,
          "O": 0,
          "R": 8,
          "Y": 2})
Example #9
0
 def test_puzzle_with_08_letters(self):
     self.assertEqual(solve("SEND + MORE == MONEY"), {
         "S": 9,
         "E": 5,
         "N": 6,
         "D": 7,
         "M": 1,
         "O": 0,
         "R": 8,
         "Y": 2
     })
Example #10
0
 def test_puzzle_with_ten_letters(self):
     self.assertEqual(
         solve("AND + A + STRONG + OFFENSE + AS + A + GOOD == DEFENSE"),
         {"A": 5,
          "D": 3,
          "E": 4,
          "F": 7,
          "G": 8,
          "N": 0,
          "O": 2,
          "R": 1,
          "S": 6,
          "T": 9})
Example #11
0
 def test_puzzle_with_ten_letters(self):
     self.assertEqual(
         solve("AND + A + STRONG + OFFENSE + AS + A + GOOD == DEFENSE"),
         {"A": 5,
          "D": 3,
          "E": 4,
          "F": 7,
          "G": 8,
          "N": 0,
          "O": 2,
          "R": 1,
          "S": 6,
          "T": 9})
 def test_puzzle_with_ten_letters_and_199_addends(self):
     """This test may take a long time to run. Please be patient when running it."""
     puzzle = (
         "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"
     )
     self.assertEqual(
         solve(puzzle),
         {
             "A": 1,
             "E": 0,
             "F": 5,
             "H": 8,
             "I": 7,
             "L": 2,
             "O": 6,
             "R": 3,
             "S": 4,
             "T": 9,
         },
     )
Example #13
0
 def test_puzzle_with_ten_letters_and_199_addends(self):
     self.assertEqual(
         solve(
             "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"), {
                 "A": 1,
                 "E": 0,
                 "F": 5,
                 "H": 8,
                 "I": 7,
                 "L": 2,
                 "O": 6,
                 "R": 3,
                 "S": 4,
                 "T": 9
             })
Example #14
0
 def test_puzzle_with_ten_letters_and_199_addends(self):
     self.assertEqual(
         solve(
             "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"
         ),
         {"A": 1,
          "E": 0,
          "F": 5,
          "H": 8,
          "I": 7,
          "L": 2,
          "O": 6,
          "R": 3,
          "S": 4,
          "T": 9})
Example #15
0
 def test_too(self):
     '''I + DID == TOO'''
     self.assertEqual(solve('I + DID == TOO'), '9 + 191 == 200')
Example #16
0
 def test_best(self):
     '''HES + THE == BEST'''
     self.assertEqual(solve('HES + THE == BEST'), '426 + 842 == 1268')
Example #17
0
 def test_late(self):
     '''NO + NO + TOO == LATE'''
     self.assertEqual(solve('NO + NO + TOO == LATE'), '74 + 74 + 944 == 1092')
Example #18
0
 def test_onze(self):
     '''UN + UN + NEUF == ONZE'''
     self.assertEqual(solve('UN + UN + NEUF == ONZE'), '81 + 81 + 1987 == 2149')
Example #19
0
 def test_onze(self):
     '''UN + UN + NEUF == ONZE'''
     self.assertEqual(solve('UN + UN + NEUF == ONZE'), '81 + 81 + 1987 == 2149')
Example #20
0
 def test_puzzle_with_four_letters(self):
     self.assertEqual(
         solve("AS + A == MOM"), {"A": 9, "S": 2, "M": 1, "O": 0})
Example #21
0
 def test_invalid_solution_must_have_unique_value_for_each_letter(self):
     self.assertEqual(solve("A == B"), {})
 def test_leading_zero_solution_is_invalid(self):
     self.assertEqual(solve("ACA + DD == BD"), None)
Example #23
0
 def test_puzzle_with_two_digits_final_carry(self):
     self.assertEqual(
         solve("A + A + A + A + A + A + A + A + A + A + A + B == BCC"),
         {"A": 9,
          "B": 1,
          "C": 0})
Example #24
0
 def test_best(self):
     '''HES + THE == BEST'''
     self.assertEqual(solve('HES + THE == BEST'), '426 + 842 == 1268')
Example #25
0
 def test_too(self):
     '''I + DID == TOO'''
     self.assertEqual(solve('I + DID == TOO'), '9 + 191 == 200')
Example #26
0
 def test_out(self):
     '''TO + GO == OUT'''
     self.assertEqual(solve('TO + GO == OUT'), '21 + 81 == 102')
Example #27
0
 def test_deux(self):
     '''UN + DEUX + DEUX + DEUX + DEUX == NEUF'''
     self.assertEqual(solve('UN + DEUX + DEUX + DEUX + DEUX == NEUF'), '25 + 1326 + 1326 + 1326 + 1326 == 5329')
Example #28
0
 def test_puzzle_with_03_letters(self):
     self.assertEqual(solve("I + BB == ILL"), {"I": 1, "B": 9, "L": 0})
Example #29
0
 def test_mom(self):
     '''AS + A == MOM'''
     self.assertEqual(solve('AS + A == MOM'), '92 + 9 == 101')
Example #30
0
 def test_out(self):
     '''TO + GO == OUT'''
     self.assertEqual(solve('TO + GO == OUT'), '21 + 81 == 102')
Example #31
0
 def test_invalid_leading_zero_solution(self):
     self.assertEqual(solve("ACA + DD == BD"), {})
Example #32
0
 def test_invalid_leading_zero_solution(self):
     self.assertEqual(solve("ACA + DD == BD"), {})
Example #33
0
 def test_mom(self):
     '''AS + A == MOM'''
     self.assertEqual(solve('AS + A == MOM'), '92 + 9 == 101')
Example #34
0
 def test_late(self):
     '''NO + NO + TOO == LATE'''
     self.assertEqual(solve('NO + NO + TOO == LATE'), '74 + 74 + 944 == 1092')
Example #35
0
 def test_invalid_solution_must_have_unique_value_for_each_letter(self):
     self.assertEqual(solve("A == B"), {})
Example #36
0
 def test_deux(self):
     '''UN + DEUX + DEUX + DEUX + DEUX == NEUF'''
     self.assertEqual(solve('UN + DEUX + DEUX + DEUX + DEUX == NEUF'), '25 + 1326 + 1326 + 1326 + 1326 == 5329')
Example #37
0
 def test_puzzle_with_three_letters(self):
     self.assertEqual(solve("I + BB == ILL"), {"I": 1, "B": 9, "L": 0})
Example #38
0
 def test_leading_zero_solution_is_invalid(self):
     self.assertEqual(solve("ACA + DD == BD"), None)