From 9f37ec9b1f7ff60a6570ac7aeb90918dbcb6c66e Mon Sep 17 00:00:00 2001 From: Dmitrii Ushakov Date: Fri, 5 Jun 2026 10:08:47 +0300 Subject: [PATCH 1/5] Slightly rewrited description --- tasks/medium/strings/anagram_finder.toml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tasks/medium/strings/anagram_finder.toml b/tasks/medium/strings/anagram_finder.toml index c3a751a..e20426c 100644 --- a/tasks/medium/strings/anagram_finder.toml +++ b/tasks/medium/strings/anagram_finder.toml @@ -4,18 +4,18 @@ tags = ["strings", "hashing", "sorting"] time_to_solve_sec = 360 description_en = """ -Given an array of lowercase words $w$, group words that are anagrams. -Return an array of groups (each a string array) where each group has size $\\ge 2$. -Inside each group, words are sorted lexicographically (duplicates allowed). -Groups are sorted by their first element, then by group size. +Given an array $w$ of lowercase words, group words that are anagrams. + +Return an array of groups (each is a string array) where each group has size $\\ge 2$. +Inside each group, words should be ordered alphabetically, duplicates are not allowed. Groups should be ordered alphabetically by their first word. If there are no anagrams, return `[["anagrams not found!"]]`. """ description_ru = """ -Дан массив слов в нижнем регистре $w$. Сгруппируйте слова-анаграммы. -Верните массив групп (каждая — массив строк) только с группами размера $\\ge 2$. -Внутри группы слова отсортированы лексикографически (дубликаты допускаются). -Группы отсортированы по первому слову, затем по размеру группы. +Дан массив $w$ слов в нижнем регистре. Сгруппируйте слова-анаграммы. + +Верните массив групп (каждая — массив строк) с группами размера $\\ge 2$. +Внутри групп слова должны быть упорядочены по алфавиту, дубликаты не допускаются. Группы должны быть упорядочены по алфавиту по первому слову. Если анаграмм нет, верните `[["anagrams not found!"]]`. """ From e400cd8928211f0a6e2335277ee786061ba84bfc Mon Sep 17 00:00:00 2001 From: Dmitrii Ushakov Date: Fri, 5 Jun 2026 10:13:13 +0300 Subject: [PATCH 2/5] Renamed w to words --- tasks/medium/strings/anagram_finder.toml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tasks/medium/strings/anagram_finder.toml b/tasks/medium/strings/anagram_finder.toml index e20426c..97b2137 100644 --- a/tasks/medium/strings/anagram_finder.toml +++ b/tasks/medium/strings/anagram_finder.toml @@ -4,7 +4,7 @@ tags = ["strings", "hashing", "sorting"] time_to_solve_sec = 360 description_en = """ -Given an array $w$ of lowercase words, group words that are anagrams. +Given an array `words` of lowercase words, group words that are anagrams. Return an array of groups (each is a string array) where each group has size $\\ge 2$. Inside each group, words should be ordered alphabetically, duplicates are not allowed. Groups should be ordered alphabetically by their first word. @@ -12,7 +12,7 @@ If there are no anagrams, return `[["anagrams not found!"]]`. """ description_ru = """ -Дан массив $w$ слов в нижнем регистре. Сгруппируйте слова-анаграммы. +Дан массив `words` слов в нижнем регистре. Сгруппируйте слова-анаграммы. Верните массив групп (каждая — массив строк) с группами размера $\\ge 2$. Внутри групп слова должны быть упорядочены по алфавиту, дубликаты не допускаются. Группы должны быть упорядочены по алфавиту по первому слову. @@ -20,18 +20,18 @@ description_ru = """ """ limits = """ -- $0 \\leq \\text{len}(w) \\leq 5\\cdot 42$ -- $1 \\leq \\text{len}(w_i) \\leq 30$ -- $w_i \\in [a\\!\\dots\\!z]^*$ +- $0 \\leq \\text{len}(words) \\leq 5\\cdot 42$ +- $1 \\leq \\text{len}(words_i) \\leq 30$ +- $words_i \\in [a\\!\\dots\\!z]^*$ """ solution = """ -def solution(w): +def solution(words): from collections import defaultdict groups = defaultdict(list) - for s in w: - key = ''.join(sorted(s)) - groups[key].append(s) + for w in words: + key = ''.join(sorted(w)) + groups[key].append(w) # keep only groups with >=2 kept = [] for key, arr in groups.items(): @@ -51,7 +51,7 @@ solution(["eat","tea","tan","ate","nat","bat"]) == [["ate","eat","tea"],["nat"," """ [[input_signature]] -argument_name = "w" +argument_name = "words" [input_signature.type] name = "array" [input_signature.type.nested] From 1fc637a807a42d499969f22b2ac82bd29f88fce9 Mon Sep 17 00:00:00 2001 From: Dmitrii Ushakov Date: Fri, 5 Jun 2026 11:03:50 +0300 Subject: [PATCH 3/5] Fixed solution to avoid duplicates --- tasks/medium/strings/anagram_finder.toml | 47 ++++++++---------------- 1 file changed, 16 insertions(+), 31 deletions(-) diff --git a/tasks/medium/strings/anagram_finder.toml b/tasks/medium/strings/anagram_finder.toml index 97b2137..f688902 100644 --- a/tasks/medium/strings/anagram_finder.toml +++ b/tasks/medium/strings/anagram_finder.toml @@ -28,20 +28,18 @@ limits = """ solution = """ def solution(words): from collections import defaultdict - groups = defaultdict(list) + + groups = defaultdict(set) for w in words: key = ''.join(sorted(w)) - groups[key].append(w) - # keep only groups with >=2 + groups[key].add(w) kept = [] - for key, arr in groups.items(): + for arr in groups.values(): if len(arr) >= 2: - arr.sort() - kept.append(arr) + kept.append(sorted(arr)) if not kept: return [["anagrams not found!"]] - kept.sort(key=lambda g: (g[0], len(g))) - return kept + return sorted(kept) """ examples = """ @@ -72,7 +70,7 @@ expected = [["ever", "veer"], ["item", "mite"], ["kale", "lake"]] [[asserts]] arguments = [["meat", "mat", "team", "mate", "eat", "mate"]] comment = "Only the meat/mate/team group qualifies; words sorted" -expected = [["mate", "mate", "meat", "team"]] +expected = [["mate", "meat", "team"]] [[asserts]] arguments = [["there", "is", "no", "anagrams", "foo", "bar"]] @@ -102,7 +100,6 @@ expected = [ [ "cough", "guohc", - "guohc", ], [ "distribution", @@ -116,25 +113,17 @@ expected = [ "nitwer", "trnwie", ], - [ - "osls", - "osls", - ], - [ - "water", - "water", - ], ] [[asserts]] arguments = [["ab", "ba", "ab", "bca", "cab", "abc", "zzz"]] comment = "Two groups; sorted groups and words" -expected = [["ab", "ab", "ba"], ["abc", "bca", "cab"]] +expected = [["ab", "ba"], ["abc", "bca", "cab"]] [[asserts]] arguments = [["a", "a"]] comment = "Single-letter duplicates" -expected = [["a", "a"]] +expected = [["anagrams not found!"]] [[asserts]] arguments = [["a", "b", "c"]] @@ -191,7 +180,7 @@ expected = [["anagrams not found!"]] [[asserts]] arguments = [["aaaa", "aaaa", "aaaa"]] comment = "All identical" -expected = [["aaaa", "aaaa", "aaaa"]] +expected = [["anagrams not found!"]] [[asserts]] arguments = [["loop", "polo", "pool", "loco", "cool"]] @@ -210,7 +199,7 @@ expected = [["xyz", "xzy", "yxz", "yzx", "zxy", "zyx"]] [[asserts]] arguments = [["abc", "bca", "cab", "abcd", "bcad", "dacb", "dbca", "zz", "zz"]] -comment = "One 3-group, one 4-group, one 2-group; sorted by first word" +comment = "One 3-group, one 4-group; sorted by first word" expected = [ [ "abc", @@ -223,16 +212,12 @@ expected = [ "dacb", "dbca", ], - [ - "zz", - "zz", - ], ] [[asserts]] arguments = [["abc", "bac", "ccc", "ccc", "bcc", "cbc"]] -comment = "Two groups with duplicates" -expected = [["abc", "bac"], ["bcc", "cbc"], ["ccc", "ccc"]] +comment = "Two groups and two duplicates" +expected = [["abc", "bac"], ["bcc", "cbc"]] [[asserts]] arguments = [["note", "tone", "stone", "tones", "onset", "seton"]] @@ -246,10 +231,10 @@ expected = [["lair", "liar", "rail"]] [[asserts]] arguments = [["abc", "cba", "bca", "abcd", "abdc", "abcd", "dcab", "cadb"]] -comment = "Group sizes 3 and 5 (abcd group has duplicate)" -expected = [["abc", "bca", "cba"], ["abcd", "abcd", "abdc", "cadb", "dcab"]] +comment = "Group sizes 3 and 4 (abcd group has duplicate)" +expected = [["abc", "bca", "cba"], ["abcd", "abdc", "cadb", "dcab"]] [[asserts]] arguments = [["zzz", "zzz", "zzz", "zzzz", "zzzz"]] comment = "Two groups of repeated letters" -expected = [["zzz", "zzz", "zzz"], ["zzzz", "zzzz"]] +expected = [["anagrams not found!"]] From dbb5dcf33a947882729cd9660c3983fdcaa14a77 Mon Sep 17 00:00:00 2001 From: Dmitrii Ushakov Date: Fri, 5 Jun 2026 12:05:54 +0300 Subject: [PATCH 4/5] Stylistic corrections --- tasks/medium/strings/anagram_finder.toml | 72 +++++------------------- 1 file changed, 13 insertions(+), 59 deletions(-) diff --git a/tasks/medium/strings/anagram_finder.toml b/tasks/medium/strings/anagram_finder.toml index f688902..de84dae 100644 --- a/tasks/medium/strings/anagram_finder.toml +++ b/tasks/medium/strings/anagram_finder.toml @@ -43,9 +43,9 @@ def solution(words): """ examples = """ -solution(["a","b","c"]) == [["anagrams not found!"]] -solution(["ab","ba","cd","dc"]) == [["ab","ba"],["cd","dc"]] -solution(["eat","tea","tan","ate","nat","bat"]) == [["ate","eat","tea"],["nat","tan"]] +solution(["a", "b", "c"]) == [["anagrams not found!"]] +solution(["ab", "ba", "cd", "dc"]) == [["ab", "ba"], ["cd", "dc"]] +solution(["eat", "tea", "tan", "ate", "nat", "bat"]) == [["ate", "eat", "tea"], ["nat", "tan"]] """ [[input_signature]] @@ -92,27 +92,15 @@ arguments = [ "gelugaan", "nuaegalg", "osls", - "osls", - ], + "osls" + ] ] comment = "Multiple groups with duplicates" expected = [ - [ - "cough", - "guohc", - ], - [ - "distribution", - "oriintdusbti", - ], - [ - "gelugaan", - "nuaegalg", - ], - [ - "nitwer", - "trnwie", - ], + ["cough", "guohc"], + ["distribution", "oriintdusbti"], + ["gelugaan", "nuaegalg"], + ["nitwer", "trnwie"] ] [[asserts]] @@ -136,31 +124,9 @@ comment = "All are one large group" expected = [["abc", "acb", "bac", "bca", "cab", "cba"]] [[asserts]] -arguments = [ - [ - "listen", - "silent", - "enlist", - "inlets", - "google", - "gogole", - "elints", - ], -] +arguments = [["listen", "silent", "enlist", "inlets", "google", "gogole", "elints"]] comment = "Classic anagram set" -expected = [ - [ - "elints", - "enlist", - "inlets", - "listen", - "silent", - ], - [ - "gogole", - "google", - ], -] +expected = [["elints", "enlist", "inlets", "listen", "silent"], ["gogole", "google"]] [[asserts]] arguments = [["dusty", "stud", "study", "rust", "tsur", "udsty"]] @@ -200,19 +166,7 @@ expected = [["xyz", "xzy", "yxz", "yzx", "zxy", "zyx"]] [[asserts]] arguments = [["abc", "bca", "cab", "abcd", "bcad", "dacb", "dbca", "zz", "zz"]] comment = "One 3-group, one 4-group; sorted by first word" -expected = [ - [ - "abc", - "bca", - "cab", - ], - [ - "abcd", - "bcad", - "dacb", - "dbca", - ], -] +expected = [["abc", "bca", "cab"], ["abcd", "bcad", "dacb", "dbca"]] [[asserts]] arguments = [["abc", "bac", "ccc", "ccc", "bcc", "cbc"]] @@ -221,7 +175,7 @@ expected = [["abc", "bac"], ["bcc", "cbc"]] [[asserts]] arguments = [["note", "tone", "stone", "tones", "onset", "seton"]] -comment = "One group of note/tone and one large group of onset/seton/stone/tones" +comment = "One small group and one big group" expected = [["note", "tone"], ["onset", "seton", "stone", "tones"]] [[asserts]] From 3874fb0dd337579ae1495ce797cbd3d8570e5ea4 Mon Sep 17 00:00:00 2001 From: Dmitrii Ushakov Date: Fri, 5 Jun 2026 14:02:02 +0300 Subject: [PATCH 5/5] Bring quotation marks to unified style --- tasks/medium/strings/anagram_finder.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/medium/strings/anagram_finder.toml b/tasks/medium/strings/anagram_finder.toml index de84dae..33d0ed1 100644 --- a/tasks/medium/strings/anagram_finder.toml +++ b/tasks/medium/strings/anagram_finder.toml @@ -31,7 +31,7 @@ def solution(words): groups = defaultdict(set) for w in words: - key = ''.join(sorted(w)) + key = "".join(sorted(w)) groups[key].add(w) kept = [] for arr in groups.values():