|
继续解59题。
#64对"普通英语文本"的认定, 是认为字母+空格应该占据全部字符的90%以上。 这种做法比较低效。
更好的认定方法是: 在正常的英语文本中, 数量最多的是空格, 并且这种多是绝对性的多, 在任何较长的片段都是最多的, 甚至几十按照隔几个挑一个字符的方法, 挑出来的字符串中也一定是空格最多。
因此, 我们可以从1/4/7... 的字符中找出最多的,假定它是空格, 然后破解对应的key, 再 2/5/8... 和3/6/9...中同样的方法找出第二个第三个key
用这样的方法, 甚至不需要题目给出的条件: 3个"小写字母"。
这次纯粹用SQL来解决, 虽然写的依然是冗长了一些:
with t as (select '79,59,12,2,79,35,8,28,20,2,以下略。。。。。。' str
from dual)
,t1 as (select cast(','||str||',' as varchar2(4000)) str from t)
,td as (select rownum d from t1 connect by rownum<=length(translate(str, ','||str, ',')) )
,tall as (select /*+ MATERIALIZE */ d, instr(str, ',', 1,d), instr(str, ',', 1,d+1)-1,
substr(str, instr(str, ',',1, d)+1,instr(str, ',', 1,d+1)-instr(str, ',', 1,d)-1) crypt
from t1,td where d<length(translate(str, ','||str, ',')))
,tchar as (select level c from dual where level>=97 connect by level<=122)
,tspace as (select mod(d,3) seq ,crypt,count(*) cnt from tall group by mod(d,3),crypt)
,tspace2 as (select seq, substr(max(to_char(cnt, 'FM0000')||crypt),5) sp from tspace group by seq)
,tkey as (select seq, (sp+32) - BITAND(sp,32)*2 key from tspace2 )
,tdecrypt as (select d, (crypt + key) - BITAND(crypt, key) * 2 decrypt
from tall, tkey where mod(d,3)=seq)
select sum(decrypt) from tdecrypt
SUM(DECRYPT)
------------
107359
Executed in 2.187 seconds
其中tspace2的写法,是刚刚从http://www.itpub.net/thread-1383362-1-1.html 贴子里,newkid那里偷来的。 |
|