Ulam numbers: Difference between revisions
Content added Content deleted
(Created page with "With the following initial conditions: <big><big> u<sub>1</sub> = 1 </big></big> <big><big> u<sub>2</sub> = 2 </big></big> we define the n-th Ulam number u<sub>n...") |
(Added Wren) |
||
Line 15: | Line 15: | ||
===Lazy List=== |
===Lazy List=== |
||
<lang haskell> |
<lang haskell>ulam |
||
ulam |
|||
:: Integral i => |
:: Integral i => |
||
Int -> i |
Int -> i |
||
Line 42: | Line 41: | ||
isSingleton as |
isSingleton as |
||
| length as == 1 = True |
| length as == 1 = True |
||
| otherwise = False |
| otherwise = False</lang> |
||
=={{header|Wren}}== |
|||
{{libheader|Wren-set}} |
|||
<lang ecmascript>import "/set" for Set |
|||
var ulam = Fn.new() { |n| |
|||
var ulams = [1, 2] |
|||
var set = Set.new(ulams) |
|||
var i = 3 |
|||
while (true) { |
|||
var count = 0 |
|||
for (j in 0...ulams.count) { |
|||
if (set.contains(i - ulams[j]) && ulams[j] != (i - ulams[j])) { |
|||
count = count + 1 |
|||
} |
|||
if (count > 2) break |
|||
} |
|||
if (count == 2) { |
|||
ulams.add(i) |
|||
set.add(i) |
|||
if (ulams.count == n) break |
|||
} |
|||
i = i + 1 |
|||
} |
|||
return ulams[-1] |
|||
} |
|||
var n = 1 |
|||
while (true) { |
|||
n = n * 10 |
|||
System.print("The %(n)th Ulam number is %(ulam.call(n))") |
|||
if (n == 10000) break |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
The 10th Ulam number is 18 |
|||
The 100th Ulam number is 690 |
|||
The 1000th Ulam number is 12294 |
|||
The 10000th Ulam number is 132788 |
|||
</pre> |
Revision as of 11:47, 1 December 2020
With the following initial conditions:
u1 = 1 u2 = 2
we define the n-th Ulam number un as the number such that is greater than un-1 and uniquely written as a sum of two different Ulam numbers ui (<n) and uj (<n).
- Task
Write a function to generate the n-th Ulam number.
- References
Haskell
Lazy List
<lang haskell>ulam
:: Integral i => Int -> i
ulam 1 = 1 ulam 2 = 2 ulam n
| n > 2 = ulams !! (n-1)
ulams
:: Integral n => [n]
ulams = 1:2:(nexts [2,1]) nexts us = u: (nexts (u:us))
where n = length us [u] = head . filter isSingleton . group . sort $ [v | i <- [0 .. n-2], j <- [i+1 .. n-1] , let s = us !! i , let t = us !! j , let v = s+t , v > head us ]
isSingleton :: [a] -> Bool isSingleton as
| length as == 1 = True | otherwise = False</lang>
Wren
<lang ecmascript>import "/set" for Set
var ulam = Fn.new() { |n|
var ulams = [1, 2] var set = Set.new(ulams) var i = 3 while (true) { var count = 0 for (j in 0...ulams.count) { if (set.contains(i - ulams[j]) && ulams[j] != (i - ulams[j])) { count = count + 1 } if (count > 2) break } if (count == 2) { ulams.add(i) set.add(i) if (ulams.count == n) break } i = i + 1 } return ulams[-1]
}
var n = 1 while (true) {
n = n * 10 System.print("The %(n)th Ulam number is %(ulam.call(n))") if (n == 10000) break
}</lang>
- Output:
The 10th Ulam number is 18 The 100th Ulam number is 690 The 1000th Ulam number is 12294 The 10000th Ulam number is 132788