bba3f16c43
Per the assignment's instructions, the `Shift n` operation should treat the *entire keyboard* like a cycle and shift that. I was erroneously treating *each row* like a cycle and shifting those one-by-one. This change fixes that. In addition, it also: - Updates README.md with expected inputs and outputs - Updates test suite - Adds `split` dependency to {default,shell}.nix
41 lines
1.1 KiB
Haskell
41 lines
1.1 KiB
Haskell
--------------------------------------------------------------------------------
|
|
module App where
|
|
--------------------------------------------------------------------------------
|
|
import Keyboard (Keyboard(..))
|
|
import Transforms (Transform(..))
|
|
import Utils ((|>))
|
|
|
|
import qualified Data.Char as Char
|
|
import qualified Utils
|
|
import qualified Data.List.Split as Split
|
|
import qualified Keyboard
|
|
import qualified Data.HashMap.Strict as HM
|
|
--------------------------------------------------------------------------------
|
|
|
|
transform :: Keyboard -> Transform -> Keyboard
|
|
|
|
transform (Keyboard xs) xform =
|
|
case xform of
|
|
HorizontalFlip ->
|
|
xs
|
|
|> fmap reverse
|
|
|> Keyboard
|
|
|
|
VerticalFlip ->
|
|
xs
|
|
|> reverse
|
|
|> Keyboard
|
|
|
|
Shift n ->
|
|
xs
|
|
|> concat
|
|
|> Utils.rotate n
|
|
|> Split.chunksOf 10
|
|
|> Keyboard
|
|
|
|
retypePassage :: String -> Keyboard -> Maybe String
|
|
retypePassage passage newKeyboard =
|
|
passage
|
|
|> fmap Char.toUpper
|
|
|> traverse (\c -> HM.lookup c Keyboard.charToCoord)
|
|
>>= traverse (Keyboard.coordToChar newKeyboard)
|