# BrainFuck part 4 - Advanced maths

DPAmar

16K views

## Print a number

Now, with euclidean division, we can print number. The process looks like (recursive definition): print(x) = if x < 10 then return x, else return print(quotient x/10) + remainder x/10

In other words, we will divide N successively by 10, store the remainders and fianlly print them all, backards.

Note : the remainders will first be values from 0 to 9. But

- it's uneasy to iterate on null values (see playground about arrays)
- and we need to print chars from "0" to "9" and not just values

Fortunately, "0" is not 0, so we will store remainders + 48

## Let's start

- Memory: 0, N, 0, ... (note : we will need a various number of zeros, based on how many digits are displayed)
- Cursor: on N
- Input: any

## Process

*Invariant : memory = 0, {some digit chars}, X, 0, 0, 0, 0, 0 with N in base 10 written as "X in base 10" + all the digit chars, reversed*- While X is not null
- Divide X by 10
- Add 48 to remainder
- Replace X cell by remainder
- Put quotient after X cell
- Clear all used cells on the right
- Go to the "new X cell" (on the right of the original)

- Loop
*Memory = 0, {N number in base 10, with reversed digits}, 0, 0, 0, 0, 0*- Print all chars in array, backwards

## Code

```
[ While X is not null
>>>>++++++++++<<<< (10)
[->+>>+>-[<-]<[<<[->> Divide X by 10
>+<<<]>>>>+<<-<]<<] ** part 2 **
++++++++[->++++++<]> add 48 to remainder
[-<+>] Move remainder at X location
>>>>[-<<<<+>>>>] Put quotient at new X location
<[-]<<< Reset cells
] Loop
<[.<] Print backwards
```

#Minified version

```
[>>>>++++++++++<<<<[->+>>+>-[<-]<[<<[->>>+<<<]>>>>+<<-<]<<]++++++++[->++++++<]>[-<+>]>>>>[-<<<<+>>>>]<[-]<<<]<[.<]
```

## Final state

- Memory: 0, { reversed digits of N}, 0
- Cursor: on first cell
- Input: unchanged
- Output: N printed, in base 10

## Test program

This program reads all chars from the input and print ASCII codes (space separated)

```
>,[ for each char read
[>>>>++++++++++<<<<[->+ Print char code
>>+>-[<-]<[<<[->>>+<<<] ** part 2 **
>>>>+<<-<]<<]++++++++[- ** part 3 **
>++++++<]>[-<+>]>>>>[-< ** part 4 **
<<<+>>>>]<[-]<<<]<[.[-]<] ** part 5 ** Note: the "reset cell" before end of line : chars are deleted after being printed
++++++++[->++++<]>. (32) = space; and print
,] Read next char and loop
```

Create your playground on Tech.io

This playground was created on Tech.io, our hands-on, knowledge-sharing platform for developers.

Suggested playgrounds