notpron

git clone git://xatko.vsos.ethz.ch/notpron.git
Log | Files | Refs

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 }