Implement emojifuck
This commit is contained in:
parent
ea936cba8e
commit
fc08f05fea
@ -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
1
examples/helloworld.ef
Normal file
@ -0,0 +1 @@
|
||||
📈📈📈📈📈📈📈📈🌔🔜📈📈📈📈🌔🔜📈📈🔜📈📈📈🔜📈📈📈🔜📈🔙🔙🔙🔙📉🌖🔜📈🔜📈🔜📉🔜🔜📈🌔🔙🌖🔙📉🌖🔜🔜📤🔜📉📉📉📤📈📈📈📈📈📈📈📤📤📈📈📈📤🔜🔜📤🔙📉📤🔙📤📈📈📈📤📉📉📉📉📉📉📤📉📉📉📉📉📉📉📉📤🔜🔜📈📤🔜📈📈📤
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user