-- The Computer Language Shootout -- http://shootout.alioth.debian.org/ -- contributed by Mike Pall local gmatch, gsub, write = string.gmatch, string.gsub, io.write local seq = io.read("*a") local ilen = #seq seq = gsub(seq, ">.-\n", "") seq = gsub(seq, "\n", "") local clen = #seq local variants = { "agggtaaa", "tttaccct", "[cgt]gggtaaa", "tttaccc[acg]", "a[act]ggtaaa", "tttacc[agt]t", "ag[act]gtaaa", "tttac[agt]ct", "agg[act]taaa", "ttta[agt]cct", "aggg[acg]aaa", "ttt[cgt]ccct", "agggt[cgt]aa", "tt[acg]accct", "agggta[cgt]a", "t[acg]taccct", "agggtaa[cgt]", "[acg]ttaccct", } local count, prev = 0 for i,pattern in ipairs(variants) do for _ in gmatch(seq, pattern) do count = count + 1 end if prev then write(prev, "|", pattern, " ", count, "\n") count = 0 prev = nil else prev = pattern end end local subst = { B = "(c|g|t)", D = "(a|g|t)", H = "(a|c|t)", K = "(g|t)", M = "(a|c)", N = "(a|c|g|t)", R = "(a|g)", S = "(c|g)", V = "(a|c|g)", W = "(a|t)", Y = "(c|t)", } -- Dumbing down forced by "the rules": for k,v in pairs(subst) do seq = gsub(seq, k, v) end -- Otherwise you're better off with: seq = gsub(seq, "[BDHKMNRSVWY]", subst) write("\n", ilen, "\n", clen, "\n", #seq, "\n")