Blog

Perl6で「ソフトウェアエンジニアならば1時間以内に解けなければいけない5つの問題」の5問目を解いてみた

http://qiita.com/tag1216/items/25ff0f957340c54ae73c

Perl6 だと eval が EVAL になってるのと、文字列結合演算子が ~ になっているのと実行が異常に遅いこと以外は違いはない。

calc(1, 1);

sub calc {
    my ($b, $n) = @_;
    if ($n==9) {
        say $b if EVAL($b) == 100;
    } else {
        for ('+', '-', '') {
            calc($b ~ $_ ~ ($n+1), $n+1);
        }
    }
}

Perl5 なら以下のように極めてわかりやすく記述することが可能。

my $x = 1;
for ('+', '-', '') {
    my $x = $x . $_ . 2;
    for ('+', '-', '') {
        my $x = $x . $_ . 3;
        for ('+', '-', '') {
            my $x = $x . $_ . 4;
            for ('+', '-', '') {
                my $x = $x . $_ . 5;
                for ('+', '-', '') {
                    my $x = $x . $_ . 6;
                    for ('+', '-', '') {
                        my $x = $x . $_ . 7;
                        for ('+', '-', '') {
                            my $x = $x . $_ . 8;
                            for ('+', '-', '') {
                                my $x = $x . $_ . 9;
                                say $x if eval($x)==100;
                            }
                        }
                    }
                }
            }
        }
    }
}

題意のままに!!! 直接的な!!! 表現をしている!!! ダイナミックスコープ最高!!!!!