next_palindrome_in_base.sf 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #!/usr/bin/ruby
  2. # A nice algorithm, due to David A. Corneth (Jun 06 2014), for generating the next palindrome from a given palindrome.
  3. # Generalized to other bases by Daniel Suteu (Sep 16 2019).
  4. # See also:
  5. # https://oeis.org/A002113
  6. # https://en.wikipedia.org/wiki/Palindromic_number
  7. func next_palindrome (n, b=10) {
  8. var d = n.digits(b)
  9. var l = d.end
  10. var i = (((d.len+1)>>1) - 1)
  11. while ((i >= 0) && (d[i] == b-1)) {
  12. d[i,l-i] = (0,0)
  13. --i
  14. }
  15. if (i >= 0) {
  16. d[i]++
  17. d[l-i] = d[i]
  18. }
  19. else {
  20. d = (d.len+1).of(0)
  21. d[0,-1] = (1,1)
  22. }
  23. d.digits2num(b)
  24. }
  25. for b in (2 .. 12) {
  26. var a = with (1) { |n|
  27. 20.of { n = next_palindrome(n, b) }
  28. }
  29. say a
  30. }
  31. __END__
  32. # Palindromes in bases 2 to 12:
  33. [3, 5, 7, 9, 15, 17, 21, 27, 31, 33, 45, 51, 63, 65, 73, 85, 93, 99, 107, 119]
  34. [2, 4, 8, 10, 13, 16, 20, 23, 26, 28, 40, 52, 56, 68, 80, 82, 91, 100, 112, 121]
  35. [2, 3, 5, 10, 15, 17, 21, 25, 29, 34, 38, 42, 46, 51, 55, 59, 63, 65, 85, 105]
  36. [2, 3, 4, 6, 12, 18, 24, 26, 31, 36, 41, 46, 52, 57, 62, 67, 72, 78, 83, 88]
  37. [2, 3, 4, 5, 7, 14, 21, 28, 35, 37, 43, 49, 55, 61, 67, 74, 80, 86, 92, 98]
  38. [2, 3, 4, 5, 6, 8, 16, 24, 32, 40, 48, 50, 57, 64, 71, 78, 85, 92, 100, 107]
  39. [2, 3, 4, 5, 6, 7, 9, 18, 27, 36, 45, 54, 63, 65, 73, 81, 89, 97, 105, 113]
  40. [2, 3, 4, 5, 6, 7, 8, 10, 20, 30, 40, 50, 60, 70, 80, 82, 91, 100, 109, 118]
  41. [2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101, 111, 121]
  42. [2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 122]
  43. [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 26, 39, 52, 65, 78, 91, 104, 117, 130]