Anagramm.d (1095B)
1 import std.stdio; 2 import std.algorithm; 3 import std.uni; 4 import std.range; 5 import std.getopt; 6 import std.conv; 7 8 9 void writeAnagrams(Range)(in string[][string]words, Range r) if(is(ElementType!Range : const(char)[])){ 10 11 } 12 13 struct Anagram{ 14 private string[][dstring] index; 15 16 private static dstring toKey(in char[] str){ 17 return (str[].map!(a=>a.toLower).array.sort).to!dstring; 18 } 19 20 void add(in char[] str){ 21 index[toKey(str)]~=str.idup; 22 } 23 string[] get(in char[] str){ 24 string[]* p=toKey(str) in index; 25 if(p==null) 26 return null; 27 return *p; 28 } 29 } 30 31 void main(string[] args){ 32 Anagram ana; 33 string filename="-"; 34 bool anagrams_on_stdin=false; 35 getopt(args, 36 "word-file|f", &filename, 37 "anagrams-stdin|s", &anagrams_on_stdin, 38 ); 39 File f; 40 if(filename=="-"){ 41 if(anagrams_on_stdin){ 42 throw new Exception("Can't read anagrams _and_ words from stdin"); 43 } 44 f=stdin; 45 } 46 else{ 47 f.open(filename); 48 } 49 scope(exit){f.close();} 50 51 f.byLine().each!(a=>ana.add(a)); 52 53 if(anagrams_on_stdin){ 54 stdin.byLine.each!(a=>writeln(ana.get(a))); 55 } 56 else{ 57 args.each!(a=>writeln(ana.get(a))); 58 } 59 }