[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