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)))))))