Merge branch 'master' of git://iolanguage.com/Io
[io.git] / samples / shootout / fasta.io
blob3769a335fa02ed7997fb02980dd8b70d361e0995
1 #!/usr/bin/env io
3 /* The Great Computer Language Shootout
4 http://shootout.alioth.debian.org
6 Contributed by Ian Osgood */
8 ALU := Sequence with(
9 "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG",
10 "GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA",
11 "CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT",
12 "ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA",
13 "GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG",
14 "AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC",
15 "AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA")
17 # probabilities for symbols in Fasta codes
19 IUB := list(0.27, 0.12, 0.12, 0.27)
20 11 repeatTimes( IUB append(0.02) )
22 HomoSap := list(0.3029549426680, 0.1979883004921, 0.1975473066391, 0.3015094502008)
24 Fasta := Object clone do(
25 last := 42
27 gen_random := method(
28 (last = ((last * 3877 + 29573) % 139968)) / 139968
31 repeat := method(n,seq, i := li := 0
32 line := Sequence clone setSize(60)
33 n repeatTimes(
34 line atPut(li, seq at(i))
35 li = li + 1
36 if (li == line size, line println; li = 0)
37 i = ((i+1) % seq size)
39 if (li != 0, line setSize(li) println)
42 codes := "acgtBDHKMNRSVWY"
44 random := method(n, probs, sum := li := 0
45 line := Sequence clone setSize(60)
46 probs mapInPlace(prob, sum = sum + prob)
47 n repeatTimes(
48 r := gen_random; i := 0
49 while (r > probs at(i), i = i + 1)
50 line atPut(li, codes at(i))
51 li = li + 1
52 if (li == line size, line println; li = 0)
54 if (li != 0, line setSize(li) println)
58 n := System args at(1) asNumber
60 ">ONE Homo sapiens alu" println
61 Fasta repeat(2*n, ALU)
63 ">TWO IUB ambiguity codes" println
64 Fasta random(3*n, IUB)
66 ">THREE Homo sapiens frequency" println
67 Fasta random(5*n, HomoSap)