import Text.Parsec
import Control.Applicative ((<$), (<*), (*>), liftA)
-import Data.List (partition, union, intersect)
+import Data.List (partition, union, intersect, tails)
+import Data.Char (isAlphaNum)
data Chunk = Include String | Exclude String deriving (Show)
data ChunkV = Includev Bool | Excludev Bool deriving (Show)
part2 text = do
print $ length $ filter (supportsSSL) $ successfulParse $ parseI7f text
-
allowsAbba :: [ChunkV] -> Bool
allowsAbba chunks = (any (chunkValueV) includeChunks) && (not (any (chunkValueV) excludeChunks))
where (includeChunks, excludeChunks) = partition (isIncludeV) chunks
-
i7file = i7line `endBy` newline
i7line = many1 (includeChunk <|> excludeChunk)
hasABBA = preambleAbba <* (many alphaNum)
preambleAbba = (try abba) <|> (alphaNum >> preambleAbba)
+-- abba =
+-- do a <- alphaNum
+-- b <- alphaNum
+-- if a == b then
+-- fail "Identical"
+-- else do char b
+-- char a
+-- return [a, b, b, a]
+
abba =
do a <- alphaNum
- b <- alphaNum
- if a == b then
- fail "Identical"
- else do char b
- char a
- return [a, b, b, a]
+ b <- noneOf [a]
+ char b
+ char a
+ return [a, b, b, a]
+
+-- where
+-- firstChar = satisfy (\a -> isLetter a || a == '_')
+-- nonFirstChar = satisfy (\a -> isDigit a || isLetter a || a == '_')
+
+ -- b <- bChar
+-- where bChar = satisfy (\l -> lsLetter l && l /= a)
+
+
i7filev = i7linev `endBy` newline
i7linev = many1 (includeChunkv <|> excludeChunkv)
allSubstrings :: Int -> [a] -> [[a]]
-allSubstrings n es
- | length es < n = []
- | otherwise = (take n es) : (allSubstrings n $ tail es)
+-- allSubstrings n es
+-- | length es < n = []
+-- | otherwise = (take n es) : (allSubstrings n $ tail es)
+allSubstrings n e = filter (\s -> length s == n) $ map (take n) $ tails e
+
ieCandidates :: [Chunk] -> ([String], [String])
ieCandidates chunks = (includeCandidates, excludeCandidates)