君ならどう書く 小町算

またd.y.d.さんで見つけた
やるか迷った末うあああってやった。

use strict;

our %expr = (
    '.' => sub { int($_[0] . $_[1]); },
    '*' => sub { $_[0] * $_[1]; },
    '/' => sub { $_[0] / $_[1]; },
    '+' => sub { $_[0] + $_[1]; },
    '-' => sub { $_[0] - $_[1]; }
);

sub komachi 
{
    my ($dpc, $maxdpc, $count, @path) = @_;
    my @ops = qw( . * / - + );
    
    foreach my $op (@ops) {
        push(@path, $op);
        if ($dpc >= $maxdpc) {
            my @dup = @path;
            my @num = (1 .. 9);
            foreach my $k (0 .. 2) {
                for (my $i = 0, my $j = 0; $i < @dup; ++$i, ++$j) {
                    if (($k == 0 and ($dup[$i] eq '.'))
                        or ($k == 1 and ($dup[$i] eq '*' or $dup[$i] eq '/'))
                        or ($k == 2 and ($dup[$i] eq '+' or $dup[$i] eq '-')))
                    {
                        $num[$j] = $expr{$dup[$i]}($num[$j], $num[$j + 1]);
                        splice(@num, $j + 1, 1);
                        splice(@dup, $i, 1);
                        redo;
                    }
                }
            }
            if ($num[0] == 100) {
                ++$$count;
            }
        } else {
            komachi($dpc + 1, $maxdpc, $count, @path);
        }
        pop(@path);
    }
    
    return $$count;
}

my @path = ();
my $count = 0;
print komachi(1, 8, \$count, @path), "\n";

うあああ。101って出たので、あってるとは思う。

最近仕事ばかりで、とにかく動くものを早めに作れみたいな雰囲気でやっているから、テキトーコーディングの癖がついていてしまって、このままではやばいと思い、どう書く?系の問題をやっているのに、それを美しさ的なものを気にしないでやっていたら意味ないという。前のもまだ見てないし。