Enquanto rabiscava em papel quadriculado no outro dia, criei a fonte de espaço negativo acima para dígitos. Caso você ainda não tenha visto, os espaços entre as formas acima produzem a proporção áurea 1,618033988749 . Nesse desafio, sua tarefa é pegar um número como entrada e renderizá-lo exatamente como o exemplo acima mostra.
Aqui está como eles são criados. Todas as linhas estarão em uma grade regular, de modo que os dígitos individuais sejam compostos por um pequeno número de células da grade. Aqui estão as formas dos 10 dígitos (ignoraremos o ponto decimal para este desafio):
Sim, o 7 difere do exemplo da proporção áurea na parte superior. Eu meio que estraguei tudo. Nós vamos com este.
Observe que cada dígito tem cinco células de altura e três células de largura. Para renderizar um número, você pode imaginar colocando todos os seus dígitos um ao lado do outro, de modo que exista exatamente uma coluna vazia entre cada par de dígitos. Por exemplo, tomando 319
como entrada, escreveríamos:
Observe que adicionamos uma coluna vazia inicial e final. Agora invertemos as células:
A saída deve ser os limites dos polígonos resultantes:
É claro que você pode gerar o resultado de qualquer outra maneira, desde que a saída renderizada pareça a mesma.
Entrada
- Você pode escrever um programa ou função, recebendo entradas via STDIN (ou alternativa mais próxima), argumento da linha de comando ou argumento da função, como uma sequência ou lista de dígitos. (Você não pode usar um número, pois isso não permitirá que você suporte zeros à esquerda.)
- Você pode assumir que não haverá mais 16 dígitos na entrada.
Saída
- A saída pode ser exibida na tela ou gravada em um arquivo em um formato de imagem comum.
- Você pode usar gráficos de varredura e vetoriais.
- Em ambos os casos, a proporção das células da grade subjacente precisa ser 1 (ou seja, as células devem ser quadrados).
- No caso de gráficos raster, cada célula deve cobrir pelo menos 20 por 20 pixels.
- As linhas não devem ter mais de 10% do tamanho da célula. Estou disposto a dar margem de um ou dois pixels devido ao aliasing aqui.
- Linhas e plano de fundo podem ter duas cores claramente distinguíveis, mas as formas criadas pelas linhas não devem ser preenchidas (ou seja, a parte interna também deve ser a cor do plano de fundo).
- Não deve haver lacunas dentro de cada loop fechado.
- Obviamente, todo o resultado deve estar visível.
Casos de teste
Aqui estão 10 entradas, que juntas cobrem todos os pares possíveis de dígitos adjacentes, bem como todos os dígitos iniciais e finais possíveis:
07299361548
19887620534
21456837709
39284106657
49085527316
59178604432
69471338025
79581224630
89674235011
97518264003
E aqui estão os resultados esperados para aqueles:
Certifique-se de que seu código também funcione quando receber um único dígito (não quero incluir os resultados esperados aqui, porque eles devem ser óbvios, e a seção do caso de teste está cheia o suficiente).
fonte
Respostas:
BBC BASIC, 182 caracteres ASCII (tamanho do arquivo tokenizado 175 bytes)
Faça o download do intérprete em http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
Pontuação: quando o programa acima for colado no editor e executado, o editor expandirá as palavras-chave abreviadas em palavras-chave completas na tela, embora na verdade elas sejam apenas 1 byte após a tokenização. (Exemplo
I.
=INPUT
espaço de armazenamento 1 byte.)Explicação
Vou apenas explicar o que a linha VDU faz: ela desenha uma caixa movendo a cor atual do pixel na tela. Isso significa que (com um pouco de cuidado com os cantos) é possível simplesmente desenhar uma célula ao lado da outra, e a aresta intermediária será cancelada e desaparecerá devido ao desenho duplo.
Um exame cuidadoso revelará que os cantos superior direito e inferior esquerdo de uma célula são desenhados, mas o canto superior esquerdo e o canto inferior direito estão ausentes ("arredondados") para que isso funcione.
Depois que a célula é desenhada, o cursor gráfico é movido para cima 32 pixels, pronto para a próxima célula a ser desenhada.
O restante do programa é uma descompactação de bitmap ASCII bastante simples. As dimensões da célula são 64x64 unidades para golfe / compatibilidade com a maneira como o bitmap é descompactado.
q
controla o tamanho da célula que é plotada: 64x64 unidades para uma célula presente, 0x0 para uma célula ausente.Código ungolfed
Saída
Os
MOVE
são apenas obter a saída para alturas apropriadas na tela. O BBC basic usa 2 unidades = 1 pixel neste modo, então as células são na verdade 32x32 pixels.fonte
Oitava,
233252252123bytesAqui está o primeiro caso de teste (de uma captura de tela redimensionada, se encaixa no meu monitor =):
A entrada pode ter um comprimento arbitrário, como por exemplo
'07299361548'
fonte
Javascript ES6, 506 bytes
Ungolfed:
Supõe que há um
<body>
anexo à tela, testado no Firefox 46.Exemplo de execução (atribuindo função anônima a f):
rendimentos:
fonte
Html + JavaScript ES6, 352
Teste a execução do snippet abaixo
Menos golfe
fonte
Java, 768 bytes
Ungolfed
Notas
Entrada é uma única sequência como argumento. Como usar:
javac G.java
,java G 80085
Estou começando com uma tela preta e adicionando os números como positivos em branco. Crio uma cópia da imagem e inverto cada pixel preto que possui 4 vizinhos pretos na imagem original.
Saídas
Alguns dígitos:
fonte
R, muitos bytes para o golfe (
1530+1115)lol ao gravar no disco e depois ler do disco, editar o preenchimento preto.
fonte
Python 3,
326325 bytesfonte
range(3)
nunca vale a pena.C #, 768
773 776bytesPega o número como argumento da linha de comando. Produz uma imagem BMP agradável, limpa e sem alias com o número como o nome.
Original antes do golfe:
fonte
Mathematica 328 bytes
Explicação
Quatro bits serão usados em cada uma das 5 linhas de células para cada dígito de entrada.
"75557262277174771717557117471774757711117575775717"
representa 0 a 9 como bitmaps.Os 5 primeiros dígitos do número inteiro grande acima, ou seja,
75557
indicam como cada linha da matriz para zero deve ser exibida.7
representará{0,1,1,1}
, ou seja, uma célula branca, seguida, à sua direita, por três células pretas; o primeiro0
é um espaço em branco para separar os dígitos exibidos.5
corresponde a{0,1,0,1}
células brancas, pretas, brancas e pretas.O seguinte produz uma lista de regras de substituição:
Observe que quando
3
for inserido, ele será substituído por71717
Esta representação é expressa em binário:Seu inverso preto-branco é encontrado por simplesmente trocando os
1
s e0
s.Vamos ver como
p
eq
quando exibido porArrayPlot
:Isso simplesmente une as matrizes de zeros e as de cada dígito antes de renderizar a grande matriz via
ArrayPlot
.*
é definidoj
como o espaço vertical final após o último dígito.fonte