Skip to content

Instantly share code, notes, and snippets.

@samcv
Created July 5, 2017 05:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save samcv/9ed8322b4c9e1a40e1f3df495d8cee1d to your computer and use it in GitHub Desktop.
Save samcv/9ed8322b4c9e1a40e1f3df495d8cee1d to your computer and use it in GitHub Desktop.
#!/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