From 0a842e6c7df97d70d075d08e4520a6b2bf4d50f2 Mon Sep 17 00:00:00 2001 From: Jörg Sommrey <28217714+jo-37@users.noreply.github.com> Date: Mon, 11 Jan 2021 14:07:16 +0100 Subject: Solution to task 1 --- challenge-095/jo-37/perl/ch-1.pl | 113 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100755 challenge-095/jo-37/perl/ch-1.pl diff --git a/challenge-095/jo-37/perl/ch-1.pl b/challenge-095/jo-37/perl/ch-1.pl new file mode 100755 index 0000000000..f3c19491d6 --- /dev/null +++ b/challenge-095/jo-37/perl/ch-1.pl @@ -0,0 +1,113 @@ +#!/usr/bin/perl -s + +use v5.16; +use Test2::V0; +use warnings FATAL => 'all'; +use Scalar::Util 'looks_like_number'; +use experimental 'signatures'; + +our ($tests, $examples, $verbose); + +run_tests() if $tests || $examples; # does not return + +say(<stringify->reverse->numify->stringify +# resembles the input string. (All transformations from a Perl view.) +# +# This sub uses different false return values to signal the failed test: +# - undef for a non-numeric input string +# - the empty string for a non-numeric reversed numified input string +# - zero for a numeric forward and backward value that is not a palindrome +# number +sub palindrome_number ($str) { + return unless looks_like_number $str; + my $reverse = reverse $str + 0; + return '' unless looks_like_number $reverse; + + 0 + ($str eq $reverse + 0); +} + +### Examples and tests + +sub run_tests { + SKIP: { + skip "examples" unless $examples; + ok palindrome_number(1221), 'example 1: 1221 is palindrome'; + ok !palindrome_number(-101), 'example 2: -101 is not palindrome'; + ok !palindrome_number(90), 'example 3: 90 is not palindrome'; + } + + SKIP: { + skip "tests" unless $tests; + for my $str (qw(21e12 1.221e3 0012100 00121 0012.2100)) { + ok !palindrome_number($str), "$str is not palindrome"; + } + for my $str (qw(12.21 1221)) { + ok palindrome_number($str), "$str is palindrome"; + } + + # specific return codes + is palindrome_number('1O2O1'), U(), 'not a number'; + is palindrome_number('-101'), '', 'reverse not a number'; + is palindrome_number('1e-21'), '', 'reverse not a number'; + is palindrome_number('12327'), 0, 'not palindrome'; + is palindrome_number('+121.0'), 0, 'not palindrome'; + is palindrome_number('121'), 1, 'palindrome'; + + # exotic cases: NaN vs. nan + is palindrome_number('NaN'), 0, 'NaN is numeric'; + is palindrome_number('nan'), 1, 'possibly the strangest case'; + } + + done_testing; + exit; +} -- cgit