15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The Great Computer Language Shootout
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//  http://shootout.alioth.debian.org
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//  Contributed by Ian Osgood
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var last = 42, A = 3877, C = 29573, M = 139968;
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function rand(max) {
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  last = (last * A + C) % M;
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return max * last / M;
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var ALU =
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG" +
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA" +
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT" +
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA" +
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG" +
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC" +
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  "AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA";
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var IUB = {
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  a:0.27, c:0.12, g:0.12, t:0.27,
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  B:0.02, D:0.02, H:0.02, K:0.02,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  M:0.02, N:0.02, R:0.02, S:0.02,
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  V:0.02, W:0.02, Y:0.02
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var HomoSap = {
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  a: 0.3029549426680,
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  c: 0.1979883004921,
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  g: 0.1975473066391,
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  t: 0.3015094502008
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function makeCumulative(table) {
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var last = null;
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  for (var c in table) {
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (last) table[c] += table[last];
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    last = c;
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function fastaRepeat(n, seq) {
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var seqi = 0, lenOut = 60;
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  while (n>0) {
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (n<lenOut) lenOut = n;
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (seqi + lenOut < seq.length) {
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      ret = seq.substring(seqi, seqi+lenOut);
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      seqi += lenOut;
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var s = seq.substring(seqi);
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      seqi = lenOut - s.length;
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      ret = s + seq.substring(0, seqi);
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    n -= lenOut;
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function fastaRandom(n, table) {
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var line = new Array(60);
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  makeCumulative(table);
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  while (n>0) {
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (n<line.length) line = new Array(n);
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i=0; i<line.length; i++) {
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var r = rand(1);
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      for (var c in table) {
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (r < table[c]) {
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          line[i] = c;
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          break;
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ret = line.join('');
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    n -= line.length;
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var ret;
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var count = 7;
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ret = fastaRepeat(2*count*100000, ALU);
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ret = fastaRandom(3*count*1000, IUB);
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ret = fastaRandom(5*count*1000, HomoSap);
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
86