John Carter wrote: > Assuming you are running Linux and have a list of valid English words in > the file /usr/share/dict/words or someplace or something similar. > > Assume you have a cellphone with T9 predictive text input. > > For those that don't, cellphones have each key overloaded to mean several > things. eg. On my Sharp GX-15 > 2 also means A,B,C > 3 also means D,E,F > 4 also means G,H,I > 5 also means J,K,L > 6 = M,N,O > 7 = P,Q,R,S > 8 = T,U,V > 9 = W,X,Y,Z > > In T9 mode I can type in 43556 and it only finds one word in its > dictionary that can be made with combination > {G,H,I}{D,E,F}{J,K,L}{J,K,L}{M,N,O} and that is > HELLO > > Which is a lost faster than typing 4433555555666. > > How ever, some words like "high", can be entered by just bouncing on one > key ... 4444. > > Your mission, should you choose to accept, is to write the shortest ruby > program that will find the longest word in the dictionary that can be > produced by... > * repeatedly typing one key > * Can be produced by just using only two keys. > * Can be produced by just using only three keys. > * Can be produced by just using only four keys. > * .... Assumes that ambiguity is disallowed; rejects words with apostrophes. h=Hash.new(0) a=ARGF.grep(/^\w+$/).sort_by{|x|-x.size}.map{|w|w.chomp!.downcase! c=w.split('').map{|c|2+"abc def ghi jkl mno pqrstuv wxyz".index(c)/4} h[c]+=1;[w,c]}.reject{|w,c|h[c]>1} (1..8).each{|n|p [n,a.find{|w,c|n==c.uniq.size}[0]]} [1, "deeded"] [2, "blackjack"] [3, "openendedness"] [4, "prepossessingness"] [5, "contemporaneousness"] [6, "microspectrophotometric"] [7, "antidisestablishmentarianism"] [8, "microspectrophotometrically"]