Powershell, 104 97 91 86 83 знака
$k=@{};$input|%{$k["$([char[]]$_|%{$_+0}|sort)"]+=@($_)}
$k.Values|?{$_[1]}|%{"$_"}
Обновление для нового требования (+8 символов):
Чтобы исключить слова, которые отличаются только заглавными буквами, мы могли бы просто удалить дубликаты (без учета регистра) из списка ввода, то есть $input|sort -u
, где -u
обозначает -unique
. sort
по умолчанию не учитывает регистр:
$k=@{};$input|sort -u|%{$k["$([char[]]$_|%{$_+0}|sort)"]+=@($_)}
$k.Values|?{$_[1]}|%{"$_"}
Объяснение [char[]]$_|%{$_+0}|sort
-части
Это ключ для записи хеш-таблицы, в которой хранятся анаграммы слова. Мое первоначальное решение было: $_.ToLower().ToCharArray()|sort
. Затем я обнаружил, что мне не нужно ToLower()
для ключа, так как поиск по хеш-таблице не зависит от регистра.
[char[]]$_|sort
было бы идеально, но сортировка символов для ключа должна выполняться без учета регистра (в противном случае Cab
и abc
будут храниться под разными ключами). К сожалению, sort
не учитывает регистр символов (только для строк).
Нам нужен [string[]][char[]]$_|sort
, но я нашел более короткий способ преобразования каждого символа в строку, который заключается в конкатенации чего-то еще с ним, в данном случае целое число 0
, следовательно, [char[]]$_|%{$_+0}|sort
. Это не влияет на порядок сортировки, и фактический ключ в итоге выглядит примерно так: d0 o0 r0 w0
. Это не красиво, но это делает работу :)