The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

# NAME

Math::Cryptarithm - Solving simple cryptarithm.

Version 0.20.2

# DESCRIPTION

A primitive cryptarithm (also known as verbal arithmetic) solver.

# SYNOPSIS

``````    use Math::Cryptarithm;
use Data::Dumper;

my \$abc5 = ["A + B = C5 ", "A % 2 = 0"];

my \$abc5_ans_in_eqs = Math::Cryptarithm->new(\$abc5)->solve_ans_in_equations();

for my \$set (\$abc5_ans_in_eqs->@*) {
print join "\n", @{\$set};
print "\n\n"
}

# 2 + 3 = 05
# 2 % 2 = 0
#
# 4 + 1 = 05
# 4 % 2 = 0
#
# 8 + 7 = 15
# 8 % 2 = 0
#
# 6 + 9 = 15
# 6 % 2 = 0

my \$abcd = [
"ABA * ABA = CCDCC",
"ABA * A = CAC",
"ABA * B = ABA"
];

my \$abcd_ans = Math::Cryptarithm->new(\$abcd)->solve_alphabetvalue_hash();

say scalar \$abcd_ans->@*;             # 1
say \$abcd_ans->[0]->{"A"};            # 2
say \$abcd_ans->[0]->{"B"};            # 1
say \$abcd_ans->[0]->{"C"};            # 4
say \$abcd_ans->[0]->{"D"};            # 9

my \$magical_seven = ["ABCDEF * 6 = DEFABC"];
my \$magical_seven_ans = Math::Cryptarithm->new(\$magical_seven)->solve_alphabetvalue_hash();

print Dumper(\$magical_seven_ans);

# \$VAR1 = [ { 'A' => 1, 'F' => 7, 'E' => 5, 'B' => 4,'D' => 8, 'C' => 2 ];``````

# METHODS

## solve_alphabetvalue_hash()

Return a list object of hashes with all possible solutions. Different letters represent different digits.

## solve_ans_in_equations()

Return the possible solutions in "decrypted equations" form. See the section Synopsis.

# TODOS

## Improve the Module by Backtracking instead of Permutations

Currently the module runs slowly when the number of variables is equal to or more than 6. Using a backtracking as the algorithm should improve the performance of the module.

## "?"

Allow "?" to represent arbitary digits. See the related Wikipedia entry (zh or ja) using "square box" representing any possible digits.

To determine whether allow zeros as possible values as the leading part of a number. 1 is allowed. 0 means not allowed. Default should be 1.

# AUTHOR

Cheok-Yin Fung, <fungcheokyin at gmail.com>