get("#265") -- json.encode images = {"#1000061", "A", "#1000056", "H", "#1000064", "P", "#1000063", "X", "#1000062", "B"} features = {"#326", "#327", "#328"} -- make a letter lookup map image2letter = {} for i=1, #images, 2 do image2letter[images[i]] = images[i+1] end -- find out which results to load toget = {} for i=1, #images, 2 do table.insert(toget, images[i]) end for i=1, #features do table.insert(toget, features[i]) end results = getirresults(unpack(toget)) --map: feature -> letter -> value range map = {} for image, subresults in pairs(results) do letter = image2letter[image] for feature, result in pairs(subresults) do _, _, value = string.find(result, ": ([0-9.]+)") if value ~= nil then value = tonumber(value) if map[feature] == nil then map[feature] = {} end submap = map[feature] range = submap[letter] if range == nil then range = {value, value} else range = {math.min(range[1], value), math.max(range[2], value)} end submap[letter] = range end end end -- get serpent to serialize map into Lua code serpent = go("#158") --if all features are within the known value ranges for the letter, just take the intersection of all the matching letters within each feature. -- serpent options: -- block(map, {comment=false}) is that indented stuff -- line(map, {comment=false}) is all in one line -- dump(map) is...? -- line(map, {comment=false, compact=true, sparse=true}) is in one line, very compact -- line(map, {comment=false, compact=true, sparse=false}) is the same recognizer = " map = "..serpent.line(map, {comment=false, compact=true, sparse=false}).."\n"..[[ allletters = {} outmap = {} for feature, submap in pairs(map) do f = otherresults[feature] if f == nil then error("Need recalc, waiting for "..feature) end _, _, value = string.find(f, ": ([0-9.]+)") if value ~= nil then value = tonumber(value) for letter, range in pairs(submap) do allletters[letter] = true if value < range[1] or value > range[2] then outmap[letter] = true -- can't be this letter end end end end candidates = {} for letter, _ in pairs(allletters) do if not outmap[letter] then table.insert(candidates, letter) end end if #candidates ~= 0 then return "Candidates: "..table.concat(candidates, ", ") end ]] print(recognizer) snippet = { type = 26, -- Lua code - Image recognition text = recognizer, title = "A machine-made letter recognizer, v3" } return json.encode(snippet) --todo: otherwise, expand all value ranges uniformly and try again. --more todo: repeat & increase ranges exponentially, finally at least one letter will match.