about summary refs log tree commit diff stats
path: root/examples/add2.tf
blob: 3c1529bca854d411a10d3354a88080c1b568b388 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
  Add two values
from https://en.wikipedia.org/wiki/Brainfuck#Adding_two_values




ALL ABOARD
chug chug
END OF THE LINE
       Cell c0 = 2

ALL ABOARD
choo

END OF THE LINE

ALL ABOARD
chug chug chug chug chug
END OF THE LINE
  Cell c1 = 5


ALL ABOARD
tickets please
END OF THE LINE
        Start your loops with your cell pointer on the loop counter (c1 in our case)

ALL ABOARD
choo choo

END OF THE LINE

ALL ABOARD
chug
END OF THE LINE
      Add 1 to c0

ALL ABOARD
choo

END OF THE LINE

ALL ABOARD
chugga
END OF THE LINE
      Subtract 1 from c1

ALL ABOARD
your ticket please
END OF THE LINE
        End your loops with the cell pointer on the loop counter

At this point our program has added 5 to 2 leaving 7 in c0 and 0 in c1
but we cannot output this value to the terminal since it is not ASCII encoded

To display the ASCII character "7" we must add 48 to the value 7
We use a loop to compute 48 = 6 * 8


ALL ABOARD
chug chug chug chug
END OF THE LINE

ALL ABOARD
chug chug chug chug
END OF THE LINE
  c1 = 8 and this will be our loop counter again

ALL ABOARD
tickets please
choo choo

END OF THE LINE

ALL ABOARD
chug chug chug
END OF THE LINE

ALL ABOARD
chug chug chug
END OF THE LINE
  Add 6 to c0

ALL ABOARD
choo

END OF THE LINE

ALL ABOARD
chugga
END OF THE LINE
        Subtract 1 from c1

ALL ABOARD
your ticket please
choo choo

END OF THE LINE

ALL ABOARD
click
END OF THE LINE
        Print out c0 which has the value 55 which translates to "7"!

Finally print a newline:

ALL ABOARD
chugga chugga chugga chugga chugga chugga chugga chugga chugga chugga chugga
chugga chugga chugga chugga chugga chugga chugga chugga chugga chugga chugga
chugga chugga chugga chugga chugga chugga chugga chugga chugga chugga chugga
chugga chugga chugga chugga chugga chugga chugga chugga chugga chugga chugga
chugga click
  This program prints "Hello World!" and a newline to the screen, its
length is 106 active command characters. [It is not the shortest.]

This loop is an "initial comment loop", a simple way of adding a comment
to a BF program such that you don't have to worry about any command
characters. Any ".", ",", "+", "-", "<" and ">" characters are simply
ignored, the "[" and "]" characters just have to be balanced. This
loop and the commands it contains are ignored because the current cell
defaults to a value of 0; the 0 value causes this loop to be skipped.

from https://en.wikipedia.org/wiki/Brainfuck#Hello_World!


ALL ABOARD
chug chug chug chug chug chug chug chug
END OF THE LINE
	Set Cell #0 to 8

ALL ABOARD
tickets please
choo
chug chug chug chug
END OF THE LINE
		Add 4 to Cell #1; this will always set Cell #1 to 4

ALL ABOARD
tickets please
END OF THE LINE
		as the cell will be cleared by the loop

ALL ABOARD
choo
chug chug
END OF THE LINE
		Add 2 to Cell #2

ALL ABOARD
choo
chug chug chug
END OF THE LINE
		Add 3 to Cell #3

ALL ABOARD
choo
chug chug chug
END OF THE LINE
		Add 3 to Cell #4

ALL ABOARD
choo
chug
END OF THE LINE
		Add 1 to Cell #5

ALL ABOARD
choo choo
choo choo
choo choo
choo choo
chugga
END OF THE LINE
		Decrement the loop counter in Cell #1

ALL ABOARD
your ticket please
END OF THE LINE
		Loop until Cell #1 is zero; number of iterations is 4

ALL ABOARD
choo
chug
END OF THE LINE
		Add 1 to Cell #2

ALL ABOARD
choo
chug
END OF THE LINE
		Add 1 to Cell #3

ALL ABOARD
choo
chugga
END OF THE LINE
		Subtract 1 from Cell #4

ALL ABOARD
choo
choo
chug
END OF THE LINE
		Add 1 to Cell #6

ALL ABOARD
tickets please choo choo
your ticket please
END OF THE LINE
		Move back to the first zero cell you find; this will
		be Cell #1 which was cleared by the previous loop

ALL ABOARD
choo choo
chugga
END OF THE LINE
		Decrement the loop Counter in Cell #0

ALL ABOARD
your ticket please
END OF THE LINE
		Loop until Cell #0 is zero; number of iterations is 8

The result of this is:
Cell no :   0   1   2   3   4   5   6
Contents:   0   0  72 104  88  32   8
Pointer :   ^


ALL ABOARD
choo
choo
click
END OF THE LINE
			Cell #2 has value 72 which is 'H'

ALL ABOARD
choo
chugga chugga chugga click
END OF THE LINE
			Subtract 3 from Cell #3 to get 101 which is 'e'

ALL ABOARD
chug chug chug chug chug chug chug clickety click chug chug chug click

END OF THE LINE
		Likewise for 'llo' from Cell #3

ALL ABOARD
choo
choo
click
END OF THE LINE
			Cell #5 is 32 for the space

ALL ABOARD
choo choo
chugga clickety
END OF THE LINE
			Subtract 1 from Cell #4 for 87 to give a 'W'

ALL ABOARD
choo choo
clickety
END OF THE LINE
			Cell #3 was set to 'o' from the end of 'Hello'

ALL ABOARD
chug chug chug click chugga chugga chugga chugga chugga chugga clickety
chugga chugga chugga chugga chugga chugga chugga chugga click
END OF THE LINE
	Cell #3 for 'rl' and 'd'

ALL ABOARD
choo
choo
chug click
END OF THE LINE
			Add 1 to Cell #5 gives us an exclamation point

ALL ABOARD
choo
chug chug click
END OF THE LINE
			And finally a newline from Cell #6
  ROT13 in Brainfuck
from https://en.wikipedia.org/wiki/Brainfuck#ROT13




ALL ABOARD
chugga clack chug tickets please
END OF THE LINE
                         Read first character and start outer character reading loop

ALL ABOARD
chugga tickets please
END OF THE LINE
                       Skip forward if character is 0

ALL ABOARD
choo
choo
chug chug chug chug tickets please choo
chug chug chug chug chug chug chug chug
choo choo
chugga your ticket please
END OF THE LINE
  Set up divisor (32) for division loop
(MEMORY LAYOUT: dividend copy remainder divisor quotient zero zero)

ALL ABOARD
choo choo
chug choo choo
chugga tickets please
END OF THE LINE
                Set up dividend (x minus 1) and enter division loop

ALL ABOARD
choo
chug choo
chug choo
chugga tickets please choo
choo
choo
your ticket please
END OF THE LINE
      Increase copy and remainder / reduce divisor / Normal case: skip forward

ALL ABOARD
choo choo
tickets please tickets please choo
chug choo choo
chugga your ticket please choo
choo
chug choo
your ticket please

END OF THE LINE
    Special case: move remainder back to divisor and increase quotient

ALL ABOARD
choo choo
choo choo
choo choo
choo choo
choo choo
chugga
END OF THE LINE
           Decrement dividend

ALL ABOARD
your ticket please
END OF THE LINE
                    End division loop

ALL ABOARD
your ticket please choo
choo
choo
tickets please chugga your ticket please chug
END OF THE LINE
                 End skip loop; zero former divisor and reuse space for a flag

ALL ABOARD
choo
chugga chugga tickets please chugga tickets please choo choo
chugga choo
chug chug chug
tickets please chugga your ticket please your ticket please your ticket please
choo choo
tickets please
END OF THE LINE
         Zero that flag unless quotient was 2 or 3; zero quotient; check flag

ALL ABOARD
chug chug chug chug chug chug chug chug chug chug chug chug choo choo
tickets please

END OF THE LINE
       If flag then set up divisor (13) for second division loop
(MEMORY LAYOUT: zero copy dividend divisor remainder quotient zero zero)

ALL ABOARD
choo
chugga tickets please choo
chug choo
choo
your ticket please
END OF THE LINE
         Reduce divisor; Normal case: increase remainder

ALL ABOARD
choo
tickets please chug tickets please choo choo
chug choo
chugga your ticket please choo
chug
choo
choo
your ticket please
END OF THE LINE
   Special case: increase remainder / move it back to divisor / increase quotient

ALL ABOARD
choo choo
choo choo
choo choo
choo choo
choo choo
chugga
END OF THE LINE
           Decrease dividend

ALL ABOARD
your ticket please
END OF THE LINE
                    End division loop

ALL ABOARD
choo
choo
tickets please choo choo
chug choo
chugga your ticket please
END OF THE LINE
             Add remainder back to divisor to get a useful 13

ALL ABOARD
choo
tickets please
END OF THE LINE
                   Skip forward if quotient was 0

ALL ABOARD
chugga tickets please
END OF THE LINE
               Decrement quotient and skip forward if quotient was 1

ALL ABOARD
chugga choo choo
choo choo
tickets please chugga your ticket please choo
choo

END OF THE LINE
     Zero quotient and divisor if quotient was 2

ALL ABOARD
your ticket please choo choo
choo choo
tickets please choo choo
choo choo
chugga choo
choo
chugga your ticket please choo
choo

END OF THE LINE
    Zero divisor and subtract 13 from copy if quotient was 1

ALL ABOARD
your ticket please choo choo
choo choo
tickets please choo choo
choo choo
chug choo
choo
chugga your ticket please
END OF THE LINE
          Zero divisor and add 13 to copy if quotient was 0

ALL ABOARD
your ticket please
END OF THE LINE
                        End outer skip loop (jump to here if ((character minus 1)/32) was not 2 or 3)

ALL ABOARD
choo choo
tickets please chugga your ticket please
END OF THE LINE
                     Clear remainder from first division if second division was skipped

ALL ABOARD
choo choo
click tickets please chugga your ticket please
END OF THE LINE
                    Output ROT13ed character from copy and clear it

ALL ABOARD
choo choo
chugga clack chug
END OF THE LINE
                     Read next character

ALL ABOARD
your ticket please
END OF THE LINE
                            End character reading loop