# 4"16" 3//v\(@#/;\D"14"<;n4
#/*`3 afaaZ">;[77*,68*,@;'1,'1,q)(22)S# ␉␉␉␉ (
#yy␉;36!@
#`<` ␉
#=␉x
#<]+<[.>-]>[
#␉<
###xR+++++[D>+++++++L+++<-][<<<]>+.---.>][
#px%>~~~+␉+~*ttt*.x
#D>xU/-<+++L)
#R+.----.R␉>]|
#[#yy#yy0l0mx01k1k0l0ix0jx0h0h1d111P0eU0bx0b0o1d0b0e0e00x1d0i0fx0g0n0n11x0o0n0cx0c0o0f0c0gx0g0f0h0j0j0i0001k10mx0m0l11111100(^_)
#|␉
print((eval("1\x2f2")and(9)or(13 ) )-(0and 4)^1<<(65)>>(62))or'(\{(\{})(\{}[()])}\{}\{}\{})'#46(8+9+9+9+9+=!)#1111|=/=1/24=x=9[<$+@+-@@@@=>+<@@@=>+<?#>+.--.]/
__DATA__=1#//
#.\."12"␉*
###; console.log 39
""""#//
=begin␉//
#*/
#define␉z sizeof 'c'-1?"38":"37"
#include<stdio.h>
int main() /*/
#()`#`\'*/{puts(z);}/*'``
$'main'␉//
#-3o4o#$$$
<>"3"O.<␉>//
#
=end #//
"""#"#//
#0]#echo 21#/(\[FAC,1<-#2FAC,1SUB#1<-#52FAC,1SUB#2<-#32FACLEGEREEX,1PLEASEGIVEUPPLEASE) a>>>
#>27.say# /7Jn~15o|
#8␛dggi2␛`␉|1|6$//''25 =#print(17) ###^_^_LEintnd"3"z!]/}23!@/*///Z222999"26
␉
est un onglet littéral, ␛
un caractère ESC littéral; Stack Exchange modifierait le programme autrement. Je vous recommande de copier le programme à partir de la zone "entrée" du lien TIO ci-dessous, si vous souhaitez y travailler.
Essayez-le en ligne!
Score VIP (Imprimante numérique polyvalente): 0.01329
Fatigué
Ce programme imprime 41 en brainf ***, 40 en Minimal-2D, 39 en CoffeeScript, 38 en C, 37 en C ++, 36 en Labyrinth, 35 en INTERCAL, 34 en Rail, 33 en Incident, 32 en Whirl, 31 en SNUSP modulaire, 30 po en blanc, 29 en déclenchement, 28 en Brain-Flak, 27 en Perl 6, 26 en 05AB1E, 25 en Pip, 24 en Thutu, 23 en Hexagonie, 22 dans la sous-charge,21 en Nim, 20 en Prélude, 19 à Reng, 18 à Cardinal, 17 à Julia, 16 à Pyth, 15 à Haystack, 14 à Turtlèd, 13 à Ruby, 12 à Fission, 11 à Befunge-98, 10 à Befunge- 93, 9 en Perl 5, 8 dans la rétine, 7 à Japt, 6 en SMBF, 5 dans le python 2, 4 à> <>, 3 à Minkolang, 2 à V / vim, et 1 à 3 python.
Vérification
La plupart des langues sont testées par le pilote de test illustré ci-dessus. Vous pouvez tester Reng ici et SNUSP modulaire ici ; ils produisent respectivement 19 et 31, selon les besoins.
Le pilote de test a été mis à jour pour inclure le Tokenizer, enfin. Tout le code C est stocké en tant qu'argument du point de vue du script Bash. J'ai également modifié la sortie pour qu'elle se termine horizontalement par un espace de fin après chaque jeton au lieu de sortir verticalement. C'était juste ma préférence, pour l'adapter à la sortie de Whitespace. Mais n'importe qui d'autre peut le changer s'il sent que c'est trop déroutant.
J'ai également effectué un ajustement de testeur pour gérer l'espacement des colonnes pour le caractère UFT8 de Turtlèd dans le menu déroulant. Ce désalignement me rendait fou! Le «correctif» est plutôt compliqué, car il cherche simplement un è et modifie la largeur de la colonne pour ce cas, mais le travail est fait.
Explication
Tout d'abord, je tiens à dire à quel point l' extrait de code Rundown de l'extrait de code de la partition polyvalente de l'imprimante polyvalente de SnoringFrog était de. Cela fait un moment que je calcule les réponses avant de poster, et cela m'a inspiré à nouveau. Je pense que nous pouvons éventuellement battre la réponse de @ sp3000.
J'ai donc commencé à travailler sur cette réponse en essayant de jouer au golf avec tout ce que je pouvais et j'ai plutôt bien réussi. J'ai même eu une réponse dans une langue différente avec un nombre total d'octets inférieur à # 40. Mais alors que j'essayais de jouer à Minimal-2D, je devais apprendre le BF pour pouvoir mieux travailler avec ses dérivés et, ce faisant, j'ai trouvé le record de @ Primo Hello, World! . Je suis tombé amoureux de l'élégance.
Il s’est avéré que Minimal-2D n’était pas assez efficace pour utiliser la technique d’initialisation de la bande utilisée par @Primo, mais j’estime qu’elle serait probablement trop lourde de toute façon. Nous essayons seulement d'imprimer un entier après tout. Mais @Primo m'a effectivement envoyé sur le chemin pour apprendre à se multiplier en BF, ce que j'ai apporté au code de Minimal-2D.
Après tout cela, j'ai relu le commentaire de SnoringFrog sur la manière d'inclure BF et je me suis rendu compte que non seulement je pouvais le faire, mais que je pouvais utiliser une grande partie du code Minimal-2D que j'avais trouvé dans la réponse à BF. J'ai donc creusé pour répondre avec BF, et nous y sommes.
Une dernière chose avant d'entrer dans les détails. J'ai apporté quelques modifications pour des raisons autres que le golf. Tout d'abord, j'ai déplacé la majeure partie du code ajouté par @SnoringFrog juste en dessous des langues 2D dans les rangées supérieures. Pour moi, c'est un geste stratégique à long terme d'empêcher 2D-langs de traverser le centre du polyglotte afin d'éviter autant que possible les futurs bugs. Le nombre d'octets touchés était faible pour ce déplacement, alors je me suis lancé.
Deuxièmement, au cours des différentes ré-factorisations, j’ai appris que Begunges et Minkolang produisaient un espace après les sorties numériques, ce qui était la cause des octets nuls que nous avons vus dans Test Driver pour ces langues. J'ai corrigé ces problèmes en affichant la valeur de la pile sous forme de code ascii (qui n'incluait pas la fonctionnalité d'espace de fin), au lieu de la valeur directement. Il y avait aussi un petit octet pour ce changement, mais maintenant la sortie du pilote de test est si uniforme. Comment ne pourais-je pas?
SM / BF
Passons rapidement en revue les bases. Ce sont les seules commandes valides pour SMBF et BF:
> Move the pointer to the right
< Move the pointer to the left
+ Increment the memory cell under the pointer
- Decrement the memory cell under the pointer
. Output the character signified by the cell at the pointer
, Input a character and store it in the cell at the pointer
[ Jump past the matching ] if the cell under the pointer is 0
] Jump back to the matching [ if the cell under the pointer is nonzero
Les deux langues ont une bande mémoire où les valeurs sont stockées et modifiées. La seule différence de SMBF est que le code en cours d’exécution est également stocké sur la bande mémoire située à gauche du point de départ. Comme @SnoringFrog l'a souligné, pour obtenir des résultats différents avec SMBF et BF, il faut déplacer le pointeur de mémoire à gauche de l'origine. Dans l'interpréteur BF de Tio, le pointeur de mémoire est capable de se déplacer à gauche de l'origine et trouvera des 0 à la place des codes ascii du Polyglot que SMBF voit. Voici un exemple qui peut être exécuté à la fois en SMBF et en BF pour illustrer la différence.
Au début du polyglotte, les créations nécessitent la fin >
de la deuxième ligne et Perl6 exige que chaque >
soit précédé de la lettre <
. Alors, SM / BF commence par <>
laisser le pointeur de la mémoire à l’origine, puis frappe un [
qui saute des caractères offensants pour les deux langues à ]
la 6ème rangée.
Ensuite, nous incrémentons la cellule de mémoire d'origine pour les deux langues et nous déplaçons le pointeur de mémoire vers la gauche avec +<
. (Par convention, nous appelons la cellule de mémoire d'origine la cellule 0, les cellules situées à droite de l'origine 1, 2, ... et les cellules situées à gauche -1, -2,…). La cellule -1 contient le code asci du dernier caractère du polyglotte dans SMBF et 0 dans BF. Ainsi, lorsque le prochain [
est rencontré, seul BF passe au suivant ]
tandis que SMBF passe dans le code.
Lorsque SMBF le traverse, [.>-]
il affiche le 6 trouvé à la fin du polyglotte, puis ramène le pointeur de la mémoire à la cellule 0, en remettant sa valeur à zéro pour quitter le fichier ]
. À noter que les cassettes à cette pinte sont les suivantes: Les cellules négatives du SMBF contiennent le polyglotte, 0 et les cellules positives le zéro. Les cellules négatives et positives de BF contiennent zéro alors que la cellule d'origine en contient 1.
Ensuite, >
déplacez SMBF vers la cellule 1 et BF vers la cellule 0, permettant ainsi à BF d'entrer son bloc de code privé: [<+++++[>++++++++++<-][<<<]>+.---.>]
(j'en ai supprimé les caractères non-BF). Ici, nous revenons à la cellule -1 et initialisons notre variable de contrôle de boucle (cellule -1) à 5. Ensuite, nous entrons dans la boucle où nous ajoutons 10 à la cellule 0 et décrémentons la cellule -1 cinq fois avant de quitter la boucle où nous allons pointer sur la cellule -1 avec la valeur 0.
Ensuite nous rencontrons [<<<]
en pointant à zéro, donc BF ne passe pas par là. Le but ici est d’équilibrer un nombre de >
's avec des précédents <
pour que Perl6 ne s’échappe pas.
À ce stade, la cellule 0 a une valeur de 51. La valeur ascii de 4 est 52, nous déplaçons donc le pointeur vers la cellule 0, ajoutons 1, puis imprimons la valeur. Enfin, nous décrémentons la cellule 0 sur le caractère ascii 1 et imprimons à nouveau avant de placer le pointeur de la mémoire sur la cellule 1 (valeur 0) pour sortir après le ]
.
SMBF et BF touchent tous les deux la dernière [
ligne 8 alors que les deux reposent sur une valeur 0. Ainsi, les deux sautent devant le code Minimal-2D restant jusqu'à ce que ]
soit rencontrée sur la ligne 11. Mais sa durée est courte car la ligne 12 commence par une autre [
qui place les deux langues presque à la fin du polyglotte où aucune autre instruction n'est rencontrée.
Refactors
Minimal 2D
La réécriture de Minimal-2D visait principalement à sauvegarder des octets de manière similaire à la technique de multiplication de BF. Minimal-2D n'a cependant pas les caractères [
et ]
pour le contrôle de boucle. Au lieu de cela, il a ces commandes:
/ Skips next instruction if the data pointer is set to 0.
U Tells the program to switch to the up direction of processing instructions.
D Tells the program to switch to the down direction of processing instructions.
L Tells the program to switch to the left direction of processing instructions.
R Tells the program to switch to the right direction of processing instructions.
Celles-ci peuvent être utilisées pour produire la même structure logique, bien que de manière 2D, que celle de BF. Par exemple, BF ++++++[>++++++<-]>.
équivaut à ceci en Minimal-2D.
Voici une version simplifiée du code de Minimal-2D dans le polyglot, avec tout le code étranger supprimé et tous les caractères de substitution remplacés par #
.
###################D
###R+++++[D>+++++++L
###>
D>#U/-<+++L)
R+.----.R
La D
ligne 1 envoie le pointeur d’instruction à la L
ligne 8 du polyglotte qui envoie le pointeur à gauche. Ici, nous définissons la variable de contrôle de boucle (cellule 0) sur 7, déplaçons le pointeur de la mémoire vers la cellule 1 et entrons une boucle. En boucle, nous ajoutons 3 à la cellule 1, décrémentons la cellule 0 puis vérifions si la valeur de la cellule 0 est encore nulle. Sinon, nous ajoutons un autre 8 à la cellule 1, puis décrémentons et vérifions à nouveau. Le résultat de cette boucle est que la cellule 1 a la valeur 51 à la fin de la boucle (6 * 8 + 3).
Nous quittons la boucle en sautant U
dessus, en déplaçant le pointeur de mémoire dans la cellule 1 et en descendant puis à droite sur la ligne 11 du polyglotte. Et enfin, nous incrémentons jusqu'à la valeur ascii pour 4 puis décrémentons jusqu'à la valeur ascii pour 0 avant de partir à droite pour mettre fin au programme.
Rétine
Retina avait de nombreuses exigences avec lesquelles il était difficile de travailler pour tous les dérivés de la BF. Il n'aime pas les consécutives +
ou ne correspond pas ()
ou []
. Mais ce ne sont en réalité que des exigences pour toutes les autres lignes. Une grande partie du travail effectué pour BF, SMBF et Minimal-2D consistait donc à placer la majeure partie du code sur des lignes paires.
Le seul octet réservé uniquement à Retina est celui situé |
à la fin de la ligne 11. Pour citer @ ais523, «la plupart des expressions rationnelles se terminant par | correspondra à rien ". Sans cela, Retina renvoie 0. Pourquoi cela résout-il le problème, je ne le sais pas. Je n'ai pas trop eu à fouiller dans Retina, probablement parce que j'ai évité la longue file. Mais comme Prelude, j'ai constaté que je n'avais pas besoin de le comprendre autant que de savoir comment le déboguer, qui consistait principalement en la suppression de lignes (par multiples de 2) jusqu'à ce que j'ai trouvé la ligne. cela provoque sa rupture. J'ai deviné à ce correctif basé sur le commentaire de @ ais523, et a été récompensé. Je suis trop cool pour l'école, je suppose.
Cardinal
Il m'est arrivé d'aimer le placement de Minimal-2D par @ SnoringFrog par rapport au code de Cardinal. C'est un bon emplacement, car Cardinal ne contrarie pas Retina et semble permettre une imbrication avec Minimal-2D. Ainsi, lorsque je me suis mis en route pour transplanter les versions Minimal 2D et 2D, j'ai accompagné Cardinal. Cependant, Cardinal a subi quelques changements cosmétiques. Premièrement, j'ai jeté un >
début proche de sa déclaration #p x%>~~~+ +~*ttt*.x
pour Minimal-2D pour changer les pointeurs de mémoire dans sa boucle / Deuxièmement, j'ai tout déplacé d'un caractère à la droite pour donner à Minimal-2D l'espace nécessaire pour sortir de sa boucle gracieusement. Le p
dans cette aiguille est pour ce remplissage de caractère.
Befunge / 98
C'est en fait à Befunges que j'ai commencé à essayer de jouer au polyglotte, car le refactor C ++ a modifié tous les autres codes de langage 2D, à l'exception de celui-ci. En essayant d'apprendre que WTF se passait dans ce code, j'ai trouvé ceci dans la documentation de Begunge:
La .
commande extraira une valeur de la pile et la affichera sous la forme d'un entier décimal, suivi d'un espace , un peu comme Forth. ,
affichera une valeur, l'interprétera comme la valeur ASCII d'un caractère et affichera ce caractère ( non suivi d'un espace ) .
Bonté divine! Nous pouvons nettoyer les octets nuls sur la sortie. Après cela, il ne restait plus qu'à trouver comment entrer les valeurs asci les plus grandes et à séparer le code. Befunge-98 avait un code de saut ;
disant de sauter par- dessus l' [77*,68*,@
en ;[77*,68*,@;'1,'1,q
, qui nous a donné la ségrégation.
Befunge-98 avait aussi une commande ( '
) pour prendre le code ASCII du caractère suivant. Donc, '1,
prend le code code asci pour le caractère 1
, le place sur la pile, puis affiche le caractère asci pour la valeur supérieure de la pile avec ,
. Je dois juste faire ceci deux fois pour imprimer 11 et lâcher un q
pour quitter gracieusement.
Befunge proprement dit est un peu moins pratique, mais juste. Ici, nous devons effectuer un calcul pour mettre le code souhaité sur la pile. Heureusement, nos codes ont été facilement multipliés avec 7 * 7 et 6 * 8 avant la même commande de sortie ,
. Nous avons ensuite quitté Befunge @
avant que le code de son frère aîné ne contamine la sortie.
Minkolang
Après avoir trouvé un correctif pour les espaces de fin du Befunge, je me suis énervé sur l'idée de trouver un correctif pour Minkolang également. La documentation de Minkolang indiquait que la commande de sortie utilisée jusque-là fonctionnait de la même manière que l'interpréteur Befunge. O
Il se trouve qu’il s’agissait d’une autre commande de sortie, qui n’était pas décrite comme partageant cette attitude, alors j’ai pris une photo dans le noir et essayé d’afficher la chaîne "3"
. Victoire sans faille.
> <>
L'une des premières choses que j'ai regardées lorsque j'ai déplacé le code Minimal-2D était de vérifier que je pouvais le déplacer> <> avec lui. Si je devais gérer le transversalisme 2D polyglotte, j'allais traiter de toutes les transgressions. En gros, la chance m'a poussé dans la solution consistant ;n4
à mettre à la fin de la ligne 1 et à \D
reculer de la ligne 1. En passant, je ne savais pas que> <> pourrait être redirigé avant la réponse 40 car elle a été si bien contenue . J'aimerais penser que cela pourrait être utilisé plus tard pour diverger> <> d'un autre langage similaire.
Perl6
J'ai déjà évoqué certains des <>
problèmes d'équilibrage de Perl6 ailleurs dans cette réponse, je ne vais donc pas y revenir. Mais je tiens à souligner que je suis passé #>27.say#
à l'avant-dernière ligne. Cela n'a pas d'objet fonctionnel dans cette réponse. En fait, j'ai pris cette décision pour satisfaire une réponse différente, à savoir que je n'avais pas utilisé ce tour. J'ai décidé de simplement laisser tomber car je prévois de poster cette réponse à ma prochaine occasion et je ne voulais pas prendre la peine de la défaire et de la refaire.
Corrections de bugs
05as1e
05as1e n’a définitivement pas aimé le nouveau code Begunge autant que l’ancienne version. Je suppose que c'est le ,
s puisque c'est le seul personnage révolutionnaire. En tout état de cause, je devais reculer de la "
ligne deux pour masquer les commandes offensives, et je savais qu'il "
fallait y aller avant le chemin du code Befunge, car "
c'était un oui dans les deux langues. (Je peux juste inventer des termes comme yes-op right?) La <
bidimensionnalité de Line 2 est assez rigide, mais j’ai pu déplacer l’ ancien chemin de code de Begunge avec le "
. L' <
cependant était une exigence de Perl6. (Il doit y avoir un <
précédent avant tout >
.) J'ai été capable de déposer la première <
ligne à un endroit deviné par instinct et par avance, résolvant 05ab1e et le désaccord de Perl6.
Tourbillon
Les changements de Befunge sur la ligne 2 ont ajouté un supplément 1
au polyglotte avant la ligne Incident / Whirl. Cela a 1
amené Whirl à indiquer les mauvaises instructions sur le volant. La toute première 1
directive du préprocesseur du C / C ++ était uniquement une référence de numéro de ligne dans le code, et il pouvait tout aussi bien s'agir de tout autre numéro de ligne. J'ai donc modifié ce 4
paramètre de manière arbitraire afin de satisfaire Whirl.
Incident
La chaîne de détokenizing à la fin du polyglotte est bien connue à ce stade, donc je ne vais pas y entrer. J'ai retiré de la chaîne ce que je pouvais et ajouté les nouveaux jetons requis. Il y a 2 caractères détokenizing qui ne sont pas dans cette chaîne, mais que je devrais signaler. Tout d' abord, le deuxième R
en #R+.----.R >]|
est nécessaire ici parce que c'est un point de départ de Fusion, et il était plus sûr sur cette ligne parce qu'il y avait déjà un titre de point de départ de Fusion dans la même direction. Deuxièmement, l' x
en #= x
consiste à supprimer un jeton impliqué dans un ␉␊#
modèle, qui est devenu plus courant.
Autres
Hexagony, Whitespace et Prelude ont tous eu les ajustements mineurs habituels, mais rien d’autre ne mérite d’être évoqués.
Dernières pensées
C'est tout ce que j'ai pour cette réponse. Pour ceux qui recherchent un point de départ pour la réponse suivante, je suggérerais le mal. Cela semble fonctionner, même si je ne l'ai pas trop regardé de près, mais je suppose que cela ne serait pas trop difficile à intégrer. Je sais qu'il a une commande de saut qui devrait aider à passer au-delà du gros du polyglotte. Bonne chance.