#!/usr/bin/perl use strict; use warnings; use Test::More 'no_plan'; use integer; sub b {@_[1 .. @_ - 1, 0]} sub o { @_[map({$_, $_ + @_ / 2 + @_ % 2} 0 .. @_ / 2 - 1), @_ % 2 ? @_ / 2 : ()] } sub i { @_[map({$_ + @_ / 2, $_} 0 .. @_ / 2 - 1), @_ % 2 ? @_ + 1 : ()] } my $bal; $bal = qr /\( [^()]* (?: (??{$bal}) [^()]* )* \)/x; sub shuffle { my ($str, @deck) = @_; 1 while $str =~ s/([0-9]+)(?:([bio])|($bal))/($2 || $3) x $1/eg; $str =~ s/[^bio]+//g; foreach my $c (split //, $str) { no strict 'refs'; @deck = &$c(@deck) } @deck; } my @deck = 1 .. 8; is_deeply([shuffle ("i2o", @deck)], [5, 6, 7, 8, 1, 2, 3, 4]); is_deeply([shuffle ("3(b2(oi))", @deck)], [1, 6, 3, 2, 4, 5, 7, 8]); is_deeply([shuffle ("b", @deck)], [2, 3, 4, 5, 6, 7, 8, 1]); is_deeply([shuffle ("i", @deck)], [5, 1, 6, 2, 7, 3, 8, 4]); is_deeply([shuffle ("o", @deck)], [1, 5, 2, 6, 3, 7, 4, 8]); is_deeply([shuffle ("bioib", @deck)], [6, 1, 8, 3, 2, 5, 4, 7]); is_deeply([shuffle ("3i", @deck)], [8, 7, 6, 5, 4, 3, 2, 1]); is_deeply([shuffle ("2io", @deck)], [7, 8, 5, 6, 3, 4, 1, 2]); is_deeply([shuffle ("8b", @deck)], [1, 2, 3, 4, 5, 6, 7, 8]); is_deeply([shuffle ("b3oi", @deck)], [6, 2, 7, 3, 8, 4, 1, 5]); is_deeply([shuffle ("2(io)", @deck)], [6, 2, 5, 1, 8, 4, 7, 3]); is_deeply([shuffle ("b2(ib)o", @deck)], [2, 3, 1, 6, 7, 8, 5, 4]); is_deeply([shuffle ("3(i2(io)o)", @deck)], [3, 4, 1, 2, 7, 8, 5, 6]); is_deeply([shuffle ("4(4(io)2b)", @deck)], [5, 4, 3, 6, 8, 1, 2, 7]); is_deeply([shuffle ("5(6(bi)7(io))", @deck)], [1, 2, 8, 4, 5, 3, 7, 6]); is_deeply([shuffle ("2(3(4(io)b)b)b", @deck)], [1, 6, 4, 3, 5, 2, 8, 7]); __END__ ok 1 ok 2 ok 3 ok 4 ok 5 ok 6 ok 7 ok 8 ok 9 ok 10 ok 11 ok 12 ok 13 ok 14 ok 15 ok 16 1..16