Criar uma impressora inteira versátil é bom e tudo mais, mas escrever um código único que imprime muitos números diferentes é complicado. Não seria mais fácil criar um script que gera um número, mas também fornece um novo script para obter o próximo número?
Desafio:
Escreva um código que produza um único número inteiro N
e um código executável. O próximo código deve ser exibido N+1
e um código que pode ser exibido N+2
. Continue esse caminho até chegar N = 15
. (O último número impresso deve ser 15).
Regras:
- Nenhuma entrada (suponha que a entrada esteja vazia).
- Programa completo ou função ou outros formatos convenientes são permitidos.
- O primeiro código deve ser exibido
1
. - Você não pode gerar zeros à esquerda. Ou seja, você não pode imprimir
01
para1
. - A saída deve estar no formato
N, Code_for_N+1
. Observe que a saída é separada por vírgula e um espaço único. O código paraN+1
não possui aspas.N , Code_for_N+1
não é aceito (espaço na frente da vírgula). As novas linhas à direita estão OK. - O primeiro caractere (s) da saída deve ser o número. (Sem espaços à esquerda ou
ans = N
). - O número impresso não deve fazer parte do próximo código (o código pode conter esse número, mas você não pode usar o número de saída como parte do código)
- Exemplo: A produção de
N=2
pode ser:2, printer 2
. Nesse caso,printer 2
é o código paraN=3
. Você não pode usar toda a saída:2, printer 2
como código paraN=3
.
- Exemplo: A produção de
- Os scripts podem estar em diferentes idiomas
- Os tipos de dados são irrelevantes (o número pode ser uma sequência), mas não pode ser cercado por nada (aspas, parênteses etc.).
- Se houver um código emitido para
N=15
ele, ele deve imprimirSTOP!
(consulte o bônus) ou não imprimir nada (nem mesmo um espaço ou nova linha).- O código para
N=15
não pode falhar (mas a saída para STDERR está OK). - Você é desqualificado se o código de saída for
N=15
impresso16
ou qualquer outra coisa (exceto a caixa de bônus).
- O código para
- Operadores de quine embutidos não são permitidos.
- Não é permitido acessar o arquivo de origem através do sistema de arquivos.
Bônus:
-10 bytes se o código que imprime 15 também produz um código que imprime " STOP!
"
Exemplos usando a sintaxe Python: (obviamente, eles funcionarão apenas para os números inteiros selecionados, não de 1 a 15.)
N = 1
print "1, print 2"
1, print 2
---
N = 15
print 15
15
---
N = 15 (Qualifies for the -10 bytes bonus)
print "15, print 'STOP!'"
15, print 'STOP!'
print 'STOP!'
STOP!
----
N = 15 (Qualifies for the -10 bytes bonus)
print "15, disp('STOP!')"
15, disp('STOP!') (disp('STOP!') outputs STOP! in MATLAB)
----
N = 15 (This one is not OK. The submission is disqualified)
print "15, print 16"
15, print 16
Regras de golfe padrão se aplicam! O menor código (para N = 1) em bytes ganha!
f=>f+""
seria inválido? (f+""
Devolve o código de construção da função.)14, print(14+1)
ou não?Respostas:
Pitão + ///, 15 bytes - 10 = 5
Isso é impresso
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, STOP!
em Pyth, retirandorange(1,15+1)
e retirando os colchetes de início e de fim e imprimindo-o imediatamente seguido de ", PARAR!".Os próximos quatorze programas estão em ///, que gera diretamente todos os programas que não contêm
/
ou\
. Então o segundo programadá
2
e o terceiro programa3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
. O penúltimo programa,,15, STOP!
imprime15, STOP!
, então o último programa é justoSTOP!
.fonte
cat
como idioma?cat
não faz um teste de primalidade, então não.JavaScript, 131238 - 10 = 131228 bytes
A abordagem ingênua acabou pior do que o esperado. Em retrospectiva, eu deveria ter esperado. Mas pensei em compartilhar de qualquer maneira. Código completo aqui.
Ideia: escapar iterativamente e adicionar o
N-1, ...
fonte
CJam,
262524 bytesExperimente online.
Os programas subsequentes simplesmente têm o primeiro número incrementado. Isso executa o programa 16 vezes.
Ou com bônus pela mesma pontuação:
Experimente online.
Os programas subsequentes simplesmente têm o primeiro número incrementado. Isso executa o programa 16 vezes.
Solução alternativa para o bônus:
fonte
</selfpromotion>
JavaScript (ES6),
6261 bytes - 10 bônus = 51 pontuaçãoExplicação
Uma solução que não lê seu próprio código-fonte e também não é ridiculamente longa.
O primeiro programa constrói todos os outros 15 programas e os aninha dentro de si, usando uma função recursiva. Eu resolvo o problema da barra invertida aninhando as próprias funções (que são convertidas em cadeias durante a saída) em vez de cadeias.
Teste
Mostrar snippet de código
fonte
"" + (n=>m)
não conta como obter o corpo da funçãon=>m
?Matlab,
226212 - 10 = 202 bytesObrigado a @StewieGriffin por alguns bytes =)
A primeira parte é uma string que representa a segunda linha (abaixo), o código real (apenas deslocado por 9). No Matlab, seqüências de caracteres são matrizes preenchidas com caracteres, para que você possa executar facilmente os turnos apenas adicionando / subtraindo um escalar. Portanto, o programa apenas imprime a mesma sequência * novamente, mais a mesma sequência, mas alterada, o que resulta no código.
* Não exatamente: o primeiro byte é o contador que precisa ser aumentado a cada iteração.
O truque com a corda foi descaradamente roubado daqui.
Aqui as últimas linhas da sequência copiadas do console:
fonte
JavaScript,
5047444244 * bytesÉ uma função que extrai seu próprio corpo (apenas
a
) e faz substituições nele. Obter o corpo da função com um recurso interno do JavaScript, embora não seja explicitamente um operador quine (se for inválido, removerá a resposta).No caso de ele não funcionar corretamente encaixado lá (porque para mim não), você pode ver um exemplo lá .
* - parece que o snippet produz o resultado sem
a=
, impossibilitando outras chamadasfonte
.replace(x++,x)
?a=_=>(x=1)+(x<15?`, ${a}`:"").replace(x,x+1)
?Python 2.7.10,
19692 - 10 = 82 bytesWhee !!! Isso foi divertido. Muito mais curto agora. : P
Explicação:
Comecei com isso:
Isso é apenas uma solução simples. É isso que, com um contador adicionado:
n
é uma variável de contador que é impressa no início. Então, quando imprimirn=
peça, ela substituin+1
a%d
. Então a partir daqui, ele contará infinitamente.E aqui está a versão final. Ele adiciona uma cláusula if para parar aos 15 e imprime "STOP!" também.
Código antigo:
Nunca vai ganhar, mas divertido. : PMuito mais curto agora, embora ainda não tenha chance. : Pfonte
else
s.PowerShell,
(215-10) = 205197167106104103 bytes(Se sua única ferramenta for o PowerShell, todo problema parecerá um prego. Aguarde ...)
Essencialmente, começamos com a configuração
$d
igual a uma string big-ole-longa de um quase- Quine do código original. Ele produz1
e, em seguida,$d
com o operador de formato-f
para preencher corretamente o{0}
,{1}
,{2}
ins stand-, incrementando o{2}
número na,1*{2}
seção por um de cada vez.A
,x*y
operação no PowerShell cria uma nova matriz dey
itens, cada um dos quais é igual ax
. Por exemplo,,2*3
é equivalente a@(2,2,2)
.Isso significa que a primeira saída será
1, $c=(,1*2).length;$d=(etc...)
, portanto, quando o segundo código for executado,$c
será igual à contagem da matriz@(1,1)
ou2
etc. Observe que$c
não é usada como variável no código original, apenas nas execuções subseqüentes.Para quando imprime 15 simplesmente calculando se
$c
é igual15
e depois indexando em uma matriz, o 0º elemento é$c, $d
como descrito acima, o outro é justo15
. Assim, quando$c
tiver 15 anos, produzirá15
e nada mais. Não se qualifica para o bônus, porque"15, {0}STOP!{0}"
tem 5 caracteres a mais para que o -10 valha a pena.Requer um terminal PowerShell de largura> ~ 150. Ou para remover manualmente a quebra de linha extra (que o terminal insere de maneira útil na quebra de saída) ao copiar e colar o código. Ou para você capturar a saída em uma variável e depois executar novamente essa variável. Etc.
Editar 1 - salvou alguns bytes removendo o "STOP!" redação.
Editar 2 - Durr, não use .length de cada vez, basta chamá-lo uma vez.
Editar 3 - Não precisa ser um quine, para que a execução inicial possa ser muito menor.
Edit 4 - Mudou o uso de strings para matrizes para calcular
$c
, que salvaram dois bytes. Tenho certeza de que isso é quase ideal para essa abordagem.Edição 5 - Salva outro byte contando diretamente a igualdade, em vez de modificar
fonte
JavaScript, 79 - 10 = 69 bytes
Sem usar de
Function.prototype.toString
forma alguma.fonte
Anterior, 57 - 10 = 47 bytes
Este é incrível. Experimente aqui .
fonte
STOP!
Lote, 73 + 5 - 10 = 68 bytes
Requer,
CMD /V:ON
então eu adicionei 5 bytes para isso.fonte
Python 2.7, 107 caracteres
Usando recursão e não escrevendo um quine, pensei que poderia economizar muito, o que é verdade, mas não é bom o suficiente. Embora não seja um vencedor, acho que é divertido compartilhar essa abordagem.
Comecei criando uma string para N = 4, escapando dos caracteres
\
e"
.Então eu criei uma função lambda que cria essa string, com base em um índice inicial e um índice de parada, usando recursão. É isso:
Use-o assim:
Saída: [32902 caracteres, muito tempo para manipular]
Então, parece que minha abordagem de complexidade kolmogorov não é tão bem-sucedida ;-)
fonte
SMBF , 28 bytes
\x10
representa um byte literal (valor decimal 16). O número inteiro é emitido como um número inteiro (byte). Portanto, a saída do primeiro caractere é\x01
. O programa então imprime ",". Ao imprimir sua própria fonte, ela imprime um extra+
no início.Explicação:
Observe que você não pode executar isso em um intérprete padrão, pois requer um literal hexadecimal na entrada. Você também precisa de um terminal especial para que a saída hexadecimal funcione corretamente.
fonte
Bash,
787473 - 10 = 63 bytes (exemplo, não é possível vencer)Chegando tarde, mas o bash de serra não havia sido tentado, então tente. Primeiro desafio do golfo e quebra-cabeça tipo quine. Eles são divertidos!
Explicação:
Isso funciona porque as
a
etapas de 1 a 15 sãounset
seguidasp
. O script (armazenadop
) imprime os dois se estiveremset
e "PARE!" de outra forma. O inicialmenteunset
a
éset
0, porque aparece em uma expansão aritmética.fonte
, 30 caracteres / 47 bytes (não competitivo)
Try it here (Firefox only).
Finalmente encontrei uma boa e verdadeira solução para 𝔼𝕊𝕄𝕚𝕟.
Explicação
Aqui está o verdadeiro quine que eu usei:
⟮ⒸⅩ222+ᶈ0
Você vê isso na minha resposta? Felizmente, vocês serão capazes de expandir a partir daí.
fonte
Barril + PHP, 19-10 = 10 bytes
Conta de 1 a 15 e depois para. TIO
Barril, 13 bytes
fonte