Sua tarefa é criar um programa que, quando executado, retorne como saída (isso é conhecido como quine). No entanto, esse quine deve, quando é copiado n
vezes, retorna o quine, mas com cada um de seus caracteres duplicados nos n
horários do local , onde n
é um número inteiro positivo.
Se o seu programa original for Derp
:
Derp -> Derp (must return itself as output to be a quine)
DerpDerp -> DDeerrpp
(the "Derp" is copied twice, so each character in the output has to be copied twice)
DerpDerpDerp -> DDDeeerrrppp
etc. etc.
Lembre-se de que você pode ter espaços em branco em seu programa "base", mas eles são contados ao "entrelaçar". Diga que seu programa é
Derp
{newline}
(A nova linha significa uma nova linha à direita e há um espaço extra após a Derp
). Quando duplicado para se tornar
Derp
Derp
{newline}
Você deve produzir
DDeerrpp
{newline}
{newline}
Lembre-se de que há 2
espaços extras após o DDeerrpp
.
Regras e especificações:
- Seu programa deve conter pelo menos dois caracteres distintos (o que implica que seu código deve ter pelo menos 2 bytes).
- Aplicam- se regras padrão de quine .
Isso é código-golfe , então o código mais curto em bytes vence!
code-golf
quine
source-layout
clismique
fonte
fonte
Respostas:
Fissão , 6 bytes
Experimente online! Tente duas cópias! Tente três!
Explicação
Esta é apenas a norma da fissão . Por acaso, trabalha para esse desafio, porque a Fission tem pontos de entrada explícitos no programa. Em particular, duplicando o programa, adicionamos outro
R
que adiciona outro átomo (ponteiro de instrução). Como o código fonte é toroidal, o código efetivo que está sendo executado não muda de outra maneira - para cada átomo, o código ainda parece o mesmo localmente. No entanto, os átomos são executados na etapa de bloqueio, para que as coisas que eles imprimem sejam intercaladas e tenhamos uma cópia adicional de cada caractere na saída.Para completar, em breve reiterarei como o próprio programa funciona. Independentemente de repetirmos o programa ou não (por exemplo
'!+OR"'!+OR"'!+OR"
), cada átomo vê o seguinte código:O
"
modo de impressão de seqüência de caracteres alterna, para que o programa inicie imprimindo'!+OR
diretamente em STDOUT, que é tudo de quine, exceto a cotação. Em seguida,'!
define a massa do átomo para o código de caractere de!
,+
incrementa-o, o que fornece"
eO
imprime enquanto destrói o átomo simultaneamente. O programa então termina, porque não há átomos restantes.fonte
Python 2.7,
377310304194191 bytes!Este é o meu primeiro golfe, então não esperava que fosse muito bom. Mas eu pensei que o conceito na solução que eu criei era um pouco engraçado, então eu estou postando de qualquer maneira.
De fato, isso é um problema; você pode tentar aqui . Abusa bastante o módulo de inspeção.
Se tentarmos executá-lo com o mesmo código fonte x2, obteremos a saída correta também; você pode tentar isso aqui . x3, x4, etc. todos funcionam como esperado.
Ungolfed com explicação:
fonte
inspect
? (ver meta post relevante ). No PPCG, temos definições específicas do que torna um quine válido e 'ler a fonte' é geralmente considerado trapaça.import threading,inspect as i
pode serimport threading as T,inspect as i
CJam , 19 bytes
Experimente online!
Como funciona
fonte
RProgN , 66 bytes
Espaço em branco significativo seja a minha morte
Explicado
Bom Deus, eu sou um monstro ...
Experimente online!
fonte
~["[%q]F01+`0=`.{0m}R"]F01+`0=`.{0m}R
funcione bem em geral, não é uma solução válida, porque não há como replicar o marcador ZSS.Perl 5, 107 bytes
Ungolfed:
Experimente online!
fonte
Python 3 ,
122121112 bytesExperimente Online: uma cópia | duas cópias | três cópias | quatro cópias, com verificação automática
Como funciona
Isso usa o padrão Python quine: Armazene o código que você deseja executar em uma variável (como uma string); inclua alguma lógica nessa sequência para imprimir a si mesma, tudo antes e depois; depois execute essa string.
O código que é executado através da string s é o seguinte.
A primeira linha importa incondicionalmente o módulo atexit , o que nos permitirá registrar um manipulador de saída. Tentar importar o mesmo módulo várias vezes não afeta o script de forma alguma. Em seguida, ele tenta incrementar a variável n , para acompanhar quantas cópias do código fonte foram executadas.
A segunda linha é executada apenas se a primeira contiver um erro. Este será o caso na primeira iteração, pois n ainda não está definido. Nesse caso, inicializamos n como 1 e registramos um lambda que executa a mágica real.
O manipulador de saída registrado
será chamado logo antes da conclusão do programa. O próprio lambda cria a string
"s=%r;exec(s);"%s
-%r
cria uma representação de string do ( s ) argumento ( s ) correto ( s ), que inclui tudo entre as aspas simples e as próprias aspas - e itera sobre seus caracteres. Para cada caractere c , simplesmente imprimimos n cópias de c . Passarc*n
como argumento nomeadoend
paraprint
significa que nenhum avanço de linha será anexado.fonte
CJam , 14 bytes
Experimente online!
Explicações
fonte