Merge branch 'master' of git://iolanguage.com/Io
[io.git] / samples / shootout / nsievebits.io
blob6494b140db62c4501932efb0116a230f3a847cd7
1 #!/usr/bin/env io
3 /* The Great Computer Language Shootout
4 http://shootout.alioth.debian.org
6 contributed by Ian Osgood */
8 Sequence pad := method(w, s:=self; while (s size < w, s=" ".. s) )
9 Number clearBit := method(b, &(1 clone shiftLeft(b) bitwiseComplement) )
11 sieve := Object clone do(
12 flags := Sequence clone do(
13 isSet := method(i, at(i/8) at(i%8) != 0)
14 clear := method(i, atPut(i/8, at(i/8) clearBit(i%8) ) )
16 show := method(n,
17 flags setSize((n/8) ceil)
18 for (i, 0, flags size - 1, flags atPut(i, 255))
19 primes := 0
20 for (i, 2, n-1,
21 if (flags isSet(i),
22 primes = primes + 1
23 if (i+i < n, for (j, i+i, n-1, i, flags clear(j) ) )
26 writeln("Primes up to", n asString pad(9), primes asString pad(9))
30 n := System args at(1) asNumber
31 sieve show(10000 shiftLeft(n))
32 sieve show(10000 shiftLeft(n-1))
33 sieve show(10000 shiftLeft(n-2))