/
fasta.io
61 lines (51 loc) · 1.83 KB
/
fasta.io
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/* The Great Computer Language Shootout
http://shootout.alioth.debian.org
Contributed by Ian Osgood */
ALU := String with(
"GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG",
"GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA",
"CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT",
"ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA",
"GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG",
"AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC",
"AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA")
# probabilities for symbols in Fasta codes
IUB := list(0.27, 0.12, 0.12, 0.27)
11 repeat( IUB append(0.02) )
HomoSap := list(0.3029549426680, 0.1979883004921, 0.1975473066391, 0.3015094502008)
Fasta := Object clone do(
last := 42
gen_random := method(
(last = ((last * 3877 + 29573) % 139968)) / 139968
)
repeat := method(n,seq, i := li := 0
line := Sequence clone setSize(60)
n repeat(
line atPut(li, seq at(i))
li = li + 1
if (li == line size, line println; li = 0)
i = (i+1) % seq size
)
if (li != 0, line setSize(li) println)
)
codes := "acgtBDHKMNRSVWY"
random := method(n,probs, sum := li := 0
line := Sequence clone setSize(60)
probs mapInPlace(prob, sum = sum + prob)
n repeat(
r := gen_random; i := 0
while (r > probs at(i), i = i + 1)
line atPut(li, codes at(i))
li = li + 1
if (li == line size, line println; li = 0)
)
if (li != 0, line setSize(li) println)
)
)
n := System args at(1) asNumber
">ONE Homo sapiens alu" println
Fasta repeat(2*n, ALU)
">TWO IUB ambiguity codes" println
Fasta random(3*n, IUB)
">THREE Homo sapiens frequency" println
Fasta random(5*n, HomoSap)