summaryrefslogtreecommitdiffhomepage
path: root/es-es/brainfuck-es.html.markdown
blob: e33d672ddbddc0e4e4e66bd95c8c269d07c527f0 (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
---
language: brainfuck
contributors:
    - ["Prajit Ramachandran", "http://prajitr.github.io/"]
    - ["Mathias Bynens", "http://mathiasbynens.be/"]
translators:
    - ["Daniel Zendejas", "https://github.com/DanielZendejas"]
lang: es-es
---

Brainfuck (con mayúscula sólo al inicio de una oración) es un
lenguaje de programación mínimo, computacionalmente universal
en tamaño con sólo 8 comandos.

```

Cualquier caracter que no sea "><+-.,[]" (sin incluir las comillas)
será ignorado.

Brainfuck es representado por un arreglo de 30,000 celdas inicializadas
en cero y un apuntador en la celda actual.

Existen ocho comandos:

+ : Incrementa 1 al valor de la celda actual.
- : Decrementa 1 al valor de la celda actual.
> : Mueve el apuntador a la siguiente celda. (a la derecha)
< : Mueve el apuntador a la celda anterior. (a la izquierda)
. : Imprime el valor en ASCII de la celda actual (i.e. 65 = 'A')
, : Lee un caracter como input y lo escribe en la celda actual.
[ : Si el valor en la celda actual es cero mueve el apuntador
	hasta el primer ']' que encuentre. Si no es cero sigue a la
	siguiente instrucción.
] : Si el valor en la celda actual es cero, entonces sigue con 
	la siguiente instrucción. Si no entonces mueve el apuntador
	hacia atrás	hasta encontrar el primer '['.

[ y ] forman un while. Obviamente, deben estar balanceados.

Ahora unos ejemplos de programas escritos con brainfuck.

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

Este programa imprime la letra 'A'. Primero, incrementa la celda #1 a 
6. La celda #1 será usada para hacer los ciclos. Después entra al ciclo
([) y se mueve a la celda #2 (>). Después incrementa la celda #2 10 veces,
y se regresa a la celda #1 (<), para después decrementarla en 1 (-).
Este ciclo ocurre 6 veces (le toma 6 decrementos a la celda #1 volverse 0),
cuando esto pasa se salta a (]) y continúa.

En este punto estamos en la celda #1, que tiene un valor de 0, mientras
que la celda #2 tiene un valor de 60. Nos movemos a la celda #2 (>),
la incrementamos 5 veces para tener un valor de 65 y luego imprimimos
el valor de la celda #2 (.). 65 es 'A' en ASCII así que la letra 'A'
se imprime.

, [ > + < - ] > .

Este programa lee un caracter del input y lo copia en la celda #2 (,). 
Después empieza un ciclo. Nos movemos a la celda #2 (>) e incrementamos su
valor (+). Regresamos a la celda #1 y decrementamos su valor en 1 (-).
Esto continúa hasta que la celda #1 contenga un cero. Cuando #1 contenga un 
cero la celda #2 tendrá el valor inicial de #1. Como este ciclo siempre
terminara en la celda #1 nos movemos a la celda #2 e imprimimos (.).

Ten en mente que los espacios son sólo para fines de legibilidad.
Es lo mismo escribir el ejemplo de arriba que esto:
,[>+<-]>.

Intenta descrifrar lo que hace este programa:

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

Este programa toma dos números como input y los multiplica.

Primero recibe dos números del usuario. Luego empieza el ciclo externo,
condicionado en la celda #1. Luego se mueve a la celda #2, comenzando
el ciclo interno condicionado en la celda #2 incrementando la celda #3.
Sin embargo viene un problema: El ciclo interior no funcionará nuevamente
hasta la próxima vez. Para resolver este problema también incrementamos la
celda #4 y luego copiamos la celda #4 a la celda #2. La celda #3 contiene
el resultado.
```
Y eso es brainfuck. ¿No tan difícil o sí? Como diversión, puedes escribir
tu propio intérprete de brainfuck o tu propio programa en brainfuck. El
intérprete es relativamente sencillo de hacer, pero si eres masoquista,
intenta construir tu proprio intérprete de brainfuck... en brainfuck.