1563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark// The Great Computer Language Shootout
2563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark//  http://shootout.alioth.debian.org
3563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark//
4563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark//  Contributed by Ian Osgood
5563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
6563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvar last = 42, A = 3877, C = 29573, M = 139968;
7563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
8563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkfunction rand(max) {
9563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  last = (last * A + C) % M;
10563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  return max * last / M;
11563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
12563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
13563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvar ALU =
14563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG" +
15563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  "GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA" +
16563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  "CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT" +
17563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  "ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA" +
18563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  "GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG" +
19563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  "AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC" +
20563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  "AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA";
21563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
22563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvar IUB = {
23563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  a:0.27, c:0.12, g:0.12, t:0.27,
24563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  B:0.02, D:0.02, H:0.02, K:0.02,
25563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  M:0.02, N:0.02, R:0.02, S:0.02,
26563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  V:0.02, W:0.02, Y:0.02
27563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
28563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
29563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvar HomoSap = {
30563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  a: 0.3029549426680,
31563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  c: 0.1979883004921,
32563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  g: 0.1975473066391,
33563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  t: 0.3015094502008
34563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
35563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
36563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkfunction makeCumulative(table) {
37563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  var last = null;
38563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  for (var c in table) {
39563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (last) table[c] += table[last];
40563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    last = c;
41563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  }
42563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
43563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
44563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkfunction fastaRepeat(n, seq) {
45563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  var seqi = 0, lenOut = 60;
46563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  while (n>0) {
47563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (n<lenOut) lenOut = n;
48563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (seqi + lenOut < seq.length) {
49563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark      ret = seq.substring(seqi, seqi+lenOut);
50563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark      seqi += lenOut;
51563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    } else {
52563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark      var s = seq.substring(seqi);
53563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark      seqi = lenOut - s.length;
54563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark      ret = s + seq.substring(0, seqi);
55563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
56563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    n -= lenOut;
57563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  }
58563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
59563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
60563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkfunction fastaRandom(n, table) {
61563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  var line = new Array(60);
62563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  makeCumulative(table);
63563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  while (n>0) {
64563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (n<line.length) line = new Array(n);
65563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    for (var i=0; i<line.length; i++) {
66563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark      var r = rand(1);
67563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark      for (var c in table) {
68563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (r < table[c]) {
69563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark          line[i] = c;
70563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark          break;
71563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
72563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark      }
73563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
74563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ret = line.join('');
75563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    n -= line.length;
76563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  }
77563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
78563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
79563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvar ret;
80563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
81563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvar count = 7;
82563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkret = fastaRepeat(2*count*100000, ALU);
83563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkret = fastaRandom(3*count*1000, IUB);
84563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkret = fastaRandom(5*count*1000, HomoSap);
85563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
86