diff options
| author | Dave Cross <dave@dave.org.uk> | 2020-03-16 09:57:50 +0000 |
|---|---|---|
| committer | Dave Cross <dave@dave.org.uk> | 2020-03-16 09:57:50 +0000 |
| commit | 53aea10d78fb0dbb5531f8af40ae9702d145e390 (patch) | |
| tree | fe266938f0ecd3b1479b1ef2f496c2a56731d21b | |
| parent | 2ccb0dbd53a07b9bf0d1e6314dacbf46f3f8473b (diff) | |
| download | perlweeklychallenge-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.pl | 38 | ||||
| -rw-r--r-- | challenge-052/dave-cross/perl/ch-02.pl | 50 |
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; +} |
