Pure Sourcery - Programas de modelagem que produzem os dígitos de 0 a 9

21

Aqui está uma fonte pixelizada de 5 por 7 para os dígitos de 0 a 9:

.███.
█...█
█...█
█...█
█...█
█...█
.███.

..█..
███..
..█..
..█..
..█..
..█..
█████

.███.
█...█
....█
...█.
..█..
.█...
█████

.███.
█...█
....█
..██.
....█
█...█
.███.

█..█.
█..█.
█..█.
█████
...█.
...█.
...█.

█████
█....
█....
.███.
....█
█...█
.███.

.███.
█...█
█....
████.
█...█
█...█
.███.

█████
....█
....█
...█.
...█.
..█..
..█..

.███.
█...█
█...█
.███.
█...█
█...█
.███.

.███.
█...█
█...█
.████
....█
█...█
.███.

(Essa fonte e esta página provavelmente ficarão melhores se você executar esse código JavaScipt no console do navegador ou na barra de URL prefixada por javascript::. $('#question pre,.answer pre').css('line-height',1))

Escreva dois blocos de texto retangulares de tamanho igual, um para representar os espaços vazios ( .) na fonte acima e outro para representar os espaços preenchidos ( ).

Quando esses dois blocos de texto são organizados no mesmo padrão 5 × 7 que um dos dígitos acima, o bloco de texto grande resultante deve ser um programa que imprima esse dígito em stdout. Isso deve funcionar para todos os 10 dígitos.

Por exemplo, se o seu .bloco de texto foi

---
'''

e seu bloco de texto foi

ABC
123

então o programa

---ABCABCABC---
'''123123123'''
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
---ABCABCABC---
'''123123123'''

deve produzir 0. Da mesma forma, o programa

------ABC------
''''''123''''''
ABCABCABC------
123123123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
ABCABCABCABCABC
123123123123123

deve sair 1e assim por diante até o programa para 9.

Você pode usar esse snippet de pilha para criar os programas em forma de dígito:

<style>textarea{font-family:monospace;}</style><script>function go(){var t=parseInt(document.getElementById("digit").value[0]);if(isNaN(t))return void alert("Invalid digit.");for(var e=document.getElementById("empty").value.split("\n"),n=document.getElementById("filled").value.split("\n"),l=[],o=0;o<7*e.length;o++){l[o]="";for(var d=0;5>d;d++)l[o]+=font[t][Math.floor(o/e.length)][d]?n[o%n.length]:e[o%e.length]}document.getElementById("output").value=l.join("\n")}font=[[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,0,1,0,0],[1,1,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[1,1,1,1,1]],[[0,1,1,1,0],[1,0,0,0,1],[0,0,0,0,1],[0,0,0,1,0],[0,0,1,0,0],[0,1,0,0,0],[1,1,1,1,1]],[[0,1,1,1,0],[1,0,0,0,1],[0,0,0,0,1],[0,0,1,1,0],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[1,0,0,1,0],[1,0,0,1,0],[1,0,0,1,0],[1,1,1,1,1],[0,0,0,1,0],[0,0,0,1,0],[0,0,0,1,0]],[[1,1,1,1,1],[1,0,0,0,0],[1,0,0,0,0],[0,1,1,1,0],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,0],[1,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[1,1,1,1,1],[0,0,0,0,1],[0,0,0,0,1],[0,0,0,1,0],[0,0,0,1,0],[0,0,1,0,0],[0,0,1,0,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,1],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]]]</script><textarea id='empty' rows='8' cols='32' placeholder='empty space text block...'></textarea><textarea id='filled' rows='8' cols='32' placeholder='filled space text block...'></textarea><br>Digit <input id='digit' type='text' value='0'> <button type='button' onclick='go()'>Generate</button><br><br><textarea id='output' rows='16' cols='64' placeholder='output...' style='background-color: #eee;' readonly></textarea>

Detalhes

  • Nenhum dos 10 programas grandes de blocos de texto deve exigir entrada. Somente imprima o dígito único mais uma nova linha à direita opcional. Saída para stdout ou uma alternativa semelhante.
  • Nenhum dos programas pode ler ou acessar seu próprio código-fonte. Tratar este como um estrito Quine desafio.
  • Os blocos de texto podem não ser idênticos e devem ter dimensões diferentes de zero.
  • Os blocos de texto podem conter qualquer caractere, exceto os terminadores de linha .
  • Os 10 programas devem ser programas completos escritos no mesmo idioma, não são trechos REPL . Opcionalmente, você pode adicionar uma nova linha à direita a todos ou a nenhum deles.

Pontuação

Sua pontuação é a área (largura x altura) de um dos seus blocos de texto. (Eles são do mesmo tamanho, portanto não faz sentido contar os dois blocos.) A área do exemplo é 3 por 2, para uma pontuação de 6.

A pontuação mais baixa vence. Em caso de empate, a resposta mais votada vence.

Passatempos de Calvin
fonte
No seu código, você pode melhorá-lo bastante. var t=parseInt(document.getElementById("digit").value[0]);if(isNaN(t))return void alert("Invalid digit.");pode ser escrito como var t=document.getElementById("digit").value[0]/1;if(t!=t)return void alert("Invalid digit.");, que é o mesmo, mas menor. Há mais algumas coisas que você pode melhorar, mas parece ótimo!
Ismael Miguel
4
@IsmaelMiguel TBH Coloquei-o através de um minificador JS para obtê-lo em uma linha. Nunca foi feito para jogar golfe.
Hobbies de Calvin
Oh, cara ... Isso é um pouco preguiçoso ... Em uma pergunta sobre golfe, você publica um código que não é golfe ... Mas, ei, eu entendi e só estou dizendo isso. Você não precisa seguir o que eu disse. Mas é uma coisa boa a se fazer.
Ismael Miguel
6
@IsmaelMiguel Eu publiquei código de utilitário não- destruído , que sem dúvida deve ser o mais legível possível para que os bugs sejam mais fáceis de detectar. Mas, na verdade, desde que funcione, o tamanho do código do snippet da pilha tem literalmente zero influência no resultado do desafio.
Calvin's Hobbies
3
text blocks may not be identicalmesmo? Eu quero ver alguém quebrar essa regra, dando dois codeblocks idênticos, que retornam magicamente diferentes dígitos, quando cada número é exatamente o mesmo código ^^
Falco

Respostas:

13

CJam, 20 18 14 13 12 * 1 = 12

Experimente online: 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9

Bloco vazio

];BG*K+ :BD%

Bloco sólido

];B9+33%:B4/

Explicação

Usei uma estratégia semelhante à solução do Sp3000 , de modo que cada bloco realiza uma multiplicação, uma adição e (possivelmente) uma operação de módulo em uma variável e salva o valor de volta. Para encontrar uma solução ideal, usei boa e velha força bruta. Escrevi um programa que pesquisa o espaço de todos os possíveis valores iniciais (os valores iniciais das variáveis ​​CJam) e muitos milhões de pares possíveis de funções de transformação, de modo que a saída para cada dígito seja única. Depois, filtramos os resultados para que o resultado final das formas de dígitos que terminam em um bloco vazio, dos quais existem 8, possa ser mapeado de volta para o resultado correto por meio de outra fórmula de multiplicação, adição e módulo.

Após alguns dias de tempo de pesquisa na CPU, o melhor resultado até agora está no tamanho de 12! Esta solução começa com um valor de 11, a função de transformação de bloco vazio é x * 16 + 20, a função de resultado de bloco vazio é x % 13, a função de transformação de bloco sólido é (x + 9) % 33e a função de resultado de bloco sólido é x / 4.

Runer112
fonte
23

> <> (Peixe) , 5 * 10 = 50

Bloco vazio

   \   !9 
4n;    n/ 
1n;\      
       \  
0n;n7\\\  

Bloco sólido

   \; n8/ 
     /!/!v
     \  ;6
3n;\ ! /nn
2n;n5<  8;

Este código não contém lógica ou aritmética usa apenas redirecionamentos estáticos do ponteiro de instrução 2D (IP) de> <> com 'espelhos' ( /e \) e duas 'setas' ( <e v). O único outro controlador de fluxo é o 'trampolim' ( !), que passa pelo próximo caractere.

O IP começa no canto superior esquerdo, na direção leste. Após alguns redirecionamentos, ele atinge um número, é empurrado para a pilha e impresso com no programa termina com ;.

O fluxo do programa

Um bloco 'reconhece' o estado atual do programa pelo fato de que ponto o IP entrou e com base no estado em que decide qual direção deve deixar o ponteiro (qual bloco deve ser executado a seguir) e em qual posição exata o ponteiro deve sair (que será o novo estado). É claro que os blocos não fazem lógica; todo esse comportamento vem dos redirecionadores.

randomra
fonte
Eu estava esperando por uma resposta como esta. Pura magia.
EagleV_Attnam
11

CJam, 23 22 19 * 1 = 19

Bloco vazio:

];G)B%:G"73860594"=

Bloco sólido:

];GW*B+3*D%:G    7-

Experimente online .

Estou tentando ter sorte com coincidências matemáticas e falhas, então aqui está uma abordagem ligeiramente diferente para o mapeamento de exclusividade da solução de Martin.

Comece com 16. Blocos vazios, adicione 1 e pegue o módulo 11. Blocos sólidos se multiplicam por -1, adicione 11, multiplique por 3 e depois pegue o módulo 13. Isso mapeia magicamente 03456789(os dígitos que terminam em um bloco vazio) para o 41753026qual usamos a indexação para acertar. 12mapas ordenadamente 89, que podemos remediar subtraindo 7.

Sp3000
fonte
7

CJam, 28 27 x 1 = 27

Aqui está um começo.

Bloco vazio

U):U;                       

Bloco sólido

];U):UW+:WF%"1302986_7_54"=

Teste aqui. Não posso fornecer um link permanente para o código, porque o código é muito longo, portanto você precisará copiá-lo manualmente a partir do snippet do desafio.

A idéia é fazer o hash da forma da seguinte maneira:

  • Para cada "pixel", incremente um contador U.
  • Para cada "pixel" preto, adicione Uum total em execução W(que começa em -1). No final, tomamos esse módulo 15, que fornece resultados exclusivos, que são usados ​​para indexar em uma string de pesquisa.
Martin Ender
fonte