Created
July 5, 2017 05:15
-
-
Save samcv/9ed8322b4c9e1a40e1f3df495d8cee1d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env perl6 | |
# Deck of Pain | |
# Inspired by http://www.artofmanliness.com/2015/08/05/the-prisoner-workout/ | |
our $VERSION = '0.6'; | |
# Start the timer | |
my $time_in_seconds = 0; | |
my $supply = Supply.interval(1); | |
$supply.tap( | |
{ | |
$time_in_seconds++; | |
} | |
); | |
sub get_time { | |
my @time_total; | |
@time_total[0] = $time_in_seconds / 3600; # Hours | |
@time_total[1] = $time_in_seconds / 60; # Minutes | |
@time_total[1] = @time_total[1] % 60; # Leftover minutes | |
@time_total[2] = $time_in_seconds % 60; # Seconds | |
return sprintf "%d:%02d:%02d", @time_total; | |
} | |
sub USAGE { | |
say "Usage: $*PROGRAM-NAME [easy|medium|hard]"; | |
} | |
sub MAIN ($mode = 'easy') { | |
printf "Deck of Pain: %s Mode\n", $mode.tc; | |
say "v$VERSION"; | |
my @numbers = <2 3 4 5 6 7 8 9 10 10 10 10 11>; | |
my @jokers = (@numbers.pick) xx 2; | |
# Hard mode, 60 cards, affects all exercises (16-88 extra total reps) | |
# Just need to slip the jokers in since we're altering every exercise | |
if ($mode ~~ /:i hard/) { | |
append @numbers, @jokers; | |
@numbers = sort @numbers; | |
} | |
my @exercises = 'Curl-ups', 'Push-ups', 'Leg extensions', 'Squats'; | |
my @deck = @numbers X~ ' ' X~ @exercises; | |
my ($e1-left, $e2-left, $e3-left, $e4-left); | |
my ($e1-count, $e2-count, $e3-count, $e4-count) = 0 xx 4; | |
# Medium mode, 54 cards, affects two exercises (8-44 extra total reps) | |
# Need to add the variants after the fact to avoid affecting the whole set | |
if ($mode ~~ /:i medium/) { | |
my @added_cards; | |
my @chosen_exercises = @exercises.pick(2); | |
for 0..@jokers.end -> $num { | |
push @added_cards, @jokers[$num] ~ ' ' ~ @chosen_exercises[$num]; | |
} | |
append @deck, @added_cards; | |
@deck = sort @deck; | |
my $total += $_ for @numbers; | |
($e1-left, $e2-left, $e3-left, $e4-left) = $total xx 4; | |
# Adjust counts | |
for 0 .. 1 -> $card_num { | |
given @added_cards[$card_num] { | |
when /:i(\d+) ' ' .*"@exercises[0]"/ { $e1-left += $0; }; | |
when /:i(\d+) ' ' .*"@exercises[1]"/ { $e2-left += $0; }; | |
when /:i(\d+) ' ' .*"@exercises[2]"/ { $e3-left += $0; }; | |
when /:i(\d+) ' ' .*"@exercises[3]"/ { $e4-left += $0; }; | |
} | |
} | |
} | |
# Easy mode, 52 cards, 95 reps per exercise | |
# Default mode, no alternations necessary; shared with hard. | |
else { | |
my $total += $_ for @numbers; | |
($e1-left, $e2-left, $e3-left, $e4-left) = $total xx 4; | |
} | |
# Shuffle and set up alternatives | |
@deck = @deck.pick(*); | |
for 0.. @deck.end -> $card_num { | |
if @deck[$card_num] ~~ /Push\-ups/ && $card_num % 2 == 0 { | |
@deck[$card_num] ~~ ss/Push\-ups/Diamond push\-ups/; | |
} | |
if @deck[$card_num] ~~ /Curl\-ups/ && $card_num % 2 == 0 { | |
my $amount = @deck[$card_num] ~~ /\d+/; | |
if $amount % 2 == 0 { | |
@deck[$card_num] ~~ ss/Curl\-ups/Twisting curl\-ups/; | |
} | |
} | |
} | |
# Main cycle | |
for 0 .. @deck.end -> $card_num { | |
my $remaining = @deck.elems - $card_num; | |
my $response = ' '; | |
say "Remaining: [@exercises[0]: $e1-left][@exercises[1]: $e2-left][@exercises[2]: $e3-left][@exercises[3]: $e4-left]"; | |
until ($response ~~ /:i ^y[es]?$ || ^n[o]?$ || ^$/) { | |
$response = prompt "Draw a card? ($remaining remaining) (Y/N)[Y] "; | |
} | |
if ($response !~~ /:i ^n[o]? $/) { | |
given @deck[$card_num] { | |
when /:i(\d+) ' ' .*"@exercises[0]"/ { $e1-left -= $0; $e1-count += $0; }; | |
when /:i(\d+) ' ' .*"@exercises[1]"/ { $e2-left -= $0; $e2-count += $0; }; | |
when /:i(\d+) ' ' .*"@exercises[2]"/ { $e3-left -= $0; $e3-count += $0; }; | |
when /:i(\d+) ' ' .*"@exercises[3]"/ { $e4-left -= $0; $e4-count += $0; }; | |
} | |
if '/usr/bin/figlet'.IO.e { | |
run '/usr/bin/figlet', "@deck[$card_num]"; | |
} | |
else { | |
@deck[$card_num].say; | |
} | |
} | |
else { | |
$supply.tap.close; | |
my $time_total = get_time(); | |
say "You finished $card_num reps in $time_total"; | |
say "You did $e1-count @exercises[0], $e2-count @exercises[1], $e3-count @exercises[2], and $e4-count @exercises[3]"; | |
exit; | |
} | |
} | |
say "Remaining: [@exercises[0]: $e1-left][@exercises[1]: $e2-left][@exercises[2]: $e3-left][@exercises[3]: $e4-left]"; | |
say "Press ENTER to finish"; | |
get; | |
$supply.tap.close; | |
my $time_total = get_time(); | |
say "Deck of pain completed in $time_total"; | |
say "You did $e1-count @exercises[0], $e2-count @exercises[1], $e3-count @exercises[2], and $e4-count @exercises[3]"; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment