sunspider-string-fasta.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // The Great Computer Language Shootout
  2. // http://shootout.alioth.debian.org
  3. //
  4. // Contributed by Ian Osgood
  5. var last = 42, A = 3877, C = 29573, M = 139968;
  6. function rand(max) {
  7. last = (last * A + C) % M;
  8. return max * last / M;
  9. }
  10. var ALU =
  11. "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG" +
  12. "GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA" +
  13. "CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT" +
  14. "ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA" +
  15. "GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG" +
  16. "AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC" +
  17. "AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA";
  18. var IUB = {
  19. a:0.27, c:0.12, g:0.12, t:0.27,
  20. B:0.02, D:0.02, H:0.02, K:0.02,
  21. M:0.02, N:0.02, R:0.02, S:0.02,
  22. V:0.02, W:0.02, Y:0.02
  23. }
  24. var HomoSap = {
  25. a: 0.3029549426680,
  26. c: 0.1979883004921,
  27. g: 0.1975473066391,
  28. t: 0.3015094502008
  29. }
  30. function makeCumulative(table) {
  31. var last = null;
  32. for (var c in table) {
  33. if (last) table[c] += table[last];
  34. last = c;
  35. }
  36. }
  37. function fastaRepeat(n, seq) {
  38. var seqi = 0, lenOut = 60;
  39. while (n>0) {
  40. if (n<lenOut) lenOut = n;
  41. if (seqi + lenOut < seq.length) {
  42. ret = seq.substring(seqi, seqi+lenOut);
  43. seqi += lenOut;
  44. } else {
  45. var s = seq.substring(seqi);
  46. seqi = lenOut - s.length;
  47. ret = s + seq.substring(0, seqi);
  48. }
  49. n -= lenOut;
  50. }
  51. }
  52. function fastaRandom(n, table) {
  53. var line = new Array(60);
  54. makeCumulative(table);
  55. while (n>0) {
  56. if (n<line.length) line = new Array(n);
  57. for (var i=0; i<line.length; i++) {
  58. var r = rand(1);
  59. for (var c in table) {
  60. if (r < table[c]) {
  61. line[i] = c;
  62. break;
  63. }
  64. }
  65. }
  66. ret = line.join('');
  67. n -= line.length;
  68. }
  69. }
  70. startTest("sunspider-string-fasta");
  71. var ret;
  72. var n = 16;
  73. test( "Homo sapiens alu", function(){
  74. ret = fastaRepeat(4*n*10000, ALU);
  75. });
  76. test( "IUB ambiguity codes", function(){
  77. ret = fastaRandom(3*n*100, IUB);
  78. });
  79. test( "Homo sapiens frequency", function(){
  80. ret = fastaRandom(5*n*100, HomoSap);
  81. });
  82. endTest();