Sua tarefa é escrever um programa ou função que:
- Quando executado pela primeira vez, gera seu código fonte.
Nas execuções subseqüentes, deve gerar o que produziu anteriormente, mas com uma alteração aleatória de caracteres (definida abaixo). Não precisa ser uma alteração uniformemente aleatória, mas todas as alterações possíveis devem ter uma chance diferente de zero.
Após a primeira execução, seu programa não será mais necessariamente um quine; a saída será alterada (e o programa também poderá se modificar).
Por exemplo, se o seu quine foi ABCD
, a execução repetida pode ser impressa:
ABCD
A!CD
j!CD
j!CjD
Especificações
Uma mudança de caractere é:
- A inserção de um caractere aleatório,
- A exclusão de um caractere aleatório ou
- Uma substituição de um personagem por um novo personagem aleatório. Observe que o novo personagem pode ser o mesmo que ele substitui; nesse caso, nenhuma alteração será feita.
Obviamente, excluir ou substituir um caractere de uma sequência vazia não é uma alteração válida.
- Apesar de ter sido marcado como quine , as regras contra a leitura do seu código-fonte não se aplicam.
Você pode usar qualquer conjunto de caracteres, desde que inclua os caracteres usados no seu código-fonte.
Respostas:
Python 3 ,
288 270 224 212 195 196 194 180 178168 bytesExperimente online!
Depois de imprimir o código-fonte do arquivo na primeira iteração, anexamos uma linha extra para definir x para o novo código-fonte, em vez de m.
Explicação:
Supondo que
hash
retorna um número uniformemente aleatório, há cerca de 1/6 de chance de inserir um novo caractere, 1/6 de chance de alterar um caractere existente e 2/6 de chance de excluir um caractere. Qual é a chance restante de 2/6 que você pergunta? Ora, isso não faz nada em 2/6 do tempo!(Aqui está um programa de validação adaptado das respostas de mbomb007 . Experimente online! )
fonte
f=__file__
que ajudaria no primeiro passo também.Python 3 ,
205195 bytesExperimente online!
Queria experimentar uma versão que não lê o código fonte. Acabou não é um mau como eu pensava, e é apenas 30 ou mais bytes por trás da versão que faz . A explicação de como funciona é basicamente a mesma que a outra resposta, mas inicializa x de maneira diferente, pois não pode apenas ler o código-fonte.
fonte
Python 2 ,
779801 bytesEmbora o desafio tenha sido editado para mostrar que a leitura de sua fonte é permitida, eu já estava criando minha solução sem isso. Então, para mostrar que é possível, eu terminei. Nenhuma leitura do arquivo de origem:
Experimente online! (Observe que isso não modificará a fonte. É necessário executá-lo localmente para que isso funcione)
Para mostrar que as transformações trabalhar, aqui está um programa de teste (atualmente configurado para sempre escolher
100
parar
, e imprime o resultado para cada combinação den
ep
para a lista inicial.)Explicação:
A primeira linha é o seu estilo clássico, mas muito mais para explicar o que vem depois.
Importar para números inteiros aleatórios.
L
passará a fazer parte da lista de ordinais do código fonte, mas inicialmente é um número inteiro não usado em nenhum outro lugar na fonte para permitir a substituição de uma string. Abra o arquivo para escrever a nova fonte. Em execuções posteriores, ele será aberto para anexar.Remova a primeira e a terceira linhas de código. Substitua o
4
acima pela lista de ordinais.Em pedaços:
if L>5:
- Ignora esta linha na primeira execução. Mais tarde,L
haverá uma lista, e isso será executado. Vou explicar oexec
último, porque não é executado pela primeira vez.n
- Um número aleatório 0-2. Isso determina qual modificação ocorre (0 = inserir, 1 = substituir, 2 = excluir).p
- Uma posição aleatória na lista em que a modificação ocorrerá.r
- Um número aleatório para inserir ou substituir na listaf.write("%03d"*3%(n,p,r))
- Anexe os 3 randoms ao final do arquivo de origem. A cada execução, isso adicionará um número inteiro que codifica todas as alterações na fonte inicial que ocorreram.exec'b=[];h=%d...'%1...
- Obtenha os números aleatórios (encontrados depois%1
em execuções posteriores), aplique as alterações na lista e imprima.while~-h:b+=[h%%1000];h/=1000
- Crie uma lista dos randoms gerados até o momento, respondendo pelo líder1
, o que evita problemas com zeros à esquerda.while b:r,p,n=b[-3:];b=b[:-3]
- Atribua os randoms para esta iteração.L=[L[:p]+L[p+1:],L[:p]+[r]+L[p+n:]][n<2if L else 1]
- (0 = inserir, 1 = substituir, 2 = excluir)print"".join(map(chr,L))
- Imprima a fonte modificada.fonte
p
pode ser o comprimento da string. Além disso, qual é o comportamento de uma string vazia?Of course, deleting or replacing a character from an empty string is not a valid change
Java 10, 370 bytes
Experimente online.
Explicação:
Explicação geral:
quine -part:
s
contém o código fonte não formatado.%s
é usado para inserir essa String em si mesma com os.format(...)
.%c
,%1$c
E34
são usados para formatar as aspas.%%
é usado para formatar o módulo%
).s.format(s,34,s)
coloca tudo junto.Aqui está um programa básico de Java Quine.
Parte do desafio:
String s;
é o código-fonte que modificaremos no nível da classe.int r=s.length();r*=Math.random();
é usado para selecionar um índice aleatório do código fonte no intervalo[0, length_of_modified_source_code)
.char c=127;c*=Math.random();
é usado para selecionar um caractere ASCII aleatório (incluindo não imprimíveis) no intervalo unicode[0, 126]
.c%3
é usado para selecionar uma opção aleatória de 0, 1 ou 2. A opção 0 adicionará o caractere aleatório antes do índicer
; a opção 1 substituirá o caractere no índicer
pelo caractere aleatório; e a opção 2 removerá o caractere no índicer
.fonte