#!/usr/bin/perl my ($hit, $min) = (0, ~0); sub f { if (my ($p, $d, $r) = /^(_*)(\d)(.*)$/) { # 目の前の皿をスルーせず数値を食べる my $s = "_$r$p"; my $t = 0; # 食べている間に流れて行ってしまう数値皿の個数 for (1..$d) { # ローテーション及び食べそびれのカウント $t++ if $c =~ /\d/; } my $m1 = f($s, $m + $d); if ($t) { # 食べている間に通り過ぎてしまった数値皿のある場合、 my $m2 = f("$r$p$d", $m + 1); # 食べずにスルーするケース側の木も計算 $m1 = $m2 if $m2 < $m1; } $m = $m1; } if ($m <= $min) { if ($m == $min) { # 最小値は同じだった $hit++; } else { ($hit, $min) = (1, $m); } say " hit, min = $hit, $min"; } $m } while (<>) { ($hit, $min) = (0, ~0); say "\n$_: "; }
3324
3324: hit, min = 1, 16 hit, min = 2, 16 hit, min = 3, 16 hit, min = 4, 16 hit, min = 5, 16 hit, min = 6, 16 hit, min = 7, 16 hit, min = 8, 16 hit, min = 9, 16 hit, min = 10, 16 hit, min = 1, 15 hit, min = 2, 15 hit, min = 3, 15 hit, min = 4, 15 hit, min = 5, 15 hit, min = 6, 15 hit, min = 7, 15 hit, min = 8, 15 hit, min = 9, 15 hit, min = 10, 15 hit, min = 11, 15 hit, min = 12, 15 hit, min = 13, 15 3324 : 15