Nous avons eu beaucoup de défis de quine , mais beaucoup de formats de quine sont similaires, permet de créer une certaine variance dans nos quines.
Votre tâche consiste à créer une sélection de programmes dans la même langue (au moins 2), qui produisent tous leur propre code source, cependant, aucun de ces programmes ne peut partager de caractères.
Par exemple, si vous créez un programme en utilisant:
printf+qw(printf+qw(%s)x2)x2
Votre prochain programme ne peut comprendre aucun des éléments suivants:
%()+2finpqrstwx
etc.
Règles
- Vous pouvez utiliser des caractères Unicode, mais vous devez toujours marquer en octets.
- Tous les programmes doivent répondre à la définition communautaire d'un quine approprié . Cela signifie que la chaîne vide ne compte pas entre autres comme un quine valide.
- Les failles standard sont interdites.
- Les fonctions ou les programmes complets sont autorisés tant qu'ils répondent à la définition ci-dessus.
- Les langues indépendantes des symboles (y compris le Lenguage et les Headsecks) sont interdites.
- La plupart des programmes gagnent, avec le code total le plus court comme briseur d'égalité.
code-challenge
restricted-source
quine
Dom Hastings
la source
la source
Réponses:
V ,
3, 5 quines, 46 octetsEssayez-le en ligne!
Hexdump:
Explication:
Essayez-le en ligne!
Hexdump:
Explication:
Essayez-le en ligne!
Hexdump:
Explication:
Voici où ils commencent à devenir funky ...
Essayez-le en ligne!
Hexdump:
Explication:
Essayez-le en ligne!
Hexdump:
Explication:
Cette réponse est remplie de magie noire. Les quines 1 et 4 ne sont pas nouvelles, mais les 3 autres n'ont jamais été trouvées auparavant, donc plus de la moitié de ces quines viennent d'être découvertes aujourd'hui.
la source
normie :p
"REEEEEE--
Gelée ,
2 3 45 quines,14 18 81 65 5956326265 247 229216 octets3 octets
Essayez-le en ligne!
Quine standard.
”Ṙ
est le seul caractère littéral pourṘ
.Ṙ
affiche la représentation sous forme de chaîne de ceci, puis la chaîne estṘ
implicitement imprimée.4 octets
Essayez-le en ligne!
⁾
commence un littéral de chaîne de deux caractères etḤ
double son argument. Avec une entrée de chaîne,Ḥ
est mappé sur chaque caractère.Ḥ
Agissant ainsi sur la chaîne⁾Ḥ
donne⁾⁾ḤḤ
, le code source.11 octets
Essayez-le en ligne!
Sur le côté droit,
“ȮṾṖƊ}
est le littéral de chaîne pourȮṾṖƊ}
. Le caractère de fermeture de chaîne est tacitement ajouté à l'EOF.À gauche du littéral de chaîne,
Ɗ
s'enrouleȮṾṖ
en une seule monade et la}
transforme en dyade qui utilise son argument de droite, le littéral de chaîne.Ȯ
imprime la chaîne (ȮṾṖƊ}
),Ṿ
crée une représentation sous forme de chaîne de la chaîne (“ȮṾṖƊ}”
) etṖ
supprime le”
caractère. La chaîne“ȮṾṖƊ}
est laissée après la monade et est implicitement imprimée.38 4936 octetsEssayez-le en ligne!
C'est la première fois que j'utilise un espace de golf Jelly.
La liste des nombres au début contient
ord
le reste des caractères dans le code. Après ça:270 198 180162 octetsEssayez-le en ligne!
Utilise des nombres et des index de base 250 dans la page de codes Jelly. Économisé 72 octets en changeant l'algorithme. J'utilisais chaque numéro pour indexer la page de codes de Jelly, mais je reconvertis maintenant l'entier en base 250, puis l'indexation dans la page de codes de Jelly, réduisant de moitié le nombre de littéraux dont j'ai besoin dans la première ligne. Cela réduit également le nombre de caractères uniques nécessaires, mais je ne peux pas penser à un moyen de créer plus de quines.
J'ai utilisé ce
⁾“”
qui crée des littéraux de chaîneỌ
etØJ
qui crée des chaînes à partir de nombres. Je ne peux penser à aucune autre façon de faire des cordes. J'ai toujours le chiffre9
et‘’
disponible, donc s'il y a une autre façon de faire des chaînes à partir de nombres, il peut être possible de faire une autre quine.la source
Haskell , 3 quines, 1119 octets
Quine 1, 51 octets
Une
IO
action anonyme imprimant directement sur stdout.Essayez-le en ligne!
Quine 2, 265 octets
La fonction
f
prend un argument fictif et renvoie une chaîne.Essayez-le en ligne!
Quine 3, 803 octets
Tout ce qui suit le
LANGUAGE
pragma est une fonction quelconque qui prend un argument fictif et renvoie une chaîne.Essayez-le en ligne!
Personnages
Quine 1:
Quine 2:
Quine 3:
Comment ça marche
Quine 1
Quine 1 est une version modifiée de mon récent Golf you a quine answer (avec des améliorations de H.PWiz):
main=
a été supprimé.<>
et$
ont été remplacés par leurs quasi-synonymesmappend
etid
.Cela libère les caractères vitaux
=<>
et l'opérateur utile$
pour les autres quines.Quine 2
Quine 2 utilise des méthodes quelque peu similaires pour programmer 2 de ma récente réponse Mutuellement Exclusif Quines , mais adapté pour se quine directement et surtout pour éviter d'utiliser des littéraux de caractères, qui sont nécessaires pour la quine 3. Ces deux sont obtenus à l'aide de la
show
fonction, qui, par pure chance, n'a encore utilisé aucun de ses personnages.Cette quine utilise des tabulations au lieu d'espaces, mais j'ai utilisé les espaces ci-dessous pour plus de lisibilité.
g
correspond aux données de quine, sous la forme d'une liste d'entiers à la fin du code. Chaque numéro représente un caractère du reste du code.9
, donc cet onglet l'est0
. Cela rend l'encodage un peu plus court en permettant aux lettres minuscules de la fonction et aux noms de variables de tenir sur 2 chiffres.b c=[[[show 9!!0,show 1!!0..]!!6..]!!c]
est une fonction pour convertir un nombre en caractère (en fait une chaîne à un caractère).[[show 9!!0,show 1!!0..]!!6..]
est une plage de caractères commençant par un caractère de tabulation, qui est indexé dans avec!!c
.[show 9!!0,show 1!!0..]
, en commençant par les caractères numériques'9'
et'1'
et sautant par pas de huit.show
chaîne du chiffre correspondant.f c=[b=<<g]!!0++show g
est la fonction principale.c
est un argument factice.b=<<g
utilise=<<
pour convertir chaque nombre eng
son caractère. (L'utilisation de=<<
plutôt que par exemplemap
est la raisonb
pour laquelle il faut envelopper son caractère retourné dans une liste.)show g
donne la représentation sous forme de chaîne deg
la liste de et++
concatène les chaînes.=<<
a une priorité inférieure à++
, un certain bracketing est nécessaire. Pour éviter d'utiliser()
(réservé au quine 3),[...]!!0
indexe dans une liste avec un élément.Quine 3
De par la conception des autres quines, quine 3 a toujours accès aux parenthèses, aux expressions lambda, aux littéraux de caractères et au constructeur de chaîne / liste
:
. Ce sera suffisant pour construire une fonction qui ajoute le code du quine à une chaîne.Malheureusement, toutes les voyelles minuscules (sauf parfois
y
) ont été utilisées, ne laissant aucune fonction intégrée alphanumérique utile. Sont également[]""
partis. Cela ne laisse aucun moyen normal de construire une chaîne vide pour commencer à faire semblant le code.Cependant, presque toutes les lettres majuscules sont toujours disponibles, donc un
LANGUAGE
pragma pour obtenir une extension de langue est possible. Encore une fois, par pure chance,CPP
(activer le préprocesseur C) est la seule extension de langage nommée avec uniquement des lettres majuscules. Et les macros CPP ont souvent des noms en majuscules.Ainsi, pour obtenir la chaîne vide essentielle, le quine permet
CPP
, utilise la__TIME__
macro pour obtenir une constante de chaîne de la forme"??:??:??"
(il est commodément garanti de toujours avoir la même longueur), et le modèle correspond.Après le pragma du langage, le quine consiste en une expression lambda liant ses paramètres à ces quatre arguments (laissant un paramètre factice final
_
à appliquer plus tard):q
lié à'\''
, donnant un caractère de guillemet simple;_:_:_:_:_:_:_:_:z
lié à__TIME__
, alias une chaîne similaire"??:??:??"
, créant ainsiz
une chaîne vide;y
lié à(\(?)v k x->v$k?x)
, un combinateur lambda utilisé pour aider à convertir les données de quine de la forme associée à gauche ("foldl") à la forme associée à droite ("foldr");(#)
lié à\(&)(%)v->v&'{'&'-'&...
, les données quine lui-même.Les données de quine sont données sous une forme de codage Church, une expression lambda avec des paramètres
(&)(%)v
.(&)
,(%)
etv
, cet encodage peut être utilisé soit pour construire le code principal du quine, soit pour reconstruire la représentation des données du quine elle-même.&
et%
devenez des opérateurs associatifs gauches à l'intérieur du lambda. Ainsi, les paramètres des caractères se combinent avec l'initiale env
partant de la gauche.k
, il existe un correspondant&'k'
.k
est'
ou\
, qui doit être échappé à l'intérieur des littéraux de caractères, le codage est à la place%'\k'
.Étant donné que le codage des données est associatif à gauche, mais que les chaînes sont construites de manière associative à droite, le combinateur
y = (\(?)v k x->v$k?x)
est introduit pour combler le décalage.y(...)
est destiné à construire des fonctions appropriées à utiliser comme données(&)
et(%)
opérateurs de quine .v
est une fonction de chaînes en chaînes (les données prévuesv
sont des exemples).k
est un caractère,x
une chaîne et?
un opérateur qui les combine en une nouvelle chaîne. (Pour le code principal,.(?)=(:)
Pour reconstruire réellement la représentation des données quine, c'est plus compliqué.)y(?)v k = \x->v$k?x
une autre fonction de chaînes en chaînes.Comme exemple de la façon dont cela change l'associativité, si
(&)=y(:)
:Plus généralement, quand
(#)
est la fonction de données quine etf1,f2
sont des fonctions combinant des caractères avec des chaînes:appliquer la fonction de données de quine avec
(&)=y(f1)
et(%)=y(f2)
, et cela utilise les éléments prescritsf1
etf2
pour combiner les caractères des données de quine avecx
, puis passe la chaîne résultante àv
.Le corps de l'expression lambda principale met tout cela ensemble:
'&':q:k:q:x
pour un caractèrek
précède&'k'
la chaînex
, tandis que les'%':q:'\\':k:q:x
préfixes%'\k'
, qui sont leurs formes de données de quine d'origine.y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x
sont donc les bons paramètres pour reconstruire la représentation des données de quine, ajoutés à la finalez
(la chaîne vide), puis passés à la fonction suivante.y(:)#y(:)
sont les bons paramètres pour ajouter le code de base du quine à une chaîne, sans autre modification.\x->x
fait de ne rien faire avec le quine construit, qui est retourné.la source
Perl 6 , 3 quines, 274 octets
Quine 1, 52 octets
Essayez-le en ligne!
Quine 2, 102 octets
Essayez-le en ligne!
Quine 3, 120 octets
Essayez-le en ligne!
Vérification d'ensembles d'octets distincts
Il y avait beaucoup de manœuvre pour obtenir ce troisième quine. Perl 6 dispose de 4 méthodes de production (que je connais),
say
,put
,print
etprintf
. Les deuxsay
et laput
sortie des nouvelles lignes, car je ne peux pas utiliser les deux.put
,print
,printf
Contiennent tousp
ett
. Nous pouvons contourner cela partiellement en utilisantEVAL
pour utiliser les majusculesPRINT
. À partir de là, je ne pense pas qu'il soit possible d'obtenir 4 quines ... (même si peut-être quelque chose comme çashell "echo 'quine'"
pourrait fonctionner)Nous pouvons ensuite contourner les problèmes d'espacement en utilisant différents types d'espaces pour séparer les opérateurs, les espaces, les tabulations et les retours à la ligne.
Explications:
Quine 1:
Quine 2:
Il s'agit d'une quine au format
printf |(q[printf q[%s]]xx 2)
, c'est-à-dire qu'elle formate une copie de la chaîne en elle-même. Cependant, nous ne pouvons pas l'utilisers
car il est utilisé dans les quines précédentssay
. Nous utilisons donc la chaîne OU opérateur (~|
) sur@
et!3
, pour produire la%s
partie, mais nous ne pouvons pas le faire à la fois pour la chaîne de format et la chaîne à insérer, nous devons donc faireZ~
avec la chaîne supplémentaire et une chaîne vide, bien que nous ne puissions pas ensuite utiliser,
pour séparer les deux, nous faisons doncXx qw[1 0]
pour multiplier les chaînes par 1 et 0.Quine 3:
Il s'agit d'une quine EVAL qui fait de son mieux pour tout mettre en majuscules afin d'éviter tout conflit avec les autres quines. Cela implique beaucoup de
EVAL
s ainsi que quelqueslc
- uns etuc
de convertir entre les cas.la source
MathGolf ,
4 56 quines, 193 535 octets9 octets
Essayez-le en ligne!
45 octets
Essayez-le en ligne!
49 octets
Essayez-le en ligne!
99 octets
Essayez-le en ligne!
4488 octets
Essayez-le en ligne!
188 845 octets
Je ne peux pas vraiment faire de lien avec celui-ci, alors voici un programme Perl 6 qui génère le quine réel
Vérification de la distinction
Je peux très certainement en extraire une autre quine, bien que je pense que je n'ai plus de moyens de pousser les chaînes directement dans la pile, donc je devrai recourir à des méthodes plus étranges. Des méthodes encore plus étranges arrivent alors que j'essaie une sixième quine. Dans certains cas, les quines pourraient être plus courtes, mais je réduis les octets utilisés en préparation.D'accord, je pourrais techniquement être en mesure de faire une autre quine, car j'ai encore quelques opérateurs dont j'ai besoin (chaîne de poussée, chaîne d'incrémentation, duplication, mappage, popping), c'est le bouclage qui nous restreint. Ce
{}
sont les seuls opérateurs qui peuvent indiquer un bloc de code de longueur arbitraire, et j'en ai vraiment besoin dans la 6e quine. Je pourrais utiliser certains des autres blocs de code, mais ils sont limités, et je doute que les sections de bouclage soient aussi courtes, car nous manquons d'opérateurs faciles.D'accord, quelques explications tardives:
Tous les quines ont presque la même structure:
Quine 1:
C'est fondamentalement le même que celui que j'ai posté dans la question normale.
Quine 2
Quine 3:
Quine 4:
Quine 5:
Quine 6:
La raison pour laquelle cette quine est tellement plus longue que les autres est que l'incrémentation des chaînes utilise des représentations unicode, ce qui aspire vraiment certains des caractères du code, surtout lorsque nous essayons de créer le caractère
⌂
dans le code, ce qui gonfle le code de plus de 8000 caractères, ce qui gonfle alors la partie représentation de très grande ampleur.Ce dernier quine serait considérablement réduit si MathGolf était cohérent sur l'utilisation ou non de la page de code native par les chaînes.
la source
chr/ord
pour l'un d'eux, je devrais faire en sorte que les deux utilisent la page de code à la place je pense.Python 2, 2 quines,
434353349446 octetsC'était surtout pour voir si je pouvais le faire en Python.
30 octets (y compris une nouvelle ligne de fin):
et 416 octets, sans retour à la ligne:
(Golfé 81 octets grâce à Lynn mais a ajouté une charge en raison de l'attention portée à la nouvelle ligne.)
Explication
Le premier est juste le quine Python court standard , mais modifié pour ne pas être utilisé
_
. Comme il s'agit de Python 2, il n'utilise pas non plus(
ou)
.Le second a réfléchi. La longue chaîne est codée à l'aide du
hex
codec (garantissant ainsi qu'elle ne contiendra que0
-9
eta
-f
) et décode commeCela utilise la supercherie quine pour obtenir son propre code source, puis l'encode en utilisant
hex_codec
, puis l'imprime entouréexec"".decode("hex")
, en utilisantsys.stdout.write
pour éviter d'imprimer une nouvelle ligne. L'exécution de ce code génère le deuxième quine, c'est ainsi que je l'ai généré.Je soupçonne que plus de deux est impossible en Python, bien que j'aimerais le voir si je me trompe!
Si cela ne vous dérange pas eines quines
Ørjan Johansen a suggéré ce qui suit pour le deuxième quine pré-encodé
ce qui donnerait 30 + 248 = 278 octets pour la sortie suivante:
L'utilisation de
exec
cette manière ne triche pas selon les règles de quine appropriées de PPCG mais cela me semble un peu tricheur (élégant et intelligent, mais toujours tricheur), car certains caractères sont utilisés à la fois comme code et données. (Bien que ma version utiliseexec
, le code et les données sont séparés.) Je vais donc garder mon score à 446.la source
"hex"
fonctionne à la place de"hex_codec"
, ce qui devrait vous faire économiser quelques octets!print '<tab>',
n'ajoute pas d'espace à la fin. En utilisant cela, vous pouvez 85 octets hors de la suggestion de Jo King: tio.run/…Japt ,
23 quines,106172 octetsLe premier est une version assez verbeuse de ma réponse N quine quine .
Essayez-le ici .
La deuxième quine est une plus grande bonne quine d'ETHProduction , qui est une bonne quine standard pour Japt.
Essayez-le ici .
Le troisième utilise
``
et code XORing pour stocker les données.Essayez-le ici .
Puisqu'ils
()'
sont toujours disponibles, il pourrait être possible d'en extraire une autre quine.la source
"'[+U+']+R+(Umd)¬"q mc
vous donne la première ligne pour des mises à jour rapides, si cela peut vous aider.Gol> <> ,
23 quines,17 28 2726 octets6 octets
Essayez-le en ligne!
11 109 octetsEssayez-le en ligne!
11 octets
Essayez-le en ligne!
Gol> <> a trois façons d'imprimer n'importe quel caractère:
o
Pop une valeur et imprimer en tant que charH
Tout éclater, imprimer en tant que caractère et arrêterS"..."
Imprimer le littéral de chaîne sans affecter la pile du toutMais je ne pouvais pas trouver un moyen d'écrire une quine en utilisant
S"..."
comme seule méthode de sortie, j'ai donc trouvé les deux ci-dessus, en utilisant les deux types de littéraux de chaîne.Le troisième (par Jo King) utilise la
p
commande pour créer l'entrée"
àS"
la volée, qui à son tour imprime tout sauf le zéro à la fin.Eh
Imprime ensuite le zéro et quitte.Maintenant que nous avons utilisé toutes les commandes de sortie ET la
p
commande, je pense qu'il est impossible de créer une autre quine (sauf si quelqu'un propose laS"
quine sansp
).la source
S"..."
?Ruby , 2 quines, 27 + 44 = 71 octets
Essayez-le en ligne!
Essayez-le en ligne!
Je suis principalement limité par les méthodes de sortie, ici. Il existe plusieurs façons de manipuler les chaînes, mais à part
$><<
toutes les méthodes de sortie utilisables semblent se recouper trop. Je pense qu'il pourrait y avoir une issue,eval
mais il est difficile d'avoir à imbriquer plusieurs manipulations de cordes de différents types.la source
Javascript ES6, 2 quines, 43 + 22 = 65 octets
Quine 1:
Quine 2:
la source
g=z=>"g="+g
donc une quine JS valide?> <> , 2 quines, 8 + 16 = 24 octets
8 octets
Essayez-le en ligne!
Tiré de cette réponse .
16 octets
Essayez-le en ligne!
Ceci est basé sur le
'r3d*>o<
quine, à l' exceptiono
et<
ne peut pas être utilisé, de sorte que je l' ai remplacé<
avec|
et créé de manière dynamiqueo
(111 = 8 * 13 + 7) et placée là où le deuxième>
est.2 quines est la limite
Malheureusement, nous sommes limités par le nombre de commandes de sortie.
n
n'est pas utile car il ne produit que des nombres, ilo
doit donc être exécuté dans n'importe quelle quine. La seule façon de créer dynamiquemento
est avecp
. Une quine peut donc être utiliséeo
et une autre peut la créer avecp
, mais il ne peut y avoir de 3e quine.Il pourrait être possible qu'un troisième quine laisse le code source sur la pile si cela compte.
la source
Java 10, 2 quines,
14481248 octets13501122 octetsEssayez-le en ligne.
Équivalent à:
Explication:
126 octets
System.console()
retourneranull
quand aucun n'est fourni, donc TIO retourne unNullPointerException
dans ce cas .Pour prouver qu'il s'agit d'un quine fonctionnel, remplacez-le
System.console()
parSystem.out
: Essayez-le en ligne.Explication:
Explication générale:
En Java, une quine se fait généralement comme ceci:
String s
contient le code source non formaté.%s
est utilisé pour entrer cette chaîne en elle-même avec les.format(...)
.%c
,%1$c
Et le34
sont utilisés pour formater les guillemets doubles.s.format(s,34,s)
met tout cela ensemble.Dans ce cas, la fonction lambda quine la plus courte en Java 10 serait la suivante ( 82 octets ):
Essayez-le en ligne.
Étant donné que la seule façon d'avoir deux quines en Java est d'utiliser la version unicode avec
\uHEXA
, qui est convertie en caractères lors de la compilation, je ne peux pas utiliser les caractères0123456789ABCDEF\u
dans la version non unicode. Ainsi, la version non unicode plus petite utilisera à laSystem.console()
place dereturn
ouSystem.out
(les deux contenant un 'u'), et utilisera'}'-'['
et deux fois%c
au lieu de34
et%1$c
.Quelques points à noter sur la version unicode:
%04X
au lieu de%04x
(pour les majuscules hexadécimales au lieu de minuscules).92
,%c
et%3$c
pour formater les barres obliques.\U
au lieu de minuscules\u
n'est pas autorisée apparemment, sinon j'aurais juste utiliséreturn
dans la version non-unicode plus courte.la source