use strict; use warnings; use utf8; print "P3\n".(6*6)." ".(6*6*6)."\n".(50)."\n"; sub do_hand { my @cards = @_; my $score = 0; local $_ = join '', sort {$a <=> $b} @cards; if(/^(\d)\1{4}/) { return 50; # yahtzee } elsif(/^12345$/ || /^23456$/) { return 40; # large straight } elsif(/12.?34/ || /23.?45/ || /34.?56/) { return 30; # small straight } elsif(/(\d)\1{2}/) { $score = $cards[0] + $cards[1] + $cards[2] + $cards[3] + $cards[4]; if((/(\d)\1{2}(\d)\2/ || /(\d)\1(\d)\2{2}/) && $score < 25) { return 25; } else { return $score; } } elsif(/(\d)\1*$/) { return $1 * length $&; } } sub check_hand { my ($expected, @cards) = @_; my ($score) = do_hand(@cards); print STDERR "$score!=$expected: @cards\n" unless $score == $expected; } check_hand(50, 1,1,1,1,1); check_hand(40, 1,5,2,3,4); check_hand(30, 2,2,3,4,5); check_hand(30, 2,3,3,4,5); check_hand(30, 2,3,4,4,5); check_hand(30, 2,3,4,5,5); check_hand(30, 1,2,3,4,6); check_hand(30, 1,3,4,5,6); check_hand(6, 6,3,4,1,4); check_hand(12, 6,3,6,1,4); check_hand(10, 5,3,5,1,4); check_hand(20, 5,5,5,1,4); check_hand(25, 5,5,5,1,1); check_hand(25, 5,5,1,1,1); check_hand(28, 6,6,6,5,5); for $_ (0..6**5-1) { my @cards; for my $i (0..4) { push @cards, (int($_/6**$i) % 6) + 1; } #@cards = sort @cards; my ($score) = do_hand(@cards); print +($score).' '.($score).' '.($score)."\n"; }