# 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
␉
ist eine wörtliche Registerkarte, ␛
ein wörtliches ESC-Zeichen; Stack Exchange würde das Programm sonst lahm legen. Ich empfehle, das Programm aus dem Eingabefeld des TIO-Links unten zu kopieren, wenn Sie daran arbeiten möchten.
Probieren Sie es online!
VIP-Punktzahl (vielseitiger Ganzzahldrucker): 0,01329
Heruntergewirtschaftet
Dieses Programm druckt 41 in Brainf ***, 40 in Minimal-2D, 39 in CoffeeScript, 38 in C, 37 in C ++, 36 in Labyrinth, 35 in INTERCAL, 34 in Rail, 33 in Incident, 32 in Whirl, 31 in Modular SNUSP, 30 in Whitespace, 29 in Trigger, 28 in Brain-Flak, 27 in Perl 6, 26 in 05AB1E, 25 in Pip, 24 in Thutu, 23 in Hexagony, 22 in Underload,21 in Nim, 20 in Prelude, 19 in Reng, 18 in Cardinal, 17 in Julia, 16 in Pyth, 15 in Haystack, 14 in Turtlèd, 13 in Ruby, 12 in Fission, 11 in Befunge-98, 10 in Befunge- 93, 9 in Perl 5, 8 in Retina, 7 in Japt, 6 in SMBF, 5 in Python 2, 4 in> <>, 3 in Minkolang, 2 in V / Vim und 1 in Python 3.
Nachprüfung
Die meisten Sprachen werden vom oben gezeigten Testtreiber getestet. Sie können Reng testen hier und Modular SNUSP hier ; Sie geben je nach Bedarf 19 bzw. 31 aus.
Der Testtreiber wurde aktualisiert und enthält nun endlich den Tokenizer. Der gesamte C-Code wird aus Sicht des Bash-Skripts als Argument gespeichert. Ich habe auch die Ausgabe so geändert, dass nach jedem Token ein horizontaler Zeilenumbruch mit einem nachgestellten Leerzeichen angezeigt wird, anstatt dass vertikal ausgegeben wird. Dies war nur meine Vorliebe, um es an die Whitespace-Ausgabe anzupassen. Aber jeder andere kann es ändern, wenn er das Gefühl hat, dass es zu verwirrend ist.
Ich habe auch eine Testtreiberanpassung vorgenommen, um den Spaltenabstand für Turtlèds UFT8-Char im Rundown zu handhaben. Diese Fehlausrichtung hat mich verrückt gemacht! Das „Update“ ist ziemlich hackig, da es nur nach einem è sucht und die Spaltenbreite für diesen Fall ändert, aber es erledigt den Job.
Erläuterung
Zunächst möchte ich sagen, wie großartig @ SnoringFrogs Versatile Integer Printer Score Rundown-Code-Snippet aus dem letzten Beitrag war. Ich habe Antworten vor dem Posten eine Weile berechnet und dies hat mich erneut inspiriert, es klein zu halten. Ich denke, wir können die Antwort von @ sp3000 irgendwann schlagen.
Also habe ich angefangen, an dieser Antwort zu arbeiten, indem ich versucht habe, das Golf zu spielen, was ich konnte und ich war ziemlich erfolgreich. Ich hatte sogar eine Antwort in einer anderen Sprache mit einer Gesamtbytezahl von weniger als 40. Aber als ich versuchte, Minimal-2D zu spielen, musste ich BF lernen, damit ich besser mit seinen Derivaten arbeiten konnte. Dabei fand ich @ Primos Rekordverdächtigen Hello, World! . Ich habe mich in die Eleganz verliebt.
Wie sich herausstellte, war Minimal-2D nicht effizient genug, um die von @Primo verwendete Bandinitialisierungstechnik zu nutzen, aber ich bin der Meinung, dass es sowieso wahrscheinlich zu byteweise schwer sein würde. Wir versuchen nur, eine ganze Zahl zu drucken. Aber @Primo hat mich auf den Weg gebracht, um zu lernen, wie man in BF multipliziert.
Nach alledem las ich @ SnoringFrogs Kommentar über das Einfügen von BF noch einmal und erkannte, dass ich nicht nur das tun konnte, sondern auch einen Großteil des Minimal-2D-Codes verwenden konnte, den ich in der BF-Antwort verwendet hatte. Also habe ich mich eingegraben, um mit BF zu antworten, und hier sind wir.
Noch etwas, bevor ich auf die Details eingehe. Es gab ein paar Änderungen, die ich aus Nicht-Golf-Gründen vorgenommen habe. Zuerst habe ich den Großteil des Codes @SnoringFrog verschoben, der in den oberen Zeilen direkt unter den 2D-Sprachen hinzugefügt wurde. Für mich ist es ein langfristiger strategischer Schritt, zu verhindern, dass 2D-langs die Mitte des Polyglots durchquert, um zukünftige Bugs nach Möglichkeit zu verhindern. Der Bytetreffer war für diesen Zug gering, also habe ich mich dafür entschieden.
Zweitens habe ich während der verschiedenen Re-Faktoren erfahren, dass Begunges und Minkolang nach numerischen Ausgaben ein Leerzeichen ausgeben und dass dies die Ursache für die Null-Bytes ist, die wir im Test-Treiber für diese Sprachen gesehen haben. Ich habe dies behoben, indem ich den Wert des Stapels als ASCII-Code ausgegeben habe (der das abschließende Leerzeichen nicht enthielt), anstatt den Wert direkt. Auch für diese Änderung gab es einen kleinen Byte-Hit, aber jetzt ist die Ausgabe des Testtreibers so einheitlich. Wie könnte ich nicht?
SM / BF
Lassen Sie uns schnell die Grundlagen durchgehen. Dies sind die einzigen gültigen Befehle für SMBF und 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
Beide Sprachen haben ein Speicherband, auf dem Werte gespeichert und geändert werden. Der einzige Unterschied von SMBF besteht darin, dass der Code, der gerade ausgeführt wird, auch auf dem Speicherband links vom Startpunkt gespeichert wird. Wie @SnoringFrog ausführte, hängt es davon ab, ob der Speicherzeiger links vom Ursprung positioniert wird, damit SMBF und BF unterschiedliche Ergebnisse erzielen. In Tios BF-Interpreter kann sich der Speicherzeiger vom Ursprung nach links bewegen und findet die Nullen anstelle der ASCII-Codes des Polyglot, die SMBF sieht. Hier ist ein Beispiel, das sowohl in SMBF als auch in BF ausgeführt werden kann, um den Unterschied zu veranschaulichen.
Zu Beginn des Polyglots müssen die Befunges >
in der zweiten Zeile vollständig ausgeführt werden, und Perl6 erfordert, dass jedem >
ein vorangestellt wird <
. SM / BF beginnen also <>
damit, den Speicherzeiger am Ursprung zu belassen und drücken dann ein, [
wodurch einige anstößige Zeichen für beide Sprachen in ]
die sechste Zeile springen.
Als nächstes inkrementieren wir die Ursprungsspeicherzelle für beide Sprachen und bewegen den Speicherzeiger mit nach links +<
. (Aus Konversationsgründen nennen wir die Ursprungsspeicherzelle Zelle 0, Zellen rechts von Ursprung 1, 2, ... und Zellen links von -1, -2,…). Zelle -1 enthält den ASCII-Code des letzten Zeichens im Polyglot in SMBF und 0 in BF. Wenn also das nächste gefunden [
wird, springt nur BF zum nächsten, ]
während SMBF in den Code übergeht.
Beim Durchlaufen von SMBF wird [.>-]
die 6 gedruckt, die am Ende des Polyglots gefunden wurde, und der Speicherzeiger wird zurück auf Zelle 0 verschoben , wobei sein Wert auf Null zurückgesetzt wird, um das Dialogfeld zu verlassen ]
. Die Bänder in diesem Pint lauten: Die negativen SMBF-Zellen enthalten den Polyglot, und die positiven Zellen enthalten Null. Die negativen und positiven Zellen von BF enthalten Null, während die Ursprungszelle 1 enthält.
Anschließend wird >
SMBF in Zelle 1 und BF zurück in Zelle 0 verschoben, sodass BF den privaten Codeblock eingeben kann: [<+++++[>++++++++++<-][<<<]>+.---.>]
(Die Nicht-BF-Zeichen wurden entfernt.) Hier kehren wir zu Zelle -1 zurück und initialisieren unsere Schleifensteuervariable (Zelle -1) auf einen Wert von 5. Dann geben wir die Schleife ein, in der wir zu Zelle 0 10 addieren und Zelle -1 fünfmal dekrementieren, bevor wir die Schleife verlassen, in der Wir werden auf Zelle -1 mit einem Wert von 0 zeigen.
Als nächstes begegnen wir, [<<<]
während wir auf eine Null zeigen, damit BF dies nicht passiert. Der Zweck hier ist, eine Anzahl von >
's mit vorhergehenden <
' s auszugleichen, damit Perl6 nicht ausfällt.
Zu diesem Zeitpunkt hat die Zelle 0 den Wert 51. Der ASCII-Wert 4 ist 52, also bewegen wir den Zeiger auf die Zelle 0, addieren 1 und geben den Wert aus. Zum Schluss dekrementieren wir die Zelle 0 wieder auf das ASCII-Zeichen 1 und drucken erneut, bevor wir den Speicherzeiger auf Zelle 1 (Wert 0) setzen, um das zu verlassen ]
.
SMBF und BF treffen als [
nächstes die letzte Zeile 8, während sich beide auf einem 0-Wert ausruhen. So springen beide über den verbleibenden Minimal-2D-Code hinaus, bis ]
in Zeile 11 der gefunden wird. Dies ist jedoch kurzlebig, da Zeile 12 mit einer anderen beginnt, [
die beide Sprachen fast bis zum Ende des Polyglots führt, wo keine weiteren Anweisungen gefunden werden.
Refactors
Minimal-2D
Das Neuschreiben von Minimal-2D diente hauptsächlich dazu, einige Bytes auf eine Art und Weise zu speichern, die dem Multiplikationstrick von BF ähnelte. Minimal-2D verfügt jedoch nicht über die Zeichen [
und ]
für die Schleifensteuerung. Stattdessen hat es diese Befehle:
/ 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.
Diese können verwendet werden, um die gleiche Logikstruktur zu erzeugen, wenn auch in einem 2D-Manor, wie die von BF. Zum Beispiel BF ++++++[>++++++<-]>.
entspricht dies in Minimal-2D.
Hier ist eine vereinfachte Version des Minimal-2D-Codes im Polyglot, wobei der gesamte Fremdcode entfernt und alle Platzhalterzeichen durch ersetzt wurden #
.
###################D
###R+++++[D>+++++++L
###>
D>#U/-<+++L)
R+.----.R
Die D
In-Zeile 1 sendet den Befehlszeiger nach unten zur L
In-Zeile 8 des Polyglots, die den Zeiger nach links sendet. Hier setzen wir die Regelkreisvariable (Zelle 0) auf 7, bewegen den Speicherzeiger auf Zelle 1 und geben einen Regelkreis ein. In der Schleife addieren wir 3 zu Zelle 1, dekrementieren Zelle 0 und prüfen dann, ob der Wert von Zelle 0 noch Null ist. Wenn nicht, addieren wir eine weitere 8 zu Zelle 1, dekrementieren sie und überprüfen sie erneut. Das Ergebnis dieser Schleife ist, dass der Wert von Zelle 1 am Ende der Schleife auf 51 gesetzt wird (6 * 8 + 3).
Wir verlassen die Schleife, indem wir U
den Speicherzeiger auf Zelle 1 bewegen und dann in Zeile 11 des Polyglots nach rechts abwärts gehen. Und schließlich erhöhen wir den ASCII-Wert für 4 und verringern ihn dann auf den ASCII-Wert für 0, bevor wir nach rechts ablaufen, um das Programm zu beenden.
Retina
Retina hatte viele Anforderungen, mit denen es schwierig war, für alle BF-Derivate zu arbeiten. Es mag keine aufeinanderfolgenden +
oder nicht übereinstimmenden ()
oder []
. Dies sind jedoch nur die Anforderungen für jede zweite Zeile. Bei BF, SMBF und Minimal-2D drehte sich viel darum, den Großteil des Codes auf gerade nummerierte Zeilen zu setzen.
Das eine Byte, das nur für Retina bestimmt ist, steht jedoch |
am Ende von Zeile 11. Um @ ais523 zu zitieren: „Die meisten regulären Ausdrücke, die mit | enden passt zu allem “. Ohne dies gibt Retina 0 zurück. Warum dies das Problem behebt, weiß ich nicht. Ich musste mich nicht allzu sehr mit Retina beschäftigen, wahrscheinlich, weil ich die lange Warteschlange vermieden habe. Aber wie bei Prelude muss ich es nicht so sehr verstehen, wie ich es debuggen muss. In diesem Fall bestand es hauptsächlich aus dem Löschen von Zeilen (in Vielfachen von 2), bis ich die Zeile gefunden habe das bringt es zum brechen. Ich habe diesen Fix aufgrund des Kommentars von @ ais523 erraten und wurde belohnt. Ich bin einfach zu cool für die Schule, denke ich.
Kardinal
Ich mochte @ SnoringFrogs Platzierung von Minimal-2D relativ zu Cardinals Code. Es ist ein guter Ort, wenn man bedenkt, dass Cardinal Retina nicht verärgert, und es schien ein gewisses Verweben mit Minimal-2D zu ermöglichen. Als ich mich auf den Weg machte, Minimal-2D in 2D-Land zu verpflanzen, nahm ich Cardinal mit. Es gab jedoch ein paar kosmetische Änderungen an Cardinal. Erstens warf ich >
am Anfang seiner Anweisung #p x%>~~~+ +~*ttt*.x
für Minimal-2D ein, um die Speicherzeiger innerhalb seiner Schleife zu ändern. Zweitens habe ich alles um ein Zeichen nach rechts verschoben, um Minimal-2D Raum zu geben, um die Schleife ordnungsgemäß zu beenden. Das p
in diesem Stich ist für diese Zeichenauffüllung.
Befunge / 98
Die Befunges sind eigentlich der Ort, an dem ich angefangen habe, den Golfsport zu betreiben, da der C ++ - Refaktor alle anderen 2D-Sprachcodes außer diesem geändert hat. Beim Versuch zu lernen, dass WTF in diesem Code vor sich geht, habe ich Folgendes in der Begunge-Dokumentation gefunden:
Mit dem .
Befehl wird ein Wert aus dem Stapel entfernt und als Dezimalzahl ausgegeben, gefolgt von einem Leerzeichen , ähnlich wie bei Forth. ,
Fügt einen Wert ein, interpretiert ihn als ASCII-Wert eines Zeichens und gibt dieses Zeichen aus ( ohne Leerzeichen ).
Heilige Moley! Wir können die Null-Bytes in der Ausgabe bereinigen. Danach ging es nur noch darum, herauszufinden, wie man die größeren ASCII-Werte eingibt und den Code trennt. Befunge-98 hatte einen Sprungcode ;
es zu sagen über die überspringen [77*,68*,@
in ;[77*,68*,@;'1,'1,q
, die uns die Trennung gab.
Befunge-98 hatte auch einen Befehl ( '
), um den ASCII-Code des nächsten Zeichens zu übernehmen. Nimmt also '1,
den Code ASCII-Code für das Zeichen 1
, legt ihn auf den Stapel und druckt dann das ASCII-Zeichen für den obersten Wert auf dem Stapel mit ,
. Tun Sie dies einfach zweimal, um 11 zu drucken, und lassen Sie a fallen, q
um das Programm ordnungsgemäß zu beenden.
Befunge richtig ist etwas weniger bequem, aber eben nur. Hier müssen wir eine Berechnung durchführen, um den gewünschten Code auf den Stapel zu legen. Glücklicherweise konnten unsere Codes vor dem gleichen Ausgabebefehl leicht mit 7 * 7 und 6 * 8 multipliziert werden ,
. Dann verlassen wir Befunge, @
bevor der Code seines älteren Bruders die Ausgabe kontaminiert.
Minkolang
Nachdem ich einen Fix für die Trailing Spaces der Befunge gefunden hatte, war ich ziemlich begeistert von der Idee, auch einen Minkolang-Fix zu finden, und in der Dokumentation von Minkolang stand, dass der bis dahin verwendete Ausgabebefehl genauso funktionierte wie der Befunge-Interpreter. O
Zufällig wurde dies als ein weiterer Ausgabebefehl dokumentiert, der nicht als das Teilen dieser Begabung beschrieben wurde. Deshalb habe ich einfach eine Aufnahme im Dunkeln gemacht und versucht, die Zeichenfolge auszugeben "3"
. Makelloser Sieg.
> <>
Eines der ersten Dinge, die ich beim Verschieben des Minimal-2D-Codes sah, war die Überprüfung, ob ich> <> mitbewegen konnte. Wenn ich mich mit 2D-Polyglott-Transversalismus befassen wollte, würde ich mich mit allen Übertretungen befassen. Ich hatte im Grunde das Glück, mich in die Lösung zu begeben, ;n4
das Ende von Zeile 1 zu setzen und das Ende von Zeile 1 \D
weiter nach hinten zu verschieben. Übrigens wusste ich nicht, dass> <> vor Antwort 40 nach unten gerichtet werden konnte, da es so gut enthalten war . Ich würde gerne glauben, dass dies später verwendet werden könnte, um> <> von einer anderen ähnlichen Sprache abzuweichen.
Perl6
Ich habe <>
in dieser Antwort an anderer Stelle über einige der Probleme mit dem Perl6- Ausgleich gesprochen, daher werde ich nicht noch einmal darauf eingehen . Aber ich möchte darauf hinweisen, dass ich #>27.say#
zur vorletzten Zeile übergegangen bin . Dies hat in dieser Antwort keinen funktionalen Zweck. Ich habe diesen Schritt tatsächlich gemacht, um eine andere Antwort zu befriedigen, dass ich diese Runde letztendlich nicht benutzt habe. Ich beschloss, es einfach zu verlassen, da ich diese Antwort bei meiner nächsten Gelegenheit posten wollte und ich mich nicht darum kümmern wollte, sie rückgängig zu machen und erneut zu machen.
Fehlerbehebung
05as1e
05as1e mochte den neuen Begunge-Code definitiv nicht so sehr wie die alte Version. Ich nehme an, es ist das ,
s, da dies der einzige revolutionäre Charakter ist. Auf jeden Fall musste ich mich "
in Zeile zwei weiter nach hinten bewegen , um die beleidigenden Befehle zu verbergen, und ich wusste, dass das "
vor dem Befunge-Codepfad gehen musste, da "
es in beiden Sprachen ein Ja-Op gab. (Ich kann mir nur Begriffe wie yes-op ausdenken, oder?) Die 2-Dimension von Zeile 2 ist ziemlich starr, aber ich konnte den <
vor Begunges Code-Pfad durch den ersetzen "
. Das <
war jedoch eine Forderung des Perl6. (Es hat ein haben <
vorhergehend alle >
s.) Ich konnte die fallen <
durch den Instinkt und Vorwissen Lösung 05ab1e und Perl6 der Meinungsverschiedenheit erahnt in dem ersten Zeile an einer Stelle.
Wirbeln
Die Befunge-Änderungen in Zeile 2 haben 1
dem Polyglot vor der Incident / Whirl-Zeile ein Extra hinzugefügt . Dieses Extra führte dazu, 1
dass Whirl auf die falschen Anweisungen am Lenkrad zeigte. Das allererste 1
in der Präprozessor-Direktive von C / C ++ war nur ein Zeilennummernverweis im Code, und dies könnte genauso gut jede andere Zeilennummer sein, also habe ich dies willkürlich geändert 4
, um Whirl zu befriedigen.
Vorfall
Die Entschlüsselungszeichenfolge am Ende des Polyglots ist an dieser Stelle gut bekannt, daher werde ich nicht darauf eingehen. Ich entfernte von der Schnur, was ich konnte, und fügte die neuen Token hinzu, die benötigt wurden. Es gibt 2 aufschlussreiche Zeichen, die nicht in dieser Zeichenfolge enthalten sind, auf die ich jedoch hinweisen sollte. Zunächst wird der zweite R
in #R+.----.R >]|
benötigt hier , weil es sich um eine Fusion Ausgangspunkt ist, und es war sicherer auf dieser Linie , weil es bereits eine Fusion Ausgangspunkt Überschrift in der gleichen Richtung. Zweitens, die x
in #= x
ist ein Token in einem beteiligt zu entfernen ␉␊#
Muster, die häufiger geworden.
Andere
Hexagony, Whitespace und Prelude hatten alle die üblichen geringfügigen Anpassungen, aber nichts Besonderes, worüber man sprechen sollte.
Abschließende Gedanken
Das ist alles, was ich für diese Antwort habe. Für diejenigen, die nach einem Ausgangspunkt für die nächste Antwort suchen, würde ich das Böse vorschlagen. Es scheint praktikabel zu sein, obwohl ich es mir nicht zu genau angesehen habe, aber ich vermute, es wäre nicht zu schwer, es zu integrieren. Ich weiß, dass es einen Sprungbefehl gibt, der helfen soll, den größten Teil des Polyglots zu überspringen. Viel Glück.