Boi
Jump to navigation
Jump to search
Boi
Boi (Boilang) is a C-like programming language where all keywords contain the substring "boi". Boi borrows from both the procedural and functional paradigms.
Boi Is
- Turing-complete, able to create interpreters for simple Turing-complete languages.
- Compiled to unoptimized x86 intel-syntax assembly.
- C-like and easier to pick up than most esolangs.
- Lacking higher-order functions and callback functions.
- Only able to perform calculations on integer types.
The compiler source code (read at your own risk lol), language manual, notes, and example programs can be found here.
Types
| Type | Size In Bits | C Equivalent |
|---|---|---|
| smolboi | 8 | char |
| boi | 16 | short |
| chonkboi | 32 | int |
| gigaboi | 64 | long long int |
Keywords
Note: "argybois" is currently unimplemented in v1.0
| Boi Keyword | Approx C Equivalent |
|---|---|
| @datboi | main |
| argybois | none |
| ifboi | if |
| elseboi | else |
| elifboi | else if |
| loopyboi | while |
| switchyboi | switch |
| caseyboi | case |
| fallboi | default |
| yeetboi | return |
| bonkboi | exit(0) |
Hello World
@datboi(argybois)
{
putBoi("Hello World!");
}
Factorial of 4
@foo(n);
@datboi(argybois)
{
putBoi(foo(4));
}
@foo(n)
{
ifboi(n < 1)
{
yeetboi 1;
}
# Recursion!
yeetboi n * foo(n - 1);
}
Turing Completeness Proof
#=================================
# Brainfuck Interpreter
#=================================
@clear(a[smolboi], size);
@datboi(argybois)
{
boi i;
boi a;
boi sp;
boi sw;
smolboi arr[10000];
smolboi stack[10];
smolboi s[10000];
clear(arr, 10000);
clear(stack, 10);
clear(s, 10000);
putBoi("Enter brainfuck string: ");
getSmolBois(s, 10000);
i = 0;
loopyboi(i < 10000 && s[i] != 0)
{
sw = s[i];
++i;
switchyboi(sw)
{
caseyboi '>'
{ ++a; }
caseyboi '<'
{ --a; }
caseyboi '+'
{ arr[a] = arr[a] + 1; }
caseyboi '-'
{ arr[a] = arr[a] - 1; }
caseyboi '.'
{ putSmolBoi(arr[a]); }
caseyboi ','
{ getBoi(arr[a]); }
caseyboi '['
{
ifboi(arr[a] == 0)
{
loopyboi(s[++i] != ']')
{ }
++i;
}
elseboi
{
stack[sp] = i;
++sp;
}
}
caseyboi ']'
{
ifboi(arr[a] != 0)
{
i = stack[sp - 1];
}
elseboi
{
--sp;
}
}
}
}
}
@clear(a[smolboi], size)
{
boi i = 0;
loopyboi(i < size)
{
a[i] = 0;
++i;
}
}
Tic Tac Toe + AI
@hasWin( b );
@isFull( b );
@emptySquare( b, i );
@square( i );
@printBoard( o, x );
@bsf( b );
@set( b, i );
@search( bm[boi], o, x, a, b, d );
@datboi( argybois )
{
boi o = 0;
boi x = 0;
boi bm[1];
boi m;
# This is a fully functional tic tac toe game for the terminal.
# It is written in boi, "the language of memes."
printBoard( o, x );
loopyboi( !isFull( o | x ) && !hasWin( o ) && !hasWin( x ) )
{
putBoi("\nMake a move (1-9)\n");
putBoi("9 8 7\n");
putBoi("6 5 4\n");
putBoi("3 2 1\n>>_");
getBoi( m );
ifboi( m >= 1 && m <= 9 && emptySquare( ( o | x ), m - 1 ) )
{
o = set( o, m - 1 );
search( bm, o, x, -100, 100, 0 );
ifboi( isFull( o | x ) )
{
printBoard( o, x );
putBoi( "\nDraw!!!\n" );
yeetboi( 0 );
}
x = set( x, bm[0] );
printBoard( o, x );
}
}
putBoi( "\nI win!!!\n" );
}
@search( bm[boi], o, x, a, b, d )
{
boi score;
boi s;
boi i = 0;
# This is a tic tac toe AI, written in boi.
# It showcases boi's support for recursion.
ifboi( hasWin( x ) ) { yeetboi( 10 - d ); }
ifboi( hasWin( o ) ) { yeetboi( d - 10 ); }
ifboi( isFull( o | x ) ) { yeetboi( 0 ); }
score = -100;
loopyboi( i < 9 )
{
ifboi( emptySquare( (o | x), i ) )
{
x = set( x, i );
s =
-search(
bm, x, o, -b, -a, (d + 1)
);
x = set( x, i );
ifboi( s > score )
{
ifboi( d == 0 ) { bm[0] = i; }
score = s;
ifboi( s > a )
{
a = s;
ifboi( s >= b )
{ yeetboi( score ); }
}
}
}
++i;
}
yeetboi( score );
}
@bsf( b )
{
smolboi db =
{
0, 1, 48, 2, 57, 49, 28, 3,
61, 58, 50, 42, 38, 29, 17, 4,
62, 55, 59, 36, 53, 51, 43, 22,
45, 39, 33, 30, 24, 18, 12, 5,
63, 47, 56, 27, 60, 41, 37, 16,
54, 35, 52, 21, 44, 32, 23, 11,
46, 26, 40, 15, 34, 20, 31, 10,
25, 14, 19, 9, 13, 8, 7, 6
};
# Bit Scan Forward - From the Chess Programming Wiki
yeetboi( db[ ( ( b & -b ) * 285870213051386505 ) >> 58 ] );
}
@printBoard( o, x )
{
smolboi a[9];
boi i = 0;
# This function prints the board!
loopyboi( i < 9 )
{
a[i] = '-';
++i;
}
loopyboi( o )
{
a[ bsf( o ) ] = 'o';
o = o & (o - 1);
}
loopyboi( x )
{
a[ bsf( x ) ] = 'x';
x = x & (x - 1);
}
putBoi("\n ");
putSmolBoi( a[0] );
putBoi(" | ");
putSmolBoi( a[1] );
putBoi(" | ");
putSmolBoi( a[2] );
putBoi("\n---+---+---\n ");
putSmolBoi( a[3] );
putBoi(" | ");
putSmolBoi( a[4] );
putBoi(" | ");
putSmolBoi( a[5] );
putBoi("\n---+---+---\n ");
putSmolBoi( a[6] );
putBoi(" | ");
putSmolBoi( a[7] );
putBoi(" | ");
putSmolBoi( a[8] );
putBoi("\n");
}
@square( i ) { yeetboi( 256 >> i ); }
@emptySquare( b, i ) { yeetboi !( b & square( i ) ); }
@isFull( b ) { yeetboi( b == 511 ); }
@set( b, i ) { yeetboi( b ^ square( i ) ); }
@hasWin( b )
{
smolboi magic =
{
128, 128, 128, 128,
128, 128, 128, 255,
128, 170, 240, 250,
128, 170, 240, 255,
128, 128, 204, 204,
128, 128, 204, 255,
128, 170, 252, 254,
128, 170, 252, 255,
128, 128, 170, 170,
240, 240, 250, 255,
128, 170, 250, 250,
240, 250, 250, 255,
128, 128, 238, 238,
240, 240, 254, 255,
255, 255, 255, 255,
255, 255, 255, 255
};
# Probes the magic win table that I pre-computed.
yeetboi( magic[ b >> 3 ] & ( 1 << ( b & 7 ) ) );
}