Escreva uma Semiquina

10

Suponha que você tenha 2 idiomas Ae B. Uma cadeia de caracteres sé uma semiquina Ae Bse satisfaz as seguintes condições:

  1. sé um quine na linguagem A.
  2. sé um poliglota em Ae B.
  3. A saída da execução scomo um Bprograma é uma sequência diferente s', que é uma solução B.

O objetivo deste desafio é escrever uma semiquina em dois idiomas distintos. Este é o , o código mais curto vence, com a resposta mais antiga usada como desempate.

Regras para Quines

Somente quines verdadeiros são aceitos. Ou seja, você precisa imprimir todo o código fonte literalmente para STDOUT, sem :

  • lendo seu código fonte, direta ou indiretamente.
  • confiando em um ambiente REPL que simplesmente avalia e imprime todas as expressões que você alimenta.
  • confiando em recursos de idioma que apenas imprimem a fonte em certos casos.
  • usando mensagens de erro ou STDERR para escrever a totalidade ou parte da solução. (Você pode escrever coisas para STDERR ou produzir avisos / erros não fatais, desde que STDOUT seja uma solução válida e as mensagens de erro não façam parte dela.)

Além disso, seu código-fonte não deve consistir apenas de literais (sejam literais de seqüência de caracteres, literais numéricos etc.) e / ou NOPs. Por exemplo, `12é um poliglota em Jelly e Pyth, mas em Jelly é um NOP e um literal numérico, portanto, não é válido.

Qualquer saída não suprimível (como avisos de direitos autorais, mensagens de inicialização / desligamento ou um avanço de linha à direita) pode ser ignorada na saída para garantir a validade do quine.

Regras para poliglotas

Os dois idiomas usados ​​devem ser distintamente diferentes. Em particular:

  • Eles não devem ter versões diferentes da mesma linguagem (por exemplo, Python 2 vs. Python 3).
  • Eles não devem ter dialetos diferentes do mesmo idioma (por exemplo, Pascal vs. Delphi).
  • Um idioma pode não ser um subconjunto do outro (por exemplo, C vs. C ++ 1 ).
  • Um idioma pode não ser um derivado trivial do outro (por exemplo, Matlab vs. Octave 2 , brainfuck vs boolfuck vs TinyBF vs ShadyAsFuck vs todos os outros derivados triviais do brainfuck).

Regras Diversas

  • Você não pode aceitar entradas do STDIN (ou de qualquer outra fonte). Se o idioma escolhido precisar receber entrada, a entrada deverá estar vazia (sequência vazia, canalizada a partir de /dev/nulletc.) ou a saída do programa não deverá depender da entrada.
  • Para esse desafio, você deve escrever um programa completo. Não é permitido exigir código adicional para executar a solução (como atribuir e chamar uma função lambda definida na solução).

1: Sim, eu sei que C não é realmente um subconjunto de C ++. É perto o suficiente para ser considerado um com o objetivo de poliglotas, então, estou contando isso para este desafio.

2: Como o ponto 1 acima, embora o Octave tecnicamente não seja 100% compatível com o Matlab, ele foi projetado para ser compatível e está próximo o suficiente para permitir que um poliglota do Matlab / Octave trivialize o desafio.

Mego
fonte
Os blocos de cópias do ESMin são permitidos?
lirtosiast
@ThomasKwa Não estou familiarizado com o ESMin, então você poderia me dar um resumo rápido?
Mego
Há um comando para iniciar um bloco de cópia, que obtém o código-fonte de tudo o que está passado. Eu acho que outras linguagens JS de golfe também podem ter uma.
lirtosiast
@ThomasKwa Isso não seria permitido sob a primeira regra nas regras do quine (sem leitura do código fonte, direta ou indiretamente).
Mego
11
@Downgoat Desde que não infrinja nenhuma outra regra, absolutamente. Abusando peculiaridades é o tipo de objetivo deste site :)
Mego

Respostas:

6

GolfScript + Fissão , 19 18 bytes

{".~
'!+OR"
2<}.~

O avanço de linha à direita é necessário.

Este é um verdadeiro quine no GolfScript. Experimente online!

Em Fissão, imprime

'!+OR"

que é um verdadeiro quine em Fissão . Experimente online!

Explicação

No GolfScript, qualquer formato

{...}.~

é um quine desde que ...deixe uma string ".~"na pilha. Ele .duplica o bloco, de modo que exista uma cópia impressa no final e a ~executa, para que possamos usar seu conteúdo para imprimir o .~próprio. Nesse caso, o bloco empurra a string

".~
'!+OR"

e então o trunca para os dois primeiros caracteres com 2<.

O programa Fission realmente funciona exatamente da mesma forma que o próprio método , já que a primeira e a terceira linha são totalmente ignoradas pelo programa.

Martin Ender
fonte
6

Ruby + (JavaScript ou Python 3), 76 bytes

Esse é outro desafio que pode ser resolvido usando minha nova linguagem favorita, o subconjunto quase comum de Ruby, JavaScript e Python 3; e como ainda não temos respostas em idiomas exotéricos, e muitas pessoas gostam de ver soluções em idiomas que não são de golfe, pensei em contribuir com uma. Melhor ainda, a mesma resposta resolve o desafio de várias maneiras ao mesmo tempo.

Aqui está s:

s="'";d='"';n='print("s="+d+s+d+";d="+s+d+s+";n="+s+n+s+";eval(n)")';eval(n)

Este é um quine em Ruby. Não é um problema em JavaScript ou Python 3; se você executá-lo em um desses idiomas, sua saída s'tem uma nova linha à direita e, portanto, é diferente:

s = "'"; d =' "'; n =' print (" s = "+ d + s + d +"; d = "+ s + d + s +"; n = "+ s + n + s +" ; eval (n) ") '; eval (n)

No entanto, s'é uma linguagem poliglota em JavaScript e Python 3! (Como de costume, estou usando a implementação do JavaScript Rhino, tanto por conveniência (como é executada na linha de comando, em vez de precisar de um navegador), quanto porque possui uma biblioteca padrão estranha na qual printgrava na saída padrão. Os dois idiomas são produzidos s'como resultado da execução de qualquer programa.

Como um bônus, este programa também resolve o problema ao contrário. Se você decidir rodar s'em Ruby, ele imprimirá o programa original snovamente. Como tal, s'é uma resposta válida (mas um pouco mais longa, com 77 bytes) à pergunta.

Neste ponto, estou quase começando a pensar que "as diferenças entre a saída ou não da saída de uma nova linha ser suficiente para contar dois programas como diferentes" devem ser consideradas uma brecha padrão, pois esse parece ser um segundo conjunto de idiomas. (além do conhecido GolfScript / CJam), no qual é possível realizar o truque.


fonte
2

Vitsy (modo de segurança) e Y, 9 bytes, não-concorrentes.

' Ugrd3*Z

Em Vitsy, isso é uma solução. Em Y, isso imprime Ugrd3*Z'; quando executado, isso imprime Ugrd3*Z', o que é um quine em Y. Y pós-data a pergunta, no entanto.

O que Vitsy vê:

 ' Ugrd3*Z
 '         Heyyyy a string! Let's do this!
  ........ Capturing a string! Oh, not done? Hm, let's go back to the start.
 '         There we go.
           (space) ...
   U       (no op)
    g      use count, disabled in safe mode
     r     reverse stack
      d3*  push a '
         Z print it all!

O que Y vê:

' Ugrd3*Z
'         Push a space.
  U       Wrap around and capture.
   g      Print that. (Nothing else is printed.)
Conor O'Brien
fonte
11
Observe que isso funciona apenas no modo de segurança, ou melhor, tem alguns ... efeitos colaterais não intencionais no modo de segurança.
Addison Crump
1

CJam + GolfScript, 9 bytes

"0$p"
0$p

Este é um quine no CJam. No GolfScript, ele gera uma nova linha à direita, que é uma característica do GolfScript.

Não tenho certeza se o CJam deve ser considerado um derivado trivial do GolfScript. Mas acho que são bem diferentes e pelo menos não triviais.

jimmy23013
fonte