digitalmars.D - Trying Phobos some more
- bearophile (61/61) Feb 12 2014 One way to find what's missing among Phobos ranges and higher
One way to find what's missing among Phobos ranges and higher
order functions is to try to use them. This is a small
Rosettacode task, given a file of words, it asks to find the
longest pair of anagrams that have not even one letter in the
same position:
http://rosettacode.org/wiki/Anagrams/Deranged_anagrams
I don't fully understand the Clojure solution:
(let
anagrams (filter second (vals (group-by sort words)))
I have written two D solutions, the first tries to be short and
the second to be faster. This is the first solution (look in that
page for the fast solution):
void main() {
import std.stdio, std.file, std.algorithm, std.string,
std.array;
string[][dstring] anags;
foreach (const w; "unixdict.txt".readText.split)
anags[w.array.sort().release.idup] ~= w;
anags
.byValue
.map!(anags => anags.cartesianProduct(anags)
.filter!q{a[].equal!{ a != b }})
.join
.minPos!q{ a[0].length > b[0].length }[0]
.writeln;
}
A better short D version:
void main() {
import std.stdio, std.file, std.algorithm, std.string,
std.array;
"unixdict.txt"
.readText
.split
.hashGroupBy!(w => w.sorted.release)
.byValue
.map!(anags => anags
.pairwise
.filter!q{a[].equal!q{ a != b }})
.join
.max!q{ a[0].length }
.writeln;
}
Where:
hashGroupBy returns an associative array of the equivalence
classes, given a key function
(http://d.puremagic.com/issues/show_bug.cgi?id=9842 ).
sorted is similar to an array+sort. But it allocates a new array,
so the its output should be implicitly castable to const
(http://d.puremagic.com/issues/show_bug.cgi?id=5076
https://d.puremagic.com/issues/show_bug.cgi?id=12140 ).
pairwise is a range that yields the pairs, but only the lower
triangle. So it's like two nested loops. In this program it's up
to twice faster than using cartesianProduct
(http://d.puremagic.com/issues/show_bug.cgi?id=6788 ).
max and min accept an optional mapping key function, as in Python
(http://d.puremagic.com/issues/show_bug.cgi?id=4705 ).
Bye,
bearophile
Feb 12 2014








"bearophile" <bearophileHUGS lycos.com>