No romance subestimado de Steampunk, The Difference Engine , o equivalente a casas de cinema produzia uma imagem em movimento pixelizada exibida por ladrilhos que poderiam ser invertidos mecanicamente. O mecanismo de controle para orquestrar o movimento desses ladrilhos era uma grande máquina barulhenta controlada por um baralho de cartas perfuradas.
Sua tarefa é emular esse mecanismo e exibir uma animação pixelizada, conforme especificado por um arquivo de entrada. A entrada consiste em linhas em um formato de largura fixa, mas você pode assumir o que for conveniente para uma indicação de final de linha. O formato é:
SSSSYYxxXXOA
SSSS: 4 digit sequence no. may be padded by blanks or all blank
YY: the y coordinate affected by this line (descending, top is 0, bottom is m-1)
xx: the starting x coordinate
XX: the ending x coordinate
O: hexadecimal opcode
A: argument (0 or 1)
A entrada é explicitamente sequenciada (se você deixar seu baralho de cartas no chão, vai me agradecer por essa parte). Isso significa que o programa deve executar uma classificação estável das linhas de entrada usando o campo de sequência como uma chave de classificação. As linhas com o mesmo número de sequência devem manter sua ordem relativa original. (Ele deve funcionar com uma classificação instável, se você anexar o número da linha real à chave.) Um campo de sequência em branco deve ser interpretado como menor que qualquer número (sequência de intercalação ascii).
Uma única linha de instrução pode afetar apenas uma única coordenada y, mas pode especificar um intervalo contíguo de valores x. O valor final x pode ser deixado em branco ou pode ser idêntico ao valor inicial para afetar um único pixel.
O opcode é um dígito hexadecimal que especifica o código da função binária universal que é usado como um rasterop. O argumento é 0 ou 1. A operação de varredura executada é
pixel = pixel OP argument infix expression
--or--
OP(pixel, argument) function call expression
Portanto, o valor original do pixel entra como X na tabela UBF e o valor do argumento da instrução entra como Y. O resultado dessa função é o novo valor do pixel. E esta operação é executada em cada par x, y de xx, YY a XX, YY especificado na instrução. O intervalo especificado por xx e XX inclui os dois pontos finais. assim
0000 0 010F1
deve definir os pixels 0,1,2,3,4,5,6,7,8,9,10 na linha 0.
As dimensões de saída ( m x n ) devem ser de 20 x 20 no mínimo, mas podem ser maiores, se desejado. Mas o grão deve aparecer, sabe? É para ser pixelizada . A saída gráfica e a arte ASCII são aceitáveis.
Se, por exemplo, quisemos criar uma imagem de uma figura pixelizada:
# #
###
##
####
#
#### ####
# #
###
# #
# #
Se o desenharmos com um op inofensivo, como o XOR, ele poderá ser desenhado e apagado, independentemente de a tela ser preta ou branca.
00020261
0 6 661
1 3 561
2 3 461
3 3 661
4 4 461
5 0 361
5 5 861
6 3 361
6 5 561
8 3 561
9 3 361
9 5 561
10 3 361
10 5 561
Duplicar esta sequência fará com que a figura apareça e desapareça.
Uma animação maior pode ser composta fora de ordem, especificando diferentes "capturas" no campo de sequência.
100 016F0
101 016F0
102 016F0
103 016F0
104 016F0
105 016F0
106 016F0
107 016F0
108 016F0
109 016F0
110 016F0
111 016F0
112 016F0
113 016F0
114 016F0
115 016F0
200020261
2 0 6 661
2 1 3 561
2 2 3 461
2 3 3 661
2 4 4 461
2 5 0 361
2 5 5 861
2 6 3 361
2 6 5 561
2 8 3 561
2 9 3 361
2 9 5 561
210 3 361
210 5 561
00020261
0 6 661
1 3 561
2 3 461
3 3 661
4 4 461
5 0 361
5 5 861
6 3 361
6 5 561
8 3 561
9 3 361
9 5 561
10 3 361
10 5 561
300020261
3 0 6 661
3 1 3 561
3 2 3 461
3 3 3 661
3 4 4 461
3 5 0 361
3 5 5 861
3 6 3 361
3 6 5 561
3 8 3 561
3 9 3 361
3 9 5 561
310 3 361
310 5 561
00020261
0 6 661
1 3 561
2 3 461
3 3 661
4 4 461
5 0 361
5 5 861
6 3 361
6 5 561
8 3 561
9 3 361
9 5 561
10 3 361
10 5 561
Produção:
Este é o código-golfe, pelo que o programa mais curto (por contagem de bytes) vence. Bônus (-50) se o mecanismo emitir ruídos de cliques.
x
coord é sempre inclusivo?