WrongFuck
Jump to navigation
Jump to search
WrongFuck is brainfuck, but wrong.
Overview
It runs off of the same brainfuck tape and pointer. All instructions are ran the same way.
Translation from brainfuck
| brainfuck | WrongFuck |
|---|---|
+
|
>
|
-
|
<
|
>
|
]
|
<
|
[
|
[
|
,
|
]
|
.
|
.
|
+
|
,
|
-
|
Example programs
I didn't do any long programs because I'm lazy
Cat program
,.[,.]
WrongFuck:
-+,-+.
Truth-machine
The following implements a truth-machine tantamount to the brainfuck ,.[-->+[>>]<[.]<<] program:
-+,<<]>,]].[,+.[[.
Interpreter
The following routines, implemented in Common Lisp, apply themselves to the conversion betwixt WrongFuck and brainfuck:
(deftype destination ()
"The ``destination`` type defines a sink for output operations, the
circumference of which amplects, without the claim of the
contingency's exhaustion, the functions ``format`` and
``write-char``."
'(or null (eql T) stream string))
;;; -------------------------------------------------------
(defun translate-brainfuck-to-WrongFuck (brainfuck-code
&optional (destination NIL))
"Transliterates the BRAINFUCK-CODE to the equivalent WrongFuck
program, writes the resulting code to the DESTINATION, and returns
for a non-``NIL`` DESTINATION the ``NIL`` value; otherwise produces
and responds with a fresh string comprehending the output."
(declare (type string brainfuck-code))
(declare (type destination destination))
(the (or null string)
(if destination
(flet ((write-WrongFuck-command (wrongFuck-token)
"Writes the WRONGFUCK-TOKEN to the DESTINATION and returns
no value."
(declare (type character wrongFuck-token))
(format destination "~c" wrongFuck-token)
(values)))
(loop
for brainfuck-token of-type character across brainfuck-code
do
(case brainfuck-token
(#\+ (write-WrongFuck-command #\>))
(#\- (write-WrongFuck-command #\<))
(#\> (write-WrongFuck-command #\]))
(#\< (write-WrongFuck-command #\[))
(#\[ (write-WrongFuck-command #\,))
(#\] (write-WrongFuck-command #\.))
(#\. (write-WrongFuck-command #\+))
(#\, (write-WrongFuck-command #\-))
(otherwise NIL))))
(with-output-to-string (output)
(declare (type string-stream output))
(translate-brainfuck-to-WrongFuck brainfuck-code output)))))
;;; -------------------------------------------------------
(defun translate-WrongFuck-to-brainfuck (wrongFuck-code
&optional (destination NIL))
"Transliterates the piece of WRONGFUCK-CODE to its brainfuck
equivalent, writes the resulting program to the DESTINATION, and
returns for a non-``NIL`` DESTINATION the ``NIL`` value; otherwise,
for a ``NIL`` DESTINATION, responds with a fresh string comprehending
the output."
(declare (type string wrongFuck-code))
(declare (type destination destination))
(the (or null string)
(if destination
(flet ((write-brainfuck-command (brainfuck-token)
"Writes the BRAINFUCK-TOKEN to the DESTINATION and returns
no value."
(declare (type character brainfuck-token))
(format destination "~c" brainfuck-token)
(values)))
(loop
for wrongFuck-token of-type character across wrongFuck-code
do
(case wrongFuck-token
(#\> (write-brainfuck-command #\+))
(#\< (write-brainfuck-command #\-))
(#\] (write-brainfuck-command #\>))
(#\[ (write-brainfuck-command #\<))
(#\, (write-brainfuck-command #\[))
(#\. (write-brainfuck-command #\]))
(#\+ (write-brainfuck-command #\.))
(#\- (write-brainfuck-command #\,))
(otherwise NIL))))
(with-output-to-string (output)
(declare (type string-stream output))
(translate-WrongFuck-to-brainfuck wrongFuck-code output)))))