Codegolf: Quine e Antiquine

13

Esse desafio é semelhante ao Can you Meta Quine?

Um quine é um programa que se produz em STDOUT. Esse desafio é produzir um programa A que, quando executado, produz um programa B no STDOUT. O programa B quando executado produz o programa A em STDOUT. Os programas A e B devem ser escritos (e executados) no mesmo idioma. A questão vinculada restringia A! = B. Isso parecia fácil demais. Portanto, para esta pergunta, insistimos que A e B são antiguidades, usando as seguintes regras:

  1. Os programas A e B não podem usar os mesmos caracteres, exceto os espaços em branco e os separadores de instrução e caracteres de pontuação.
  2. Os programas A e B devem conter, pelo menos, um caractere que não é um espaço em branco, nem um separador de instrução, nem um caractere de pontuação.
  3. Para os fins das regras 1 e 2, o termo 'espaço em branco' exclui qualquer símbolo ou sequência de símbolos que seja uma declaração, operador ou símbolo que seja interpretado (em oposição a um separador). Portanto, no idioma de espaço em branco, não há espaço em branco.
  4. Um separador de instruções é um elemento sintático convencionalmente usado na linguagem para separar instruções. Isso incluiria a nova linha em python ou o ponto e vírgula em Java, perl ou C.
  5. Um caractere de pontuação é um caractere ASCII que não é um espaço em branco nem está na classe de caracteres de palavras POSIX (ou seja, um sublinhado não é uma pontuação para esse fim) - ou seja ispunct(), retornaria verdadeiro, e não é _.
  6. O programa A, quando executado, deve produzir um programa (Programa B) em seu STDOUT, que, quando executado por sua vez, produz o Programa A.
  7. Os programas A e B devem estar na mesma linguagem de programação.
  8. A linguagem de programação usada deve realmente ser uma linguagem de programação. A menos que você faça um bom caso, sugiro que seja Turing completo.
  9. Pelo menos um de A e B deve executar pelo menos uma instrução no idioma.

Isso é código de golfe, então a resposta mais curta vence, sendo a pontuação o comprimento do programa A em bytes (ou seja, o comprimento do programa B não é relevante).

abligh
fonte
Você pode adicionar "pontuação" à lista de exceções na primeira cláusula? É impossível resolver esta tarefa em vários idiomas (especialmente aqueles que exigem que você use chaves na função principal).
FUZxxl
relacionados, mas provavelmente suficientemente diferentes.
Martin Ender
@FUZxxl Permiti sinais de pontuação, mas exclui sublinhados.
abligh
1
Para os fins aqui, são Ae são aconsiderados "caracteres" diferentes?
HostileFork diz que não confia em
1
Seria melhor se você fornecesse uma lista completa de caracteres ASCII que correspondam à regra 5.
aditsu foi encerrado porque SE é MAU

Respostas:

5

GolfScript, 13 bytes

1{\~\".~"}.~

A saída é

-2{\~\".~"}.~

que gera o programa inicial.

A contagem de bytes inclui o LF à direita, pois a saída da saída o conterá.

Experimente online.

Como funciona

1       # Push 1.
{       # Start code block.
  \~\   # Apply logical NOT to the second topmost element of the stack.
  ".~"  # Push that string.
}       # End code block.
.~      # Duplicate the code block and execute the copy.

GolfScript imprime o conteúdo da pilha após o término.

Dennis
fonte
Por favor, leia a declaração do problema novamente -Programs A and B may not use any of the same characters, save for whitespace and statement separators, and punctuation characters.
isaacg
1
Tudo menos 1e 2é pontuação.
Dennis
OK, as regras foram alteradas desde a última vez que as li.
Isaacg
Sim, isso funciona. Eu tinha formulado as regras para impedir que espaços em branco fossem usados ​​como instruções, mas esqueci que a mesma brecha estaria presente na pontuação. Então brecha legalmente explorada.
abligh
14

Pascal (731 caracteres)

Programa A:

program s;{$h+}uses sysutils;const p='program s;{$h+}uses sysutils;const p=';a='a';aa=''';';aaa='a=''';aaaa='''';aaaaa='begin write(lowercase(p+aaaa+p+aa+aaa+a+aa+a+aaa+aaaa+aa+aa+a+a+aaa+aaa+aaaa+aa+a+a+a+aaa+aaaa+aaaa+aa+a+a+a+a+aaa+stringreplace(stringreplace(stringreplace(stringreplace(aaaaa,aaaa,aaaa+aaaa,[rfreplaceall]),''lower''+''c'',''tm''+''p'',[]),''up''+''c'',''lower''+''c'',[]),''tm''+''p'',''up''+''c'',[])+aa+aaaaa))end.';begin write(upcase(p+aaaa+p+aa+aaa+a+aa+a+aaa+aaaa+aa+aa+a+a+aaa+aaa+aaaa+aa+a+a+a+aaa+aaaa+aaaa+aa+a+a+a+a+aaa+stringreplace(stringreplace(stringreplace(stringreplace(aaaaa,aaaa,aaaa+aaaa,[rfreplaceall]),'lower'+'c','tm'+'p',[]),'up'+'c','lower'+'c',[]),'tm'+'p','up'+'c',[])+aa+aaaaa))end.

Programa de saídas B:

PROGRAM S;{$H+}USES SYSUTILS;CONST P='PROGRAM S;{$H+}USES SYSUTILS;CONST P=';A='A';AA=''';';AAA='A=''';AAAA='''';AAAAA='BEGIN WRITE(UPCASE(P+AAAA+P+AA+AAA+A+AA+A+AAA+AAAA+AA+AA+A+A+AAA+AAA+AAAA+AA+A+A+A+AAA+AAAA+AAAA+AA+A+A+A+A+AAA+STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(AAAAA,AAAA,AAAA+AAAA,[RFREPLACEALL]),''LOWER''+''C'',''TM''+''P'',[]),''UP''+''C'',''LOWER''+''C'',[]),''TM''+''P'',''UP''+''C'',[])+AA+AAAAA))END.';BEGIN WRITE(LOWERCASE(P+AAAA+P+AA+AAA+A+AA+A+AAA+AAAA+AA+AA+A+A+AAA+AAA+AAAA+AA+A+A+A+AAA+AAAA+AAAA+AA+A+A+A+A+AAA+STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(AAAAA,AAAA,AAAA+AAAA,[RFREPLACEALL]),'LOWER'+'C','TM'+'P',[]),'UP'+'C','LOWER'+'C',[]),'TM'+'P','UP'+'C',[])+AA+AAAAA))END.

Programa de saídas A.

Mika Lammi
fonte
3
Estou gostando do (des) uso da tradução de casos.
abligh
11

ROT13 ( não está mais competindo após a atualização da regra )

Não tenho certeza se isso conta como um idioma, mas eu certamente não compensou o desafio. Normalmente, respostas para certos utilitários, como também sedsão aceitos. No entanto, é uma decisão judicial, portanto, se não contar, eu a removerei (há uma meta-discussão em algum lugar sobre o que conta como idioma? Edit: There are now )

A

Ciclos entre Ae N:

~>> echo "A" | rot13
N
~>> echo "A" | rot13 | rot13
A
Ingo Bürk
fonte
Eu acho que isso não funciona, como rot13 está simplesmente aceitando informações STDIN, não executando um programa. Se você está argumentando que é um programa de comprimento zero, que não atende à regra 2. O programa (com sed) é o que é passado sed -e. Se isso fosse aceitável, catseria um quine, e tacseria um quine e antiquine. No entanto, nada está produzindo a fonte para cat, tacou para esse assunto rot13.
abligh
@abligh Se rot13 é o idioma usado, por que devo imprimir o código fonte do rot13? Além disso, se eu executar o Golfscript, Python ou qualquer outra coisa, provavelmente passarei o código-fonte para ele via stdin ou arquivo, para que não haja realmente nenhuma diferença. Nesse caso, rot13 é o intérprete.
Ingo Bürk
rot13como uma linguagem de programação não parece satisfazer qualquer definição razoável de 'linguagem de programação' e não está interpretando nada. Vou alterar a questão para tornar isso mais claro.
abligh
Tudo bem por mim. Vou deixar essa resposta como não competindo mais e iniciar uma meta-discussão. Bom desafio, a propósito. Mal posso esperar para ver soluções "reais"!
Ingo Bürk