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