[Wellington-pm] SEND + MORE = MONEY
Ewen McNeill
ewen at naos.co.nz
Tue Mar 1 21:41:05 PST 2005
In message <1109700654.4261.11.camel at localhost>, Grant McLean writes:
>Given the equation:
>
> SEND
> +MORE
> =====
> MONEY
Proof that there's a CPAN module for everything. It's a brute force
approach which does 10!/(10-$unique)! iterations (1814400 here), so
it's painfully slow (4:39 on a 700MHz Pentium III).
Ewen
-=- cut here -=-
#! /usr/bin/perl -w
# Solve word number puzzles, through brute force: 10!/(10-$unique)! iterations
#
# Rules: 1. Each letter always corresponds to the same digit
# 2. A digit is only used once
# 3. Most sigificant digit in values in the equation is never zero
# Written by Ewen McNeill <ewen at naos.co.nz>, 2005/03/02
use strict;
use Math::Combinatorics;
my $message = 'SEND + MORE = MONEY';
my $letters = join '', sort keys %{{map {$_,1} ($message =~ /([A-Z])/g)}};
my $unique = length $letters;
die "Too many unique letters\n" if ($unique > 10);
my $combinations = Math::Combinatorics->new(count => $unique,
data => [0..9]);
while (my @testset = $combinations->next_combination())
{
my $permutations = Math::Combinatorics->new(count => $unique,
data => \@testset);
while(my $digits = join('', $permutations->next_permutation()))
{
$_ = $message;
eval "tr/${letters}/${digits}/";
next if(/\b0/); # eliminate violations of rule 3
if(/^(....)...(....)...(.....)/ && ($1 + $2 == $3)) {
print "Success: $message is $_\n";
}
}
}
-=- cut here -=-
More information about the Wellington-pm
mailing list