Escreva um bloco de texto retangular que, quando organizado em um tapete Sierpinski , usando espaços do mesmo tamanho para as partes vazias, cria um programa que gera o número de iteração do tapete.
Por exemplo, se o seu bloco de texto for
TXT
BLK
então executando o programa
TXTTXTTXT
BLKBLKBLK
TXT TXT
BLK BLK
TXTTXTTXT
BLKBLKBLK
deve sair 1
porque a forma do programa representa a primeira iteração do tapete Sierpinski.
Da mesma forma, executando
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXT TXTTXT TXTTXT TXT
BLK BLKBLK BLKBLK BLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXTTXTTXT TXTTXTTXT
BLKBLKBLK BLKBLKBLK
TXT TXT TXT TXT
BLK BLK BLK BLK
TXTTXTTXT TXTTXTTXT
BLKBLKBLK BLKBLKBLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXT TXTTXT TXTTXT TXT
BLK BLKBLK BLKBLK BLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
deve gerar 2 porque esse é o formato da segunda iteração do tapete de Sierpinski.
Executando o bloco de texto como está
TXT
BLK
deve sair 0
porque pode ser considerada a iteração zero.
Isso deve funcionar para todas as iterações adicionais. (Pelo menos teoricamente, supondo que o computador tenha memória e tudo.)
Detalhes
- Os programas podem não ler ou acessar informações sobre seu código-fonte. Trate isso como um desafio estrito à questão.
- A saída vai para stdout ou alternativa semelhante. Somente imprima o número e uma nova linha opcional à direita. Não há entrada.
- O bloco de texto pode conter caracteres que não sejam considerados terminadores de linha . O bloco de texto pode conter espaços.
- O "espaço vazio" no tapete deve consistir inteiramente em caracteres de espaço .
- Opcionalmente, você pode assumir que todos os programas têm uma nova linha à direita.
Você pode usar esse snippet de pilha para gerar um tapete para um determinado bloco de texto em qualquer iteração:
<style>#o,#i{font-family:monospace;}</style><script>function c(e){e=e.split("\n");for(var n=new Array(3*e.length),t=0;t<n.length;t++){var l=t%e.length;n[t]=e[l]+(t>=e.length&&t<2*e.length?e[l].replace(/./g," "):e[l])+e[l]}return n.join("\n")}function f(){for(i=document.getElementById("i").value,n=parseInt(document.getElementById("n").value);n>0;)i=c(i),n--;document.getElementById("o").value=i}</script><textarea id='i'placeholder='code block...'rows='8'cols='32'></textarea><br>Iterations <input id='n'type='text' value='1'><br><br><button type='button'onclick='f()'>Generate</button><br><br><textarea id='o'placeholder='output...'rows='8'cols='32'style='background-color:#eee'readonly></textarea>
Pontuação
O envio cujo bloco de texto inicial é menor por área (largura x altura) é o vencedor. O TXT\nBLK
exemplo é 3 por 2 para uma pontuação de 6. (Basicamente, o código mais curto vence, daí a tag code-golf.)
O desempatador vai para o envio que usa o menor número de caracteres distintos em seu bloco de texto. Se ainda estiver empatado, responda as primeiras vitórias postadas.
fonte
Perl, 30 (15 × 2)
Primeiro de tudo, vou afirmar que 10 iterações são um limite razoável, não 2 32 . Após 10 iterações, um programa que consiste em N bytes será expandido para ( N × 3 20 ) bytes (mais quebras de linha), com mais de 3 gigabytes, mesmo para N = 1. Uma arquitetura de 32 bits seria completamente incapaz de lidar com 11 iterações. (E, obviamente, não há partículas suficientes no universo para 2 32 iterações).
Então aqui está a minha solução:
Isso funciona incrementando a variável
$n
na primeira linha e calculando seu logaritmo em cada etapa. A segunda linha imprime a parte inteira deste logaritmo e sai.Um logaritmo simples para basear e (2.718 ..) está próximo o suficiente para fornecer resultados corretos para as 10 primeiras iterações.
fonte
Golfscript, 9 * 2 = 18
(Observe que a primeira linha possui espaços à direita para torná-la retangular)
Não consegui encontrar uma função de log para o Golfscript, então
base
tive que fazer.Golfscript começa com uma string vazia, portanto,
0+
apenas aumenta o comprimento da string em 1 (por coerção). Quando a primeira linha terminar, a pilha terá uma sequência de comprimento3^n
, da qual utilizamos a base de log 3 antes de comentar demais.n
é então impresso automaticamente.fonte
,
na segunda linha. Primeira linha0or)
:; segunda linha3base,(}
. O outro alvo óbvio é o(
da segunda linha. Isso é mais complicado, mas também pode ser removido substituindo a primeira linha1+~abs(
por um retângulo 7 * 2.C, 12x8 = 96
Inspirado por @ciamej, reduzi-o. Ele usa essa divisão por três truques, além da percepção de que o tapete efetivamente converte um if em um loop while.
O código foi testado no gcc / Ubuntu para iterações de até 3.
Solução anterior: C, 11x12
Não é um vencedor de tamanho, mas ei, é C.
Ele encontra o log2 da contagem de blocos por deslocamento de bits e, em seguida, usa alguns números mágicos e o truncamento int para estimar o log3. A matemática deve trabalhar com até 26 iterações (um número de 42 bits).
fonte
CJam, 9 bytes
A idéia de usar
]
é do Optimizer, mas usa um método muito diferente para contar.Experimente online
Como funciona:
Duas outras soluções de 9 bytes
fonte
Python 2, 15 * 3 = 45
Outra implementação da idéia contar-primeira-linha-depois-registrar-três-e-sair. Provavelmente ainda pode ser jogado um pouco mais.
fonte
bc, 2 * 16 + 1 = 33
O +1 extra na pontuação é porque a
-l
opção bc é necessária:fonte
Golfscript, 7 * 2 = 14
Isso é inspirado na resposta do Sp3000 e, em particular, no desejo de otimizar a longa segunda linha.
3base,
é tão curto quanto um logaritmo de base 3 entra no GS, e o super comentário}
é claramente ideal.O que é necessário para a primeira linha é mapear a sequência vazia
''
do stdin inicial para 0 e, em seguida, mapear cada número inteiro não negativo para o sucessor. Desta forma, terminamos a primeira linha com3^n - 1
na pilha e3base,
não requer nenhum decremento.fonte
C, 13x8
fonte
Perl, 76
Sei que provavelmente não faz muito sentido postar isso, pois ele já foi completamente derrotado, mas aqui está a minha solução atual.
fonte
> <> (Peixe), 12 * 3 = 36
Uma solução> <> mais direta:
Primeiro, executamos a linha superior dos blocos superiores.
'v'00p
colocav
na primeira posição de todo o programa, direcionando o ponteiro do programa para baixo quando voltar ao início, após atingir o final da linha. Antes disso, cada bloco empurra 0 e o comprimento da pilha + 1 para ele. (a pilha será0 2 0 4 0 6 ...
)Na primeira metade do segundo e terceiro contamos quantas vezes podemos dividir o elemento da pilha superior antes de obtermos 2 (nós o armazenamos no segundo ao topo).
No final, produzimos o segundo ao topo do elemento da pilha.
fonte
Lua, 3 * 17 = 51
Mesma estratégia que a maioria das pessoas:
fonte
PHP, 22 × 2 = 44
27 × 2 = 54Apenas outra opinião sobre count-log3-out. Não é muito pequeno, mas o meu primeiro golfe;)
fonte