Back
Close

BrainFuck part 4 - Advanced maths

DPAmar
17.9K views

Read comma separated numbers

We know how to read one number. Let's do something more complex : read multiple numbers, with comma separator.

Process is rather simple:

  • Read a char
    • It's a digit : part of the current number
    • It's a comma : start a new number

Let's start

  • Memory: empty
  • Cursor: first cell
  • Input: A, B, C, ... (comma separated integer values)

Process

  • Leave first cell empy (array delimiter)
  • Start a number (leave another empty cell)
  • While a char is read
    • Subtract 44 ("," ASCII code) and set an else flag
    • Result is not null
      • Subtract again 4 (44+4 = 48, and -48 converts a digit char into a digit value)
      • Update current integer (add it nine times to the actual digit, then this whole block to the current integer)
      • Reset else flag
    • Result is not null
      • Start a number (leave another empty cell)
  • Loop

Code

>>                        Leave first cell empy (array delimiter); Start a number (leave another empty cell)
,[                        While a char is read
  >++++++[-<------->]+<-- Subtract 44 (comma ASCII code) and set an else flag
  [----                   Result is not null : subtract again 4
    >->+++++++++[-<<<     Update current integer
    [->+>+<<]>>[-<<+>>]   (add it nine times to the actual digit
    >]<<[-<+>]            then this whole block to the current integer)
  ]>[                     Result is null
    ->                    Move to start a new number
  ]<
,]                        Read an loop

#Minified version

>>,[>++++++[-<------->]+<--[---->->+++++++++[-<<<[->+>+<<]>>[-<<+>>]>]<<[-<+>]]>[->]<,]

Final state

  • Memory: 0, numbers, 0
  • Cursor: on final 0
  • Input: empty
  • Output: unchanged

Test program

This program reads comma-separated integer values, and then print the corresponding ASCII chars

>>,[>++++++[-<------->]+<--[---->->++++++++   read comma separated values
+[-<<<[->+>+<<]>>[-<<+>>]>]<<[-<+>]]>[->]<,]   ** part 2 **
<[<]>[.>]                                     Go back to the first value, and print them all as chars

Try with 66,114,97,105,110,70,117,99,107,32,114,111,99,107,115,32,33,33,33 for example :)

Create your playground on Tech.io
This playground was created on Tech.io, our hands-on, knowledge-sharing platform for developers.
Go to tech.io