Implement emojifuck

This commit is contained in:
Ian Adam Naval 2017-02-24 10:46:23 -05:00
parent ea936cba8e
commit fc08f05fea
3 changed files with 15 additions and 47 deletions

View File

@ -1,33 +0,0 @@
+++++ +++ Set Cell #0 to 8
[
>++++ Add 4 to Cell #1; this will always set Cell #1 to 4
[ as the cell will be cleared by the loop
>++ Add 4*2 to Cell #2
>+++ Add 4*3 to Cell #3
>+++ Add 4*3 to Cell #4
>+ Add 4 to Cell #5
<<<<- Decrement the loop counter in Cell #1
] Loop till Cell #1 is zero
>+ Add 1 to Cell #2
>+ Add 1 to Cell #3
>- Subtract 1 from Cell #4
>>+ Add 1 to Cell #6
[<] Move back to the first zero cell you find; this will
be Cell #1 which was cleared by the previous loop
<- Decrement the loop Counter in Cell #0
] Loop till Cell #0 is zero
The result of this is:
Cell No : 0 1 2 3 4 5 6
Contents: 0 0 72 104 88 32 8
Pointer : ^
>>. Cell #2 has value 72 which is 'H'
>---. Subtract 3 from Cell #3 to get 101 which is 'e'
+++++ ++..+++. Likewise for 'llo' from Cell #3
>>. Cell #5 is 32 for the space
<-. Subtract 1 from Cell #4 for 87 to give a 'W'
<. Cell #3 was set to 'o' from the end of 'Hello'
+++.----- -.----- ---. Cell #3 for 'rl' and 'd'
>>+. Add 1 to Cell #5 gives us an exclamation point
>++. And finally a newline from Cell #6

1
examples/helloworld.ef Normal file
View File

@ -0,0 +1 @@
📈📈📈📈📈📈📈📈🌔🔜📈📈📈📈🌔🔜📈📈🔜📈📈📈🔜📈📈📈🔜📈🔙🔙🔙🔙📉🌖🔜📈🔜📈🔜📉🔜🔜📈🌔🔙🌖🔙📉🌖🔜🔜📤🔜📉📉📉📤📈📈📈📈📈📈📈📤📤📈📈📈📤🔜🔜📤🔙📉📤🔙📤📈📈📈📤📉📉📉📉📉📉📤📉📉📉📉📉📉📉📉📤🔜🔜📈📤🔜📈📈📤

View File

@ -1,6 +1,5 @@
-- Branfuck interpreter in Haskell: beause why not
-- Emojifuck interpreter in Haskell: beause why not
-- author: ianonavy
-- Based on https://github.com/quchen/articles/blob/master/write_yourself_a_brainfuck.md
import Data.Maybe
import Data.List
@ -22,16 +21,17 @@ data BFSource = BFSource [BrainfuckCommand]
instance Show BFSource where
show (BFSource bfs) = map bfToChar bfs where
bfToChar GoRight = '>'
bfToChar GoLeft = '<'
bfToChar Increment = '+'
bfToChar Decrement = '-'
bfToChar Print = '.'
bfToChar Read = ','
bfToChar LoopL = '['
bfToChar LoopR = ']'
bfToChar (Comment c) = c
bfToChar GoRight = '\128284'
bfToChar GoLeft = '\128281'
bfToChar Increment = '\128200'
bfToChar Decrement = '\128201'
bfToChar Print = '\128229'
bfToChar Read = '\128228'
bfToChar LoopL = '\127764'
bfToChar LoopR = '\127766'
-- bfToChar (Comment c) = c
--
data Tape a = Tape [a] -- Left of the pivot element
a -- Pivot element
[a] -- Right of the pivot element
@ -64,7 +64,7 @@ traceParens :: BFSource -> [Int]
traceParens (BFSource bfs) = scanl accParens 0 bfs
getMissingOpenError :: BFSource -> String
getMissingOpenError (BFSource bfs) =
getMissingOpenError (BFSource bfs) =
"Syntax Error:\n- Close parens without open paren: character " ++ index where
index = (show . fromJust . findIndex (<0) $ scanl accParens 0 bfs)
@ -89,7 +89,7 @@ parseBrainfuck = checkSyntax . BFSource . mapMaybe charToBF
charToBF ']' = Just LoopR
charToBF c = Just (Comment c)
printBrainfuck :: Either String BFSource -> IO ()
printBrainfuck :: Either String BFSource -> IO ()
printBrainfuck (Left bfs) = putStrLn bfs
printBrainfuck (Right bfs) = putStrLn . show $ bfs
@ -176,4 +176,4 @@ runFile filename = readFile filename >>= runBrainfuck . parseBrainfuck
main = do
args <- getArgs
mapM runFile args