Games::Puzzles::SendMoreMoneyを試してみた
30分プログラム、その679。Games::Puzzles::SendMoreMoneyを試してみた。
前に誰かが「CPANにはSEND+MORE=MONEYを解くためだけのモジュールがあるんだぜ。ちょううけるwww」と言っていたことを思いだしたので、試してみました。
サンプルコード
my $solver = Games::Puzzles::SendMoreMoney->new( values => [0..9], puzzle => "SEND + MORE = MONEY", reporter => sub { print Dumper($_[0]) }, validator => sub { return 0 if $_[0]->{S} == 0; return 0 if $_[0]->{M} == 0; return 1; }, ); $solver->solve();
おお、シンプル!
で、さっそく走らせてみたら、ファンがものすごい勢いで回転し始めました。うーん、あんまり頭よさそうじゃないね。
コードを軽く流し読みしてみたけど、普通に全候補を生成して、一個づつチェックしてるっぽい。別に覆面算に最適化されたコードがあるわけじゃないのね。
コマンド化してみました
とりあえず、式を変えるごとにコードを書き直すのは面倒なので、コマンドラインから試せるようにしてみました。
$ perl send-more-money.pl SEND + MORE = MONEY $VAR1 = { 'S' => 9, 'O' => 0, 'M' => 1, 'D' => 7, 'N' => 6, 'R' => 8, 'E' => 5, 'Y' => 2 }; ^C $ perl send-more-money.pl HACKER + HACKER + HACKER = ENERGY $VAR1 = { 'A' => 0, 'N' => 1, 'K' => 4, 'E' => 6, 'Y' => 9, 'H' => 2, 'C' => 5, 'R' => 3, 'G' => 8 }; ^C
ソースコード
#! /usr/bin/perl # -*- mode:perl; coding:utf-8 -*- # # prelude.pl - # # Copyright(C) 2009 by mzp # Author: MIZUNO Hiroki / mzpppp at gmail dot com # http://howdyworld.org # # Timestamp: 2009/10/18 21:46:44 # # This program is free software; you can redistribute it and/or # modify it under MIT Lincence. # use strict; use warnings; use Games::Puzzles::SendMoreMoney; use Data::Dumper; sub scan($$){ my ($s,$r) = @_; my @xs = (); while($s =~ m/$r/g){ @xs = (@xs, $1); } @xs; } sub solve($){ my ($s) = @_; my @cs = scan $s,'\b(\w)'; my $solver = Games::Puzzles::SendMoreMoney->new( values => [0..9], puzzle => $s, reporter => sub { print Dumper($_[0]) }, validator => sub { for my $c (@cs){ return 0 if $_[0]->{$c} == 0; } return 1; }); $solver->solve(); } solve(join(" ",@ARGV));