4c53181624
FossilOrigin-Name: a7e5fe4c71047a01a833ce31583ef5597f3f0235c5a2fab90e55f07510bc0bf5
66 lines
1.6 KiB
Forth
66 lines
1.6 KiB
Forth
# palindromic-numbers.retro
|
|
|
|
## Description
|
|
|
|
December: Palindromic numbers
|
|
|
|
Palindromic Numbers: The programming challenge for the Saturday, Dec. 19
|
|
Silicon Valley Forth Interest Group meeting. Numbers the same forward
|
|
and backward as for RADAR but with numbers. Such as 88 and 666 and
|
|
12321.
|
|
|
|
Program a generator or a filter to find all palindromic integers from
|
|
1 (yes, it is) to 99999. Please confirm your interest to Bill Ragsdale,
|
|
bill@billragsdale.cc
|
|
|
|
## Code & Commentary
|
|
|
|
Well this is really easy. I begin by creating an array of potential
|
|
values.
|
|
|
|
~~~
|
|
#100000 [ I n:inc , ]
|
|
'Potentials d:create over , indexed-times
|
|
~~~
|
|
|
|
Then a simple `palindrome?` word to convert the number to a string and
|
|
return a flag indicating if it's a palindrome.
|
|
|
|
~~~
|
|
:palindrome? n:to-string dup s:reverse s:eq? ;
|
|
~~~
|
|
|
|
Use `palindrome?` to filter out invalid values.
|
|
|
|
~~~
|
|
&Potentials [ palindrome? ] a:filter
|
|
~~~
|
|
|
|
And finally, display the palindromes.
|
|
|
|
~~~
|
|
[ n:put nl ] a:for-each
|
|
~~~
|
|
|
|
## Notes
|
|
|
|
*Numeric Bases*
|
|
|
|
While Retro only supports decimal values by default, if you have
|
|
extended `n:to-string` to support a `Base`, this will still work with
|
|
other bases.
|
|
|
|
*Memory Use*
|
|
|
|
In my tests, this isn't memory efficient, as I'm keeping both the list
|
|
of potentials and the results in memory, so it ends up consuming about
|
|
101k memory locations. If the results don't need to be kept, a much
|
|
smaller solution would look like:
|
|
|
|
:palindrome? n:to-string dup s:reverse s:eq? ;
|
|
:value I n:inc dup ;
|
|
:process [ n:put nl ] &drop choose ;
|
|
|
|
#100000 [ value palindrome? process ] indexed-times
|
|
|
|
This only uses 74 memory locations.
|