« 基数ソート | トップページ | Project Euler 用のモジュールを改訂しました。 »

2011年2月27日 (日)

Project Euler : Problem 59 ~ 暗号解読

 問題はこちらをご覧ください。
 また、自作の "ForEuler module" に関してはこちらをご覧ください。

 

 今回の問題の解法は、以前 Ruby で解いた時と同じです。考え方についてはこちらをご覧下さい。

{- * キーワードを探す : problem059_find_key.hs -} import Data.Bits (xor) import Data.List (transpose, sort, group, sortBy) import Data.Ord (comparing) import Data.Char (chr, ord) main :: IO () main = do ss <- readFile "cipher1.txt" print $ map f $ map top5 $ divide 3 $ read ("[" ++ ss ++ "]") where f ns = deemChar 'e' ns -- cs を n 個おきにグループに分る -- ex : divide 3 [1..10] => [[1,4,7,10],[2,5,8],[3,6,9]] divide :: Int -> [Int] -> [[Int]] divide n cs = (transpose . f) cs where f [] = [] f xs = as : f bs where (as, bs) = splitAt n xs -- ns の要素のうち出現頻度の高い順に 5 個をリストにして返す top5 :: [Int] -> [Int] top5 ns = map fst $ take 5 $ reverse $ sortBy (comparing snd) lst where lst = [(head xs, length xs) | xs <- (group . sort) ns] -- 鍵文字を c と仮定して、ns を復元する(結果は String として返す) deemChar :: Char -> [Int] -> [String] deemChar c ns = map f ns where f n = [chr $ xor n $ ord c]
{- * 暗号文を復元する : problem059_decode.hs * コンパイル後のファイル名を "decode"、キーワードを "***" と仮定すると、 > decode *** で、暗合文を復元する。 -} import Data.Bits (xor) import Data.Char (ord, chr) import System (getArgs) main :: IO () main = do args <- getArgs ss <- readFile "cipher1.txt" print $ decode (read ("[" ++ ss ++ "]")) (head args) {- -- *** をキーワードに置き換える main :: IO () main = do ss <- readFile "cipher1.txt" print $ decode (read ("[" ++ ss ++ "]")) "***" -} decode :: [Int] -> String -> String decode ns pw = map chr $ zipWith (xor) ns ms where ms = map ord $ concat $ repeat pw

« 基数ソート | トップページ | Project Euler 用のモジュールを改訂しました。 »

Haskell」カテゴリの記事

Project Euler」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/112020/50988655

この記事へのトラックバック一覧です: Project Euler : Problem 59 ~ 暗号解読:

« 基数ソート | トップページ | Project Euler 用のモジュールを改訂しました。 »

2016年7月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
フォト

最近のトラックバック

無料ブログはココログ