39 lines
1.2 KiB
Factor
39 lines
1.2 KiB
Factor
! Copyright (c) 2012 Anonymous
|
||
! See http://factorcode.org/license.txt for BSD license.
|
||
USING: combinators fry kernel lists lists.lazy locals math ;
|
||
IN: rosetta-code.hamming-lazy
|
||
|
||
! http://rosettacode.org/wiki/Hamming_numbers#Factor
|
||
|
||
! Hamming numbers are numbers of the form
|
||
! H = 2^i * 3^j * 5^k where i, j, k >= 0
|
||
|
||
! Hamming numbers are also known as ugly numbers and also
|
||
! 5-smooth numbers (numbers whose prime divisors are less or equal
|
||
! to 5).
|
||
|
||
! Generate the sequence of Hamming numbers, in increasing order.
|
||
! In particular:
|
||
|
||
! 1. Show the first twenty Hamming numbers.
|
||
! 2. Show the 1691st Hamming number (the last one below 231).
|
||
! 3. Show the one millionth Hamming number (if the language – or
|
||
! a convenient library – supports arbitrary-precision integers).
|
||
|
||
:: sort-merge ( xs ys -- result )
|
||
xs car :> x
|
||
ys car :> y
|
||
{
|
||
{ [ x y < ] [ [ x ] [ xs cdr ys sort-merge ] lazy-cons ] }
|
||
{ [ x y > ] [ [ y ] [ ys cdr xs sort-merge ] lazy-cons ] }
|
||
[ [ x ] [ xs cdr ys cdr sort-merge ] lazy-cons ]
|
||
} cond ;
|
||
|
||
:: hamming ( -- hamming )
|
||
f :> h!
|
||
[ 1 ] [
|
||
h 2 3 5 [ '[ _ * ] lazy-map ] tri-curry@ tri
|
||
sort-merge sort-merge
|
||
] lazy-cons h! h ;
|
||
|