Em 2014, o demoscener Jakub 'Ilmenit' Debski lançou uma demonstração gráfica de procedimento de 250 bytes (1) para o Atari XL chamada Mona . Está desenhando a seguinte figura (2) :
Sua tarefa é gerar exatamente a mesma imagem, usando o idioma de sua escolha.
(1) Repartição: 136 bytes de dados + 114 bytes de código.
(2) A imagem original é 128x96. A versão acima foi ampliada para 256x192. Alguns pixels diferem do original, mas esta é a saída esperada com o pseudo-código descrito neste desafio.
Quão?
Isso é código-golfe . Embora você esteja autorizado a usar qualquer método, os melhores resultados provavelmente serão alcançados usando o algoritmo original descrito abaixo.
NB : Este parágrafo não é uma especificação, mas uma descrição geral. Por favor, consulte o pseudo-código e a implementação de referência para obter detalhes do algoritmo.
A imagem é composta por 64 pinceladas pseudoaleatórias ( veja este vídeo ), percorrendo as seguintes cores (no formato hexadecimal RRGGBB):
COLOR = [ 0xFFE289, 0xE99E45, 0xA55A00, 0x000000 ]
O fundo é inicialmente preenchido com a quarta cor (preto). Cada curso é mais curto que o anterior.
O gerador pseudo-aleatório está usando um LFSR (Linear-Feedback Shift Register) em um número inteiro de 32 bits inicialmente definido como 0x7EC80000
e com XOR 0x04C11DB7
.
Cada curso é inicializado com um valor de 16 bits que substitui os bytes mais baixos da semente:
BRUSH = [
0x030A, 0x37BE, 0x2F9B, 0x072B, 0x0E3C, 0xF59B, 0x8A91, 0x1B0B,
0x0EBD, 0x9378, 0xB83E, 0xB05A, 0x70B5, 0x0280, 0xD0B1, 0x9CD2,
0x2093, 0x209C, 0x3D11, 0x26D6, 0xDF19, 0x97F5, 0x90A3, 0xA347,
0x8AF7, 0x0859, 0x29AD, 0xA32C, 0x7DFC, 0x0D7D, 0xD57A, 0x3051,
0xD431, 0x542B, 0xB242, 0xB114, 0x8A96, 0x2914, 0xB0F1, 0x532C,
0x0413, 0x0A09, 0x3EBB, 0xE916, 0x1877, 0xB8E2, 0xAC72, 0x80C7,
0x5240, 0x8D3C, 0x3EAF, 0xAD63, 0x1E14, 0xB23D, 0x238F, 0xC07B,
0xAF9D, 0x312E, 0x96CE, 0x25A7, 0x9E37, 0x2C44, 0x2BB9, 0x2139
];
Estes valores também são usados para definir a nova posição (bx, por) da escova no início do acidente vascular cerebral: bx é dada pelo byte menos significativo e pela é dada pelo byte mais significativo.
A direção do golpe é dada pelos bits 1 e 7 da semente. (Veja a instrução SWITCH no pseudocódigo.)
Pseudo-código
Abaixo é o algoritmo em pseudo-código, partindo do princípio matrizes 0-indexados, onde AND
, OR
e XOR
operações médios bit a bit.
seed = 0x7EC80000
dir = 0x00
FOR part = 0 TO 63
word = BRUSH[part]
seed = (seed AND 0xFFFF0000) OR word
bx = word AND 0xFF
by = (word >> 8) AND 0xFF
FOR len = 0 TO (64 - part) * 32 - 1
carry = seed AND 0x80000000
seed = (seed << 1) AND 0xFFFFFFFF
IF carry
seed = seed XOR 0x04C11DB7
dir = seed AND 0xFF
ENDIF
SWITCH dir AND 0x82
CASE 0x00:
by = (by + 1) AND 0x7F
ENDCASE
CASE 0x02:
bx = (bx + 1) AND 0x7F
ENDCASE
CASE 0x80:
by = (by - 1) AND 0x7F
ENDCASE
CASE 0x82:
bx = (bx - 1) AND 0x7F
ENDCASE
ENDSWITCH
drawPixel(bx, by, COLOR[part AND 3])
ENDFOR
ENDFOR
Implementação de referência
Abaixo está uma implementação de referência não destruída em JavaScript.
Você também pode ver uma versão animada aqui .
Esclarecimento e regras
- A saída deve ser cortada para 128x96, mesmo que o algoritmo desenhe fora dessa área.
- Se o seu idioma / plataforma não conseguir produzir as cores exatas descritas acima, você deverá usar as cores o mais próximo possível.
- Se você decidir usar um método alternativo, ainda deverá gerar exatamente a mesma saída.
- Apenas no caso: não é permitido enviar o código de montagem original 6502 ou qualquer versão ligeiramente editada.
- Você pode bater 250 bytes? Desenho feliz!
Respostas:
opcode x 86,
227224223 BytesImagem:
fonte
0122 6681F7B71DC104 xor edi, 00001DB7
erro encontrado em W32Dasm8086 Assembly - NASM (MBR) -
248245 bytesfonte
xor dx,dx
e mudarmov bp,0xa000; mov es,bp
parapush 0xa000; pop es
.PUSH imm
Excel VBA de 32 bits,
1011720 bytesRevisão 49; Δ Pontuação = 291 bytes
Golfe
Sub
Rotina completa que não recebe entrada e gera a Mona Lisa para oActiveSheet
objeto no intervalo[A1:DX96]
.Havia um monte de magia negra envolvidos no golfe este para baixo a seu estado atual, - de nota, alguns dos truques envolvidos são de pixel prep arte , bit deslocando cores implícita conversão de tipo , e
comprimindo bytes como umbase64
compressãoString
.Nota: Esta solução foi restrita às versões de 32 bits do Excel VBA, como
^
é oLongLong
tipo literal nas versões de 64 bitsObserve, o segundo: a sequência é a linha 3 não é um comentário, pois
”
não é equivalente a"
Saída
Gif mostrando a saída para
ActiveSheet
quandoM
é chamado na janela imediata do VBE. Observe que, devido às limitações de tamanho do arquivo, estefiggif tem menos quadros do que realmente produzido.Ungolfed
Rotina completa não-gasta
sub
que não recebe entrada e produz a mona lisa usando o método descrito acima noActiveSheet
objetofonte
HTML + CSS + JavaScript (ES6), 499 bytes
678...478475473465459455451447449 bytesNão chega nem perto de 250 bytes, mas definitivamente me contentarei com menos de 500 bytes! Muito obrigado a @Arnauld e @Firefly por me ajudarem a derrotar esse monstro.
Para uma escala maior, substitua o CSS pelo seguinte:
História anotada!
Eu me diverti muito com o código de referência de Arnauld, e você pode obter um pouco disso aqui. Apreciar!
Mostrar snippet de código
fonte
Befunge,
11311052 bytesExistem várias questões que tornam esse um problema desafiador no Befunge:
O Befunge possui apenas 2000 bytes de memória para trabalhar (e isso inclui o código-fonte); portanto, não há como renderizar toda a imagem na memória antes de produzi-la. A maneira como resolvo isso é executando repetidamente o algoritmo 96 vezes, uma vez para cada linha. Cada execução armazena apenas os pixels necessários para a linha atual, que são impressos no final da execução. Isso nos permite conviver com um buffer de pixel de apenas 128 bytes.
O Befunge não possui operações de bits. Muitas das
AND
operações podem ser simplesmente emuladas com um operador de módulo (por exemplo,a AND 0x7F
podem ser substituídas pora % 0x80
). No entanto, issoXOR
requer uma manipulação de bits bastante complicada, que precisamos lidar com um byte de cada vez, usando um conjunto de fórmulas personalizadas codificadas para lidar com os quatro bytes necessários. Por exemplo, para calculara XOR 0xC1
, usamos a fórmula:a + 0xC1 - (a/64%4*64 + a%2)*2
Embora não seja uma limitação do Befunge em si, a interface no TIO é incapaz de manipular caracteres ASCII estendidos na fonte, o que seria a maneira mais fácil de armazenar o pincel e as tabelas de cores. Eu resolvo isso gerando essas tabelas como uma lista de números na pilha e, em seguida, tenho um pequeno loop de inicialização que copia os valores da pilha para a memória. Uma parte significativa do meu tempo foi passada jogando esta tabela, que ocupa as primeiras cinco linhas e meia de código.
Infelizmente, apesar de todo o meu esforço para tornar o código compatível com o TIO e da minha escolha de um formato de arquivo que possa ser extraído do TIO ( PPM ), é muito lento para concluir dentro do prazo de 60 segundos (executando o algoritmo 96 vezes provavelmente não ajuda). Mas como gera a imagem linha por linha, você ainda deve obter o suficiente da saída para recuperar quase metade da imagem.
Experimente online!
Se você não possui um visualizador de arquivos PPM local, pode facilmente converter para outro formato usando um dos muitos conversores online. Um exemplo é o Convertio .
fonte
Python 3,
544536523519518 bytesEsta é uma versão mais avançada da tradução Python do CCB60 da implementação de referência. Originalmente, usei um grande número hexadecimal para representar o pincel do algoritmo, mas depois percebi que minha suposição infundada de que uma representação de string Unicode não funcionaria no Python era falsa.
Originalmente, pensei que minha contagem de bytes era significativamente menor, mas, como apenas o ASCII apontou, não me lembrava de contar os caracteres Unicode como mais de um byte.
Saída (128 x 96)
Idêntico à saída do CCB60.
fonte
Java 7,
681677675626612610 bytesEmite a seguinte imagem na resolução 128x96:
Eu sei que não é nem perto de 250 bytes, mas ei, é java
-2 bytes graças a Zacharý
fonte
#Language, <s>Old Scores</s> Score Bytes
e 2, você pode tornar seu código um pouco mais legível adicionando um sinalizador de idioma do formulário<!-- language-all: lang-java -->
antes seu bloco de código #0x04C11DB7
=>0x4C11DB7
e0x7f
=>127
. Não fique louco quando não for necessário.C #,
960850 bytesUma cópia direta do pseudo-código com alguns jogos de golfe adicionados. Ainda há muito o que jogar, mas eu queria postar minha resposta para fazer a bola rolar.
Versão completa / formatada:
fonte
var m = new Bitmap(128,96)
AE IU WAUGH WYPython 2.7;
880876 bytes no total (incluindo dados)-4 bytes a 876 graças ao ZacharyT. (Meu intérprete de python não gostou da sugestão de deixar os espaços entre os anos 80 e mais).
A sugestão de Taylor Scott para colocar o pincel na Base 10 é excelente, mas notjagan (em um comentário) levou sua sugestão um passo adiante, usando o formato inteiro estendido do python em hexadecimal. A resposta de notjagan está em Python 3 e é uma melhoria tão grande quanto o que eu fiz que ele merece crédito. Espero que ele a publique como uma resposta separada.
Saída para uma janela Tkinter. Sem escala, a imagem é muito pequena, mas a escala adiciona cerca de uma dúzia de bytes à contagem.
Não há muita coisa acontecendo aqui, exceto a tradução para Python e alguns jogos básicos de golfe. Às vezes, as manipulações em bits são mais curtas, às vezes, números inteiros. Não consegui encontrar uma maneira de agrupar mais da lógica em listas ou matrizes. O algoritmo básico já é bastante denso.
fonte
<!-- language-all: lang-py -->
80
e oselse
. E,0x00
é o mesmo que0
, certo?import
e*
.Tcl / Tk, 805
808815816819826839840843Ainda perdedor, maseu tive que fazer isso! pode ser que eu possa jogar golfe mais tarde!Não é o perdedor agora!
Tcl / Tk, 1370
Transliteração muito desprotegida do pseudo-código antes do início da maratona de golfe! A
update
linha possibilita a visualização progressiva do desenho!fonte
Python 3 + matplotlib, 541
Isso salva a imagem como um arquivo png "i". Para exibir a imagem, você pode substituir o imsave por um imshow e um show por 545 bytes.
fonte
SmileBASIC,
454447444 bytesA sequência de "x" s tinha alguns caracteres unicode inválidos, portanto, não posso publicá-la aqui. Aqui estão os códigos de caracteres em decimal (apenas a matriz BRUSH ao contrário):
8505, 11193, 11332, 40503, 9639, 38606, 12590, 44957, 49275, 9103, 45629, 7700, 44387, 16047, 36156, 21056, 32967, 44146, 47330, 6263, 59670, 16059, 2569, 1043, 21292, 45297, 10516, 35478, 45332, 45634, 21547, 54321, 12369, 54650, 3453, 32252, 41772, 10669, 2137, 35575, 41799, 37027, 38901, 57113, 9942, 15633, 8348, 8339, 40146, 53425, 640, 28853, 45146, 47166, 37752, 3773, 6923, 35473, 62875, 3644, 1835, 12187, 14270, 778
fonte
"xx...xx"
string?: r4, 764 bytes
a fonte para execução em : r4 github
Eu uso um truque para fazer a jogada sem condicionais, transformar o bit 8 em sinal e mudar com o bit 2. versão com nomes de pilha:
fonte
Yabasic,
790779 bytesUma resposta básica que não leva entrada e saída para uma nova janela de desenho.
Saída
A tabela abaixo é escalonada por um fator de 8
fonte