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:

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 ;)

blog comments powered by Disqus