DetailedFuck
Jump to navigation
Jump to search
DetailedFuck is a clone of Brainfuck. The goal of DetailedFuck is to allow for easier understandability of brainfuck code. It is a member of the TrivialBrainfuckSubstitution family of programming languages.
Brainfuck | DetailedFuck |
---|---|
> | MOVE THE MEMORY POINTER ONE CELL TO THE RIGHT |
< | MOVE THE MEMORY POINTER ONE CELL TO THE LEFT |
+ | INCREMENT THE CELL UNDER THE MEMORY POINTER BY ONE |
- | DECREMENT THE CELL UNDER THE MEMORY POINTER BY ONE |
, | REPLACE THE CELL UNDER THE MEMORY POINTER'S VALUE WITH THE ASCII CHARACTER CODE OF USER INPUT |
. | PRINT THE CELL UNDER THE MEMORY POINTER'S VALUE AS AN ASCII CHARACTER |
[ | IF THE CELL UNDER THE MEMORY POINTER'S VALUE IS ZERO INSTEAD OF READING THE NEXT COMMAND IN THE PROGRAM JUMP TO THE CORRESPONDING COMMAND EQUIVALENT TO THE ] COMMAND IN BRAINFUCK |
] | IF THE CELL UNDER THE MEMORY POINTER'S VALUE IS NOT ZERO INSTEAD OF READING THE NEXT COMMAND IN THE PROGRAM JUMP TO THE CORRESPONDING COMMAND EQUIVALENT TO THE [ COMMAND IN BRAINFUCK |
Examples
Hello, World!
The following code prints “hello world”:
INCREMENT THE CELL UNDER THE MEMORY POINTER BY ONE IF THE CELL UNDER THE MEMORY POINTER'S VALUE IS ZERO INSTEAD OF READING THE NEXT COMMAND IN THE PROGRAM JUMP TO THE CORRESPONDING COMMAND EQUIVALENT TO THE ] COMMAND IN BRAINFUCK DECREMENT THE CELL UNDER THE MEMORY POINTER BY ONE IF THE CELL UNDER THE MEMORY POINTER'S VALUE IS ZERO INSTEAD OF READING THE NEXT COMMAND IN THE PROGRAM JUMP TO THE CORRESPONDING COMMAND EQUIVALENT TO THE ] COMMAND IN BRAINFUCK MOVE THE MEMORY POINTER ONE CELL TO THE LEFT MOVE THE MEMORY POINTER ONE CELL TO THE LEFT IF THE CELL UNDER THE MEMORY POINTER'S VALUE IS ZERO INSTEAD OF READING THE NEXT COMMAND IN THE PROGRAM JUMP TO THE CORRESPONDING COMMAND EQUIVALENT TO THE ] COMMAND IN BRAINFUCK INCREMENT THE CELL UNDER THE MEMORY POINTER BY ONE IF THE CELL UNDER THE MEMORY POINTER'S VALUE IS ZERO INSTEAD OF READING THE NEXT COMMAND IN THE PROGRAM JUMP TO THE CORRESPONDING COMMAND EQUIVALENT TO THE ] COMMAND IN BRAINFUCK DECREMENT THE CELL UNDER THE MEMORY POINTER BY ONE DECREMENT THE CELL UNDER THE MEMORY POINTER BY ONE DECREMENT THE CELL UNDER THE MEMORY POINTER BY ONE MOVE THE MEMORY POINTER ONE CELL TO THE RIGHT IF THE CELL UNDER THE MEMORY POINTER'S VALUE IS NOT ZERO INSTEAD OF READING THE NEXT COMMAND IN THE PROGRAM JUMP TO THE CORRESPONDING COMMAND EQUIVALENT TO THE [ COMMAND IN BRAINFUCK DECREMENT THE CELL UNDER THE MEMORY POINTER BY ONE IF THE CELL UNDER THE MEMORY POINTER'S VALUE IS ZERO INSTEAD OF READING THE NEXT COMMAND IN THE PROGRAM JUMP TO THE CORRESPONDING COMMAND EQUIVALENT TO THE ] COMMAND IN BRAINFUCK MOVE THE MEMORY POINTER ONE CELL TO THE LEFT MOVE THE MEMORY POINTER ONE CELL TO THE LEFT MOVE THE MEMORY POINTER ONE CELL TO THE LEFT IF THE CELL UNDER THE MEMORY POINTER'S VALUE IS NOT ZERO INSTEAD OF READING THE NEXT COMMAND IN THE PROGRAM JUMP TO THE CORRESPONDING COMMAND EQUIVALENT TO THE [ COMMAND IN BRAINFUCK IF THE CELL UNDER THE MEMORY POINTER'S VALUE IS NOT ZERO INSTEAD OF READING THE NEXT COMMAND IN THE PROGRAM JUMP TO THE CORRESPONDING COMMAND EQUIVALENT TO THE [ COMMAND IN BRAINFUCK IF THE CELL UNDER THE MEMORY POINTER'S VALUE IS NOT ZERO INSTEAD OF READING THE NEXT COMMAND IN THE PROGRAM JUMP TO THE CORRESPONDING COMMAND EQUIVALENT TO THE [ COMMAND IN BRAINFUCK MOVE THE MEMORY POINTER ONE CELL TO THE RIGHT MOVE THE MEMORY POINTER ONE CELL TO THE RIGHT MOVE THE MEMORY POINTER ONE CELL TO THE RIGHT DECREMENT THE CELL UNDER THE MEMORY POINTER BY ONE IF THE CELL UNDER THE MEMORY POINTER'S VALUE IS NOT ZERO INSTEAD OF READING THE NEXT COMMAND IN THE PROGRAM JUMP TO THE CORRESPONDING COMMAND EQUIVALENT TO THE [ COMMAND IN BRAINFUCK MOVE THE MEMORY POINTER ONE CELL TO THE RIGHT DECREMENT THE CELL UNDER THE MEMORY POINTER BY ONE PRINT THE CELL UNDER THE MEMORY POINTER'S VALUE AS AN ASCII CHARACTER DECREMENT THE CELL UNDER THE MEMORY POINTER BY ONE DECREMENT THE CELL UNDER THE MEMORY POINTER BY ONE DECREMENT THE CELL UNDER THE MEMORY POINTER BY ONE PRINT THE CELL UNDER THE MEMORY POINTER'S VALUE AS AN ASCII CHARACTER MOVE THE MEMORY POINTER ONE CELL TO THE RIGHT PRINT THE CELL UNDER THE MEMORY POINTER'S VALUE AS AN ASCII CHARACTER PRINT THE CELL UNDER THE MEMORY POINTER'S VALUE AS AN ASCII CHARACTER MOVE THE MEMORY POINTER ONE CELL TO THE RIGHT PRINT THE CELL UNDER THE MEMORY POINTER'S VALUE AS AN ASCII CHARACTER MOVE THE MEMORY POINTER ONE CELL TO THE LEFT MOVE THE MEMORY POINTER ONE CELL TO THE LEFT MOVE THE MEMORY POINTER ONE CELL TO THE LEFT MOVE THE MEMORY POINTER ONE CELL TO THE LEFT DECREMENT THE CELL UNDER THE MEMORY POINTER BY ONE PRINT THE CELL UNDER THE MEMORY POINTER'S VALUE AS AN ASCII CHARACTER MOVE THE MEMORY POINTER ONE CELL TO THE LEFT INCREMENT THE CELL UNDER THE MEMORY POINTER BY ONE PRINT THE CELL UNDER THE MEMORY POINTER'S VALUE AS AN ASCII CHARACTER MOVE THE MEMORY POINTER ONE CELL TO THE RIGHT MOVE THE MEMORY POINTER ONE CELL TO THE RIGHT MOVE THE MEMORY POINTER ONE CELL TO THE RIGHT MOVE THE MEMORY POINTER ONE CELL TO THE RIGHT MOVE THE MEMORY POINTER ONE CELL TO THE RIGHT PRINT THE CELL UNDER THE MEMORY POINTER'S VALUE AS AN ASCII CHARACTER MOVE THE MEMORY POINTER ONE CELL TO THE RIGHT PRINT THE CELL UNDER THE MEMORY POINTER'S VALUE AS AN ASCII CHARACTER MOVE THE MEMORY POINTER ONE CELL TO THE LEFT MOVE THE MEMORY POINTER ONE CELL TO THE LEFT PRINT THE CELL UNDER THE MEMORY POINTER'S VALUE AS AN ASCII CHARACTER MOVE THE MEMORY POINTER ONE CELL TO THE LEFT DECREMENT THE CELL UNDER THE MEMORY POINTER BY ONE PRINT THE CELL UNDER THE MEMORY POINTER'S VALUE AS AN ASCII CHARACTER
Implementations
The following Common Lisp code translates DetailedFuck into brainfuck instructions:
(declaim (type list *translations*)) (defparameter *translations* '(("MOVE THE MEMORY POINTER ONE CELL TO THE RIGHT" . ">") ("MOVE THE MEMORY POINTER ONE CELL TO THE LEFT" . "<") ("INCREMENT THE CELL UNDER THE MEMORY POINTER BY ONE" . "+") ("DECREMENT THE CELL UNDER THE MEMORY POINTER BY ONE" . "-") ("REPLACE THE CELL UNDER THE MEMORY POINTER'S VALUE WITH THE ASCII CHARACTER CODE OF USER INPUT" . ",") ("PRINT THE CELL UNDER THE MEMORY POINTER'S VALUE AS AN ASCII CHARACTER" . ".") ("IF THE CELL UNDER THE MEMORY POINTER'S VALUE IS ZERO INSTEAD OF READING THE NEXT COMMAND IN THE PROGRAM JUMP TO THE CORRESPONDING COMMAND EQUIVALENT TO THE ] COMMAND IN BRAINFUCK" . "[") ("IF THE CELL UNDER THE MEMORY POINTER'S VALUE IS NOT ZERO INSTEAD OF READING THE NEXT COMMAND IN THE PROGRAM JUMP TO THE CORRESPONDING COMMAND EQUIVALENT TO THE [ COMMAND IN BRAINFUCK" . "]")) "Associates each DetailedFuck instruction with its brainfuck analogue.") (defun convert-detailedFuck-to-brainfuck (detailedFuck-code) "Converts the DETAILEDFUCK-CODE into brainfuck code." (declare (type string detailedFuck-code)) (let ((brainfuck-code detailedFuck-code)) (declare (type string brainfuck-code)) (loop for translation of-type (cons string string) in *translations* do (destructuring-bind (detailedFuck-command . brainfuck-command) translation (declare (type string detailedFuck-command brainfuck-command)) (let ((detailedFuck-length (length detailedFuck-command)) (source-length (length brainfuck-code))) (declare (type fixnum detailedFuck-length source-length)) (let ((previous-position 0) (search-position 0)) (declare (type fixnum previous-position) (type (or null fixnum) search-position)) (setf brainfuck-code (with-output-to-string (output) (declare (type string-stream output)) (loop do (setf search-position (search detailedFuck-command brainfuck-code :start2 previous-position :test #'string-equal)) (write-string brainfuck-code output :start previous-position :end (or search-position source-length)) (unless search-position (loop-finish)) (setf previous-position (+ search-position detailedFuck-length)) (write-string brainfuck-command output)))))))) (the string brainfuck-code)))