aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Cross <dave@dave.org.uk>2020-03-16 09:57:50 +0000
committerDave Cross <dave@dave.org.uk>2020-03-16 09:57:50 +0000
commit53aea10d78fb0dbb5531f8af40ae9702d145e390 (patch)
treefe266938f0ecd3b1479b1ef2f496c2a56731d21b
parent2ccb0dbd53a07b9bf0d1e6314dacbf46f3f8473b (diff)
downloadperlweeklychallenge-club-53aea10d78fb0dbb5531f8af40ae9702d145e390.tar.gz
perlweeklychallenge-club-53aea10d78fb0dbb5531f8af40ae9702d145e390.tar.bz2
perlweeklychallenge-club-53aea10d78fb0dbb5531f8af40ae9702d145e390.zip
Challenge #52
-rw-r--r--challenge-052/dave-cross/perl/ch-01.pl38
-rw-r--r--challenge-052/dave-cross/perl/ch-02.pl50
2 files changed, 88 insertions, 0 deletions
diff --git a/challenge-052/dave-cross/perl/ch-01.pl b/challenge-052/dave-cross/perl/ch-01.pl
new file mode 100644
index 0000000000..5e52ac3e2c
--- /dev/null
+++ b/challenge-052/dave-cross/perl/ch-01.pl
@@ -0,0 +1,38 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use feature 'say';
+
+use File::Basename;
+
+my ($start, $end) = get_params();
+
+for ($start .. $end) {
+ say "$_ is a stepping number" if is_stepping($_);
+}
+
+sub is_stepping {
+ my ($x) = @_;
+
+ my @digits = split //, $x;
+ for (0, 1) {
+ return if $digits[$_] + 1 != $digits[$_ + 1];
+ }
+ return 1;
+}
+
+sub get_params {
+ my $me = basename $0;
+ my $usage = "Usage: $me start end\n";
+ $usage .= "(where 'start' and 'end' are integers between 100 and 999)\n";
+
+ die $usage if @ARGV < 2;
+
+ for (@ARGV) {
+ die $usage if /\D/;
+ die $usage if length != 3;
+ }
+
+ return sort { $a <=> $b } @ARGV;
+}
diff --git a/challenge-052/dave-cross/perl/ch-02.pl b/challenge-052/dave-cross/perl/ch-02.pl
new file mode 100644
index 0000000000..c71ecde8f1
--- /dev/null
+++ b/challenge-052/dave-cross/perl/ch-02.pl
@@ -0,0 +1,50 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use feature 'say';
+
+my @coins = qw[£1 50p 1p 10p 5p 20p £2 2p];
+my @amts = map { coin2amt($_) } @coins;
+
+my ($player1, $player2);
+my $turn = 1;
+
+while (@amts) {
+ if ($turn %2) {
+ say "Player 1 ...";
+ $player1 += pick_coin(\@amts);
+ say "... has ", amt2coins($player1);
+ } else {
+ say "Player 2 ...";
+ $player2 += pick_coin(\@amts);
+ say "... has ", amt2coins($player2);
+ }
+ $turn++;
+}
+
+say "Player one has: ", amt2coins($player1);
+say "Player two has: ", amt2coins($player2);
+
+sub pick_coin {
+ my ($remaining) = @_;
+
+ if ($remaining->[0] > $remaining->[-1]) {
+ say "... takes ", amt2coins($remaining->[0]);
+ return shift @$remaining;
+ } else {
+ say "... takes ", amt2coins($remaining->[-1]);
+ return pop @$remaining;
+ }
+}
+
+sub coin2amt {
+ $_[0] =~ s/p$//;
+ $_[0] =~ s/£(\d+)/100*$1/e;
+
+ return $_[0];
+}
+
+sub amt2coins {
+ return $_[0] < 100 ? "$_[0]p" : '£' . $_[0]/100;
+}