Skip to content

Instantly share code, notes, and snippets.

@abailly
Created May 23, 2020 14:09
Show Gist options
  • Save abailly/240e4c7d3a361098a633e493eb952bb4 to your computer and use it in GitHub Desktop.
Save abailly/240e4c7d3a361098a633e493eb952bb4 to your computer and use it in GitHub Desktop.
module Substitution where
import Data.Maybe
import Data.List(findIndex)
newtype Message = Msg { unMsg :: [Int] }
deriving (Eq, Show)
type SubstitutionTable = Int -> Int
mkSubst :: [Int] -> SubstitutionTable
mkSubst table n =
table !! (n - 1)
cipher :: SubstitutionTable -> Message -> Message
cipher table = Msg . fmap table . unMsg
subst1 = mkSubst [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,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,1]
subst2 = mkSubst [ 2,1,4,3,6,5,8,7,10,9,12,11,14,13,16,15,18,17,20,19,22,21,24,23,26,25,28,27,30,29,32,31,34,33,36,35,38,37,40,39,42,41,44,43,46,45,48,47,50,49,52,51,54,53,56,55,58,57,60,59,62,61,64,63,66,65,68,67,70,69,72,71,74,73,76,75,78,77,80,79,82,81,84,83,86,85,88,87,90,89,92,91,94,93,96,95,98,97,100,99]
powerOfSubst :: SubstitutionTable -> Message -> Message -> Int
powerOfSubst table initial target =
let ciphers = drop 1 $ iterate (cipher table) initial
in 1 + (fromJust $ findIndex (uncurry (==)) $ zip ciphers (repeat target))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment