Code golf: find all anagrams
Powershell, 104 97 91 86 83 chars
$k=@{};$input|%{$k["$([char[]]$_|%{$_+0}|sort)"]+=@($_)}
$k.Values|?{$_[1]}|%{"$_"}
Update for the new requirement (+8 chars):
To exclude the words that only differ in capitalization, we could just remove the duplicates (case-insensitvely) from the input list, i.e. $input|sort -u
where -u
stands for -unique
. sort
is case-insenstive by default:
$k=@{};$input|sort -u|%{$k["$([char[]]$_|%{$_+0}|sort)"]+=@($_)}
$k.Values|?{$_[1]}|%{"$_"}
Explanation of the [char[]]$_|%{$_+0}|sort
-part
It's a key for the hashtable entry under which anagrams of a word are stored. My initial solution was: $_.ToLower().ToCharArray()|sort
. Then I discovered I didn't need ToLower()
for the key, as hashtable lookups are case-insensitive.
[char[]]$_|sort
would be ideal, but sorting of the chars for the key needs to be case-insensitive (otherwise Cab
and abc
would be stored under different keys). Unfortunately, sort
is not case-insenstive for chars (only for strings).
What we need is [string[]][char[]]$_|sort
, but I found a shorter way of converting each char to string, which is to concat something else to it, in this case an integer 0
, hence [char[]]$_|%{$_+0}|sort
. This doesn't affect the sorting order, and the actual key ends up being something like: d0 o0 r0 w0
. It's not pretty, but it does the job :)
Perl, 59 characters
chop,$_{join'',sort split//,lc}.="$_ "for<>;/ ./&&say for%_
Note that this requires Perl 5.10 (for the say
function).