Mind boggling card trick: Difference between revisions

Rename Perl 6 -> Raku, alphabetize, minor clean-up
(→‎{{header|Ruby}}: Added Ruby)
(Rename Perl 6 -> Raku, alphabetize, minor clean-up)
Line 826:
{1,1,0,1,0,1,1,1,1,0,1,1,1,1,0} //this is final B pile
True // the result is TRUE
</pre>
 
 
=={{header|Phix}}==
<lang Phix>constant n = 52,
pack = shuffle(repeat('r',n/2)&repeat('b',n/2))
string {black, red, discard} @= ""
for i=1 to length(pack) by 2 do
integer {top,next} = pack[i..i+1]
if top=='b' then
black &= next
else
red &= next
end if
discard &= top
end for
black = shuffle(black); red = shuffle(red) -- (optional)
--printf(1,"Discards : %s\n",{discard})
 
printf(1,"Reds : %s\nBlacks : %s\n\n",{red,black})
 
integer lb = length(black), lr = length(red),
ns = rand(min(lb,lr))
printf(1,"Swap %d cards:\n\n", ns)
{black[1..ns],red[1..ns]} = {red[1..ns],black[1..ns]}
 
printf(1,"Reds : %s\nBlacks : %s\n\n",{red,black})
integer nb = sum(sq_eq(black,'b')),
nr = sum(sq_eq(red,'r'))
string correct = iff(nr==nb?"correct":"**INCORRECT**")
printf(1,"%d r in red, %d b in black - assertion %s\n",{nr,nb,correct})</lang>
{{out}}
<pre>
Reds : brrbrrrrbrbr
Blacks : brrrbbbrbbbbrr
 
Swap 5 cards:
 
Reds : brrrbrrrbrbr
Blacks : brrbrbbrbbbbrr
 
8 r in red, 8 b in black - assertion correct
</pre>
 
Line 948 ⟶ 904:
Red in Red, Black in Black: 7 = 7</pre>
 
=={{header|Perl 6Phix}}==
<lang Phix>constant n = 52,
{{works with|Rakudo|2018.08}}
pack = shuffle(repeat('r',n/2)&repeat('b',n/2))
string {black, red, discard} @= ""
for i=1 to length(pack) by 2 do
integer {top,next} = pack[i..i+1]
if top=='b' then
black &= next
else
red &= next
end if
discard &= top
end for
black = shuffle(black); red = shuffle(red) -- (optional)
--printf(1,"Discards : %s\n",{discard})
 
printf(1,"Reds : %s\nBlacks : %s\n\n",{red,black})
<lang perl6># Generate a shuffled deck
my @deck = shuffle;
put 'Shuffled deck: ', @deck;
 
integer lb = length(black), lr = length(red),
my (@discard, @red, @black);
ns = rand(min(lb,lr))
# Deal cards following task description
printf(1,"Swap %d cards:\n\n", ns)
deal(@deck, @discard, @red, @black);
{black[1..ns],red[1..ns]} = {red[1..ns],black[1..ns]}
 
printf(1,"Reds : %s\nBlacks : %s\n\n",{red,black})
put 'Discard pile: ', @discard;
put '"Red" pile: ', @red;
integer nb = sum(sq_eq(black,'b')),
put '"Black" pile: ', @black;
nr = sum(sq_eq(red,'r'))
string correct = iff(nr==nb?"correct":"**INCORRECT**")
printf(1,"%d r in red, %d b in black - assertion %s\n",{nr,nb,correct})</lang>
{{out}}
<pre>
Reds : brrbrrrrbrbr
Blacks : brrrbbbrbbbbrr
 
Swap 5 cards:
# swap the same random number of random
# cards between the red and black piles
my $amount = ^(+@red min +@black) .roll;
put 'Number of cards to swap: ', $amount;
swap(@red, @black, $amount);
 
Reds : brrrbrrrbrbr
put 'Red pile after swaps: ', @red;
Blacks : brrbrbbrbbbbrr
put 'Black pile after swaps: ', @black;
 
8 r in red, 8 b in black - assertion correct
say 'Number of Red cards in the Red pile: ', +@red.grep('R');
</pre>
say 'Number of Black cards in the Black pile: ', +@black.grep('B');
 
sub shuffle { (flat 'R' xx 26, 'B' xx 26).pick: * }
 
sub deal (@deck, @d, @r, @b) {
while @deck.elems {
my $top = @deck.shift;
if $top eq 'R' {
@r.push: @deck.shift;
}
else {
@b.push: @deck.shift;
}
@d.push: $top;
}
}
 
sub swap (@r, @b, $a) {
my @ri = ^@r .pick($a);
my @bi = ^@b .pick($a);
my @rs = @r[@ri];
my @bs = @b[@bi];
@r[@ri] = @bs;
@b[@bi] = @rs;
}</lang>
{{out|Sample output}}
<pre>Shuffled deck: B B B R B R R R B B R R R B R B R B R R R B R B B R R B B R R B R B R R R R B R R B B B B B B R R B B B
Discard pile: B B B R B R R R R R R R B R B R R R R B R B B B R B
"Red" pile: R R B B B R B B B B B R R B B
"Black" pile: B R R B R R R B B R B
Number of cards to swap: 6
Red pile after swaps: R R B B R R R R B B B R B B B
Black pile after swaps: B R B R R B B B B R B
Number of Red cards in the Red pile: 7
Number of Black cards in the Black pile: 7</pre>
 
=={{header|Python}}==
Line 1,134 ⟶ 1,072:
The assertion is true!
</pre>
 
=={{header|Raku}}==
(formerly Perl 6)
{{works with|Rakudo|2018.08}}
 
<lang perl6># Generate a shuffled deck
my @deck = shuffle;
put 'Shuffled deck: ', @deck;
 
my (@discard, @red, @black);
# Deal cards following task description
deal(@deck, @discard, @red, @black);
 
put 'Discard pile: ', @discard;
put '"Red" pile: ', @red;
put '"Black" pile: ', @black;
 
# swap the same random number of random
# cards between the red and black piles
my $amount = ^(+@red min +@black) .roll;
put 'Number of cards to swap: ', $amount;
swap(@red, @black, $amount);
 
put 'Red pile after swaps: ', @red;
put 'Black pile after swaps: ', @black;
 
say 'Number of Red cards in the Red pile: ', +@red.grep('R');
say 'Number of Black cards in the Black pile: ', +@black.grep('B');
 
sub shuffle { (flat 'R' xx 26, 'B' xx 26).pick: * }
 
sub deal (@deck, @d, @r, @b) {
while @deck.elems {
my $top = @deck.shift;
if $top eq 'R' {
@r.push: @deck.shift;
}
else {
@b.push: @deck.shift;
}
@d.push: $top;
}
}
 
sub swap (@r, @b, $a) {
my @ri = ^@r .pick($a);
my @bi = ^@b .pick($a);
my @rs = @r[@ri];
my @bs = @b[@bi];
@r[@ri] = @bs;
@b[@bi] = @rs;
}</lang>
{{out|Sample output}}
<pre>Shuffled deck: B B B R B R R R B B R R R B R B R B R R R B R B B R R B B R R B R B R R R R B R R B B B B B B R R B B B
Discard pile: B B B R B R R R R R R R B R B R R R R B R B B B R B
"Red" pile: R R B B B R B B B B B R R B B
"Black" pile: B R R B R R R B B R B
Number of cards to swap: 6
Red pile after swaps: R R B B R R R R B B B R B B B
Black pile after swaps: B R B R R B B B B R B
Number of Red cards in the Red pile: 7
Number of Black cards in the Black pile: 7</pre>
 
=={{header|REXX}}==
Line 1,237:
There were 5!
</pre>
 
=={{header|Rust}}==
{{libheader|rand}}
10,333

edits