Bgt
Jump to navigation
Jump to search
Bgt is a joke esoteric programming language speedran by Cinnamony. Let's see how long it takes to write this one.
Commands
| Command | Description |
|---|---|
P
|
prints the character in front of it |
K
|
prints the input |
L
|
prints the 99 bottles of beer on the wall program |
J
|
print the FizzBuzz program |
Z
|
truth-machine |
Examples
Hello World
PHPePlPlPoP,P PWPoPrPlPdP!
Cat
K
99 Bottles of Beer
L
FizzBuzz
J
Truth Machine
Z
Time
00:02:22.29
Implementations
An implementation in Common Lisp shall be provided:
(defun interpret-Bgt (code)
"Interprets the piece of Bgt source CODE and returns NIL."
(declare (type string code))
(let ((position 0))
(declare (type fixnum position))
(symbol-macrolet
((current-token
(the character
(char code position)))
(eof-p
(the boolean
(not (array-in-bounds-p code position)))))
(loop until eof-p do
(case current-token
(#\P
(incf position)
(when eof-p
(error "Expected at character to print, encountered EOF."))
(format T "~c" current-token)
(incf position))
(#\K
(format T "~&>> ")
(format T "~a" (read-line))
(clear-input)
(incf position))
(#\L
(loop for number-of-bottles of-type (integer -1 99) from 99 downto 1 do
(format T "~&~d ~:*bottle~p of beer on the wall,~%~
~:*~d ~:*bottle~p of beer.~%~
Take one down, pass it around,~%~
~[No~:;~d~] ~:*bottle~p of beer on the wall.~2%"
number-of-bottles (decf number-of-bottles) number-of-bottles))
(incf position))
(#\J
(loop for counter of-type (integer 1 101) from 1 to 100 do
(format T "~&~a"
(cond
((zerop (mod counter 15)) "FizzBuzz")
((zerop (mod counter 3)) "Fizz")
((zerop (mod counter 5)) "Buzz")
(T counter))))
(incf position))
(#\Z
(format T "~&>> ")
(let ((input (parse-integer (read-line))))
(declare (type integer input))
(clear-input)
(if (zerop input)
(format T "~&0")
(loop initially (fresh-line) do (format T "1"))))
(incf position))
(otherwise
(error "Invalid character at position ~d: ~s." position current-token)))))))