Added cabal setup scripts.
Modified files to work with cabal. Added main function in SolataireCipher.
This commit is contained in:
parent
fd4ef85d22
commit
42c8b7db80
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,3 +1,5 @@
|
||||
*.hi
|
||||
*.o
|
||||
input
|
||||
bin
|
||||
dist
|
@ -8,7 +8,7 @@
|
||||
|
||||
{-# LANGUAGE BangPatterns #-}
|
||||
|
||||
module Cryptograms where
|
||||
module Main where
|
||||
|
||||
import qualified Data.Map as M
|
||||
import qualified Data.Set as S
|
||||
|
@ -46,7 +46,7 @@
|
||||
Copyright 2012 Abhinav Sarkar <abhinav@abhinavsarkar.net>
|
||||
-}
|
||||
|
||||
module EnglishNumerals where
|
||||
module Main where
|
||||
|
||||
import qualified Data.Sequence as Seq
|
||||
import Data.List (maximumBy, nub)
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
{-# LANGUAGE NoMonomorphismRestriction, RecordWildCards #-}
|
||||
|
||||
module GedcomParser where
|
||||
module Main where
|
||||
|
||||
import Text.Parsec hiding (spaces, Line)
|
||||
import System.IO
|
||||
|
@ -20,7 +20,7 @@
|
||||
|
||||
{-# LANGUAGE MultiParamTypeClasses, RecordWildCards #-}
|
||||
|
||||
module KnightsTravails where
|
||||
module Main where
|
||||
|
||||
import qualified Data.Set as S
|
||||
import AStar
|
||||
|
@ -15,7 +15,7 @@
|
||||
|
||||
{-# LANGUAGE BangPatterns #-}
|
||||
|
||||
module PhoneNumberWords where
|
||||
module Main where
|
||||
|
||||
import qualified Data.Set as S
|
||||
import qualified Data.Map as M
|
||||
|
@ -1,8 +1,11 @@
|
||||
module SolataireCipher where
|
||||
module Main where
|
||||
|
||||
import qualified Options.Applicative as Op
|
||||
import Data.Char (toUpper, ord, chr)
|
||||
import Data.List (unfoldr, splitAt, sort, elemIndex)
|
||||
import Data.Maybe (fromJust)
|
||||
import Control.Applicative ((<*>))
|
||||
import Control.Monad ((>=>))
|
||||
|
||||
data Card = RankCard Int | JokerA | JokerB deriving (Eq)
|
||||
|
||||
@ -43,7 +46,7 @@ keyChar deck =
|
||||
deck'' = moveCard deck' (bJokerIdx deck') 2
|
||||
|
||||
-- triple cut around the jokers
|
||||
[i, j] = sort [(aJokerIdx deck''), (bJokerIdx deck'')]
|
||||
[i, j] = sort [aJokerIdx deck'', bJokerIdx deck'']
|
||||
(top, rest) = splitAt i deck''
|
||||
(mid, bottom) = splitAt (j + 1 - i) rest
|
||||
cards' = bottom ++ mid ++ top
|
||||
@ -51,14 +54,14 @@ keyChar deck =
|
||||
-- count cut using the value of the bottom card
|
||||
c = cardValue (last cards')
|
||||
(top', bottom') = splitAt c cards'
|
||||
cards'' = (init bottom') ++ top' ++ [last cards']
|
||||
cards'' = init bottom' ++ top' ++ [last cards']
|
||||
|
||||
-- output value
|
||||
cV = cardValue (cards'' !! (cardValue . head $ cards''))
|
||||
in
|
||||
if cV == 53
|
||||
then keyChar cards''
|
||||
else (numToChar $ (if cV > 26 then cV - 26 else cV), cards'')
|
||||
else (numToChar (if cV > 26 then cV - 26 else cV), cards'')
|
||||
|
||||
moveCard :: [a] -> Int -> Int -> [a]
|
||||
moveCard lst idx move =
|
||||
@ -119,3 +122,26 @@ decrypt deck encText =
|
||||
ks = keyStream deck (length encText)
|
||||
encTextNums = charsToNums encText
|
||||
ksNums = charsToNums ks
|
||||
|
||||
data Command = Encrypt String | Decrypt String
|
||||
|
||||
optParser = Op.subparser $
|
||||
Op.command "encrypt"
|
||||
(Op.info
|
||||
(Op.helper <*>
|
||||
(Op.argument (Op.str >=> Just . Encrypt) (Op.metavar "CLEARTEXT")))
|
||||
(Op.progDesc "Encrypts a cleartext"))
|
||||
Op.& Op.command "decrypt"
|
||||
(Op.info
|
||||
(Op.helper <*>
|
||||
(Op.argument (Op.str >=> Just . Decrypt) (Op.metavar "CRYPTTEXT")))
|
||||
(Op.progDesc "Decrypts a crypttext"))
|
||||
|
||||
opts = Op.info (Op.helper <*> optParser) $
|
||||
Op.progDesc "Encrypt or decrypts a string using the solataire cipher algorithm"
|
||||
|
||||
main = do
|
||||
command <- Op.execParser opts
|
||||
case command of
|
||||
(Encrypt clearText) -> putStrLn $ encrypt serialDeck clearText
|
||||
(Decrypt cryptText) -> putStrLn $ decrypt serialDeck cryptText
|
@ -10,7 +10,7 @@
|
||||
|
||||
{-# LANGUAGE BangPatterns #-}
|
||||
|
||||
module TicTacToe where
|
||||
module Main where
|
||||
|
||||
import Data.List (sort, nub, maximumBy)
|
||||
import Data.List.Split (chunk)
|
||||
|
62
rubyquiz.cabal
Normal file
62
rubyquiz.cabal
Normal file
@ -0,0 +1,62 @@
|
||||
name: RubyQuiz
|
||||
version: 1.0
|
||||
synopsis: Solutions to RubyQuiz problems in Haskell
|
||||
homepage: https://github.com/abhin4v/rubyquiz
|
||||
bug-reports: https://github.com/abhin4v/rubyquiz/issues
|
||||
license: BSD3
|
||||
copyright: Copyright 2012 Abhinav Sarkar <abhinav@abhinavsarkar.net>
|
||||
author: Abhinav Sarkar
|
||||
cabal-version: >= 1.14
|
||||
build-type: Simple
|
||||
|
||||
source-repository head
|
||||
type: git
|
||||
location: git@github.com:abhin4v/rubyquiz.git
|
||||
|
||||
executable TicTacToe
|
||||
build-depends : base == 4.*,
|
||||
containers == 0.4.*,
|
||||
mtl == 2.1.*,
|
||||
random == 1.0.*,
|
||||
split == 0.1.4.*
|
||||
main-is : TicTacToe.hs
|
||||
default-language : Haskell2010
|
||||
|
||||
executable KnightsTravails
|
||||
build-depends : base == 4.*,
|
||||
containers == 0.4.*,
|
||||
pqueue == 1.2.*
|
||||
main-is : KnightsTravails.hs
|
||||
default-language : Haskell2010
|
||||
other-modules : AStar
|
||||
|
||||
executable Cryptograms
|
||||
build-depends : base == 4.*,
|
||||
containers == 0.4.*
|
||||
main-is : Cryptograms.hs
|
||||
default-language : Haskell2010
|
||||
|
||||
executable EnglishNumerals
|
||||
build-depends : base == 4.*,
|
||||
containers == 0.4.*,
|
||||
split == 0.1.4.*
|
||||
main-is : EnglishNumerals.hs
|
||||
default-language : Haskell2010
|
||||
|
||||
executable GedcomParser
|
||||
build-depends : base == 4.*,
|
||||
parsec == 3.1.*
|
||||
main-is : GedcomParser.hs
|
||||
default-language : Haskell2010
|
||||
|
||||
executable PhoneNumberWords
|
||||
build-depends : base == 4.*,
|
||||
containers == 0.4.*
|
||||
main-is : PhoneNumberWords.hs
|
||||
default-language : Haskell2010
|
||||
|
||||
executable SolataireCipher
|
||||
build-depends : base == 4.*,
|
||||
optparse-applicative == 0.1.*
|
||||
main-is : SolataireCipher.hs
|
||||
default-language : Haskell2010
|
Loading…
Reference in New Issue
Block a user