#!/usr/bin/perl use strict; my @input = qw( 2 6 5 10 10 4 10 10 10 4 5 10 4 5 10 9 7 6 1 7 6 9 5 3 10 10 4 10 9 2 1 10 1 10 10 10 3 10 9 8 10 8 7 1 2 8 6 7 3 3 8 2 4 3 2 10 8 10 6 8 9 5 8 10 5 3 5 4 6 9 9 1 7 6 3 5 10 10 8 10 9 10 10 7 2 6 10 10 4 10 1 3 10 1 1 10 2 2 10 4 10 7 7 10 10 5 4 3 5 7 10 8 2 3 9 10 8 4 5 1 7 6 7 2 6 9 10 2 3 10 3 4 4 9 10 1 1 10 5 10 10 1 8 10 7 8 10 6 10 10 10 9 6 2 10 10 ); # variables need to be visible my ($initial_deck, $offset, $deck, $dealt); my @stacks; my @gamestates; # play the three games for ( 0..2 ) { $offset = $_ * 52; @$initial_deck = @input[ 0 + $offset .. 51 + $offset ]; play(); } # # play one game sub play { $deck = $initial_deck; $dealt = 0; @stacks = ([],[],[],[],[],[],[]); @gamestates = (); # warn 'INITIAL: ' . join ' ', @$initial_deck; while ( 1 ) { # warn "\n\nDEALT: $dealt -----------------------\n"; # warn "DECK: " . join ' ', @$deck; foreach my $stack ( @stacks ) { # warn "---------"; # deal card push @$stack, shift @$deck; $dealt++; return done( 'Loss' ) if ! scalar @$deck; # check for 10,20,30 $stack = check_stack($stack); # check for repeated game state return done( 'Draw' ) if repeated(); # die if $dealt >= 200; } @stacks = grep { scalar @$_ } @stacks; return done('Win') if ! scalar @stacks; } } # evaluate stack for ten twenty thirty and resize array sub check_stack { my $stack = shift; # warn "Stack: " . join ' ', @$stack; foreach my $card_combo ( ( [0,1,-1],[0,-2,-1],[-3,-2,-1] ) ) { my $sum; return $stack if scalar @$stack < 3; foreach ( @$stack[ @$card_combo ] ) { $sum += $_ }; next if ( $sum % 10 ); # warn "GOT ONE: @$card_combo / " . join '+', @$stack[ @$card_combo ]; push @$deck, @$stack[ @$card_combo ]; # remove elements from array @$stack[ @$card_combo]= undef; @$stack = grep { $_ } @$stack; check_stack( $stack ); } $stack; } sub repeated { my $gamestate = join ' ', map { join ' ', @$_ } @stacks; # $gamestate .= ' ' . join ' ', @$deck; foreach ( @gamestates ) { if ( $gamestate eq $_ ) { # warn "Seen: $_"; # warn "Now : $gamestate"; return 'draw'; } } push @gamestates, $gamestate; return 0; } sub done { print shift() . ": $dealt\n"; } 1;