aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-114/mark-anderson/raku/ch-1.raku46
1 files changed, 46 insertions, 0 deletions
diff --git a/challenge-114/mark-anderson/raku/ch-1.raku b/challenge-114/mark-anderson/raku/ch-1.raku
new file mode 100644
index 0000000000..caecfd4270
--- /dev/null
+++ b/challenge-114/mark-anderson/raku/ch-1.raku
@@ -0,0 +1,46 @@
+#!/usr/bin/env raku
+
+use Test;
+plan 9;
+
+is next-palindrome-number(3), 4;
+is next-palindrome-number(9), 11;
+is next-palindrome-number(999), 1001;
+is next-palindrome-number(1234), 1331;
+is next-palindrome-number(1999), 2002;
+is next-palindrome-number(4321), 4334;
+is next-palindrome-number(4444), 4554;
+is next-palindrome-number(500006), 501105;
+is next-palindrome-number(90000056780000000000000), 90000056780008765000009;
+
+multi next-palindrome-number($N where * == 9) { 11 }
+
+multi next-palindrome-number($N)
+{
+ my ($left, $middle) = partition($N);
+ my $next = $left ~ $middle ~ $left.flip;
+
+ while $next <= $N
+ {
+ $next = ($left ~ $middle) + 1;
+ $next ~= $next.substr(^$left.chars).flip;
+ }
+
+ $next;
+}
+
+sub partition($N)
+{
+ my @N = $N.comb;
+ my $mid = @N.elems div 2;
+ my @left = @N[^$mid];
+ my $middle = q{};
+ my @right = @N[$mid..*];
+
+ unless @left.end == @right.end
+ {
+ $middle = @right.shift;
+ }
+
+ @left.join, $middle;
+}