use integer; my $start = time; while(){ if(/#----END----#/){ my $duration = time - $start; die "Execution time: $duration s\n"; } @A = split //,; &R; } sub R { for $i ( 0 .. 80 ) { next if $A[$i]; my %t = map { $_/9==$i/9||$_%9==$i%9||$_/27==$i/27&&$_%9/3==$i%9/3?$A[$_]:0=>1 } 0 .. 80; R($A[$i]=$_) for grep{!$t{$_}} 1 .. 9; return $A[$i] = 0; } $sum=0; for(@A){$sum+=$_} print" $sum\n"; warn @A; # Execution time = 717 s # die @A; # Execution time 31 + 31 + 14 + 1 + 5 = 82 s } __DATA__ 120400300300010050006000100700090000040603000003002000500080700007000005000000098 000000039000001005003050800008090006070002000100400000009080050020000600400700000 120300004350000100004000000005400200600070000000008090003100500000009070000060008 003000000400080036008000100040060073000900000000002005004070068600000000700600500 800000000003600000070090200050007000000045700000100030001000068008500010090000400 #----END----# 128465379374219856956837142765198423249673581813542967592386714487921635631754298 751846239892371465643259871238197546974562318165438927319684752527913684486725193 126395784359847162874621953985416237631972845247538691763184529418259376592763418 123456789457189236968327154249561873576938412831742695314275968695814327782693541 812753649943682175675491283154237896369845721287169534521974368438526917796318452