aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJörg Sommrey <28217714+jo-37@users.noreply.github.com>2024-08-23 14:15:37 +0200
committerJörg Sommrey <28217714+jo-37@users.noreply.github.com>2024-08-23 14:59:31 +0200
commite2c14ad063aa499b6587fc93bd9a0f64ffbd36ea (patch)
treebddcd36d9b6d391e21d6a1074248437d5f7b1b71
parent51e4b5293155ac6d00aaea883ad885aa8d899876 (diff)
downloadperlweeklychallenge-club-e2c14ad063aa499b6587fc93bd9a0f64ffbd36ea.tar.gz
perlweeklychallenge-club-e2c14ad063aa499b6587fc93bd9a0f64ffbd36ea.tar.bz2
perlweeklychallenge-club-e2c14ad063aa499b6587fc93bd9a0f64ffbd36ea.zip
Solution to task 1
-rwxr-xr-xchallenge-283/jo-37/perl/ch-1.pl68
1 files changed, 68 insertions, 0 deletions
diff --git a/challenge-283/jo-37/perl/ch-1.pl b/challenge-283/jo-37/perl/ch-1.pl
new file mode 100755
index 0000000000..aec6b0b309
--- /dev/null
+++ b/challenge-283/jo-37/perl/ch-1.pl
@@ -0,0 +1,68 @@
+#!/usr/bin/perl -s
+
+use v5.24;
+use Test2::V0;
+
+our ($tests, $examples);
+
+
+run_tests() if $tests || $examples; # does not return
+
+die <<EOS unless @ARGV;
+usage: $0 [-examples] [-tests] [N...]
+
+-examples
+ run the examples from the challenge
+
+-tests
+ run some tests
+
+N...
+ list of integers
+
+EOS
+
+
+### Input and Output
+
+say unique_number(@ARGV) // 'no single unique number';
+
+
+### Implementation
+#
+# For details see:
+# https://github.sommrey.de/the-bears-den/2024/08/23/ch-283.html#task-1
+
+sub unique_number {
+ my ($sum, $cnt, %seen) = (0, 0);
+ ($seen{$_}, $sum, $cnt) = exists $seen{$_} ?
+ (0, $sum - $seen{$_} * $_, $cnt - $seen{$_}) :
+ (1, $sum + $_, $cnt + 1) for @_;
+
+ $cnt == 1 ? $sum : undef;
+}
+
+
+### Examples and tests
+
+sub run_tests {
+ SKIP: {
+ skip "examples" unless $examples;
+ is unique_number(3, 3, 1), 1, 'example 1';
+ is unique_number(3, 2, 4, 2, 4), 3, 'example 2';
+ is unique_number(1), 1, 'example 3';
+ is unique_number(4, 3, 1, 1, 1, 4), 3, 'example 4';
+ }
+
+ SKIP: {
+ skip "tests" unless $tests;
+
+ is unique_number(1, 2, 3, 3), U(),
+ 'multiple unique values';
+ is unique_number(1, 2, 3, 3, 2, 1), U(), 'no unique value';
+ is unique_number(-2, -1, 0, -2 , 0), -1, 'negative';
+ }
+
+ done_testing;
+ exit;
+}