# Zfuck

Zfuck is a minimal Turing-complete 3-command variation of Smallfuck discovered by User:PythonshellDebugwindow. It was developed independently of Nanofuck.

## Memory

Like Smallfuck, Zfuck operates on a tape of bits, but unlike Smallfuck, Zfuck uses a left- and right-unbounded tape. The tape is initialized with the program's input as a binary number left- and right-padded with zeros, and the program's output is all previously and currently visited cells in the tape at the end of the program (if it halts) as a binary number.

## The minimization process

We start out with Smallfuck's 5 commands.

```><*[]
```

We can combine `*>` into `}` to get 4 commands.

```}<[]
```

We can also define the empty loop `[]` to be a nop and merge `]<` into `)` to get 3 commands.

```}[)
```

## Simple translation to and from SmallfuckU

This version of Smallfuck has an unbounded tape. Let's call it SmallfuckU for the sake of brevity.

Zfuck SmallfuckU
`}` `*>`
`[` `[`
`)` `]<`
SmallfuckU Zfuck
`>` `}[)}`
`<` `[)`
`*` `}[)`
`[` `[`
`]` `)}[)}`

## Examples

### Infinite loop

```[}[))}[)}}[)[}[)}[))
```

### Truth-machine

```[}[)}[))
```

## Interpreter in JavaScript

The first argument is the code and the second is the initial tape. Undefined behaviour for a negative cell pointer. Also severely golfed and memory-inefficient as a result.

```var zfuck=(c,m)=>eval("var p=0;"+c.replace(/}/g,"m+=~0];m~p]=!m~p++];").replace(/\)/g,"}p--;").replace(/\[/g,"while(m[p]){").replace(/~/g,"[").replace(/{}/g,"break;"));
```