# 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
```

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:
```

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

## Work in progress

• Finding Beam constants.
• Describing some techniques to program in Beam.
• WeBeam (to program webpages).

Help is always welcome.