Beam
Beam is yet another two dimensional language thought of around mid-2010 by User:Feuermonster and implemented and published in 2012.
- The start-up direction is right.
- There is a beam which holds an 8bit unsigned value.
- Also there is a store which can hold an arbitrary large positive value. If it drops below zero it's wrapped to 255.
- Then there is an infinite amount of 8bit memory cells.
- The implementation uses NUL (\0) if no character could be read from stdin.
- Every character which is not an instruction is a NOP.
Instructions
> Set the direction to right < Set the direction to left ^ Set the direction to up v Set the direction to down + Increment the beam - Decrement the beam @ Output the beam as character : Output the beam as number / Redirect the control flow like this: | ----/ /--- | (90 degrees to the left) \ Redirect the control flow like this: | -----\ \---- | (90 degrees to the right) ! If the beam is not 0, reverse the control flow. (It bounces off the !) ? If the beam is 0, reverse the control flow. (It bounces off the ?) | Reverse the control flow if coming from a right/left-direction _ Reverse the control flow if coming from a up/down-direction H stop the program S store = beam L beam = store s memory[beam] = store g store = memory[beam] P memory[store] = beam p beam = memory[store] u If beam != store change direction to up n if beam != store change direction to down ` Decrement the store ' Increment the store ) If store != 0 change direction to left ( If store != 0 change direction to right r Read character from input
It should be noted, that 'u' and 'n' perform 32bit comparison: if the store exceeds 255 the comparison beam != store is always true since beam can not exceed 255. Lines are not padded to equal length. A compliant interpreter is not allowed to do this!
Example programs
Reverse stdin
'> rP n ^!p'<vn(`< ^ < >'p!`>`p@ v Hnp`< ^ <
Painfully written by hand.
A faster version (thanks to User:Fizzie):
>'p!rP(`)n>'p!`v ^ < H(`p@p`)H H
Fastest version in the west (also thanks to User:Fizzie):
v (>``v ! H(p`@`p)H P H ' r ' P ! >^
Truth-machine
rS>@)
(Expects NUL or SOH from stdin.)
Codegolfed; 5 bytes.
Hello
Prints Hello!
'''''v >`++++++++++++++)++@v v++++++@-(++++++++++`<'''< >+@@+++@>-!'''>`++++++++++)v @+++<
Even / Odd
Reads from stdin and tests if the value (ascii value) is even or odd. If it is even, it prints a zero, else a one.
rv`< :u'< >-- u:
Cat
>r@nH ^ <
Compare
Reads in two ascii characters and prints out the smaller one.
rP'Pr'P'P```v < H @p'''u``p''< >p-P''p-P``pu'p@
Turing completeness
Brainfuck programs can be translated to Beam programs. This mechanism works with the 'u' instruction and marking cells to restore the store.
Brainfuck
,[>+>+<<-]++++++[>--------<-]>[>.<]>.
Beam (translation with the bf2beam perl script)
v > v > v > v >'''rP>`p+P'p(`)uv>'>'p?-P'''p+P''p+P````p-Pv>p++++++P>`p+P'p(`)uv>'>'p?-P'''p--------P``p-Pv>''>`p+P'p(`)uv>'>'p?-P'''p@``v>''p@H > '>'p?-P' ^ > '>'p?-P' ^ > '>'p?-P' ^ ^ < ^ < ^ <
Beam constants
Constants to set the beam to a specific value (requires store to be zero.). This list is not complete. Help me!
Number | Code | Bytes | Cycles | Cycles / Bytes | Cycles / Number |
---|---|---|---|---|---|
24 | '''>`++++++++)
|
14 | 34 | 2.42 | 1.42 |
24 | '''''>`+++++)-
|
14 | 42 | 3 | 1.75 |
25 | '''''>`+++++)
|
13 | 41 | 3.15 | 1.64 |
25 | '''>`++++++++)+
|
15 | 35 | 2.33 | 1.39 |
26 | '''''>`+++++)+
|
14 | 42 | 3 | 1.61 |
26 | '''>`+++++++++)-
|
16 | 38 | 2.38 | 1.46 |
27 | '''>`+++++++++)
|
15 | 37 | 2.46 | 1.37 |
28 | '''''''>`++++)
|
14 | 50 | 3.57 | 1.78 |
28 | '''>`+++++++++)+
|
16 | 38 | 2.38 | 1.36 |
28 | '''''>`++++++)--
|
16 | 48 | 3 | 1.71 |
Implementation
- Java interpreter (DEADLINK)
- Javascript interpreter with 2D trace (DEADLINK)
- Online (HTML/Javascript) interpreter
Work in progress
- Finding Beam constants.
- Describing some techniques to program in Beam.
- WeBeam (to program webpages).
Help is always welcome.