diff options
| author | BarrOff <58253563+BarrOff@users.noreply.github.com> | 2024-09-29 23:16:02 +0200 |
|---|---|---|
| committer | BarrOff <58253563+BarrOff@users.noreply.github.com> | 2024-09-29 23:16:02 +0200 |
| commit | 7b3cd5bfc61dbf5d2b038bc2dae9c932a81ffbec (patch) | |
| tree | 42e6bc1f7146557e9ddf835f54cc6c372bf07789 | |
| parent | 1d33e6293b7f2829eb3815cecc2112812dbc69b6 (diff) | |
| download | perlweeklychallenge-club-7b3cd5bfc61dbf5d2b038bc2dae9c932a81ffbec.tar.gz perlweeklychallenge-club-7b3cd5bfc61dbf5d2b038bc2dae9c932a81ffbec.tar.bz2 perlweeklychallenge-club-7b3cd5bfc61dbf5d2b038bc2dae9c932a81ffbec.zip | |
feat: add solution for challenge 288 from BarrOff
| -rw-r--r-- | challenge-288/barroff/raku/ch-1.p6 | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/challenge-288/barroff/raku/ch-1.p6 b/challenge-288/barroff/raku/ch-1.p6 new file mode 100644 index 0000000000..9c7c0bc51c --- /dev/null +++ b/challenge-288/barroff/raku/ch-1.p6 @@ -0,0 +1,40 @@ +#!/usr/bin/env raku + +use v6.d; + +sub is-palindrome($word --> Bool) { + $word eq $word.flip; +} + +sub find-palindrome($str, &mod) { + my $mod-str = &mod($str); + return $mod-str if is-palindrome($mod-str); + return find-palindrome($mod-str, &mod); +} + +sub closest-palindrome(Str $str --> Str) { + my &dec-one = -> $x { $x - 1 }; + my &inc-one = -> $x { $x + 1 }; + my $lower-palindrome = find-palindrome($str, &dec-one); + my $upper-palindrome = find-palindrome($str, &inc-one); + + $str - $lower-palindrome <= $upper-palindrome - $str + ?? Str($lower-palindrome) + !! Str($upper-palindrome); +} + +#| Run test cases +multi sub MAIN('test') { + use Test; + plan 4; + + is closest-palindrome("123"), "121", 'works for "123"'; + is closest-palindrome("2"), "1", 'works for "2"'; + is closest-palindrome("1400"), "1441", 'works for "1400"'; + is closest-palindrome("1001"), "999", 'works for "1001"'; +} + +#| Take user provided string like "1400" +multi sub MAIN(Str $str) { + say closest-palindrome($str); +} |
