Esse desafio consiste em codificar um intérprete para uma linguagem de descrição de pintura Mondrian (MPDL).
Definição de idioma
A linguagem opera em uma pilha de retângulos. Um retângulo é definido por sua coordenada superior esquerda e inferior direita. As coordenadas devem ser números inteiros. A pilha é inicializada com um único retângulo com atributos(1,1,254,254)
Cada comando tem o seguinte formato:
<character><integer>
Existem três comandos:
v<integer>
: faça uma divisão vertical no último retângulo da pilha, na posição indicada pelo parâmetro (como porcentagem). O retângulo de origem é removido da pilha e substituído pelos dois novos retângulos resultantes da divisão. O retângulo esquerdo é pressionado na pilha e o retângulo direito. Como as coordenadas retangulares são números inteiros, as frações devem ser arredondadas para o maior número menor menor.
h<integer>
: divisão horizontal. O retângulo superior é pressionado na pilha e o retângulo inferior.
c<integer>
: remove o último retângulo da pilha e o pinta na cor fornecida como parâmetro. 1 = branco, 2 = vermelho, 3 = azul, 4 = amarelo
Desafio
Escreva um programa que tome como parâmetro uma descrição de pintura e crie uma representação de bitmap de 256x256 dos retângulos pintados. Os retângulos devem ser separados por uma linha preta de 3 pixels. Um retângulo de um ou dois pixels deve ter seus pixels não pretos ocultos pelos pixels pretos da borda.
A entrada pode ser lida como um parâmetro ou como um arquivo, até você. Os comandos devem ser separados por um espaço. Você pode assumir que o arquivo de entrada possui sintaxe correta e não possui espaços à esquerda ou à esquerda, guias, etc. A saída pode ser exibida diretamente na tela ou salva em um arquivo, até você.
O código mais curto vence.
Teste
A seguinte fonte:
v25 h71 v93 h50 c4 c1 c1 c2 h71 c3 h44 c1 c1
Deve produzir a composição II em vermelho, azul e amarelo :
v30 v50 c1 c5 h70 v50 c1 c3 c2
.
v
eh
argumentos devem estar em pixels