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