File size: 3,428 Bytes
1fcdf1c
d64dc2a
1fcdf1c
 
d64dc2a
 
 
 
 
 
 
810e7bf
 
 
d64dc2a
 
 
810e7bf
 
d64dc2a
 
810e7bf
d64dc2a
810e7bf
 
 
 
d64dc2a
 
810e7bf
d64dc2a
 
810e7bf
d64dc2a
 
810e7bf
d64dc2a
 
810e7bf
 
d64dc2a
810e7bf
d64dc2a
 
810e7bf
 
 
3ca8c04
d64dc2a
 
 
 
810e7bf
 
 
d64dc2a
 
810e7bf
d64dc2a
2e2c700
 
d64dc2a
2e2c700
 
 
 
d0aa436
810e7bf
2e2c700
1fcdf1c
810e7bf
d0aa436
1fcdf1c
2e2c700
d64dc2a
2e2c700
 
d0aa436
810e7bf
2e2c700
810e7bf
 
2e2c700
d64dc2a
2e2c700
 
d0aa436
8e111ac
d0aa436
1fcdf1c
 
d64dc2a
810e7bf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import gradio as gr
from itertools import permutations

def solve_cryptarithm(equation):
    try:
        # Parse the left and right parts of the equation
        left, right = equation.replace(" ", "").split("=")
        words = left.split("+") + [right]
    except ValueError:
        return "Invalid format. Use the format 'SEND + MORE = MONEY'."

    # Extract unique letters
    unique_letters = set("".join(words))
    if len(unique_letters) > 10:
        return "Error: Too many unique letters (more than 10), unsolvable with digits 0-9."

    # Function to convert words to numbers based on current letter-to-digit mapping
    def word_to_number(word, mapping):
        return int("".join(str(mapping[char]) for char in word))

    # Depth-First Search with pruning and backtracking
    def dfs(index, letter_to_digit, used_digits):
        # If all letters are assigned, check if the equation holds
        if index == len(unique_letters):
            left_sum = sum(word_to_number(word, letter_to_digit) for word in words[:-1])
            right_val = word_to_number(words[-1], letter_to_digit)
            return left_sum == right_val

        # Get current letter to assign
        letter = unique_letters_list[index]

        # Try assigning each digit to the letter
        for digit in range(10):
            # Skip used digits and avoid leading zero for multi-letter words
            if digit in used_digits or (digit == 0 and letter in leading_letters):
                continue

            # Assign the digit and proceed
            letter_to_digit[letter] = digit
            used_digits.add(digit)

            if dfs(index + 1, letter_to_digit, used_digits):
                return True  # Found a solution

            # Backtrack
            del letter_to_digit[letter]
            used_digits.remove(digit)

        return False  # No solution found along this path

    # Identify leading letters to avoid leading zeros
    leading_letters = {word[0] for word in words if len(word) > 1}
    unique_letters_list = list(unique_letters)
    letter_to_digit = {}
    used_digits = set()

    # Start DFS to find a solution
    if dfs(0, letter_to_digit, used_digits):
        # Format the result in the desired output format
        formatted_result = f"Input: {equation}\n\n"
        for i, word in enumerate(words):
            formatted_result += " ".join(str(letter_to_digit[char]) for char in word)
            if i < len(words) - 2:
                formatted_result += " + "
            elif i == len(words) - 2:
                formatted_result += " = "
        return formatted_result
    else:
        return f"No solution found for: {equation}"

def process_input(equations):
    results = []
    for equation in equations.splitlines():
        equation = equation.strip()
        if equation:
            result = solve_cryptarithm(equation)
            results.append(result)
    return "\n\n".join(results)

# Set up Gradio interface
interface = gr.Interface(
    fn=process_input,
    inputs=gr.Textbox(
        label="Enter Cryptarithm Equations (one per line)",
        placeholder="E.g., SEND + MORE = MONEY\nSEND + MORE = MONEY"
    ),
    outputs="text",
    title="Cryptarithm Solver",
    description="Enter cryptarithm equations (like SEND + MORE = MONEY) one per line to find solutions. Each letter represents a unique digit from 0-9."
)

# Launch the Gradio app
interface.launch()