Sua tarefa é escrever um programa de tamanho uniforme , que imprima um quadrado de arte ASCII (descrito abaixo), que aumente o comprimento do lado em 1 unidade cada vez que o código-fonte original é colado no meio do código atual.
É muito difícil para mim definir essa tarefa muito bem, então vou dar um exemplo:
Digamos que seu código inicial era
CODE
e que era impresso:0
Em seguida, insira
CODE
no meio: seu código se tornaCOCODEDE
e deve ser impresso:00 00
Reinsira
CODE
no meio: seu código se tornaCOCOCODEDEDE
e deve ser impresso:000 000 000
E assim por diante. Sua resposta deve teoricamente funcionar após várias iterações, mas entendo se, devido às limitações de desempenho do idioma, ela não pode ser executada razoavelmente acima de um determinado limite.
Algumas regras:
Você pode usar qualquer ASCII imprimível (32-127) como o caractere a ser usado no seu quadrado. Sua escolha precisa ser constante (você deve usar o mesmo caractere para cada iteração).
O quadrado de saída inicial deve ter o comprimento lateral 1 .
Um quadrado ascii-art é definido como uma string com N linhas (separadas por N-1 feeds de linha / novas linhas) e cada linha contém N cópias do caractere escolhido.
Não é permitido que sua saída contenha espaços em branco externos, exceto uma nova linha à direita.
Você pode usar os padrões para entrada e saída (programas ou funções são permitidos, mas trechos não são).
O meio do seu código é definido como o ponto em que o código-fonte pode ser dividido em duas partes, para que as duas sejam iguais.
Suas respostas serão pontuadas pela duração do seu programa original , em bytes. A menor contagem de bytes vence. Caso haja empate, a resposta enviada anteriormente vence.
Você pode usar este programa para aplicar as inserções sem precisar fazer isso manualmente.
Respostas:
Pitão , 2 bytes
Experimente online! Também Experimente dobrou , triplicou !
Como isso funciona?
\n
é o comando que imprime seu argumento com uma nova linha à direita, enquanto o retorna simultaneamente. Portanto, toda vez que você faz uma inserção, transforma o literal inteiro 5 em um número contendo N cópias de 5 concatenadas, e as novas linhas principais basicamente garantem que seja impresso o número apropriado de vezes, mantendo-o quadrado.fonte
JavaScript (ES6),
423230 bytesSegunda iteração:
Isso funciona anexando a
0
as
cada vez que a primeira metade do código é executada e imprimindo-s
se a cada vez que a segunda metade é executada. Aproveita quatro peculiaridades do JavaScript:this
. Isso nos permite fazerthis.s
no lugar des
.undefined
.[1,2,3] + 4 === "1,2,34"
undefined
é convertida na cadeia vazia, o que significa isso[undefined] + 0 === "0"
.Juntos, isso significa que podemos expressar a primeira metade (gerando uma sequência de zeros) em apenas 13 bytes. Se usar em
alert
vez deconsole.log
for permitido, podemos salvar mais 4 bytes encurtando a segunda metade.fonte
05AB1E , 2 bytes
Experimente online!
Porto da minha resposta Pyth .
fonte
Python 2 ,
423828 bytesExperimente online! . Você também pode tentar a segunda e a terceira iterações
fonte
Python 2 , 22 bytes
Experimente online!
Dobrado:
Observe que a segunda metade começa com um caractere de nova linha.
fonte
C (GCC) ,
17016896807270 bytesVersão muito mais curta. Ainda desejo encontrar uma solução sem o pré-processador.
Experimente online!
Versão antiga de 168 bytes:
Experimente online!
fonte
Python 2 , 30 bytes
Experimente online! , 2 e 3 iteração
Isso faz uso do fato de que os bools no Python são basicamente ints e nomes
False
eTrue
foram reatribuíveis no Python 2.Python 1 , 32 bytes
Experimente online! , 2º e 3ª iteração
No Python 1, as strings internas
exit
equit
existiam para informar ao usuário do shell interativo como sair dele. O valor padrão é"Use Ctrl-D (i.e. EOF) to exit."
.fonte
n=False+=1;print'*'*n;
, mas continuo esquecendo que esse não é um recurso do Python ...Carvão , 6 bytes
Experimente online! Explicação:
υ
termina com um comprimento do número de repetições.fonte
Haskell , 68 bytes
Experimente online uma vez , duas vezes ou três vezes .
Por causa da preguiça de Haskell, uma expressão como a acima conta como uma função que não aceita argumentos, conforme esta pergunta do Meta .
fonte
brainfuck ,
4434 bytesriscado 44 ainda é regular 44;
Experimente online!
Tente dobrar , triplicar . Olha, sem preenchimento!
Imprime quadrados de
U
. Ele se divide bem no meio dos 10+
s.fonte
Ruby, 18 bytes
Experimente online! Dobrado! Triplicado!
fonte
Flacidez Cerebral , 74 bytes
Experimente online!
Tente dobrar e triplicar .
Explicação
O ponto de interrupção está no meio da
<>
seção "push 10". Quebrar isso deixará um 5 na terceira pilha até chegarmos à segunda metade correspondente, altura em que pressionar 10 continuará exatamente de onde parou.Embora seja possível enviar por push um valor ASCII (espaço) imprimível em 22 bytes, isso faria com que a central
<>
fosse executada após o envio5
. Ao adicionar mais dois bytes, eu pude mover o<>
para que todo o progresso em direção ao push10
estivesse na terceira pilha. Como um bônus, isso também tornou o quadrado resultante mais esteticamente agradável.fonte
tinylisp , 112 bytes
Experimente online!Também dobrou e cinco vezes .
A abordagem "construa uma string na primeira metade, imprima na segunda metade" que muitas linguagens estão adotando não funcionará no tinylisp, pois não há variáveis mutáveis. Em vez disso, fazemos um aninhamento de código sério.
Quando uma segunda cópia do código é inserida, ela é colocada dentro de
(q())
, o que envolve uma lista. Em seguida,(h(t(t(h(t(...))))))
perfura essa lista para a parte após(d N
.(v(...))
avalia; passamos para a função sem nome(q((x)(i x(inc x)1)))
, que incrementa o valor resultante se for um número e retorna 1 se for a lista vazia. O resultado final na versão aninhada mais externa do código é atribuídoN
. Em essência, configuramos um tipo estranho de recursão que conta o número de níveis de aninhamento.A segunda metade do código cria uma sequência de
N
asteriscos, uma listaN
dessas seqüências e, em seguida, junta-se à lista em novas linhas. O resultado é exibido com uma nova linha à direita.fonte
R , 44 bytes
Experimente online!
Imprime com uma nova linha à direita. o
T=TRUE*TRUE+12
é apenas para preencher o comprimento.Tente dobrar e tente triplicar .
fonte
F=F+1;T=TRUE*TRUE+12#
<newline>write(strrep(1,F),"")
Julia 0.6 , 29 bytes
Todas as minhas idéias foram mais longas do que adaptar a solução python inteligente do xnor.
Torna-se
Experimente online!
fonte
SNOBOL4 (CSNOBOL4) ,
13068 bytesAgora sem comentários! Veja o histórico de edições para obter uma explicação do antigo algoritmo.
Experimente online!
Tente dobrar e triplicar
Explicação:
Como um
END
rótulo é necessário e qualquer coisa após o primeiroEND
rótulo ser ignorado, temos duas vantagens para esse desafio:X
vezes para asX
repetiçõesIsso sugere que usamos a repetição para o primeiro semestre e, em seguida, podemos usar uma abordagem de rotulagem mais "convencional" para repetir a saída
X
tempos de .A primeira metade é
que, quando repetido, incrementa
X
o número apropriado de vezes e cria umARRAY
A
com índices de e1
paraX
onde cada elemento deA
é a sequência de vezes1
repetidaX
.Então, não importa quantas vezes o programa seja repetido, o intérprete vê apenas:
que é um programa SNOBOL típico que imprime os elementos de
A
um de cada vez até que o índice saia dos limites e finaliza o programa.;
é um terminador de linha opcional geralmente reservado para uma linhaEVAL
ouCODE
instruções que elevam a contagem de bytes para 68 e marcam a metade do caminho, permitindo que o código seja anexado a ela.fonte
shortC ,
5644 bytes-12 bytes: espere duh, estou usando shortC, por que não usar algumas coisas C reduzidas
Eu teria usado o padrão C, mas isso requer um
}
no final que mexe com a replicação. shortC o insere implicitamente no EOF.fonte
Perl 5 , 25 bytes
Código de 24 bytes + 1 para
-p
.Lembre-se de que talvez você não queira permitir sinalizadores de linha de comando, informe-me se isso não for válido.
Experimente online!
fonte
Zsh , 10 bytes
Experimente um conjunto completo de testes online!
... Sim, isso é um pouco melhor. Acrescente à seqüência N vezes e imprima N vezes. Acontece que
<<<foo<<<foo
funciona muito bem.Zsh , 64 bytes
Personagem usado:
(espaço).
Experimente um conjunto completo de testes online!
O ponto médio fica entre o segundo
E
e a nova linha a seguir. Um heredoc terminará quando houver umE
em uma linha por si só, o que acontece exatamente no meio do código.fonte
s+=0;<<<$s