--- /dev/null
+! Copyright (C) 2008 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: math.ranges math.parser math.vectors sets sequences
+kernel io ;
+IN: benchmark.beust1
+
+: count-numbers ( max -- n )
+ 1 [a,b] [ number>string all-unique? ] count ; inline
+
+: beust ( -- )
+ 10000000 count-numbers
+ number>string " unique numbers." append print ;
+
+MAIN: beust
--- /dev/null
+! Copyright (C) 2008 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: math math.ranges math.parser sequences kernel io locals ;
+IN: benchmark.beust2
+
+:: (count-numbers) ( remaining first value used max listener -- ? )
+ 10 first - [| i |
+ [let* | digit [ i first + ]
+ mask [ digit 2^ ]
+ value' [ i value + ] |
+ used mask bitand zero? [
+ value max > [ t ] [
+ remaining 1 <= [
+ listener call f
+ ] [
+ remaining 1-
+ 0
+ value' 10 *
+ used mask bitor
+ max
+ listener
+ (count-numbers)
+ ] if
+ ] if
+ ] [ f ] if
+ ]
+ ] contains? ; inline
+
+:: count-numbers ( max listener -- )
+ 10 [ 1+ 1 1 0 max listener (count-numbers) ] contains? drop ;
+ inline
+
+:: beust ( -- )
+ [let | i! [ 0 ] |
+ 10000000000 [ i 1+ i! ] count-numbers
+ i number>string " unique numbers." append print
+ ] ;
+
+MAIN: beust