Hamming numbers: Difference between revisions

m
→‎{{header|Lambdatalk}}: small improvement
(→‎{{header|UNIX Shell}}: modify so it works in bash as well as ksh)
m (→‎{{header|Lambdatalk}}: small improvement)
Line 6,685:
<syntaxhighlight lang="scheme">
{def hamming
 
{def hamming.test
{lambda {:h :n :x :a :i}
{if {= :x {A.get :n :h}}
then {* :a {A.get {+ :i 1} :h}} {+ :i 1}
else :x :i}
}}
 
{def hamming.rec
{lambda {:h :x2 :i :x3 :j :x5 :k :limit :n}
{hamming.loop :h
{hamming.test :h :n :x2 2 :i}
{hamming.test :h :n :x3 3 :j}
{hamming.test :h :n :x5 5 :k}
:limit
{+ :n 1} }
}}
 
{def hamming.loop
{lambda {:h :x2a :i :x3b :j :x5c :k :limitm :n}
{if {>= :n :limitm}
then {A.last :h}
else {hamming.reclet { {:h {A.set! :n {min :x2a :x3b :x5c} :h}}
{:a :x2a} {:i :x3 :j :x5 :k :limit :ni}
{hamming.test :hb :nb} {:x3 3j :j}
}}}
{hamming.test :hc :nc} {:x5 5k :k}
 
{:m :m} {:n :n}
} {hamming.loop :h
{if {= :xa {A.get :n :h}}
then {* :a2 {A.get {+ :i 1} :h}} {+ :i 1}
else :xa :i}
{if {= :b {A.get :n :h}}
then {* 3 {A.get {+ :j 1} :h}} {+ :j 1}
{+ else :n 1}b :j}
{if {= :c {A.get :n :h}}
then {* 5 {A.get {+ :k 1} :h}} {+ :k 1}
else :c :k}
:limitm
{hamming.test :h+ :n :x21} 2 :i}
}}}}
{lambda {:n}
{hamming.loop {A.new {S.serie 1 :n}} 2 0 3 0 5 0 :n 1}
}}
-> hamming
 
{S.map hamming {S.serie 1 20}}
-> 1 2 3 4 5 6 8 9 10 12 15 16 18 20 24 25 27 30 32 36
 
{hamming 1691}
-> 2125764000 // 175ms< 200ms
 
 
 
</syntaxhighlight>
 
99

edits