S E N D
+ M O R E
-----------
M O N E Y
####
sub bd { my ($ls, $f) = @_;
[ map @{$f->($_)}, @$ls ] # Yow
}
sub guard { $_[0] ? [undef] : [] }
sub remove {
my ($b, $a) = @_;
my %h = map { $_ => 1 } @$a;
delete $h{$_} for @$b;
return [ keys %h ];
}
my $digits = [0..9];
my $solutions =
bd remove([0], $digits) => sub { my ($s) = @_;
bd remove([$s], $digits) => sub { my ($e) = @_;
bd remove([$s,$e], $digits) => sub { my ($n) = @_;
bd remove([$s,$e,$n], $digits) => sub { my ($d) = @_;
my $send = "$s$e$n$d";
bd remove([0,$s,$e,$n,$d], $digits) => sub { my ($m) = @_;
bd remove([$s,$e,$n,$d,$m], $digits) => sub { my ($o) = @_;
bd remove([$s,$e,$n,$d,$m,$o], $digits) => sub { my ($r) = @_;
my $more = "$m$o$r$e";
bd remove([$s,$e,$n,$d,$m,$o,$r], $digits) => sub { my ($y) = @_;
my $money = "$m$o$n$e$y";
bd guard($send + $more == $money) => sub { [[$send, $more, $money]] }}}}}}}}};
for my $s (@$solutions) {
print "@$s\n";
}
####
use strict;
use warnings;
use Data::Dump qw/pp dd/;
=pod
https://blog.plover.com/prog/haskell/monad-search.html
https://blog.plover.com/prog/monad-search-2.html
=cut
# --- List comprehension
sub from (&$;$) {
my ($c_block, undef, $c_tail) = @_;
my $var = \$_[1];
sub {
for ( &$c_block ) {
$$var = $_;
$c_tail->()
}
}
}
sub when (&$){ # guard
my ($c_block, $c_tail) = @_;
sub { $c_tail->() if &$c_block }
}
# --- rem() Helper function to return digits 0..9 except @_
my %digits;
@digits{0..9}=();
sub rem { # set difference
my %h = %digits;
delete @h{@_};
keys %h;
}
my ($send,$s,$e,$n,$d);
my ($more,$m,$o,$r);
my ($money,$y);
my $do =
# send
from { rem 0 } $s =>
from { rem $s } $e =>
from { rem $s, $e } $n =>
from { rem $s,$e,$n } $d =>
# more
from { rem 0,$s,$e,$n,$d } $m =>
from { rem $s,$e,$n,$d,$m } $o =>
from { rem $s,$e,$n,$d,$m,$o } $r =>
# money
from { rem $s,$e,$n,$d,$m,$o,$r } $y =>
# guard
when { "$s$e$n$d" + "$m$o$r$e" == "$m$o$n$e$y" }
# output
sub { pp [ "$s$e$n$d" , "$m$o$r$e" , "$m$o$n$e$y" ] }
;
&$do;
####
Compilation started at Wed Dec 2 19:11:14
C:/Perl_524/bin\perl.exe -w d:/tmp/pm/send_more_money_monad.pl
[9567, 1085, 10652]
Compilation finished at Wed Dec 2 19:11:18