Écrire une sémiquine

10

Supposons que vous ayez 2 langues Aet B. Une chaîne sest un point-virgule dans Aet Bsi elle remplit les conditions suivantes:

  1. sest une quine dans la langue A.
  2. sest un polyglotte dans Aet B.
  3. La sortie de l'exécution en stant que Bprogramme est une chaîne différente s', qui est une quine in B.

Le but de ce défi est d'écrire une sémiquine en deux langues distinctes. C'est le , donc le code le plus court gagne, avec la première réponse utilisée comme bris d'égalité.

Règles pour les quines

Seuls les vrais quines sont acceptés. Autrement dit, vous devez imprimer l'intégralité du code source textuellement sur STDOUT, sans :

  • lire votre code source, directement ou indirectement.
  • en s'appuyant sur un environnement REPL qui évalue et imprime simplement chaque expression que vous lui donnez.
  • en s'appuyant sur des fonctionnalités linguistiques qui impriment simplement la source dans certains cas.
  • utiliser des messages d'erreur ou STDERR pour écrire tout ou partie du quine. (Vous pouvez écrire des choses dans STDERR ou produire des avertissements / erreurs non fatales tant que STDOUT est un quine valide et que les messages d'erreur n'en font pas partie.)

De plus, votre code source ne doit pas être composé uniquement de littéraux (qu'il s'agisse de littéraux de chaîne, de littéraux numériques, etc.) et / ou de NOP. Par exemple, `12est un polyglotte dans Jelly et Pyth, mais dans Jelly, c'est un NOP et un littéral numérique, il n'est donc pas valide.

Toute sortie non supprimable (comme les avis de droits d'auteur, les messages de démarrage / arrêt ou un saut de ligne de fin) peut être ignorée dans la sortie pour des raisons de validité du quine.

Règles pour les polyglottes

Les deux langues utilisées doivent être distinctement différentes. En particulier:

  • Il ne doit pas s'agir de versions différentes du même langage (par exemple Python 2 vs. Python 3).
  • Ils ne doivent pas être des dialectes différents de la même langue (par exemple Pascal vs Delphi).
  • Un langage peut ne pas être un sous-ensemble de l'autre (par exemple C contre C ++ 1 ).
  • Une langue peut ne pas être un dérivé trivial de l'autre (par exemple, Matlab vs Octave 2 , brainfuck vs boolfuck vs TinyBF vs ShadyAsFuck vs tous les autres dérivés triviaux brainfuck).

Règles diverses

  • Vous ne pouvez pas accepter l'entrée de STDIN (ou de toute autre source). Si la langue que vous avez choisie doit accepter l'entrée, alors soit l'entrée doit être vide (chaîne vide, envoyée depuis /dev/null, etc.), soit la sortie du programme ne doit pas dépendre de l'entrée.
  • Pour ce défi, vous devez écrire un programme complet. Exiger du code supplémentaire pour exécuter la solution n'est pas autorisé (comme affecter et appeler une fonction lambda définie dans la solution).

1: Oui, je sais que C n'est pas vraiment un sous-ensemble de C ++. Il est assez proche pour être considéré comme un aux fins des polyglottes, donc je le compte pour ce défi.

2: Comme le point 1 ci-dessus, bien qu'Octave ne soit pas techniquement compatible à 100% avec Matlab, il a été conçu pour être compatible et est suffisamment proche pour que permettre un polyglotte Matlab / Octave banalise le défi.

Mego
la source
Les blocs de copie d'ESMin sont-ils autorisés?
lirtosiast
@ThomasKwa Je ne connais pas ESMin, pourriez-vous me donner un bref aperçu?
Mego
Il y a une commande pour démarrer un bloc de copie, qui obtient le code source de tout ce qui est passé. Je pense que d'autres langages de golf JS pourraient en avoir un aussi.
lirtosiast
@ThomasKwa Cela ne serait pas autorisé en vertu de la première règle des règles de quine (pas de lecture du code source, directement ou indirectement).
Mego
1
@Downgoat Tant qu'il n'enfreint aucune autre règle, absolument. Abuser des bizarreries est en quelque sorte l'objectif de ce site :)
Mego

Réponses:

6

GolfScript + Fission , 19 18 octets

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

Le saut de ligne arrière est nécessaire.

C'est une vraie quine dans GolfScript. Essayez-le en ligne!

Dans Fission, il imprime

'!+OR"

ce qui est une vraie quine dans la fission . Essayez-le en ligne!

Explication

Dans GolfScript, n'importe quoi de la forme

{...}.~

est une quine tant qu'elle ...laisse une chaîne avec ".~"sur la pile. Le .duplique le bloc, de sorte qu'il y a une copie qui est imprimée à la fin, et l' ~exécute, afin que nous puissions utiliser son contenu pour l'imprimer .~lui - même. Dans ce cas, le bloc pousse la chaîne

".~
'!+OR"

puis le tronque aux deux premiers caractères avec 2<.

Le programme Fission fonctionne vraiment exactement comme le quine lui - même , car la première et la troisième ligne sont entièrement ignorées par le programme.

Martin Ender
la source
6

Ruby + (JavaScript ou Python 3), 76 octets

Ceci est un autre défi qui peut être résolu en utilisant mon nouveau langage préféré, le sous-ensemble presque commun de Ruby, JavaScript et Python 3; et étant donné que nous n'avons pas encore de réponses dans les langues exotériques, et que beaucoup de gens aiment voir des solutions dans des langues autres que le golf, j'ai pensé en apporter une. Encore mieux, la même réponse résout le défi de différentes manières en même temps.

Voici s:

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

Ceci est une quine en Ruby. Ce n'est pas une quine en JavaScript ou Python 3; si vous l'exécutez dans l'une de ces langues, sa sortie s'a une nouvelle ligne de fin et est donc différente:

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

Cependant, s'est une quine polyglotte en JavaScript et Python 3! (Comme d'habitude pour moi, j'utilise l'implémentation Rhino de JavaScript, à la fois pour plus de commodité (car elle s'exécute à partir de la ligne de commande plutôt que d'avoir besoin d'un navigateur), et parce qu'elle a une bibliothèque standard bizarre dans laquelle printécrit sur la sortie standard.) Les deux langues produisent s'suite à l'exécution de l'un ou l'autre programme.

En prime, ce programme résout également le problème à l'envers. Si vous décidez de lancer s'Ruby, il imprimera à snouveau le programme d'origine . En tant que tel, s'est une réponse valide (mais légèrement plus longue, à 77 octets) à la question.

À ce stade, je commence presque à penser que "les différences dans le fait que la sortie se termine ou non avec une nouvelle ligne suffisante pour compter deux programmes comme différents" devraient être considérées comme une faille standard, étant donné qu'il semble s'agir d'un deuxième ensemble de langues. (au-delà du GolfScript / CJam bien connu) dans lequel il est possible de réussir l'astuce.


la source
2

Vitsy (mode sans échec) et Y, 9 octets, sans concurrence.

' Ugrd3*Z

À Vitsy, c'est une quine. En Y, cela s'imprime Ugrd3*Z'; lors de l'exécution, cela s'imprime Ugrd3*Z', ce qui est une quine dans Y. Y postdate la question, cependant.

Ce que Vitsy voit:

 ' 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!

Ce que Y voit:

' Ugrd3*Z
'         Push a space.
  U       Wrap around and capture.
   g      Print that. (Nothing else is printed.)
Conor O'Brien
la source
1
Notez que cela ne fonctionne qu'en mode sans échec, ou, plutôt, il a des effets secondaires ... involontaires en mode non sûr.
Addison Crump
1

CJam + GolfScript, 9 octets

"0$p"
0$p

Ceci est une quine dans CJam. Dans GolfScript, il se produit avec une nouvelle ligne de fin, qui est une quine dans GolfScript.

Je ne sais pas si CJam doit être considéré comme un dérivé trivial de GolfScript. Mais je pense qu'ils sont assez différents et du moins pas insignifiants.

jimmy23013
la source