# Malbolge

Malbolge é uma linguagem de programação esotérica inventada por Ben Olmstead em 1998, cujo nome veio do oitavo círculo do Inferno na Divina Comédia de Dante Alighieri.
A maior característica de Malbolge é que ela foi especialmente criada para ser a pior linguagem de programação possível (a mais difícil e mais esotérica). O trabalho de seus desenvolvedores foi torná-la a mais impossível de ser entendida por programadores. Porém, muitos truques usados para complicá-la podem ser simplificados e entendidos.

## Fatos da programação

Malbolge é tão difícil de ser entendida que somente depois de dois anos de ter sido inventada que surgiu seu primeiro programa. Por sinal, não foi criado por um humano, mas sim por um algoritmo baseado em LISP, desenvolvido por Andrew Cooke.
Em 24 de agosto de 2000, Anthony Youhas garantiu ter dominado a linguagem depois de ter conseguido criar três programas que conseguiam apenas imprimir várias frases diferentes!
Diz-se inclusive que levaria anos para se implementar uma simples instrução de repetição em Malbolge...

## Implementando o Hello World!

Nós fazemos o computador mostrar na tela a frase "Hello World". Apenas isso.
Esse seria o código Malbolge para fazer o computador mostrar na tela a frase "Hello World":

## Dados sobre a linguagem

Basicamente, o Malbolge utiliza três registradores, que funcionam como variáveis: a, c, d. Elas iniciam com valor zero, onde c recebe a instrução que irá ser processada no momento, e d recebe um endereço de memória específico das operações implementadas.
Possui 59049 locações de memórias virtuais que podem armazenar números de dez dígitos. A primeira parte dessas locações recebem o programa, e as restantes são preenchidas por dados de uma instrução chamada Crazy Operation, que recebem os endereços anteriores ([m] = crz [m - 2], [m - 1]) e realizam operações imediatas que repetem os endereços de memória 12 vezes (já que os dígitos individuais ternários se repetem a cada três ou quatro endereços, dando no total um grupo de endereços 12 vezes repetidos igualitariamente).

## Instruções

Malbolge possui 8 instruções, que funcionam a partir do valor que foi atribuído no registrador c. Em seguida, adiciona um valor de acordo com a instrução e subtrai por 94 até o número respectivo ser menos que 94. De acordo com o valor retornado, o interpretador Malbolge retornará a seguinte resposta:
4: O valor que está guardado no endereço de memória d será somado com um e e ali executará a dada operação.
5: Imprime o valor ASCII armazenado na variável a.
23: Adiciona o código ASCII da tecla pressionada na execução do algoritmo em a.
39: Rotaciona o valor que estiver armazenado em d em um dígito (por exemplo, se for o numero 000111254 ele retorna 400011125) e o armazena tanto em d quanto em a.
40: Copia o valor armazenado em d e envia para d em forma de endereço de memória.
62: Realiza a Crazy Operation (que veremos logo abaixo) com o valor armazenado no endereço de memória d e com a e o armazena nos dois registradores.
68: Não faz nada.
81: Termina de executar o algoritmo.
Terminado de executar, o interpretador criptografa as instruções para que não realize a mesma função futuramente, e torne toda a tarefa de criação do algoritmo mais complexa.

### Crazy Operation

Pega dois valores ternários de dez dígitos e retorna os valores de acordo com a seguinte tabela ternária, como no exemplo:
Se executarmos a crazy operation crz 0001112220, 012012012, teremos como retorno o valor 1001022211, como na tabela:
///0 1 2 0 1 0 0 1 1 0 2 2 2 2 1
De forma bem simples, você compara cada digito individualmente e compara com o que está demonstrado na tabela. Por exemplo, se o crz 0001112220, 012012012 é esse, comparamos primeiro o 0001112220 com 012012012 em negrito e vemos na tabela qual o valor que será retornado:
///0 1 2 0 1 0 0 1 1 0 2 2 2 2 1

### Encriptação

Depois de executar uma instrução, o que foi armazenado em c será subtraido repetidas vezes por 94, até seu resultado ser menor que 94. Em seguida, pode ser criptografada em dois métodos (só demonstraremos um pelo fato do segundo exigir atenção de uma tabela gigantesca):
Método 1: Retorna o seguinte trecho criptografado a partir do valor ASCII armazenado em c:
Código: 0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123
9m<.TVac`uY*MK'X~xDl}REokN:#?G"i@5z]&gqtyfr$(we4{WP)H-Zn,[%\3dL+Q;>U!pJS72FhOA1CB6v^=I_0/8|jsb