I've written a solution, too. :-)
I haven't been able to determine the complexity, I'm too bad in mathematics, maybe someone else could ?
However, the lower bound clearly tops all other algorithms, its g(1).
Ok, the upper bound could be g(unlimited), I'd guess.
use strict;
use List::Util qw(shuffle);
# construct a standard deck
my @card;
foreach my $suit (qw(H C S D)) {
foreach my $value (2..10, qw(J Q K A)) {
push @card, $value . $suit;
}
}
# now shuffle us up a pile of cards, perhaps composed of any
# number of decks
my @pile;
my $n = 4; # number of decks in shuffled pile
push @pile, @card for (1..$n);
@pile = shuffle @pile;
my $decks;
do {
$decks = grab ( \@pile ); # split the pile into $n decks
@pile = lookup( $decks ); # Look if we got it right..
} while ( @pile > 0 );
print "Got it!\n";
for my $a (0..$n){
print "$_ " foreach ( @{$decks->{$a}} );
print "\n\n";
}
# Exits here.. happily
sub grab{
my $pile = shift;
my $decks;
# Grab the cards
foreach my $card (@{$pile}){
push @{$decks->{int(rand($n))}}, $card;
}
return $decks;
}
sub lookup{
my $decks = shift;
for my $a (0..$n-1) {
my %cards;
foreach my $card ( @{$decks->{$a}} ){
if ( defined( $cards{$card} ) ){
damnit( $decks );
return throw ( $decks );
} else {
$cards{$card} = 1; # Remember this. An
+d dont forget it!
}
}
}
}
sub damnit{
my $decks = shift;
print "Damnit!!!\n";
for my $a (0..$n){
print "$_ " foreach ( @{$decks->{$a}} );
print "\n\n";
}
}
sub throw{
my $decks = shift;
my @pile;
foreach ( values %{$decks} ){
push @pile, @{$_};
}
return shuffle( @pile );
}
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|