fundo
Como a maioria dos usuários regulares de PPCG saberá, uma solução é um programa que gera seu próprio código-fonte quando executado; e a distância de Levenshtein entre duas cadeias é o número mínimo de inserções, exclusões e edições necessárias para alterar uma cadeia pela outra. Neste desafio, estamos combinando os dois conceitos em um "levenquine": um programa que gera seu próprio código-fonte, mas com uma instância de um caractere inserido, excluído ou substituído por um caractere diferente. (Em outras palavras, a distância de Levenshtein entre o programa e sua saída é 1.)
A tarefa
Escreva uma levenquina de modo que sua saída seja uma levenquina, a saída desse programa também seja uma levenquina e assim por diante. Além disso, em algum momento, a sequência de executar repetidamente o programa, executar sua saída, executar a saída de sua saída etc. deve, eventualmente, retornar ao programa original.
Há uma restrição adicional que torna as coisas muito mais difíceis: deve haver dois programas distintos em algum lugar desse ciclo que não possuem caracteres em comum (em outras palavras, não existe um caractere existente em um programa e também existe no outro programa). Portanto, seu programa terá que se transformar gradualmente em um conjunto de caracteres diferente e voltar novamente.
Se você estiver usando uma linguagem de programação que possui um clichê inevitável que é necessário em qualquer programa que produza saída (por exemplo, ele só tem uma maneira de escrever um print
declaração e nenhuma outra forma útil de saída), você pode tratar esse clichê como inexistente para a finalidade de determinar quais caracteres dois programas têm em comum. No entanto, você ainda deve contar esse clichê com o objetivo de determinar a propriedade Levenquine do código.
Esclarecimentos
- Cada um dos "programas" no ciclo pode ser um programa completo ou uma função. Nem todos precisam ser iguais, por exemplo, alguns podem ser programas completos e outros podem ser funções.
- Nem todos os programas do ciclo precisam usar a mesma forma de saída. Por exemplo, alguns podem produzir via saída padrão e outros podem produzir via erro padrão.
- Seus programas serão executados sem entrada (ou em idiomas que exigem entrada para fazer qualquer coisa, a entrada mais simples possível).
- Aplicam- se regras de quine apropriadas ; embora um Levenquine não seja um verdadeiro quine, você não pode fazer nada que seja ilegal ao escrever um quine adequado. Em particular, o programa nulo nunca é uma saída válida de um Levenquine adequado (e, portanto, não pode fazer parte do seu ciclo).
- A restrição Levenquine é medida em termos de caracteres, em vez de bytes (por exemplo,
ê
é um caractere mesmo quando a fonte é codificada em UTF-8). A restrição sem caracteres em comum também é medida em termos de caracteres. A condição de vitória, no entanto, conta em bytes.
Condição de vitória
Envie pelo menos os três programas a seguir do ciclo: o programa mais curto (medido em bytes); e dois programas do ciclo que não possuem caracteres em comum. É possível que dois deles sejam iguais, e também é possível que todos os três sejam distintos. A pontuação é baseada no comprimento em bytes do programa mais curto, com o menor sendo melhor, tornando assim uma espécie de competição de golfe com código .
Respostas:
Gol> <> ,
252167 bytesExperimente online!
E o programa mutuamente distinto ( verificação ):
Experimente online!
Isso se inspira principalmente na minha resposta ao desafio Quines mutuamente exclusivos , com elogios também na resposta Gol> <> do Bubbler's .
Aqui está um programa de verificação você pode executar. Infelizmente, o tempo limite é excedido, mas você pode observar como uma seção do código cria a outra seção e, em seguida, pode copiar a última versão impressa e colá-la na entrada para continuar. Eventualmente, você alcançará o primeiro programa que instalou.
Explicação
Ambas as seções do código são compostas por duas seções, a parte em execução real e os dados que contêm a outra seção do código. Ambos funcionam praticamente de forma idêntica:
Eles dependem de um sinalizador (o primeiro caractere do código, um
1
ou outro0
). Se o sinalizador estiver definido, eles começarão a criar a outra seção do código, retirando o 252º caractere, adicionando / subtraindo28
dele e anexando-o ao código.Por exemplo, aqui estão as duas primeiras iterações do código após o primeiro programa acima:
Eventualmente, quando chega ao final da seção atual, ele inverte o segundo caractere do código (
<
para>
trás e para trás) para apontar para a outra seção.Aqui estão as duas seções juntas, prestes a deixar de executar a primeira seção para executar a segunda.
Experimente online!
Os sinalizadores são o oposto de cada seção; portanto, a nova seção em execução começará a excluir a outra seção do código até atingir seu próprio código. Nesse ponto, ele vira a bandeira e o ciclo se repete novamente.
fonte