aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad Sajid Anwar <Mohammad.Anwar@yahoo.com>2024-03-18 16:53:59 +0000
committerGitHub <noreply@github.com>2024-03-18 16:53:59 +0000
commit796494ac72db533a43e4345c68fa1d307477f5dc (patch)
treedbf2cc44cbcffc935d343507b5ab8383f630c367
parente898c4a2e23971a7d2f46b6e992e2eec563edbfe (diff)
parent212e2e6526d40477e2c89106aa3e25da4a51ad46 (diff)
downloadperlweeklychallenge-club-796494ac72db533a43e4345c68fa1d307477f5dc.tar.gz
perlweeklychallenge-club-796494ac72db533a43e4345c68fa1d307477f5dc.tar.bz2
perlweeklychallenge-club-796494ac72db533a43e4345c68fa1d307477f5dc.zip
Merge pull request #9771 from pme/challenge-236
challenge-236
-rwxr-xr-xchallenge-236/peter-meszaros/perl/ch-1.pl88
-rwxr-xr-xchallenge-236/peter-meszaros/perl/ch-2.pl85
2 files changed, 173 insertions, 0 deletions
diff --git a/challenge-236/peter-meszaros/perl/ch-1.pl b/challenge-236/peter-meszaros/perl/ch-1.pl
new file mode 100755
index 0000000000..345d5eeb55
--- /dev/null
+++ b/challenge-236/peter-meszaros/perl/ch-1.pl
@@ -0,0 +1,88 @@
+#!/usr/bin/env perl
+#
+# You are asked to sell juice each costs $5. You are given an array of bills.
+# You can only sell ONE juice to each customer but make sure you return exact
+# change back. You only have $5, $10 and $20 notes. You do not have any change in
+# hand at first.
+#
+# Write a script to find out if it is possible to sell to each customers with
+# correct change.
+# Example 1
+#
+# Input: @bills = (5, 5, 5, 10, 20)
+# Output: true
+#
+# From the first 3 customers, we collect three $5 bills in order.
+# From the fourth customer, we collect a $10 bill and give back a $5.
+# From the fifth customer, we give a $10 bill and a $5 bill.
+# Since all customers got correct change, we output true.
+#
+# Example 2
+#
+# Input: @bills = (5, 5, 10, 10, 20)
+# Output: false
+#
+# From the first two customers in order, we collect two $5 bills.
+# For the next two customers in order, we collect a $10 bill and give back a $5 bill.
+# For the last customer, we can not give the change of $15 back because we only
+# have two $10 bills.
+# Since not every customer received the correct change, the answer is false.
+#
+# Example 3
+#
+# Input: @bills = (5, 5, 5, 20)
+# Output: true
+#
+
+use strict;
+use warnings;
+use Test2::V0 -no_srand => 1;
+use Data::Dumper;
+
+my $cases = [
+ [5, 5, 5, 10, 20],
+ [5, 5, 10, 10, 20],
+ [5, 5, 5, 20],
+];
+
+sub exact_change
+{
+ my $bill = shift;
+
+ my %change = (
+ 5 => 0,
+ 10 => 0,
+ 20 => 0,
+ );
+ my $ret = 1;
+ for my $bill (@$bill) {
+ ++$change{$bill};
+ if ($bill == 10) {
+ if ($change{5}) {
+ --$change{5};
+ } else {
+ $ret = 0;
+ last;
+ }
+ } elsif ($bill == 20) {
+ if ($change{5} && $change{10}) {
+ --$change{5};
+ --$change{10};
+ } elsif ($change{5} >= 3) {
+ $change{5} -= 3;
+ } else {
+ $ret = 0;
+ last;
+ }
+ }
+ }
+
+ return $ret;
+}
+
+is(exact_change($cases->[0]), 1, 'Example 1');
+is(exact_change($cases->[1]), 0, 'Example 2');
+is(exact_change($cases->[2]), 1, 'Example 3');
+done_testing();
+
+exit 0;
diff --git a/challenge-236/peter-meszaros/perl/ch-2.pl b/challenge-236/peter-meszaros/perl/ch-2.pl
new file mode 100755
index 0000000000..d258a37fbc
--- /dev/null
+++ b/challenge-236/peter-meszaros/perl/ch-2.pl
@@ -0,0 +1,85 @@
+#!/usr/bin/env perl
+#
+# You are given an array of unique integers.
+#
+# Write a script to determine how many loops are in the given array.
+#
+# To determine a loop: Start at an index and take the number at #
+# array[index] and then proceed to that index and continue this until you end up
+# at the starting index.
+#
+#
+# Example 1
+#
+# Input: @ints = (4,6,3,8,15,0,13,18,7,16,14,19,17,5,11,1,12,2,9,10)
+# Output: 3
+#
+# To determine the 1st loop, start at index 0, the number at that index is 4,
+# proceed to index 4, the number at that index is 15, proceed to index 15 and so
+# on until you're back at index 0.
+#
+# Loops are as below:
+# [4 15 1 6 13 5 0]
+# [3 8 7 18 9 16 12 17 2]
+# [14 11 19 10]
+#
+# Example 2
+#
+# Input: @ints = (0,1,13,7,6,8,10,11,2,14,16,4,12,9,17,5,3,18,15,19)
+# Output: 6
+#
+# Loops are as below:
+# [0]
+# [1]
+# [13 9 14 17 18 15 5 8 2]
+# [7 11 4 6 10 16 3]
+# [12]
+# [19]
+#
+# Example 3
+#
+# Input: @ints = (9,8,3,11,5,7,13,19,12,4,14,10,18,2,16,1,0,15,6,17)
+# Output: 1
+#
+# Loop is as below:
+# [9 4 5 7 19 17 15 1 8 12 18 6 13 2 3 11 10 14 16 0]
+#
+
+use strict;
+use warnings;
+use Test2::V0 -no_srand => 1;
+use Data::Dumper;
+
+my $cases = [
+ #0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
+ [4, 6, 3, 8, 15, 0, 13, 18, 7, 16, 14, 19, 17, 5, 11, 1, 12, 2, 9, 10],
+ [0, 1, 13, 7, 6, 8, 10, 11, 2, 14, 16, 4, 12, 9, 17, 5, 3, 18, 15, 19],
+ [9, 8, 3, 11, 5, 7, 13, 19, 12, 4, 14, 10, 18, 2, 16, 1, 0, 15, 6, 17],
+];
+
+sub array_loops
+{
+ my $l = shift;
+
+ my $nloop = 0;
+ my %visited;
+ for my $start (0..$#$l) {
+ next if defined $visited{$start};
+ my $next = $l->[$start];
+ while ($next != $start || not defined $visited{$next}) {
+ ++$visited{$next};
+ $next = $l->[$next];
+ }
+ ++$nloop if $next == $start;
+ }
+
+ return $nloop;
+}
+
+is(array_loops($cases->[0]), 3, 'Example 1');
+is(array_loops($cases->[1]), 6, 'Example 2');
+is(array_loops($cases->[2]), 1, 'Example 3');
+done_testing();
+
+exit 0;
+