!752 sS info = [[ The images "9176714c9a935fc91e14595dbb3adddf 35731666e72dd0c9448f616ff3a7464a da9bc5a24bd503e898f69ad43bb9b92e" are the characters "yet". The images "412f9e0f8e177817a4fa285415c5a13f 386b289407599f31e3a7c57c3adb2587 6cd2a2284a5a6fda3a7cad3e3a048671 b0c47c014d665ec5b658f510c258dc47 b273ff598fe6afa04cfed9f9e8fb4109" are the grouped characters "[Ob]ject". //The image abcd12 is the character "a" //The image abcd34 is the characters "abc" //The image abcd34 can be the character "I" or "l" ]]; sclass GlyphInfo { S meaning; bool multi; // multiple meanings seen } // key = md5 static new Map glyphInfos; p { new Matches m; for (S s : toLinesFullTrim(info)) { if "the images * are the characters *" { L md5s = splitAtSpace($1); L characters = eachCharAsString($2); saveMeanings(md5s, characters); } else if "the images * are the grouped characters *" { L md5s = splitAtSpace($1); L characters = ungroupCharacters($2); saveMeanings(md5s, characters); } else if (nempty(javaTokC(s))) { print("huh? " + s); } } psl(glyphInfos); } svoid saveMeaning(S md5, S meaning) { GlyphInfo info = getGlyphInfo(md5); if (info.multi) ret; if (hasDifferent(info.meaning, meaning)) { info.meaning = null; info.multi = true; print("multi"); } else info.meaning = meaning; } static GlyphInfo getGlyphInfo(S md5) { GlyphInfo info = glyphInfos.get(md5); if (info == null) glyphInfos.put(md5, info = new GlyphInfo); ret info; } svoid saveMeanings(L md5s, L characters) { if (l(md5s) != l(characters)) { print("huh?"); ret; } for i over md5s: saveMeaning(md5s.get(i), characters.get(i)); }