Data update
This commit is contained in:
parent
5150844a7d
commit
4bb20c9b71
7735 changed files with 38060 additions and 199180 deletions
|
|
@ -28,7 +28,7 @@ F listEsths(Int64 n1, n2, m1, m2; perLine, all)
|
|||
@dfs(n, m, i1)
|
||||
@dfs(n, m, i2)
|
||||
|
||||
L(i) 10
|
||||
L(i) 0.<10
|
||||
dfs(n2, m2, i)
|
||||
|
||||
print(‘Base 10: ’esths.len‘ esthetic numbers between ’n1‘ and ’m1‘:’)
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ findEsthetics: function [base][
|
|||
|
||||
cnt: 0
|
||||
i: 1
|
||||
result: new []
|
||||
result: []
|
||||
while [cnt < limUp][
|
||||
if esthetic? i base [
|
||||
cnt: cnt + 1
|
||||
|
|
|
|||
|
|
@ -1,33 +1,21 @@
|
|||
func$ to n b .
|
||||
digs$ = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||
if n = 0
|
||||
return 0
|
||||
.
|
||||
s$ = ""
|
||||
if n = 0 : return 0
|
||||
while n > 0
|
||||
idx = n mod b + 1
|
||||
d = n mod b
|
||||
n = n div b
|
||||
s$ = substr digs$ idx 1 & s$
|
||||
d += 48
|
||||
if d >= 58 : d += 7
|
||||
s$ = strchar d & s$
|
||||
.
|
||||
return s$
|
||||
.
|
||||
func uabs a b .
|
||||
if a > b
|
||||
return a - b
|
||||
.
|
||||
return b - a
|
||||
.
|
||||
func isEsthetic n b .
|
||||
if n = 0
|
||||
return 0
|
||||
.
|
||||
func esthetic n b .
|
||||
if n = 0 : return 0
|
||||
i = n mod b
|
||||
n = n div b
|
||||
while n > 0
|
||||
j = n mod b
|
||||
if uabs i j <> 1
|
||||
return 0
|
||||
.
|
||||
if abs (i - j) <> 1 : return 0
|
||||
n = n div b
|
||||
i = j
|
||||
.
|
||||
|
|
@ -38,11 +26,9 @@ for b = 2 to 16
|
|||
n = 1
|
||||
c = 0
|
||||
while c < 6 * b
|
||||
if isEsthetic n b = 1
|
||||
if esthetic n b = 1
|
||||
c += 1
|
||||
if c >= 4 * b
|
||||
write to n b & " "
|
||||
.
|
||||
if c >= 4 * b : write to n b & " "
|
||||
.
|
||||
n += 1
|
||||
.
|
||||
|
|
@ -51,7 +37,5 @@ for b = 2 to 16
|
|||
.
|
||||
print "Base 10 esthetic numbers between 1000 and 9999:"
|
||||
for i = 1000 to 9999
|
||||
if isEsthetic i 10 = 1
|
||||
write i & " "
|
||||
.
|
||||
if esthetic i 10 = 1 : write i & " "
|
||||
.
|
||||
|
|
|
|||
|
|
@ -1,71 +1,71 @@
|
|||
(phixonline)-->
|
||||
<span style="color: #008080;">constant</span> <span style="color: #000000;">aleph</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"0123456789ABCDEF"</span>
|
||||
with javascript_semantics
|
||||
constant aleph = "0123456789ABCDEF"
|
||||
|
||||
<span style="color: #008080;">function</span> <span style="color: #000000;">efill</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">ch</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000080;font-style:italic;">-- min-fill, like 10101 or 54321 or 32101</span>
|
||||
<span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">ch</span>
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">=</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #000000;">ch</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ch</span><span style="color: #0000FF;">>=</span><span style="color: #008000;">'1'</span><span style="color: #0000FF;">?</span><span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ch</span><span style="color: #0000FF;">=</span><span style="color: #008000;">'A'</span><span style="color: #0000FF;">?</span><span style="color: #008000;">'9'</span><span style="color: #0000FF;">:</span><span style="color: #000000;">ch</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">):</span><span style="color: #008000;">'1'</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">ch</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #000000;">s</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
|
||||
function efill(string s, integer ch, i)
|
||||
-- min-fill, like 10101 or 54321 or 32101
|
||||
s[i] = ch
|
||||
for j=i+1 to length(s) do
|
||||
ch = iff(ch>='1'?iff(ch='A'?'9':ch-1):'1')
|
||||
s[j] = ch
|
||||
end for
|
||||
return s
|
||||
end function
|
||||
|
||||
<span style="color: #008080;">function</span> <span style="color: #000000;">esthetic</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">base</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">10</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000080;font-style:italic;">-- generate the next esthetic number after s
|
||||
-- (nb unpredictable results if s is not esthetic, or "")</span>
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">to</span> <span style="color: #000000;">1</span> <span style="color: #008080;">by</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">ch</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">cp</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">></span><span style="color: #000000;">1</span><span style="color: #0000FF;">?</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]:</span><span style="color: #008000;">'0'</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">ch</span><span style="color: #0000FF;"><</span><span style="color: #000000;">cp</span> <span style="color: #008080;">and</span> <span style="color: #000000;">cp</span><span style="color: #0000FF;"><</span><span style="color: #000000;">aleph</span><span style="color: #0000FF;">[</span><span style="color: #000000;">base</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #000000;">efill</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">aleph</span><span style="color: #0000FF;">[</span><span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ch</span><span style="color: #0000FF;">,</span><span style="color: #000000;">aleph</span><span style="color: #0000FF;">)+</span><span style="color: #000000;">2</span><span style="color: #0000FF;">],</span><span style="color: #000000;">i</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">elsif</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">and</span> <span style="color: #000000;">ch</span><span style="color: #0000FF;"><</span><span style="color: #000000;">aleph</span><span style="color: #0000FF;">[</span><span style="color: #000000;">base</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #000000;">efill</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ch</span><span style="color: #0000FF;">=</span><span style="color: #008000;">'9'</span><span style="color: #0000FF;">?</span><span style="color: #008000;">'A'</span><span style="color: #0000FF;">:</span><span style="color: #000000;">ch</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">),</span><span style="color: #000000;">i</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #000000;">efill</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"1"</span><span style="color: #0000FF;">&</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #008000;">'1'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
|
||||
function esthetic(string s, integer base = 10)
|
||||
-- generate the next esthetic number after s
|
||||
-- the special case of s="" always yields "1"
|
||||
-- (nb otherwise s is assumed to be esthetic)
|
||||
for i=length(s) to 1 by -1 do
|
||||
integer ch = s[i], cp = iff(i>1?s[i-1]:'0')
|
||||
if ch<cp and cp<aleph[base] then
|
||||
return efill(s,aleph[find(ch,aleph)+2],i)
|
||||
elsif i=1 and ch<aleph[base] then
|
||||
return efill(s,iff(ch='9'?'A':ch+1),i)
|
||||
end if
|
||||
end for
|
||||
return efill("1"&s,'1',1)
|
||||
end function
|
||||
|
||||
<span style="color: #004080;">string</span> <span style="color: #000000;">s</span>
|
||||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">res</span>
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">base</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #000000;">16</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">hi</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">base</span><span style="color: #0000FF;">*</span><span style="color: #000000;">6</span><span style="color: #0000FF;">,</span>
|
||||
<span style="color: #000000;">lo</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">base</span><span style="color: #0000FF;">*</span><span style="color: #000000;">4</span>
|
||||
<span style="color: #0000FF;">{</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">res</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">""</span><span style="color: #0000FF;">,{}}</span>
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">hi</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">esthetic</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">base</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">>=</span><span style="color: #000000;">lo</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">shorten</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"numbers"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">))</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Base %d esthetic numbers[%d..%d]: %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">base</span><span style="color: #0000FF;">,</span><span style="color: #000000;">lo</span><span style="color: #0000FF;">,</span><span style="color: #000000;">hi</span><span style="color: #0000FF;">,</span><span style="color: #000000;">res</span><span style="color: #0000FF;">})</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
string s
|
||||
sequence res
|
||||
for base=2 to 16 do
|
||||
integer hi = base*6,
|
||||
lo = base*4
|
||||
{s,res} = {"",{}}
|
||||
for i=1 to hi do
|
||||
s = esthetic(s, base)
|
||||
if i>=lo then
|
||||
res = append(res,s)
|
||||
end if
|
||||
end for
|
||||
res = join(shorten(res,"numbers",4))
|
||||
printf(1,"Base %d esthetic numbers[%d..%d]: %s\n",{base,lo,hi,res})
|
||||
end for
|
||||
|
||||
<span style="color: #0000FF;">{</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">res</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">efill</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"1000"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">'1'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">),{}}</span>
|
||||
<span style="color: #008080;">while</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">4</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">esthetic</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
|
||||
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">shorten</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"numbers"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">))}</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\nBase 10 esthetic numbers between 1,000 and 9,999: %s\n\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">res</span><span style="color: #0000FF;">)</span>
|
||||
{s,res} = {efill("1000",'1',1),{}}
|
||||
while length(s)=4 do
|
||||
res = append(res,s)
|
||||
s = esthetic(s)
|
||||
end while
|
||||
res = {join(shorten(res,"numbers",5))}
|
||||
printf(1,"\nBase 10 esthetic numbers between 1,000 and 9,999: %s\n\n",res)
|
||||
|
||||
<span style="color: #008080;">function</span> <span style="color: #000000;">comma</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)-</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #000000;">2</span> <span style="color: #008080;">by</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">3</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">..</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">","</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #000000;">s</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
|
||||
function comma(string s)
|
||||
for i=length(s)-2 to 2 by -3 do
|
||||
s[i..i-1] = ","
|
||||
end for
|
||||
return s
|
||||
end function
|
||||
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">=</span><span style="color: #000000;">7</span> <span style="color: #008080;">to</span> <span style="color: #000000;">19</span> <span style="color: #008080;">by</span> <span style="color: #000000;">3</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #004080;">string</span> <span style="color: #000000;">f</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"10"</span><span style="color: #0000FF;">&</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'0'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">k</span><span style="color: #0000FF;">),</span>
|
||||
<span style="color: #000000;">t</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"13"</span><span style="color: #0000FF;">&</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'0'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">k</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #0000FF;">{</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">res</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">efill</span><span style="color: #0000FF;">(</span><span style="color: #000000;">f</span><span style="color: #0000FF;">,</span><span style="color: #008000;">'1'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">),{}}</span>
|
||||
<span style="color: #008080;">while</span> <span style="color: #000000;">s</span><span style="color: #0000FF;"><</span><span style="color: #000000;">t</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">esthetic</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
|
||||
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">shorten</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"numbers"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">))</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Base 10 esthetic numbers between %s and %s: %s\n"</span><span style="color: #0000FF;">,</span>
|
||||
<span style="color: #0000FF;">{</span><span style="color: #000000;">comma</span><span style="color: #0000FF;">(</span><span style="color: #000000;">f</span><span style="color: #0000FF;">),</span><span style="color: #000000;">comma</span><span style="color: #0000FF;">(</span><span style="color: #000000;">t</span><span style="color: #0000FF;">),</span><span style="color: #000000;">res</span><span style="color: #0000FF;">})</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
<!--
|
||||
for k=7 to 19 by 3 do
|
||||
string f = "10"&repeat('0',k),
|
||||
t = "13"&repeat('0',k)
|
||||
{s,res} = {efill(f,'1',1),{}}
|
||||
while s<t do
|
||||
res = append(res,s)
|
||||
s = esthetic(s)
|
||||
end while
|
||||
res = join(shorten(res,"numbers",1))
|
||||
printf(1,"Base 10 esthetic numbers between %s and %s: %s\n",
|
||||
{comma(f),comma(t),res})
|
||||
end for
|
||||
|
|
|
|||
|
|
@ -1,21 +1,19 @@
|
|||
(phixonline)-->
|
||||
<span style="color: #008080;">function</span> <span style="color: #000000;">count_esthetic</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">len</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">start</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000080;font-style:italic;">-- a start digit of 0 means sum all 1..9</span>
|
||||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">dc</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">10</span><span style="color: #0000FF;">),</span><span style="color: #000000;">len</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- nb 0..9 logically</span>
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #000000;">len</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">d</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">9</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #000000;">dc</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">][</span><span style="color: #000000;">d</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">d</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">?</span><span style="color: #000000;">0</span><span style="color: #0000FF;">:</span><span style="color: #000000;">dc</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">d</span><span style="color: #0000FF;">])</span> <span style="color: #0000FF;">+</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">d</span><span style="color: #0000FF;">=</span><span style="color: #000000;">9</span><span style="color: #0000FF;">?</span><span style="color: #000000;">0</span><span style="color: #0000FF;">:</span><span style="color: #000000;">dc</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">d</span><span style="color: #0000FF;">+</span><span style="color: #000000;">2</span><span style="color: #0000FF;">])</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">start</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #7060A8;">sum</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dc</span><span style="color: #0000FF;">[</span><span style="color: #000000;">len</span><span style="color: #0000FF;">][</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">9</span><span style="color: #0000FF;">])</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> <span style="color: #000080;font-style:italic;">-- (see note)</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #000000;">dc</span><span style="color: #0000FF;">[</span><span style="color: #000000;">len</span><span style="color: #0000FF;">][</span><span style="color: #000000;">start</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
|
||||
function count_esthetic(integer len, start=0)
|
||||
-- a start digit of 0 means sum all 1..9
|
||||
sequence dc = repeat(repeat(1,10),len) -- nb 0..9 logically
|
||||
for i=2 to len do
|
||||
for d=0 to 9 do
|
||||
dc[i][d+1] = iff(d=0?0:dc[i-1][d]) + iff(d=9?0:dc[i-1][d+2])
|
||||
end for
|
||||
end for
|
||||
if start=0 then return sum(dc[len][1..9]) end if -- (see note)
|
||||
return dc[len][start+1]
|
||||
end function
|
||||
|
||||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">t</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">machine_bits</span><span style="color: #0000FF;">()=</span><span style="color: #000000;">64</span><span style="color: #0000FF;">?</span><span style="color: #000000;">63</span><span style="color: #0000FF;">:</span><span style="color: #000000;">57</span><span style="color: #0000FF;">),</span><span style="color: #000000;">9</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">),</span>
|
||||
<span style="color: #000000;">r</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">columnize</span><span style="color: #0000FF;">({</span><span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #004600;">true</span><span style="color: #0000FF;">,</span><span style="color: #000000;">count_esthetic</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">t</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">}),</span><span style="color: #000000;">t</span><span style="color: #0000FF;">})</span>
|
||||
<span style="color: #7060A8;">papply</span><span style="color: #0000FF;">(</span><span style="color: #004600;">true</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">printf</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">"There are %,26d %2d-digit esthetic numbers beginning with 1\n"</span><span style="color: #0000FF;">},</span><span style="color: #000000;">r</span><span style="color: #0000FF;">})</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">machine_bits</span><span style="color: #0000FF;">()=</span><span style="color: #000000;">64</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"There are %,26d 64-digit esthetic numbers\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">count_esthetic</span><span style="color: #0000FF;">(</span><span style="color: #000000;">64</span><span style="color: #0000FF;">)})</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"There are %,26d esthetic numbers with max 65 digits\n"</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">sum</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">64</span><span style="color: #0000FF;">),</span><span style="color: #000000;">count_esthetic</span><span style="color: #0000FF;">))})</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<!--
|
||||
sequence t = tagset(iff(machine_bits()=64?63:57),9,3),
|
||||
r = columnize({apply(true,count_esthetic,{t,1}),t})
|
||||
papply(true,printf,{1,{"There are %,26d %2d-digit esthetic numbers beginning with 1\n"},r})
|
||||
if machine_bits()=64 then
|
||||
printf(1,"There are %,26d 64-digit esthetic numbers\n",{count_esthetic(64)})
|
||||
printf(1,"There are %,26d esthetic numbers with max 65 digits\n",{sum(apply(tagset(64),count_esthetic))})
|
||||
end if
|
||||
|
|
|
|||
|
|
@ -1,61 +1,162 @@
|
|||
/*REXX pgm lists a bunch of esthetic numbers in bases 2 ──► 16, & base 10 in two ranges.*/
|
||||
parse arg baseL baseH range /*obtain optional arguments from the CL*/
|
||||
if baseL=='' | baseL=="," then baseL= 2 /*Not specified? Then use the default.*/
|
||||
if baseH=='' | baseH=="," then baseH=16 /* " " " " " " */
|
||||
if range=='' | range=="," then range=1000..9999 /* " " " " " " */
|
||||
-- 15 Nov 2025
|
||||
include Setting
|
||||
numeric digits 21
|
||||
|
||||
do radix=baseL to baseH; #= 0; if radix<2 then iterate /*process the bases. */
|
||||
start= radix * 4; stop = radix * 6
|
||||
$=; do i=1 until #==stop; y= base(i, radix) /*convert I to base Y*/
|
||||
if \esthetic(y, radix) then iterate /*not esthetic? Skip*/
|
||||
#= # + 1; if #<start then iterate /*is # below range?*/
|
||||
$= $ y /*append # to $ list.*/
|
||||
end /*i*/
|
||||
say
|
||||
say center(' base ' radix", the" th(start) '──►' th(stop) ,
|
||||
"esthetic numbers ", max(80, length($) - 1), '─')
|
||||
say strip($)
|
||||
end /*radix*/
|
||||
say; g= 25
|
||||
parse var range start '..' stop
|
||||
say center(' base 10 esthetic numbers between' start "and" stop '(inclusive) ', g*5-1,"─")
|
||||
#= 0; $=
|
||||
do k=start to stop; if \esthetic(k, 10) then iterate; #= # + 1; $= $ k
|
||||
if #//g==0 then do; say strip($); $=; end
|
||||
end /*k*/
|
||||
say strip($); say; say # ' esthetic numbers listed.'
|
||||
exit /*stick a fork in it, we're all done. */
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
PorA: _= pos(z, @u); p= substr(@u, _-1, 1); a= substr(@u, _+1, 1); return
|
||||
th: parse arg th; return th || word('th st nd rd', 1+(th//10)*(th//100%10\==1)*(th//10<4))
|
||||
vv: parse arg v,_; vr= x2d(v) + _; if vr==-1 then vr= r; return d2x(vr)
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
base: procedure expose @u; arg x 1 #,toB,inB,,y /*Y is assigned a "null" value. */
|
||||
if tob=='' then tob= 10 /*maybe assign a default for TObase. */
|
||||
if inb=='' then inb= 10 /* " " " " " INbase. */
|
||||
@l= '0123456789abcdef'; @u= @l; upper @u /*two versions of hexadecimal digits. */
|
||||
if inB\==10 then do; #= 0 /*only convert if not base 10. */
|
||||
do j=1 for length(x) /*convert X: base inB ──► base 10. */
|
||||
#= # * inB + pos(substr(x, j, 1), @u) -1 /*build new number.*/
|
||||
end /*j*/ /* [↑] this also verifies digits. */
|
||||
end
|
||||
if toB==10 then return # /*if TOB is ten, then simply return #.*/
|
||||
do while # >= toB /*convert #: base 10 ──► base toB.*/
|
||||
y= substr(@l, (# // toB) + 1, 1)y /*construct the output number. */
|
||||
#= # % toB /* ··· and whittle # down also. */
|
||||
end /*while*/ /* [↑] algorithm may leave a residual.*/
|
||||
return substr(@l, # + 1, 1)y /*prepend the residual, if any. */
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
esthetic: procedure expose @u; arg x,r; L= length(x); if L==1 then return 1
|
||||
if x<2 then return 0
|
||||
do d=0 to r-1; _= d2x(d); if pos(_ || _, x)\==0 then return 0
|
||||
end /*d*/ /* [↑] check for a duplicated digits. */
|
||||
do j=1 for L; @.j= substr(x, j, 1) /*assign (base) digits to stemmed array*/
|
||||
end /*j*/
|
||||
if L==2 then do; z= @.1; call PorA; if @.2==p | @.2==a then nop
|
||||
else return 0
|
||||
end
|
||||
do e=2 to L-1; z= @.e; pe= e - 1; ae= e + 1
|
||||
if (z==vv(@.pe,-1)|z==vv(@.pe,1))&(z==vv(@.ae,-1)|z==vv(@.ae,1)) then iterate
|
||||
return 0
|
||||
end /*e*/; return 1
|
||||
say 'ESTHETIC NUMBERS'
|
||||
say version
|
||||
say
|
||||
call Task1
|
||||
call Task2 1000,9999
|
||||
call Task2 1.0e8,1.3e8
|
||||
call Timer 'R'
|
||||
call Generate
|
||||
call Task3 1.0e8,1.3e8,1
|
||||
call Task3 1.0e11,1.3e11,0
|
||||
call Task3 1.0e14,1.3e14,0
|
||||
call Task3 1.0e17,1.3e17,0
|
||||
call Task3 1.0e20,1.3e20,0
|
||||
call Timer 'R'
|
||||
exit
|
||||
|
||||
Task1:
|
||||
-- Shows ranges Esthetic numbers in bases 2 thru 16
|
||||
procedure
|
||||
do base=2 to 16
|
||||
n=0; n1=base*4; n2=base*6; d=0
|
||||
say 'Brute-force: Base' base 'Index' n1 'thru' n2'...'
|
||||
do i=1 until n=n2
|
||||
if base=10 then
|
||||
j=i
|
||||
else
|
||||
j=D2n(i,base)
|
||||
if Esthetic(j) then do
|
||||
n+=1
|
||||
if n>=n1 & n<=n2 then do
|
||||
d+=1
|
||||
call CharOut ,j' '
|
||||
if d//20=0 then
|
||||
say
|
||||
end
|
||||
end
|
||||
end i
|
||||
say; say
|
||||
end base
|
||||
return
|
||||
|
||||
Task2:
|
||||
-- Shows range Esthetic numbers in base 10
|
||||
-- using brute-force algorithm
|
||||
procedure
|
||||
arg n1,n2
|
||||
say 'Brute-force: Base 10 from' n1 'to' n2'...'
|
||||
n=0
|
||||
do i=n1 to n2
|
||||
if Esthetic(i) then do
|
||||
n+=1
|
||||
call CharOut ,i' '
|
||||
if n//10=0 then
|
||||
say
|
||||
end
|
||||
end i
|
||||
say
|
||||
say n 'found'
|
||||
say
|
||||
return
|
||||
|
||||
Esthetic:
|
||||
-- Is a number Esthetic?
|
||||
procedure
|
||||
arg xx
|
||||
if xx<10 then
|
||||
return 1
|
||||
dig='0123456789ABCDEF'
|
||||
est=1; a=SubStr(xx,1,1)
|
||||
do i=2 to Length(xx)
|
||||
b=SubStr(xx,i,1)
|
||||
if Abs(Pos(a,dig)-Pos(b,dig))<>1 then do
|
||||
est=0
|
||||
leave
|
||||
end
|
||||
a=b
|
||||
end i
|
||||
return est
|
||||
|
||||
Generate:
|
||||
-- Generate all Esthetic numbers
|
||||
-- needed for the stretch task and beyond
|
||||
-- Iterative solution
|
||||
procedure expose Esth. Work1. Work2.
|
||||
say 'Generate up to' Digits() 'digits...'
|
||||
do i=1 to 9
|
||||
work1.i=i; Esth.i=i
|
||||
end
|
||||
work1.0=9; n=9
|
||||
do Digits()-1
|
||||
w=0
|
||||
do i=1 to work1.0
|
||||
a=work1.i; b=Right(a,1)
|
||||
if b > 0 then do
|
||||
w+=1; work2.w=a||(b-1)
|
||||
end
|
||||
if b < 9 then do
|
||||
w+=1; work2.w=a||(b+1)
|
||||
end
|
||||
end i
|
||||
work2.0=w
|
||||
do i=1 to w
|
||||
work1.i=work2.i; n+=1; Esth.n=work2.i
|
||||
end i
|
||||
work1.0=w
|
||||
end
|
||||
Esth.0=n
|
||||
say n 'found'
|
||||
say
|
||||
return
|
||||
|
||||
Task3:
|
||||
-- Shows range Esthetic numbers in base 10
|
||||
-- using the generated array
|
||||
procedure expose Esth.
|
||||
arg n1,n2,all
|
||||
say 'Generated: Base 10 from' n1 'to' n2'...'
|
||||
i1=0; i2=0
|
||||
do i=1 to Esth.0
|
||||
a=Esth.i
|
||||
if a<n1 then
|
||||
iterate i
|
||||
if i1=0 then
|
||||
i1=i
|
||||
if a>n2 then do
|
||||
i2=i-1
|
||||
leave i
|
||||
end
|
||||
end i
|
||||
n=i2-i1+1
|
||||
if all then do
|
||||
k=0
|
||||
do i=i1 to i2
|
||||
k+=1
|
||||
call CharOut ,Esth.i' '
|
||||
if k//5=0 then
|
||||
say
|
||||
end i
|
||||
say
|
||||
end
|
||||
else do
|
||||
do i=i1 for 5
|
||||
call CharOut ,Esth.i' '
|
||||
end
|
||||
say; say '...'
|
||||
do i=i2-4 for 5
|
||||
call CharOut ,Esth.i' '
|
||||
end
|
||||
say
|
||||
end
|
||||
say n 'found'
|
||||
say
|
||||
return
|
||||
|
||||
-- D2n (convert decimal to base n)
|
||||
include Base
|
||||
-- Timer
|
||||
include Timer
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue