Brainfuck – When you see it, you will shit bricks
Dec 28, 2011
o que é
Ontem tava sem nada para fazer e resolvi brincar um pouco com os problemas dos Google Code Jam anteriores. Vendo as soluções feitas por outras pessoas, acabei vendo a de um cara que fez em Brainfuck. Brainfuck, WTF???
Brainfuck é uma linguagem que foi criada em 1992 por Urban Müller, com o objetivo de ter o menor compilador existente. Ela implementa seus comandos de outra linguagem esotérica, chamada ``P. Essa linguagem é Turing completa.
Seu funcionamento é o seguinte: O compilador separa cerca de 30000 células de memória para o programa acessar (versões mais atuais de compiladores chegam a ter apenas 5000). Todas as células estão com o valor zero, e você tem um ponteiro que começa na posição inicial. Você pode usar esse ponteiro para movimentá-lo pelas células e então ter o funcionamento do seu programa.
A linguagem possui oito comandos, são eles:
- > - acrescenta uma posição de célula de memória ao ponteiro.
- < - diminui uma posição célula de memória ao ponteiro.
- + - aumenta o valor da posição que o ponteiro está.
- - - diminui o valor da posição em que o ponteiro está.
- [- itera por uma posição até a mesma chegar a 0.
- ]- indica o final da iteração
- , - permite a entrada de um caractere. (getchar em C).
- . - imprime na tela o valor atual do ponteiro.
escrevendo um programa
Resolvi escrever um I love you em brainfuck, então vou mostrar como fiz esse programa:
++++++++++[>+++++++>++++++++++>+++++++++++>++++++++++++>+++
<<<<<-]>+++.>>>>++.<<<++++++++.>+.+++++++.<-------.>>>.<+.<-------.++++++.>>+.
<<<<<+++++++++++.
Agora identado para melhor compreensão:
+++++ +++++
[
> +++++ ++ add 7 to cell 1
> +++++ +++++ add 10 to cell 2
> +++++ +++++ + add 11 to cell 3
> +++++ +++++ ++ add 12 to cell 4
> +++ add 3 to cell 5
<<<<< -
]
> +++ . print 'I'
>>>> ++ . print ' '
<<< ++++++++ . print 'l'
> + . print 'o'
+++++++ . print 'v'
< ------- . print 'e'
>>> . print ' '
< + . print 'y'
< ------- . print 'o'
++++++ . print 'u'
>> + . print '!'
<<<<< +++++++++++ .
Na primeira linha, aumentei o contador da célula 0 para 10, que vai ser o número de iterações pelo loop. Usando a tabela ASCII, juntei os caracteres que tem a representação decimal próximos (exemplo: o é 111 e u é 117). No final da iteração, diminuimos o contador, até chegar a zero, o que determina o final da iteração. Então, a célula 1 ficou com valor de 70, a célula 2 de 100, a célula 3 de 110, a célula 4 de 120 e a célula 5 de 30.
Depois da iteração, é só ir mudando de uma célula para a outra, e adicionando os valores que forem necessários (na célula 3 temos 110, então adicionamos 1 para poder imprimir um caractere ASCII 'o'). Se algum valor tiver maior, é só dimunuir com - e quando chegar no código do caractere, é só imprimir!
Espero que isso deixe a cabeça de muita gente louca ;)