Levenquina cíclica

45

fundo

Como a maioria dos usuários regulares de PPCG saberá, uma é 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 .


fonte
Para pessoas que podem ver postagens excluídas: a postagem da Sandbox estava aqui .
Eu acho que também seria bom que as respostas incluíssem a duração do ciclo.
precisa saber é o seguinte
E se, digamos, o idioma tiver várias funções para executar a saída, mas todas elas compartilharem caracteres em pares?
Ørjan Johansen
2
@ ØrjanJohansen: Eu acho que não me oponho muito a escolher um deles e continuar nesse caso. No entanto, é indiscutivelmente não-competitivo; Eu queria que a regra fosse objetiva, porque, caso contrário, as pessoas tendem a tentar abrir brechas nela, e se você tentar tornar a regra muito complexa, haverá discussões sobre o que isso significa.
Pode ser uma levenquina em termos de bits? Como a distância do código-fonte original está 1 byte desligado?
Magic Octopus Urn

Respostas:

34

Gol> <> , 252 167 bytes

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_

Experimente online!

E o programa mutuamente distinto ( verificação ):

0<CŽB‚‚UGGŽ™™ŽB‚F~GGM–JŽ™ŽRY–[d––ŠŽRŽdŽ™ŽVGRGY–UFQFGM–<J<™B–GQFBd™Ž~F~G‡GGŽd;oRl-7-7so~|;oRl@@-Ms7QKMM3-3-3~R-4sRaaK-3sRaa|;oRl@@sR43M|;oRlQ-sR43@Q{RMlMss3{~{"

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 1ou outro 0). Se o sinalizador estiver definido, eles começarão a criar a outra seção do código, retirando o 252º caractere, adicionando / subtraindo 28dele 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:

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_C

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_CŽ

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.

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_CŽB‚‚UGGŽ™™ŽB‚F~GGM–JŽ™ŽRY–[d––ŠŽRŽdŽ™ŽVGRGY–UFQFGM–<J<™B–GQFBd™Ž~F~G‡GGŽd;oRl-7-7so~|;oRl@@-Ms7QKMM3-3-3~R-4sRaaK-3sRaa|;oRl@@sR43M|;oRlQ-sR43@Q{RMlMss3{~{"

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.

Brincadeira
fonte