Eban numbers: Difference between revisions
Content added Content deleted
Alextretyak (talk | contribs) m (→{{header|11l}}) |
Not a robot (talk | contribs) (Add CLU) |
||
Line 572: | Line 572: | ||
eban numbers up to and including 1000000000: |
eban numbers up to and including 1000000000: |
||
count = 7999</pre> |
count = 7999</pre> |
||
=={{header|CLU}}== |
|||
<lang clu>eban = cluster is numbers |
|||
rep = null |
|||
% Next valid E-ban number in the range [0..999] |
|||
next = proc (n: int) returns (int) signals (no_more) |
|||
if n>=66 then signal no_more end |
|||
if n<0 then return(0) end |
|||
% advance low digit (two four six) |
|||
if (n//10=0) then n := (n/10)*10 + 2 |
|||
elseif (n//10=2) then n := (n/10)*10 + 4 |
|||
elseif (n//10=4) then n := (n/10)*10 + 6 |
|||
elseif (n//10=6) then n := (n/10)*10 + 10 |
|||
end |
|||
% this might put us into tEn, twEnty which are invalid |
|||
if (n//100/10 = 1) then n := n + 20 % ten + 20 = 30 |
|||
elseif (n//100/10 = 2) then n := n + 10 % twEnty + 10 = 30 |
|||
end |
|||
return(n) |
|||
end next |
|||
% Yield all valid E_ban numbers |
|||
% (sextillion and upwards aren't handled) |
|||
numbers = iter () yields (int) |
|||
parts: array[int] := array[int]$[0: 2] |
|||
while true do |
|||
num: int := 0 |
|||
for m: int in array[int]$indexes(parts) do |
|||
num := num + parts[m] * 1000 ** m |
|||
end |
|||
yield(num) |
|||
for m: int in array[int]$indexes(parts) do |
|||
begin |
|||
parts[m] := next(parts[m]) |
|||
break |
|||
end except when no_more: |
|||
parts[m] := 0 |
|||
end |
|||
end |
|||
if array[int]$top(parts) = 0 then |
|||
array[int]$addh(parts,2) |
|||
end |
|||
end |
|||
end numbers |
|||
end eban |
|||
start_up = proc () |
|||
maxmagn = 1000000000000 |
|||
po: stream := stream$primary_output() |
|||
count: int := 0 |
|||
upto_1k: int := 0 |
|||
between_1k_4k: int := 0 |
|||
disp_1k: bool := false |
|||
disp_4k: bool := false |
|||
nextmagn: int := 10000 |
|||
for i: int in eban$numbers() do |
|||
while i>nextmagn do |
|||
stream$putl(po, int$unparse(count) |
|||
|| " eban numbers <= " |
|||
|| int$unparse(nextmagn)) |
|||
nextmagn := nextmagn * 10 |
|||
end |
|||
count := count + 1 |
|||
if i<1000 then upto_1k := upto_1k + 1 |
|||
elseif i<=4000 then between_1k_4k := between_1k_4k + 1 |
|||
end |
|||
if i>1000 & ~disp_1k then |
|||
disp_1k := true |
|||
stream$putl(po, "\n" || int$unparse(upto_1k) |
|||
|| " eban numbers <= 1000\n") |
|||
end |
|||
if i<=4000 then stream$putright(po, int$unparse(i), 5) end |
|||
if i>4000 & ~disp_4k then |
|||
disp_4k := true |
|||
stream$putl(po, "\n" || int$unparse(between_1k_4k) |
|||
|| " eban numbers 1000 <= x <= 4000\n") |
|||
end |
|||
if nextmagn>maxmagn then break end |
|||
end |
|||
end start_up </lang> |
|||
{{out}} |
|||
<pre> 2 4 6 30 32 34 36 40 42 44 46 50 52 54 56 60 62 64 66 |
|||
19 eban numbers <= 1000 |
|||
2000 2002 2004 2006 2030 2032 2034 2036 2040 2042 2044 2046 2050 2052 2054 2056 2060 2062 2064 2066 4000 |
|||
21 eban numbers 1000 <= x <= 4000 |
|||
79 eban numbers <= 10000 |
|||
399 eban numbers <= 100000 |
|||
399 eban numbers <= 1000000 |
|||
1599 eban numbers <= 10000000 |
|||
7999 eban numbers <= 100000000 |
|||
7999 eban numbers <= 1000000000 |
|||
31999 eban numbers <= 10000000000 |
|||
159999 eban numbers <= 100000000000 |
|||
159999 eban numbers <= 1000000000000</pre> |
|||
=={{header|D}}== |
=={{header|D}}== |