What ROT is this? - decrypt ROT-n
Haskell - 192 175
f y=sum.map(\x->length.fst$break(==x)y)
main=interact(\s->snd$minimum$[(f"etaoinshrdlcumwfgypbvkjxqz"r,show(26-n)++" "++r)|n<-[0..25],let r=map(\x->([x..'z']++['a'..])!!n)s])
Running
% ./rot-n <<< "pmttwxmwxtmwnxzwoziuuqvoxchhtmakwlmowtnabiksmfkpivom"
8 hellopeopleofprogrammingpuzzlescodegolfstackexchange
GolfScript, 112 108 102 100 characters
{{}/]{97-}%}:b~:|;"etaoinshrdlcumwfgypbvkjxqz"b:f,:&,{:x[|{&x-+&%f?}%{+}*\]}%$0=1=:x|{&x-+&%97+}%''+
I'm not happy about the repetition with the re-decrypting at the end, but meh.
Ungolfed (if that makes any sense :P) and slightly older version:
# store input IDs (a = 0, b = 1, etc.) in s
[{}/]{97-}%:s;
# store frequency data IDs in f (blah, repetition)
"etaoinshrdlcumwfgypbvkjxqz"[{}/]{97-}%:f
# for each number from 0 to 26 (length of previous string left unpopped)...
,,{
# the number is x
:x;
# return an array of...
[
# the score
s{x 26\-+26%f?}%{+}*
# and the n
x
]
}%
# use $ort to find the n to output
$0=1=:x
# get the string that the n corresponded to (blah, more repetition)
s{x 26\-+26%97+}%''+
JavaScript (205)
f='zqxjkvbpygfwmucldrhsnioate';a='abcdefghijklmnopqrstuvwxyz';for(s=prompt(o=m=n=0)
,i=27;i--;w>m&&(m=w,n=i,o=u))for(u='',w=c=0;c<s.length;w+=f.indexOf(x))u+=x=(a+a)[a
.indexOf(s[c++])+i];alert((26-n)+' '+o)
I think it can still be golfed a bit more, so suggestions welcome!
Some notes to help understand the solution
m
,n
, ando
track the highest score.u
andw
track the character and value result, respectively for the currenti
(a+a)
helps prevent overflow when wrapping around pastz
, and is shorter than doing%26
- I have the frequency in reverse order so I can search max instead of min.
Proof: http://jsfiddle.net/J9ZyV/5/