#!/usr/bin/perl use Time::HiRes qw(gettimeofday tv_interval); use List::Util 'shuffle'; # perlfaq4 use warnings; use strict; my @ups = ('0') x 10; # four suits are added to a deck and then shuffled my @deck = shuffle(('A' .. 'M') x 4); #print "@deck\n"; exit 0; print "\n"; my $t0 = gettimeofday; $ups[0] = shift @deck; eval { my $done = 0; while (!$done) { print "@ups\n"; $done = 1; scan: for (my $j=1;$j<10;$j++) { $ups[$j] eq '0' and $ups[$j] = (shift @deck or die); for (my $k=0;$k<$j;$k++) { if ( $ups[$j] eq $ups[$k] ) { $ups[$j] = (shift @deck or die); $ups[$k] = (shift @deck or die); $done = 0; last scan; } } } } }; print "\n@ups\tExit row\n"; my $usec = sprintf("%.2f", (gettimeofday - $t0) * 10**6); print "\n".(52-@deck)." passes in $usec microseconds. "; print !@deck ? "Succeeded in consuming the entire deck.\n\n" : "Failed to consume the entire deck.\n\n";