Bawkbawk²

From Esolang
Jump to navigation Jump to search

Bawkbawk² is a variant of Bawkbawk that is much easier to read and looks more "in the language of the chickens", but on text. It is made by User:Lilchiky.

Bawkbawk²
Designed by User:Lilchiky
Appeared in 2023
Computational class Turing Complete
Reference implementation https://replit.com/@lilchiky/Bawkbawk2
File extension(s) .bawksq

Syntax and Overview

Bawkbawk² has (not so) similar syntax as Bawkbawk, but it has many more features.
One of the major differences is that Bawkbawk² no longer has a limit on the amount loops available.

Chickens

Bawkbawk² has a data type called a 'chicken'. A chicken has a single character as an identifier and can store Bawkbawk² code, there can be unlimited chickens; however, you may only append one character at a time to the chicken. You can now append to the chicken in bulk with code grouping!

A chicken's scripts can be ran using the command, followed by the identifier, and it will concurrently run along the main chicken.

Commands

Even though Bawkbawk² still has one cell of memoryBawkbawk² now has unbounded memory and the mathematical operations now work on base-15 numbers instead of binary numbers. The value of the cell is still in decimal.

The (modified, new and removed) commands are:

Command Bawkbawk equivalent Function
° theeggcamefirst Multiply
/ rationtheworms Divide and truncate
^ flyoverthehouse Jump to the specified command
> chirp Outputs the current cell's value
~ forage See here
dig User input
Π None Get raw user input (only accepts base-15)
emptypocket Skip the next command if cell = 0
¼ None Skip the next command if cell >= 1
v peck Decrement the cell
! feed Increment the cell
« retrace Jump to the beginning
Removed happy Binary 1
Removed sad Binary 0
' think/endthink Start/end of comment
% None Modulo
§ None Print the value of the cell without conversion to characters
feed forage sad sad sad sad happy sad happy sad theeggcamefirst chirp Print a newline
forage sad theeggcamefirst Set the cell to 0
¿ None Increase the accumulator by a random number between 1 and 0
None Terminate the program
< None Creates a chicken
None Executes a chicken
( None Code grouping, see here
) None Code grouping
¡ None Increase the pointer
None Decrease the pointer
None Switch between axis (x and y)

Newlines are ignored.

Memory

Bawkbawk² has unbounded memory of a 2-dimensional plane along positive-x and positive-y, and the pointer begins at (0, 0) (meaning x and y cannot be below 0). The pointer travels along the x-axis by default and can be changed via .

Code grouping

Code can be grouped with ( and ), which can used to append code to a chicken in bulk, like this:

[identifier] ( [code] )

< and

A chicken can be created with < and executed with . The syntax for < is as follows:

[code (a single command)] < [identifier]

[code] is a single command that will be appended to the chicken with the mentioned [identifier].

A chicken is ran as follows:

√ [identifier]

~ (forage)

The ~ command may be hard to understand at first. Its usage is as follows:

~ [pentadecimal number] [suffix]

[pentadecimal number] can be any base-15 number, like a5 or 3d9. [suffix] can be any of the following commands:

  • °
  • /
  • ^
  • %

Example for all 4 of them:

° (theeggcamefirst)

!~483°
§

Does 1 * 1023.

/ (rationtheworms)

!~400°
~30/
§

Does 900 / 45

% (modulo)

!~400°
~2d%
§

Does 900 % 43

^ (flyoverthehouse)

!§¶°1^

Counts.

Examples

Hello, World!

!~4c°>•!~6b°>•!~73°>>•!~76°>•
!~2e°>•!~22°>•
!~7e°>•!~76°>•!~79°>•!~73°>•!~6a°>•
!~23°>

99 bottles of beer

!~69°

b(
  §¡•!~22°>•!~68°>•!~76°>•!~7b°>•!~7b°>•!~73°>•!~6b°>
  •!~7a°>•!~22°>•!~76°>•!~6c°>•!~22°>•!~68°>•!~6b°>
  •!~6b°>•!~79°>•!~22°>•!~76°>•!~75°>•!~22°>•!~7b°>
  •!~6e°>•!~6b°>•!~22°>•!~7e°>•!~67°>•!~73°>•!~73°>
  •!~2e°>•!~a°>¶←

  §¡•!~22°>•!~68°>•!~76°>•!~7b°>•!~7b°>•!~73°>•!~6b°>
  •!~7a°>•!~22°>•!~76°>•!~6c°>•!~22°>•!~68°>•!~6b°>
  •!~6b°>•!~79°>•!~31°>←

  •!~a°>•!~59°>•!~67°>•!~72°>•!~6b°>•!~22°>•!~76°>•!~75°>•!~6b°>•!~22°>•!~6a°>
  •!~76°>•!~7e°>•!~75°>•!~22°>•!~67°>•!~75°>•!~6a°>•!~22°>•!~77°>•!~67°>•!~7a°>
  •!~7a°>•!~22°>•!~70°>•!~7b°>•!~22°>•!~67°>•!~79°>•!~76°>•!~7c°>•!~75°>•!~6a°>
  •!~2e°>•!~a°>←v

  §¡•!~22°>•!~68°>•!~76°>•!~7b°>•!~7b°>•!~73°>•!~6b°>
  •!~7a°>•!~22°>•!~76°>•!~6c°>•!~22°>•!~68°>•!~6b°>
  •!~6b°>•!~79°>•!~31°>¶¶←∅«
)

√b

Displays '0 bottles on the wall' at the end.

(This program was generated with this script.)

Convert base-15 into decimal

Π§

Π automatically converts its input into decimal if possible.

Cat program

∆>¶«

Truth machine

Π§¼↑§~5^

Or, preferably, an unoptimized version that makes use of chickens:

§<c«<cΠ§¼↑√c

Or you could do this:

c(§«)Π§¼↑√c

Text to Bawkbawk²

Converting text to Bawkbawk² is really easy. To convert text to Bawkbawk², you get the ASCII code for each character, then convert it into pentadecimal and add on •!~[pentadecimal]°> then add it together, like so:

h — 104
e — 101
l — 108
l — 108
o — 111

104 -> •!~6e°>
101 -> •!~6b°>
108 -> •!~73°>
108 -> •!~73°>
111 -> •!~76°>

hello = •!~6e°>•!~6b°>•!~73°>•!~73°>•!~76°>

Converter in Python

def text_to_bawkbawk(string):
    result = ''
    
    for char in string:
        ascii_ = ord(char)
        pentadecimal = ""
        
        while ascii_ > 0:
            dig = int(ascii_%15)
            if dig < 10:
                pentadecimal += str(dig)
            else:
                pentadecimal += chr(ord('a')+dig-10)
            ascii_ //= 15
        
        pentadecimal = pentadecimal[::-1]
        
        result += f'•!~{pentadecimal}°>'
    return result

Computational class

Bawkbawk² is (probably) Turing-complete.

This can be proved by translating a Minsky machine to Bawkbawk². In a Minsky machine, there are two instructions available:

  • Increment the register and move to the next
  • Decrement the register and move to the next; unless it is 0, then skip to another instruction.

Checking for a 0 in a register could be done like this:

∅√a

assuming the chicken named a contains the code that is needed to run if the register is 0.

From here it is (at least it should be) straightforward to convert any Minsky machine into Bawkbawk². Since the set of Minsky machines is Turing-complete, Bawkbawk² should also be Turing Complete.

Implementations

This is the original implementation.

See also