1# The Computer Language Shootout
2# http://shootout.alioth.debian.org/
3# Contributed by Sokolov Yura
4
5$last = 42.0
6def gen_random (max,im=139968,ia=3877,ic=29573)
7    (max * ($last = ($last * ia + ic) % im)) / im
8end
9
10alu =
11   "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG"+
12   "GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA"+
13   "CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT"+
14   "ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA"+
15   "GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG"+
16   "AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC"+
17   "AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA"
18
19iub = [
20    ["a", 0.27],
21    ["c", 0.12],
22    ["g", 0.12],
23    ["t", 0.27],
24
25    ["B", 0.02],
26    ["D", 0.02],
27    ["H", 0.02],
28    ["K", 0.02],
29    ["M", 0.02],
30    ["N", 0.02],
31    ["R", 0.02],
32    ["S", 0.02],
33    ["V", 0.02],
34    ["W", 0.02],
35    ["Y", 0.02],
36]
37homosapiens = [
38    ["a", 0.3029549426680],
39    ["c", 0.1979883004921],
40    ["g", 0.1975473066391],
41    ["t", 0.3015094502008],
42]
43
44def make_repeat_fasta(id, desc, src, n)
45    puts ">#{id} #{desc}"
46    v = nil
47    width = 60
48    l = src.length
49    s = src * ((n / l) + 1)
50    s.slice!(n, l)
51    puts(s.scan(/.{1,#{width}}/).join("\n"))
52end
53
54def make_random_fasta(id, desc, table, n)
55    puts ">#{id} #{desc}"
56    rand, v = nil,nil
57    width = 60
58    chunk = 1 * width
59    prob = 0.0
60    table.each{|v| v[1]= (prob += v[1])}
61    for i in 1..(n/width)
62        puts((1..width).collect{
63            rand = gen_random(1.0)
64            table.find{|v| v[1]>rand}[0]
65        }.join)
66    end
67    if n%width != 0
68        puts((1..(n%width)).collect{
69            rand = gen_random(1.0)
70            table.find{|v| v[1]>rand}[0]
71        }.join)
72    end
73end
74
75
76n = (ARGV[0] or 250_000).to_i
77
78make_repeat_fasta('ONE', 'Homo sapiens alu', alu, n*2)
79make_random_fasta('TWO', 'IUB ambiguity codes', iub, n*3)
80make_random_fasta('THREE', 'Homo sapiens frequency', homosapiens, n*5)
81
82