Semelhante a outros quebra-cabeças quine (mais especificamente, este ), escreva um programa que produza a fonte por si mesmo.
Aqui está a nova reviravolta: O código produzido NÃO deve ser idêntico à fonte. Em vez disso, ele deve gerar um programa diferente que criará o primeiro.
O desafio vinculado acima conseguiu isso saltando entre dois idiomas. Eu estou pensando que este seria feito em apenas um idioma , mas as duas (ou mais) versões da fonte devem ser significativamente diferentes (consulte as regras abaixo). Com essa restrição, as respostas de um único caractere seriam proibidas, exigindo, assim, um pouco mais de reflexão para uma submissão final.
REGRAS
- Seu código deve ser produzido em apenas um idioma. (Vários envios, um para cada idioma é perfeitamente aceitável.)
- Suas diferentes versões de código devem ser sintaticamente distintas. Em outras palavras, se você desenhar uma árvore de sintaxe abstrata para seu código, deve haver pelo menos um nó diferente.
- Fornecimento de uma AST não será necessário, mas se você se sentir inclinado a fornecer um para cada um de seus programas, ele iria ajudar no julgamento.
- Você pode produzir quantas iterações desejar, desde que todas permaneçam sintaticamente distintas. (Mais ajudará sua pontuação, veja abaixo.)
PONTUAÇÃO
Sua pontuação final será a duração média de todos os seus programas, dividida pelo número de programas.
Exemplo 1:
A (fonte para B) = 50 caracteres
B (fonte para A) = 75 caracteres
Pontuação final = 31,25
Exemplo 2:
A (fonte para B) = 50 caracteres
B (fonte para C) = 75 caracteres
C (fonte para A) = 100 caracteres
Pontuação final = 25
Respostas:
Python, 0 (limite de (68 + 3 n ) / (16 n ))
Se duas árvores de sintaxe abstrata forem diferentes se tiverem constantes diferentes,
existem 16 n programas de duração no máximo 68 + 3n, resultando em pontuação assintótica de 0.
Se você deseja programas com estrutura variável, podemos implementar um somador binário em n bits. Aqui, existem 2 n programas de comprimento O ( n 2 ). Entra em um ciclo devido à queda do bit de transporte.
fonte
pass
mudará parat=n(t)
e para trás, em todas as 2 ^ n combinações.Perl, pontuação de 110,25
Eu tenho que admitir, eu não sou muito bom com quines. Estou 100% certo de que há espaço para melhorias. A solução é baseada no mesmo princípio da solução Element abaixo.
O primeiro programa tem 264 caracteres.
O segundo programa tem 177 caracteres.
Estou trabalhando no AST para esta entrada (e a entrada Elemento).
Elemento , pontuação de 47,25
O primeiro programa tem 105 caracteres.
O segundo programa tem 84 caracteres.
Tenho certeza de que há muito espaço para melhorias.
No primeiro programa, há uma string (na qual todo caractere é escapado, apesar de muita redundância), seguida pelas partes executáveis A e B. A parte A faz várias coisas: imprime a string e escapa de cada caractere, imprime a última metade da string (que é a fonte da parte B) e impede que a parte B que a segue faça qualquer coisa.
O segundo programa é a mesma sequência seguida pela parte B. A parte B é baseada em uma simples coluna; imprime uma string precedida por uma versão escapada dela. Isso significa que ele imprime a sequência e as duas partes A e B.
fonte
[]{}
, qualquer comando pode ser colocado em qualquer lugar do programa inteiro sem causar um erro de sintaxe. É perfeito.VBA: (251 + 216) / 2/2 = 116,75
251
216
Isso é executado no MSAccess para fazer uso do
Module
objeto. O módulo é nomeado"Q"
para o golfe. A diferença na sintaxe vem daIf ... Then
falta da versão mais curta.fonte
vbCrLF
paravbCr
C ++, pontuação de 0,734194
O código-fonte a seguir imprime uma meta quine da ordem 999 no console (explicação abaixo):
A única linha que muda é a primeira linha. O valor de
X
será 1000, 999, 998, ..., 3, 2 e, em seguida, será iniciado novamente. No entanto, a fim de obter diferentes árvores de sintaxe a cada vez,X
é representado em termos de sua fatoração primária, onde cada primo é escrito como uma soma de1
s. Os ASTs são diferentes, porque a fatoração primária de números inteiros é diferente para cada valor.O programa será impresso automaticamente, exceto que a primeira linha é alterada e as barras invertidas, quebras de linha e recuos internos
Q(...)
serão removidas.O programa a seguir calcula a pontuação da minha resposta:
Ele imprimiu 0,734194 no console. Obviamente, 1000 podem ser substituídos por números inteiros maiores e a pontuação se aproximará de 0 como seu limite. A prova matemática envolve a função Zeta de Riemann, que é um tanto complicada. Deixo isso como um exercício para o leitor. ;)
fonte
JavaScript,
84,56461Dois programas, ambos com comprimento
169128122.Antes de jogar, para seu prazer:
Retorna o novo programa e produz a peça atual!
Eu provavelmente poderia torná-lo mais curto sem a função regex, mas ... eu não quero.fonte
J - (24 + 30) / 2/2 = 13,5 pts
Note que strings em J não são a escapado barra invertida-, mas citação-escapou à la Pascal:
'I can''t breathe!'
.O programa 1 possui AST
noun verb hook noun
e o programa 2 possui ASTnoun
. O programa 2 é uma versão citada do programa 1, que retornará o programa 1 apenas quando executado, portanto, esse método não pode ser estendido para três cópias com facilidade: PO Programa 1 opera tirando uma cópia da parte do código da fonte, com uma citação anexada à frente e adicionando cinco dessas aspas ao final (
(,5#{.)
). Em seguida, ele usa ciclicamente 30 caracteres dessa seqüência de 16 caracteres, o que fornece exatamente o Programa 2 como resultado.fonte