ou: Construisez un quine vertical
Inspiré par Prenez position contre les longues lignes .
Votre tâche consiste à créer un quine vertical avec une longueur de ligne aussi courte que possible.
Notation
La longueur de ligne la plus courte (hors nouvelles lignes) gagne, avec des critères de code-golf comme briseur d'égalité.
La longueur de ligne est déterminée comme la ligne la plus longue de votre programme à l'exclusion du caractère de saut de ligne.
Par exemple:
$_=
Q.
P
a une longueur de ligne de 3 et un nombre d'octets de 8, tandis que:
Q
$
_
P
A une longueur de ligne de 1 et un nombre d'octets de 7 (en supposant qu'il n'y ait pas de nouvelle ligne de fin).
Règles
Les quines doivent répondre à la définition communautaire d'une quine .
Les failles standard sont interdites.
code-challenge
quine
source-layout
Dom Hastings
la source
la source
Réponses:
Langue , longueur de ligne 0, ≈ 1,01 × 10 805 octets
Le code source se compose de
linefeeds, qui code le programme brainfuck qui suit.
Le code source est en grande partie identique au quine Lenguage adouci par rayonnement de @ jimmy23013 , moins le
.
à la fin, avec++++++++++.[-]
remplacement.
pour imprimer les sauts de ligne au lieu d'octets nuls, et les modifications correspondantes apportées à la section des données sur la ligne 1.la source
"about 1.75*10**76 yottabytes in ASCII"
]++++++++ ++.-->
JavaScript, longueur de ligne 1,
960956928 octetsVersion plus lisible qui s'avère également être une quine (les nouvelles lignes superflues ont été supprimées):
Explication
Ouf. Installez-vous pour une balade ici, parce que ça va être un voyage perfide ...
J'ai passé beaucoup de temps à essayer de comprendre comment résoudre ce défi avec la longueur 1 - pas de fonctions intégrées (directement, de toute façon), de mots clés ou même de fonctions fléchées - avant de réaliser que c'est facilement possible avec JSF *** , qui peut évaluer tout code JavaScript tout en évitant les jetons multi-octets. Mais une solution JSF aurait facilement des milliers d'octets, sinon des dizaines ou des centaines de milliers. Heureusement, nous ne sommes pas limités à seulement
()[]+!
- nous avons tout ASCII à notre disposition!J'ai décidé de commencer par jouer au golf sur les blocs de construction essentiels de JSF - les personnages qui peuvent être construits en chaînes pour «débloquer plus de fonctionnalités», pour ainsi dire. Nous ne pouvons pas utiliser directement des chaînes pour obtenir des caractères, car cela nécessiterait des lignes de longueur 3. Ainsi, nous volons une astuce à JSF, obtenant quelques caractères des littéraux qui peuvent être construits avec des jetons à un octet:
De ceux-ci, nous pouvons développer vers l'extérieur, en commençant par
[].find
, qui est un objet Function. La conversion de ce à une chaînefunction find() { ...
nous donne accès àc
,o
, l' espace (_
), et les parenthèses (y
etz
). Peut-être plus important encore , nous avons maintenant accès à sonconstructor
, laFunction
fonction qui, inceptional que cela puisse paraître, nous donne la possibilité d'exécuter du code par la construction d' une chaîne, en passant àFunction()
, puis d' appeler la fonction générée.Je devrais probablement mentionner la méthode globale utilisée par le programme lui-même. À partir de 2015, JavaScript a cette fonctionnalité vraiment cool appelée « modèles balisés », qui permet non seulement des sauts de ligne sans échappement dans les chaînes, mais nous permet également d'appeler directement une fonction avec un littéral de chaîne (en quelque sorte;
myFunc`abc`;
est à peu près équivalent àmyFunc(["abc"])
). Si nous plaçons l'appel de fonction comme dernière chose dans le programme, la structure générale ressemblera à ceci:Il
func
suffit alors de sortir son argument, suivi d'un backtick, puis de nouveau son argument, et d'un second backtick. En supposant que nous ayons l'argumenta
et un backtick stockés dansf
, nous pouvons accomplir cela avec le codealert(a+f+a+f)
. Cependant, pour le moment, nous+
manquons et le backtick lui-même.+
(stocké dansP
) n'est pas difficile; nous volons une autre astuce à JSF, la construction de la chaîne1e23
, la conversion en un nombre, puis de nouveau en une chaîne, donnant"1e+23"
.Obtenir un backtick est un peu plus compliqué. Au début, j'ai essayé de l'obtenir
String.fromCharCode
, mais trouver unC
avéré s'est avéré presque aussi difficile. Heureusement,atob
est assez facile à obtenir (Function("return atob")()
;b
est généré à partir de0+{}
, ce qui donne[object Object]
) et peut donner n'importe quel caractère ASCII, si une chaîne magique appropriée est trouvée. Un court script m'a donné12A
comme l'une des options, qui peut être facilement trouvée dans12Array
(un peu plus court à générer, grâce à[].constructor[n+a+m+e]
;m
se trouve dans0 .constructor+0
:)"function Number() { ..."
.Enfin, nous collons tout ensemble. Nous attribuons le backtick à la variable
f
, mais comme nous ne pouvons pas l'utiliser directement dans la chaîne de fonction, nous définissons plutôt la variableq
sur la lettref
et nous l'utilisons à la place. Cela rend notre chaîne finalea+l+e+r+t+y+a+P+q+P+a+P+q+z
, ou"alert(a+f+a+f)"
. Nous alimentons ensuite ceciFunction()
, alimentons notre code fini au résultat, et le tour est joué, nous avons un quine JavaScript avec pas plus d'un caractère par ligne!Ma tête est horrible pour le moment, alors s'il vous plaît, renseignez-vous sur les erreurs que j'ai faites ou les choses que j'ai manquées dans cette explication, et je vous répondrai après un peu de repos ...
la source
f=
ligne.f
un seul backtick. La ligne elle-même est équivalente àf=atob("12Array")[1]
. L'autre astuce est qu'elleq
est en fait définie sur la lettref
dans la première ligne, de sorte que dans laF(...)
ligne, je puisse l'utiliser pour mettre la lettref
dans la chaîne évaluée, car la variablef
n'est plus définie sur cette lettre. L'a+l+e+r+t+y+a+P+q+P+a+P+q+z
équivalent à"alert(a+f+a+f)"
.0+{}
et se0[E]
ficeler pour obtenirb
etm
.Haskell , longueur de ligne 6,
400343336 octetsEssayez-le en ligne! Je ne suis pas au courant d'un moyen de contourner
putStr
, donc la longueur de ligne de 6. Les accolades externes permettent de se débarrasser de l'indentation requise dans le cas contraire après une nouvelle ligne dans une seule déclaration.la source
> <> , 22 octets, longueur de ligne 1
Essayez-le en ligne!
-6 octets grâce à Emigna .
la source
CJam , longueur de ligne 1,
1613 octetsEssayez-le en ligne!
C'est un petit miracle que l'insertion de nouvelles lignes dans le
quine standard,même un quine standard plus court,{"_~"}_~
"_p"␊_p
fasse la bonne chose. (Merci, Martin!) La nouvelle ligne de fin est nécessaire.Explication (avec • comme nouvelle ligne)
À la fin, ce qui reste sur la pile est imprimé (
•_•p•
), ce qui donne une sortie totale"•_•p•"••_•p•
.la source
Haskell + CPP, longueur de ligne 2,
705237 octetsEssayez-le en ligne!L'utilisation de l'indicateur
-CPP
qui active le pré-processeur C nous permet d'utiliser une barre oblique inversée à la fin d'une ligne pour continuer sur la ligne suivante.Le code réel est
main=putStr$(:"\\\n")=<<s++show s;s="<data>"
.Edit: Un casual -468 octets grâce à Ørjan Johansen !
la source
main=putStr$(:"\\\n")=<<s++show s;s="<data>"
. Essayez-le en ligne!Rouille, longueur de ligne: 5, octets:
301299Essayez-le en ligne
Malgré son apparence, ce n'est pas un langage de programmation ésotérique, il y a juste beaucoup de bruit de ligne de format.
La longueur verticale de 5 a été choisie pour pouvoir être utilisée
print
. Je ne pense pas qu'il existe un moyen d'imprimer qui aurait une longueur verticale plus courte, en déclarant que les fonctions C utilisent unextern
mot clé,stdout
est de 6 octets de long,write
5 octets de long,no_main
7 octets de long (main est généralement une fonction;)).la source
cargo fmt
cela aiderait même ici ...05AB1E , Longueur de ligne: 1, Nombre d'octets: 43
Essayez-le en ligne!
la source
Japt , longueur de ligne 1, 20 octets
Basé sur la norme Japt quine par ETHproductions .
Essayez-le ici!
la source
JavaScript (ES6), longueur de ligne 3, 17 octets
la source
Rouge , longueur de ligne: 10, 49 octets
Essayez-le en ligne!
Ceci est en fait un Rebol quine
Explication: Red / Rebol
mold
suit le style de codage consistant à mettre 4 espaces décalés.la source
RProgN , 3 octets, longueur de ligne 1
Essayez-le en ligne!
Une copie de la réponse de Dennis ici (allez le voter aussi)
Ceci est conforme à notre définition actuelle d'un quine approprié, car le premier 0 code le second 0 et vice-versa.
la source
RProgN 2 , L = 1, B = 15 octets
Cela équivaut au programme:
Panne
«
envoie d'abord une fonction représentant implicitement le reste du programme à la pile, puis poursuit l'exécution.Ø.
ajoute une chaîne vide à la fonction, qui la chaîne. Cela se stringifiera toujours comme le programme équivalent, car les sauts de ligne ne sont pas opérationnels.`\n-
Supprime toutes les nouvelles lignes de la chaîne, ressemblant maintenant à«Ø.`=S`.
.S
puis le convertit en une pile de caractères uniques et`\n.
rejoint la pile par des sauts de ligne, renvoyant le programme attendu.Essayez-le en ligne!
la source
Sous-charge , longueur de ligne 1, 20 octets
Essayez-le en ligne!
Ceci est juste le quine standard de sous-charge avec des nouvelles lignes ajoutées. Nécessite une implémentation comme celle de TIO qui ignore les caractères de commande inconnus.
La partie dans
()
est un littéral de chaîne placé sur la pile, la:
duplique,a
enveloppe l'entrée de pile supérieure entre parenthèses etS
imprime.la source
Perl 5 , 259 octets
Essayez-le en ligne!
Vérification .
la source
Javascript (ES6 REPL), programme complet, longueur de ligne: 3, nombre d'octets: 31
Il s'agit d'un portage de la réponse de @ kamoroso94 à un programme complet autonome.
Si quelqu'un trouve un moyen de supprimer certains octets sans ajouter plus à la longueur de ligne, n'hésitez pas à commenter :)
la source
Pip , longueur de ligne 1, 35 octets
Essayez-le en ligne!
Basé sur le Quine Pip le plus court connu,
V Y"`V Y`.RPy"
. La principale difficulté à l'écraser à la longueur de ligne 1 estRP
, qui ne peut pas être divisée en deux lignes. Mais dans ce cas, tousRP
(repr) fait est de mettre la chaîne entre guillemets, ce que nous pouvons faire directement.Voici une explication basée sur une version horizontale:
la source
Befunge-98 , 41 octets
Essayez-le en ligne!
Vraiment juste un quine normal tourné de côté, avec quelques trucs supplémentaires pour imprimer des nouvelles lignes.
la source