summaryrefslogtreecommitdiff
path: root/lua_benchmark/tests/Lua-Benchmarks/k-nucleotide.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua_benchmark/tests/Lua-Benchmarks/k-nucleotide.lua')
-rw-r--r--lua_benchmark/tests/Lua-Benchmarks/k-nucleotide.lua66
1 files changed, 66 insertions, 0 deletions
diff --git a/lua_benchmark/tests/Lua-Benchmarks/k-nucleotide.lua b/lua_benchmark/tests/Lua-Benchmarks/k-nucleotide.lua
new file mode 100644
index 0000000..5deb58d
--- /dev/null
+++ b/lua_benchmark/tests/Lua-Benchmarks/k-nucleotide.lua
@@ -0,0 +1,66 @@
+-- The Computer Language Benchmarks Game
+-- http://benchmarksgame.alioth.debian.org/
+-- contributed by Mike Pall
+
+local function kfrequency(seq, freq, k, frame)
+ local sub = string.sub
+ local k1 = k - 1
+ for i=frame,string.len(seq)-k1,k do
+ local c = sub(seq, i, i+k1)
+ freq[c] = freq[c] + 1
+ end
+end
+
+local function freqdefault()
+ return 0
+end
+
+local function count(seq, frag)
+ local k = string.len(frag)
+ local freq = setmetatable({}, { __index = freqdefault })
+ for frame=1,k do kfrequency(seq, freq, k, frame) end
+ io.write(freq[frag] or 0, "\t", frag, "\n")
+end
+
+local function frequency(seq, k)
+ local freq = setmetatable({}, { __index = freqdefault })
+ for frame=1,k do kfrequency(seq, freq, k, frame) end
+ local sfreq, sn = {}, 1
+ for c,v in pairs(freq) do sfreq[sn] = c; sn = sn + 1 end
+ table.sort(sfreq, function(a, b)
+ local fa, fb = freq[a], freq[b]
+ return fa == fb and a > b or fa > fb
+ end)
+ sum = string.len(seq)-k+1
+ for _,c in ipairs(sfreq) do
+ io.write(string.format("%s %0.3f\n", c, (freq[c]*100)/sum))
+ end
+ io.write("\n")
+end
+
+local function readseq()
+ local sub = string.sub
+ for line in io.lines() do
+ if sub(line, 1, 1) == ">" and sub(line, 2, 6) == "THREE" then break end
+ end
+ local lines, ln = {}, 0
+ for line in io.lines() do
+ local c = sub(line, 1, 1)
+ if c == ">" then
+ break
+ elseif c ~= ";" then
+ ln = ln + 1
+ lines[ln] = line
+ end
+ end
+ return string.upper(table.concat(lines, "", 1, ln))
+end
+
+local seq = readseq()
+frequency(seq, 1)
+frequency(seq, 2)
+count(seq, "GGT")
+count(seq, "GGTA")
+count(seq, "GGTATT")
+count(seq, "GGTATTTTAATT")
+count(seq, "GGTATTTTAATTTATAGT")
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback