Hinzufügen einer Sprache zu einem Polyglot


239

Dies ist eine Herausforderung , bei der jede Antwort auf die vorherige Antwort aufbaut. Ich empfehle, den Thread nach "ältesten" zu sortieren, um sicherzugehen, in welcher Reihenfolge die Posts erstellt werden.

Hinweis : Dies ist zu einer langwierigen Herausforderung geworden, und es ist ziemlich schwierig, neue Antworten zu veröffentlichen. Daher steht jetzt ein Chatroom für diese Herausforderung zur Verfügung, falls Sie Rat zu einem bestimmten Teil einer möglichen Antwort benötigen, Ideen für Sprachen haben, die hinzugefügt werden könnten, oder dergleichen. Schauen Sie doch einfach mal vorbei, wenn Sie etwas zu fragen oder zu sagen haben!

Die Aufgabe

Das n- te Programm, das eingereicht werden soll, muss in n verschiedenen Sprachen laufen . Insbesondere müssen alle in früheren Programmen hinzugefügten Sprachen und eine weitere eingereicht werden. Das Programm muss 1 ausgeben, wenn es in der ersten Sprache ausgeführt wird, die in Antworten auf diese Frage verwendet wird, 2, wenn es in der zweiten Sprache ausgeführt wird, und so weiter. Beispielsweise könnte die erste Antwort 1 ausgeben, wenn sie in Python 3 ausgeführt wird, und die zweite Antwort könnte 1 ausgeben, wenn sie in Python 3 ausgeführt wird, und 2, wenn sie in JavaScript ausgeführt wird. In diesem Fall müsste die dritte Antwort 1 ausgeben, wenn sie in Python 3 ausgeführt wird, 2, wenn sie in JavaScript ausgeführt wird, und 3, wenn sie in einer anderen Sprache ausgeführt wird.

Zusätzliche Regeln

  • Ihr Programm muss ohne Fehler oder Abstürze ausgeführt werden. Warnungen (und andere stderr-Ausgaben) sind akzeptabel, aber das Programm muss normal beendet werden (z. B. durch Abarbeiten des Programmendes oder über einen Befehl exit, der die normale Programmbeendigung ausführt).

  • Die Ausgabe muss nur die Ganzzahl sein, aber nachfolgende Zeilenumbrüche sind in Ordnung. Andere unvermeidbare Standardausgaben sind ebenfalls zulässig. Beispiele: Name und Version des Interpreten in Befunge-93, Leerzeichen nach der gedruckten Zeichenfolge in Zephyr. Einige Sprachen bieten zwei Druckmethoden - mit und ohne Leerzeichen; In diesem Fall muss eine Methode ohne Leerzeichen verwendet werden.

  • Jede Antwort darf nicht mehr als 20% oder 20 Byte (je nachdem, welcher Wert größer ist) länger als die vorherige Antwort sein. (Dies soll verhindern, dass Sprachen wie Lenguage den Faden spammen, und zumindest eine geringe Menge an Golfspielen fördern.)

  • Die Verwendung unterschiedlicher Versionen derselben Sprache ist zulässig (obwohl sie natürlich unterschiedliche Zahlen drucken müssen, sodass Sie einen Versions-Check in die Mehrsprachigkeit einfügen müssen). Sie können jedoch keine Sprachfunktion verwenden, die die Versionsnummer der Sprache zurückgibt. Es ist offensichtlich unmöglich, genau dieselbe Sprache zu wiederholen (da das Programm deterministisch eine von zwei verschiedenen Zahlen drucken müsste).
  • Tricks wie übermäßiger Missbrauch von Kommentaren sind hier in Ordnung, obwohl sie in einigen mehrsprachigen Wettbewerben verboten sind.
  • Sie müssen die vorherigen Antworten nicht als Anleitung zum Schreiben Ihrer eigenen verwenden (Sie können das gesamte Programm nach Belieben umschreiben, solange es der Spezifikation entspricht). Es ist jedoch zulässig und wahrscheinlich der einfachste Weg, eine Lösung zu finden, wenn Sie Ihre Antwort hauptsächlich auf eine vorherige Antwort stützen.
  • Sie können nicht zwei Antworten hintereinander einreichen. Lass jemanden dazwischen posten. Diese Regel gilt solange, bis die Siegbedingung erfüllt ist.
  • Da diese Herausforderung erfordert, dass andere Konkurrenten in denselben Sprachen wie Sie posten, können Sie nur Sprachen mit einer kostenlosen Implementierung verwenden (ähnlich wie bei einem Wettbewerb).
  • Wenn eine Sprache mehr als einen Interpreter hat, können Sie einen beliebigen Interpreter für eine bestimmte Sprache auswählen, sofern alle Programme, die in dieser Sprache erfolgreich ausgeführt werden sollen, dies in diesem Interpreter tun. (Mit anderen Worten, wenn ein Programm in mehr als einem Dolmetscher ausgeführt wird, können zukünftige Beiträge einen dieser Dolmetscher auswählen, anstatt dass ein Beitrag eine bestimmte Auswahl von Dolmetschern für eine Sprache "festlegt".)
  • Bei dieser Herausforderung werden jetzt die neuen PPCG-Regeln für die Sprachauswahl verwendet : Sie können eine Sprache oder einen Sprachinterpreter verwenden, auch wenn dieser neuer als die Frage ist. Sie dürfen jedoch keine Sprache / keinen Dolmetscher verwenden, der neuer ist als die Frage, wenn a) die Sprache zum Zwecke der Mehrsprachigkeit entwickelt wurde oder b) die Sprache von dieser Frage inspiriert wurde. (So ​​werden neu gestaltete praktische Programmiersprachen mit ziemlicher Sicherheit in Ordnung sein, ebenso wie unabhängige Esolangs, aber Dinge wie A Pear Tree , die von dieser Frage inspiriert wurden, sind verboten.) Beachten Sie, dass dies die Gültigkeit der entworfenen Sprachen nicht ändert für Polyglotten, die älter als diese Frage sind.
  • Beachten Sie, dass die Siegbedingung (siehe unten) so ausgelegt ist, dass Sie vom Gewinn ausgeschlossen werden, wenn Sie die Kette durchbrechen (dh wenn es niemandem möglich ist, mit einer Sprache zu antworten, die mit anderen Sprachen nur schwer zu verstehen ist). Das Ziel ist es, so lange wie möglich weiterzumachen, und wenn Sie gewinnen wollen, müssen Sie dies respektieren.

Antwortformat

Da alle Antworten voneinander abhängen, ist ein einheitliches Antwortformat hilfreich. Ich empfehle, Ihre Antwort so zu formatieren (dies ist ein Beispiel für das zweite Glied in der Kette):

2. JavaScript, 40 Bytes

(program goes here)

Dieses Programm druckt 1 in Python 3 und 2 in JavaScript.

(Wenn Sie das Programm, die Polyglottetechniken usw. erläutern möchten, platzieren Sie sie hier.)

Siegbedingung

Einmal gibt es keine neue Antworten für 14 Tage, wird der Sieger sein , wer die gebuchten zweiten neueste Antwort, dh die größten polyglott , die die Kette nicht gebrochen haben bewiesen worden sind. Eine Verlängerung der Kette danach ist jedoch immer noch sehr willkommen!

Der Gewinner ist Chance , siehe Antwort 194 (TemplAt) .

Sprachliste


3
Für Leute, die gelöschte Beiträge sehen können: Der Sandbox-Beitrag war hier .

5
Es ist nicht erforderlich, das vorherige Programm zu kopieren, obwohl Sie es natürlich als Leitfaden verwenden können. Das Wiederherstellen des Programms von Grund auf wird wahrscheinlich länger dauern! Es ist nicht nötig, auf Antworten zu verlinken. Wenn Sie nach den ältesten sortieren, werden alle Antworten bereits in der richtigen Reihenfolge angezeigt.

3
@ ais523 Ich denke was gemeint war, dass neue Antworten enthalten sollen, versuchen Sie es mit dem neuen Code zu verknüpfen?
Blue

5
Ich denke, wir brauchen ein Skript, das einen Hex-Dump des Codes erstellt und ihn automatisch in allen Sprachen
ausführt

3
Dies ist der vielseitige Ganzzahldrucker, der als eine andere Art von Herausforderung veröffentlicht wurde. (Inspiration?) Die endgültige Antwort (derzeit) würde punkten 0.0127, nur von Sp3000's 30-sprachigem Beitrag übertroffen ... :)
Stewie Griffin

Antworten:


80

Hinweis: Wenn dies zuerst angezeigt wird, möchten Sie möglicherweise nach dem ältesten sortieren

17. Julia (128 Bytes)

#v`16 "<" 6/b0\ .q@#;n4"14""
#>3N9@15o|R"12"*^
#=|
print((1/2and 9 or 13)-(0and+4)^1<<65>>62);# =#;print(17)
#gg99ddi2` |1|1+6

In der letzten Zeile befinden sich zwei ESCs, einer vor dem ersten gund einer nach dem 2. Dies könnte mehr Golf gespielt werden, aber dank V und Pyth wurde es unordentlich.

Druckt 1 in Python 3, 2 in V, 3 in Minkolang, 4 in> <>, 5 in Python 2, 6 in SMBF, 7 in Japt, 8 in Retina, 9 in Perl, 10 in Befunge-93, 11 in Befunge -98, 12 in Fission, 13 in Ruby, 14 in Turtléd, 15 in Haystack, 16 in Pyth und 17 in Julia .


Hinweise:

  • Der Anfang der vierten Zeile ist Python 2/3, Perl, Ruby. Das Ende ist Julia, dank #=mehrzeiliger Kommentare (beachte, dass Julia keine hat and/or).
  • V ist <ESC>gg99ddi2<ESC>, das ist definitiv Golf, aber V ist ärgerlich zu testen. Probieren Sie es online aus! da der dolmetscher ziemlich langsam ist.
  • Minkolang und Haystack gehen am ersten runter v. Befunge-93 und -98 nicht und hängen von a ab b.
  • Retina zählt die Anzahl der Leerzeichen und Einsen in der vierten Zeile, und V verbirgt sich in der Konfiguration für Retina (dh vor dem Backtick).
  • Gemäß dem Hinweis von @ ETHproduction verwendet Japt Backticks, um den größten Teil des Codes in einem String zu verbergen.
  • Spaltung ist R"12"*.
  • SMBF wurde <.in der ersten Zeile plus dem Finale zum Golfen 6.

24
Wo ist der Code aller anderen geblieben
Alfie Goodacre

13
159 Bytes bis 128 Bytes? Wow, das ist exzellentes Golfen!
Kühe quaken

6
Schön, 2 ^ 7 Bytes
Tomsmeding

7
Wow ... unglaublich! Wir werden eine neue Erklärung für jede Sprache schreiben müssen, wenn alles gesagt und getan ist ;-)
ETHproductions

4
@AlfieGoodacre "Sie müssen die vorherigen Antworten nicht als Leitfaden für das Schreiben Ihrer eigenen verwenden (Sie können das gesamte Programm nach
Belieben

52

23. Hexagony , 186 Bytes

Entschuldigung, wenn dies Pläne durcheinander bringt ...

#v`16/"<"6/b.q@"(::):::  (22)S#;n4"14"
#>3N6@15o|> ^*ttt*~++~~~%
#=~nJ<R"12";
#[

print((1/2and 9 or 13)-(0and+4)^1<<65>>62)#46(89999+++++!)=#print(17)#0\32=""<0]#echo 21
#8␛dggi2␛` |1|6

␛ wird verwendet, um ein buchstäbliches ESC-Zeichen darzustellen.

Drucke:

23 in Hexagony , 22 in Underload, 21 in Nim, 20 in Prelude, 19 in Reng ( hier testbar ), 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, 8 in Retina, 7 in Japt , 6 in SMBF, 5 in Python 2, 4 in> <>, 3 in Minkolang, 2 in Vim / V und 1 in Python 3.

Um zu den nicht verknüpften Sprachen zu gelangen, klicken Sie auf die change languageSchaltfläche oben rechts im Hexagony-Link.


Hexagony ist in diesem Format (überhaupt) nicht lesbar. Wir müssen es in sechseckiger Form betrachten.
Beachten Sie, dass die 2 ESC-Zeichen durch s ersetzt wurden, damit Sie sie sehen können. Sie werden ignoriert, sodass keine anderen im Programm sind:

        # v 1 6 / " < " 6
       / b . q @ " ( : : )      A lot more readable, right?? No?
      : : : ( 2 2 ) S # ; n
     4 " 1 4 " # > 3 N 6 @ 1
    5 o | > ^ * t t t * ~ + +
   ~ ~ ~ % # = ~ n J < R " 1 2
  " ; # [ p r i n t ( ( 1 / 2 a
 n d 9 o r 1 3 ) - ( 0 a n d + 4
) ^ 1 < < 6 5 > > 6 2 ) # 4 6 ( 8   | Note that the 0s below can be replaced
 9 9 9 9 + + + + + ! ) = # p r i    | With anything (except "`" or " "), 
  n t ( 1 7 ) # 0 \ 3 2 = " " <     V as far as Hexagony is concerned
   0 ] # e c h o 2 1 # 8 ␛ d g
    g i 2 ␛ | 1 | 6 . . . . .    <-- the ␛ represents an esc
     . . . . . . . . . . . .         character
      . . . . . . . . . . .
       . . . . . . . . . .       A "." is a no-op
        . . . . . . . . .
                ^
                | Mirror wraps to here, going NW

Für diejenigen, die mit Hexagony nicht vertraut sind , gibt es 6 IPs, die an den 6 Ecken beginnen. Es ist immer nur 1 aktiv und wird mit umgeschaltet #][. Das Speichermodell ist für dieses Programm nicht so wichtig, könnte aber in Zukunft zum Verständnis notwendig sein. Alles, was Sie wissen müssen, ist, dass 1 int in einer "Memory Edge" (kurz ME) gespeichert ist, und '"}{ändern Sie die ME, die aktiv ist.

\/|_>< sind Spiegel, die den Programmfluss steuern.

So funktioniert es:

Erste Zeile ausgeführt:

#       A no-op (sets active IP to 0, the currently active one)
 v      letter chars set the ME to their ASCII value - so ME is now 118
  16    Like Labyrinth, 0-9 multiplies ME by 10 and is added - ME now 11816
    /   A mirror that sends IP going NW by wrapping to the bottom

Die Unterseite (Ausschnitt vertikal gespiegelt, damit Sie von oben nach unten lesen können):

    .   
   .    A series of no-ops. The IP is going NW now,
  .     because of the mirror on the top.
 .
|       Another mirror. This one sends the IP NE, into the h
 h      sets the ME to 104, the ASCII value for h
  #     104 % 6 == 2, so IP 2 is now active instead of 0

Der rechte Rand:

        8  IP #2 is moving SW, starting in the right corner 
       i   Sets the ME to 105
      <    Mirror. Sends the IP going due West
    ""     These change the Active ME - just know that the new edge is 0
   =       Changes the MP (more in specs) - effectively a no-op used to fill space
\32        pushes 23, and mirrors up NE to the !

Das letzte Bit des relevanten Codes:

!          Prints the current value of the ME as an int. Success!
 20(R~     Does things to the ME - irrelevant now
      @    Ends the program!

Dinge zu beachten:

  • Hexagony löscht alle s und `s vor der Ausführung, sodass Änderungen an diesen Hexagony nicht beeinflussen
  • Ich musste den Code so auffüllen, dass er als ein Sechseck mit 9 Längen anstatt als ein Achtel interpretiert wurde - seien Sie vorsichtig, wenn Sie unter 169 oder über 217 relevanten Zeichen spielen
  • Aus diesem Grund können die ~~~und die 2 0s am Ende geändert werden, ohne den Code zu beschädigen
  • Das =""verschiebt den ME einfach vom vorherigen weg, so dass ein neuer ME geändert werden kann. Sie können durch andere Zeichen ersetzt werden, die dasselbe tun, ohne das Hexagony-Programm ( 'z. B.) zu beschädigen.
  • Dies ist technisch nicht mit den Befunge 93-Spezifikationen vereinbar, da hierdurch der Begrenzungsrahmen des Codes auf 80 mal 25 Zeichen begrenzt wird. Die meisten Interptreter ignorieren jedoch diese Spezifikation (wie TIO). Ich persönlich halte es also nicht für eine so große Sache. Wenn Sie dies tun, können Sie gerne einen Kommentar hinterlassen. (Wenn genug wirklich will, dass ich es ändere, werde ich es versuchen)
  • Hoffe, es ist jetzt nicht zu schwer.

1
Dies könnte leicht zum verrücktesten Programmablauf werden, wenn es richtig gemacht wird. Ich war kurz davor, es mit einem Sechseck der Größe 8 durch eine verrückte @ ## -Methode zu schaffen, aber 9 war viel einfacher, als ich das versuchte. Außerdem arbeitet TIO v1 viel schneller, aber Sie können die Sprache nicht einfach wechseln.
MildlyMilquetoast

Ich würde Labyrinth als nächstes vorschlagen, aber ich möchte das tun.
MildlyMilquetoast

Ich bin nicht fähig genug, selbst so etwas zu schreiben, aber in der Zwischenzeit warte ich darauf, dass Cubix auftaucht.
Pavel

@pavel Ich kenne diese Sprache nicht. Ich nehme an, es ist 3D. Hört sich cool an. Es gibt auch einige Pilze, die 3D sind, könnte eine interessante Ergänzung sein
MildlyMilquetoast

Ich vermute, es ist am einfachsten, so etwas beizubehalten, solange wir uns noch auf dieser Seitenlänge befinden, und den Hexagony-Code einfach neu zu schreiben, wenn wir auf die nächste Größe aufsteigen. In Bezug auf 3D-Sprachen sollte Trefunge relativ einfach zu installieren sein, vorausgesetzt, keine der vorhandenen Sprachen gerät beim Auftreten von Formfeeds in Panik. (Cubix wurde auch früher gepostet, aber gelöscht, weil das Poster es für zu schwierig hielt; die gleichzeitige Beibehaltung von Hexagony und Cubix könnte ziemlich verwirrend sein ...)

52

50. Bash, 1024 Bytes

#16  "(}23!@)" 3//v\D(@;'[af2.qc]GkGGZ'#)"14";n4
#/*` "[!PPP(22)SP(>7 7*,;68*,@;'1,@ ␉␉␉␉ q
#>␉
# >36!@␉
#`<`
#<]+<[.>-]>[
#{
#z}
#
#=<xR+++++[D>+++++++L+++<-][pPLEASE,2<-#2DO,2SUB#1<-#52PLEASE,2SUB#2<-#32DOREADOUT,2DOGIVEUPDOiiipsddsdoh@O6O4/]>+.-- -. >][
#Rx%>~~~+ +~*ttt*.x
#D>xU/-<+++L
#R+.----\).>]|
#[#[/v/v(/0l0v01k1kx0l0ix0jor0h0h1d111x0eU0bx0b0o1d0b0e0e00m1d0i0fx0g0n0n11x0o0n0cx0c0o0f0c0gx0g0f0h0j0j0i0001k10vx0v0l111111^_)  0046(8+9+9+9+9+=!)
###|
'\';echo 50;exit;';print((eval("1\x2f2")and(9)or(13))-(0and 4)^1<<(65)>>(62))or"'x"or'({({1})({1}[(0)])}{1}\{1})'#}#(prin 45)(bye)|/=1/24=x<$+@+-@@@@=>+<@@@=>+<?#d>+.--./
__DATA__=1#"'x"//
#.\."12"__*'
###;console.log 39
""""#//
=begin //
#ssseemeePaeueewuuweeeeeeeeeeCisajjapppp/*/
#define z sizeof'c'-1?"38":"37"
#include<stdio.h>
main(  )/*/
#()`#`\'*/{puts(z );}/*'``
<>{# }//
#}
disp 49#//
#{
1}<>//
$'main'//
#-3o4o#$$$
#< >"3"O.
=end #//
"""#"#//
#}
#|o51~nJ;#:p'34'\
#ss8␛dggi2␛ `|1|6$//''25  =#print(17)#>27.say#]#print(47)#]#echo 21#ss*///nd^_^_Z222999"26

Möchten Sie mehr erfahren? Probieren Sie den Polygot-Chat aus !

Probiere sie online aus!

Wie üblich habe ich aufgrund der Einschränkungen von Stack Exchange die literalen Tabulatoren durch und die literalen ESC-Zeichen durch ersetzt. Sie können eine leicht kopierbare Version des Programms aus dem "Eingabefeld" des obigen TIO-Links erhalten.

Heruntergewirtschaftet

Dieses Programm druckt 50 in Bash, 49 in Octave, 48 in Deadfish ~, 47 in Lily, 46 in Cubix, 45 in PicoLisp, 44 in Alphuck, 43 in Reticular, 42 in Evil , 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 obigen Testtreiber getestet. Die üblichen vier Täter müssen separat getestet werden:

  • Incident wurde mit seinem offiziellen Dolmetscher offline getestet.

  • Deadfish ~ wurde auch mit seinem offiziellen Interpreter offline getestet.

  • Modulares SNUSP wurde hier online getestet ;

  • Reng wurde hier online getestet .

Erläuterung

Ich suchte in verschiedenen Quellen nach Sprachen, die ich hinzufügen konnte. Eine Möglichkeit bestand darin, eine Sprache mit #Zeilenkommentaren zu finden, die plausibel zur Zeile "Skriptsprache" hinzugefügt werden kann (die Perl, Python 2 und 3 sowie Ruby behandelt). Es hat eine Weile gedauert, bis ich eine geeignete Sprache gefunden hatte, die syntaktisch mit den bereits vorhandenen kompatibel sein könnte.

Es stellt sich heraus, dass die Antwort mich seit Ewigkeiten ins Gesicht starrt. Wenn Sie oben auf den TIO-Link klicken, wird der in bash geschriebene mehrsprachige Testtreiber geöffnet. Die ganze Zeit hatte ich einen Tab mit der Aufschrift "Bash - TIO Nexus". Du hättest gedacht, das wäre ein Hinweis, aber anscheinend habe ich ihn verpasst. Als Bonus ist bash auch eine Skriptsprache, daher ist der Begriff "Skriptsprachenzeile" immer noch angemessen.

Das Bash-Programm startet an derselben Stelle wie die anderen Skriptsprachen. Es gibt jedoch eine ziemlich einfache Möglichkeit, sie von ihnen zu trennen. Ist in Strings in einfachen Anführungszeichen \ein Escapezeichen in den meisten Sprachen, jedoch nicht in Bash. So können wir Bash-Code vor den anderen Sprachen verbergen. Dies '\'…';ist eine entartete Anweisung (ohne Wirkung) in Perl, Python und Ruby, die jedoch in Bash ausgeführt wird. echo 50;exitist eine ziemlich einfache Möglichkeit, das Bash-Programm zu beenden. Naja fast.

Das größte Problem hierbei ist, dass bash beim Ausführen exitdas Parsen bis zum Ende der aktuellen Zeile fortsetzt (auch wenn der betreffende Code nicht ausgeführt wird). Daher müssen wir sicherstellen, dass im Rest keine Syntaxfehler auftreten die Linie. Wir haben ein 'kurz danach exit;nicht (und kann nicht) sofort abgestimmt werden. Später in der Zeile '…'wird verwendet, um etwas Brain-Flak-Code vor den Skriptsprachen zu verbergen, aber das würde es vor Bash verbergen. Infolgedessen müssen wir ändern, welche Art von Zeichenfolgenliteral wir verwenden, um den Code auszublenden, und von einfach in Anführungszeichen gesetzten Zeichenfolgen zu doppelten Anführungszeichen wechseln. or"'"erledigt den Trick, ohne Perl, Python oder Ruby zu stören (da das Argument auf der linken Seite in jedem Fall wahr ist).

Wir haben jetzt ein unübertroffenes doppeltes Anführungszeichen, das sich auf eine zukünftige Zeile erstreckt. Es war ziemlich schwierig, es zu schließen, ohne mindestens eine andere Sprache zu stören. Was wir tatsächlich tun, ist, die Art und Weise, wie wir Code vor Bash verbergen, vom doppelten Anführungszeichen zurück zu einem unvergleichlichen einfachen Anführungszeichen in einem Python / Ruby-Kommentar in der nachfolgenden Zeile zu ändern und schließlich das einfache Anführungszeichen am Ende der Zeile zu schließen.

Pyth und 05AB1E

Das Herumspielen mit doppelten Anführungszeichen stört auch die Sprachen, die doppelte Anführungszeichen zum Ausblenden von Code, Pyth und 05AB1E, verwendeten. Der Haupttrick, den wir hier anwenden, besteht darin, sicherzustellen, dass jedes doppelte Anführungszeichen, das wir hinzufügen, bald danach ein weiteres doppeltes Anführungszeichen enthält, um so wenig Code wie möglich verfügbar zu machen. (Dies erklärt das zusätzliche Anführungszeichen in der __DATA__Zeile, das für bash nicht erforderlich ist.) Pyth verwendet \als Escape-Zeichen. Das Fazit ist, dass es den Spielraum für das Herumspielen mit Strings in den Skriptsprachen einschränkte und mich dazu zwang, die oben beschriebene, recht verworrene Methode zu verwenden (da ich den Unterschied im \Verhalten zwischen bash und allem nicht leicht nutzen konnte sonst). Dient in 05AB1E 'als Escape-Zeichen außerhalbStreicher, und es "würde nicht genügen , wenn es dem führenden entgeht. Daher musste ich xin den "'"Konstrukten, die zum Wechseln zwischen Bash-Anführungszeichenstilen verwendet werden, ein unnützes Füllzeichen platzieren (standardmäßig wie üblich ; das erleichtert das Lesen!) .

Auftakt

Bei weitem die schwierigste Sprache, um hier zu beheben. Das Problem ist, dass die Skriptzeile mit all ihren Klammern seitwärts verschoben wurde und somit der Prelude-Kontrollfluss (der sich stark auf die Art und Weise auswirkt, in der Klammern vertikal ausgerichtet sind) vollständig zerstört wurde. Ich musste also versuchen, etwas zu rekonstruieren, das funktioniert.

Schlimmer noch, die aktuelle erste Zeile (die ich eigentlich nicht umschreiben wollte) schränkt die Anzahl der Klammern ein. Es beginnt mit einer Ziffer ungleich Null (zwei davon sogar!) Und wird bald von einer öffnenden Klammer gefolgt. Dies ist eine Schleife in Prelude, und Schleifen, die zu Beginn des Kontrollflusses in Prelude ausgeführt werden, verursachen eine Reihe verschiedener Probleme (hauptsächlich, weil mehr Code ausgeführt wird als weniger). Daher musste ich unbedingt eine 0-Iterationsschleife in einer anderen Zeile öffnen, um diesen Code zu überspringen. Die mainZeile für das C-Programm ist sehr gut geeignet, aber wir müssen sehr vorsichtig sein, wo sich die passende schließende Klammer befindet. zu weit rechts und die unübertroffene Klammer an der#R+Zeile verursacht Probleme, zu weit links und es wird nicht genug Code auskommentiert. (Beachten Sie, dass eine öffnende Klammer in einer Zeile mit einer schließenden Klammer in einer anderen Zeile übereinstimmen kann.)

Sobald dies erledigt ist, haben wir gerade genug Platz, um eine öffnende Klammer in der Incident-Zeile einzufügen, und wir haben endlich die ersten Zeichen des Programms hinter uns gelassen. Der Unterschied bei den Platzierungen in Klammern führt jedoch dazu, dass ein Teil des Incident / Whirl-Codes tatsächlich in Prelude ausgeführt wird, wodurch der Stapel beschädigt wird. Anstatt dies zu verhindern, habe ich einige von Whirls Nullen nach rechts verschoben, damit sie uns wieder ein funktionierendes Prelude-Programm geben können.

Eine weitere kleine Änderung befand sich in der ersten Programmzeile. Die letzte Klammer der Zeile befand sich in einer Position, die sehr schwer zu vermeiden war. Ich habe cgleich nach dem Pyth-Code einen zusätzlichen Code eingefügt, um ihn nach rechts zu verschieben. (Viele Sprachen analysieren diesen Punkt des Programms, so dass es eine erstaunliche Menge an Versuch und Irrtum erfordert, ein Füllzeichen zu finden, das nicht mindestens eine Sprache zerstört!)

Vorfall

Das Präludium war an sich schon hart genug, aber Präludium und Incident gleichzeitig zum Laufen zu bringen, war ein Albtraum. Prelude legte dem Code eine Menge Einschränkungen auf, die mich daran hinderten, Dinge frei zu bewegen, und erschwerten so das Golfspielen bei versehentlicher Token-Konstruktion. Beispiel: In Prelude muss nur ein Token 0nach rechts verschoben werden. Dies führte jedoch dazu 00, dass ein Token fehlschlug und einige der Token, die wir als Teil des Incident-Programms wollten, beschädigt wurden (wenn sich zwei Token überlappen, werden beide zurückgewiesen und Das 00überlappte ein Token, das wir wollten (zusätzlich zu der Überlappung selbst). Ich musste beide herausziehen, um eine vierte Kopie anzufertigen und zu verhindern, dass sie überhaupt als Token betrachtet wurde.

Subtiler sind die Token ;'und ␠␠(dh zwei Leerzeichen). Das Problem ist , dass diese beide scheinen vor dem , kGdass zu Beginn des Programms zu springen verwendet wird, und bricht somit Vorfall des Steuerfluss (zusätzlich zu dem Programm Mittelpunkt zu brechen).

Das Entfernen einer Kopie von ␠␠durch Zerlegen erscheint nicht sinnvoll. Es könnte möglich sein, es überlappend zu entfernen (dies ␠=ist eine vielversprechende potenzielle Überlappung), aber es ist mit ziemlicher Sicherheit weniger ausführlich, nur eine vierte Kopie hinzuzufügen, wie ich es hier getan habe.

In der Zwischenzeit können wir für einen anderen Trick verwenden ;'. Ich wollte es nicht versuchen, es aufzubrechen, da es in relativ raumsensiblen Situationen verwendet wird. Es ist jedoch nicht so kurz vor dem Start des Programms (obwohl es in der ersten Zeile angezeigt wird), so dass es plausibel ist, dass wir darüber springen könnten (was dazu führt, dass es den Kontrollfluss nicht beeinflusst), anstatt dass es nicht vorhanden sein muss. Ich suchte nach einem geeigneten Token für den Sprung, der keine der anderen Sprachen vermasselte. /verscheint etwas früher in der ersten Zeile und bricht nichts, und so habe ich es benutzt.

50 Sprachen in 1 Kib Code

@MistahFiggins wies darauf hin, dass meine 1025-Byte-Übermittlung weitaus ordentlicher wäre, wenn es 1024 Byte wären (zumal die fünfzigste Sprache für sich genommen ein Meilenstein ist). Hierfür musste irgendwo ein Einsparungsbyte gefunden werden. In diesem Fall habe ich drei Bytes im Deadfish ~ gespeichert, und zwar auf Kosten von zwei zusätzlichen Bytes, mit denen Incident-Token korrekt ausgerichtet wurden, und damit das Programm genau auf 1024 Bytes reduziert.

Zuvor lautete die Formel, die der Deadfish ~ -Code verwendete, (2² + 2) ² + 10 × 1 + 2 = 48. Die neue Formel lautet (3²-2) ²-1 und ergibt ebenfalls 48. Überraschenderweise ist dies nicht der Fall viel kürzer in Deadfish ~ zu schreiben, obwohl es wesentlich einfacher ist.

Dies gibt uns auch eine VIP-Punktzahl von .008192. Dies ist nicht nur ein neuer Rekord, sondern auch eine schöne runde Zahl für sich (was offensichtlich eine Folge der Verwendung von schönen runden Zahlen als Eingaben in die Formel ist).


2
Es tut uns leid, dass ich keinen TIO habe> _> (Mit freundlichen Grüßen, Schöpfer von Reng)
Conor O'Brien

@ ConorO'Brien Ping Dennis? Außerdem, ais523, sollten Sie versuchen, ein einzelnes Byte
abzuspielen

1
Sie können den Raum schneiden , puts(z )wenn Sie tauschen (und Pin Zeile 2, dank Sie den Auftakt Spielraum Sie erstellt haben. Bravo zu dieser Antwort. # 50in1k
Chance

1
Zufällig habe ich ein anderes Byte abgespielt. Jetzt ist es genau um 1024, ich möchte es nicht wirklich ändern :-) Vielleicht kann eine spätere Antwort einige der Einsparungen, die wir haben, einsparen; Es gibt wahrscheinlich viel mehr (z. B. liegt wahrscheinlich eine alte Auffüllung / Aufdeckung von Vorfällen herum, die nicht mehr benötigt wird).

6
@ ais523 vereinbart. Diese Antwort sollte immer 1024 Bytes betragen.
Chance

38

37. C ++ (gcc), 776 Bytes

#  1"16" 2//v\(;@#/;n4"14"
#/*`3 auaaZ<>16/"<"6/b.q@")(22)S#  ␉␉␉␉ 
#yy␉;36!@
# ␉
#=␉>
#[#yy#yy0l0mx01k1k0l0ix0jx0h0h1d111P0eU0bx0b0o1d0b0e0e00x1d0i0fx0g0n0n11x0o0n0cx0c0o0f0c0gx0g0f0h0j0j0i0001k10mx0m0l11111100(^_)
#`<`␉|
print((eval("1\x2f2")and( 9 )or(13 ))-(0and 4)^1<<(65)>>(62))or'(\{(\{})(\{}[()])}\{}\{}\{})'#46(8+9+9+9+9+=!)#1|=/=1/24=x=9[<$+@+-@@@@=>+<@@@=>+<?#>+.--.]/
__DATA__=1#//
#.\."12"*␉
""""#//
=begin␉//
#*/
#include<iostream>␉
int main()  /*/
#()"`#"\'*/{std::cout<<37;}/*'"`"
$'main'␉//
#-3o4o#$$$
<>3N.<>␉//
#xx
#x%~~~+␉+~*ttt*.x
#xx
=end   #//
"""#"#//
#0]#echo 21#/(\[FAC,1<-#2FAC,1SUB#1<-#52FAC,1SUB#2<-#32FACLEGEREEX,1PLEASEGIVEUPPLEASE)  ap
#_~nJ|#o51\   
#0␛dggi2␛`␉|1|6$//''25  >>>>>#>27.say# =#print(17)#^_^_7LEintndus({})!<>+]/*///Z222999/3!@"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.

Probiere sie online aus!

Heruntergewirtschaftet

Dieses Programm druckt 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.

Ich habe der Testtreiberausgabe ein anderes Format hinzugefügt, das doppelte Anführungszeichen vermeidet und Zeilenvorschubersetzungen vornimmt. Auf diese Weise kann ich die einzeilige Zeichenfolge in ein ac (gcc) -Programm einspeisen, das ich hier um die von @feersum erstellte Funktion gewickelt habe . Hoffentlich können andere es so nutzen, wie es ist.

Hier ist das Incident-Token-Programm . Im Idealfall möchte ich die Token abgrenzen, da sie etwas schwer zu lesen sind, das "mittlere" Token angeben und es in den Testtreiber aufnehmen. Aber ich weiß nicht wirklich, wie ich etwas anderes machen soll, als verschiedene Programme sequentielle Ganzzahlen drucken zu lassen, also ist dies soweit ich weiß.

Ich habe versucht, die offensichtlichen Incident-Probleme zu lösen, z. B. Token nach dem Anfangs- und Endsprung-Token und alles, was fremd aussah, aber ich habe die Token nicht ausgeglichen, um sie 0oin die Mitte zu stellen. Ich bin mir nicht wirklich sicher, wie die Logik genau aussieht, um das Zentrum zu bestimmen. Ich hoffe, dass @ ais523 dort helfen wird. Diese Zeichenfolge am Ende 7LEintndus({})!<>+wäre alles Token, wenn nicht diese vierte Aufnahme in den Code. Diese können alle entfernt (und durch eine .für Hexagony-Ausrichtung ersetzt) ​​werden, um den mittleren Token anzupassen.

Ich werde diesen Post in den nächsten ein oder zwei Tagen immer wieder aktualisieren, um den Code durchzugehen (vorausgesetzt, Incident kann überprüft / behoben werden, ohne die Byte-Anzahl zu überschreiten). Aber jetzt ist es super spät und ich wollte das meistens rausbringen, bevor ich ein weiteres Labyrinth-ähnliches Problem lösen musste. : P

Erläuterung

Wie der C ++ Code funktioniert.

Ich denke, die meisten Leute sind mit C ++ vertraut genug, so dass ich nicht zu sehr ins Detail gehen werde. Blockkommentare kommen in Form von /* comment */. Zeilenkommentare kommen in Form von //comment. Der eigentliche Code, der von C ++ zur Erstellung der Antwort verwendet wird, lautet int main() {std::cout<<37;}. Und auf die Bibliothek, die für die Schnittstelle mit STDOUT verwendet wird, wird von dieser Anweisung verwiesen #include<iostream>.

/ * Missbrauch von Kommentaren * /

Für mich geht die Geschichte von C ++ auf meine Brain-Flak-Antwort zurück.

Nachdem ich schließlich # 28 gefunden hatte, machte ich mich daran, einige andere in PPCG veröffentlichte Polyglots zu studieren, und all diese Studien führten mich zu ein paar einfachen Antworten (die meisten davon sind immer noch verfügbar, wenn jemand anderes so geneigt ist). Aber was noch wichtiger ist, ich bin zu dem Schluss gekommen, dass Polyglots im Allgemeinen: Große Polyglots in der Regel in eine von zwei Hauptkategorien fallen: #Kommentarmissbrauch oder /*Kommentarmissbrauch.

Dies ist ohnehin keine Tatsache oder Einschränkung, sondern ein persönlicher mentaler Rahmen, der meine nächsten Antworten leitete.

Von hier aus folgerte ich, dass es am besten wäre, wenn dies der größte Polyglott der Welt werden würde, was ich derzeit für wahrscheinlich halte, wenn es den Missbrauch von Kommentaren aus beiden Kommentarfamilien nutzen könnte. Also machte ich mich daran, einen Weg zu finden, eine /*Kommentarsprache einzubeziehen, und wandte mich hauptsächlich aufgrund meiner persönlichen Vertrautheit der C-Familie zu.

C ++ - Ersttest

Mein anfänglicher Gedanke dabei war, C # hauptsächlich aufgrund meiner Vertrautheit zu verwenden, und die erste Hürde für C # bestand darin, den Polyglot in einen Zustand zu versetzen, in dem eine Zeile akzeptiert werden konnte, die nicht mit "Start" begann, #ohne von den Skriptsprachen anderweitig als Code behandelt zu werden . Die Rail-Antwort löste zusammen mit mehreren Byte-aufblasenden Antworten, die dazu führten, dieses Problem.

Als nächstes kam das Problem, wie der erste /*Kommentarblock initiiert werden soll . Ich wusste, dass die Zeile mit einem beginnen musste #, um für Perl, Ruby und Python unsichtbar zu bleiben, aber was auch immer vor dem kam, /*würde von C # gelesen werden. #regionZuerst habe ich versucht, ein C # -Tag zu verwenden, aber das erwies sich für die 2D-Sprachen als zu unübersichtlich. Geben Sie C ++ ein.

C ++ hat mehrere Präprozessor-Direktiven, mit #denen alle beginnen und die eine Vielzahl von Optionen für das Durchlaufen der 2D-Sprachen bieten. Es stellte sich jedoch heraus, dass alle inkompatibel mit mindestens einer Sprache waren und ich in einem C ++ - exponierten Code-Space begrenzte Workarounds hatte. Aus Frustration und Verzweiflung bin ich auf die Tatsache gestoßen, dass C ++ einfach nur eine einzelne #vor dem Kommentarblock akzeptiert . Okay, was auch immer, das geht. Also ging ich mit der Vermutung weiter, dass #/*die ersten drei Zeichen im Polyglot funktionieren könnten.

Die zweite grundlegende Überprüfung bestand darin, sicherzustellen, dass der tatsächliche Ausdruck mit den anderen Codes zufrieden ist. Ich wusste von Brain-Flak Antwort , dass Japt nicht gefallen un-entgangen {ist , und das war für C ++ erforderlich zu sagen , int main() {std::cout<<37;}und C ++ würde nicht Japt der Escape - Zeichen in der Mitte seines Codes ermöglichen. Diesmal hatte ich das Glück, herauszufinden, dass Japt immer noch glücklich das gleiche Ergebnis erzielen würde, wenn ich nur für diese Aussage Japts wörtliche Zeichenfolge streichen würde.

In der Zwischenzeit mochte Brain-Flak das auch nicht {}, aber ich hatte erneut das Glück, dass C ++ mit #den Anweisungen int main()und {std::cout<<37;}einverstanden war, sodass die geschweiften Klammern aus der Perspektive von Brain-Flak kommentiert werden konnten.

Als sich herausstellte, dass die Hauptprobleme von C ++ theoretisch lösbar sind, begann ich den mühsamen Prozess, alle von mir eingeführten Fehler zu beheben.

2D-Landschaft

Der schwierigste Teil dieser Antwort war bei weitem die Neukonfiguration der beiden obersten Zeilen des Polyglots. Und das größte Problem war das *. Unterlast wird ein *vor a nicht zulassen (. Es betrachtet dies als mathematische Operation auf einem leeren Stapel, die es für einen Fehler hält. Also brauchte der Polyglot einen (Vorgänger, /*aber C ++ konnte dies nicht zulassen. Die Lösung war für uns also ein C ++ - Zeilenkommentar //in der ersten Zeile, um ein auszublenden (und dann die zweite Zeile mit einem zu beginnen #/*.

Als nächstes mochte Befunge die Idee nicht wirklich, /ohne dass etwas geteilt wurde, aber nachdem 16/"<"6/b.q@ich die existierende Antwort von Begunge studiert hatte, stieß ich auf die Idee einer Zahl und einer Schnur, die vor der zusammengebrochen war //. Es hat funktioniert und ich habe keine Ahnung, warum C ++ damit einverstanden ist, aber es akzeptiert # 1"16" 2als Eröffnungsanweisung. Ich werde es nicht in Frage stellen, aber ich weiß, dass die Räume benötigt werden, damit es funktioniert.

Zeile eins

Japt erwies sich als ziemlich platzsparend und wollte nicht wirklich in die Backtick-basierte Zeichenfolge in der obersten Zeile eintreten. Daher wurde er und Pips Backtick in die zweite Zeile verschoben, wodurch in Zeile 1 eine Menge Sprachgymnastik erzwungen wurde.

  • Pip mochte die meiste Zeile 1 nicht, daher wurde nach der ersten ein zweites Leerzeichen eingefügt #, um einen Kommentar anzuzeigen.
  • Die (for Underload musste mit einem Vorgänger aus Japt geflüchtet werden \.
  • #ist ein Sprungterminator in Turtlèd, so dass es erforderlich war, aber Pyth betrachtet dies als eine Schleife zum Beenden eines Fehlers, so dass Pyth eine Division durch Null / nach dem brauchte#
  • Ich bin mir nicht sicher, was die @erste Zeile noch tut, aber Pyth und Japt scheinen es besser zu mögen, wenn sie anwesend sind als nicht, obwohl @es laut Pyths Dokumentation kein aussagekräftiger Charakter ist.
  • Und es sieht so aus, als ob die erste ;an dieser Stelle ohne Konsequenz entfernt werden kann, sodass ich nicht sicher bin, was dort noch gelöst wurde, obwohl ich vermute, dass es mit Pyth zusammenhängt. Aber es sieht so aus, als könnten zukünftige Lösungen ein Byte sparen, wenn Sie dieses weglassen.
  • <> <und Turtlèd arbeiten im Prinzip wie zuvor, wobei <> <über das erste nachdenkt #und bis zum Ende der ersten Zeile umbrochen wird . Und Turtlèd springt mit, #wie ich schon sagte , und endet mit der "14"Zeichenfolge, die er druckt.

2D-Routing

Nachdem diese Probleme behoben waren, wurden in der nächsten Phase die 2D-Sprachen geroutet. Zuvor wurde die Initiale vvon den Befunges aufgrund der vorangegangenen ignoriert #, aber Haystack und Minkolang nach unten geschickt. Der erste Raum versucht nun, Minkolang entlang der 3. Dimension zu senden, die in seiner Dokumentation als Zeitdimension bezeichnet wird.

Kommen wir zu Minolangs dritter Dimension: Für mich ist es eine Art Fehlbezeichnung, dies als Zeitdimension zu bezeichnen, die mir wirklich eher räumlich als zeitlich erscheint. Ich habe es nicht wirklich verstanden, bis ich diesen Link gefunden habe , der das Konzept veranschaulicht, und es scheint mehr wie die mehreren Schichten eines 3D-Schachbretts. Nach meiner Überzeugung funktionieren 3D-Sprachen in der Regel so. Da dies jedoch ein neues Konzept für mich war, dachte ich, ich würde diese Informationen für andere herauswerfen.

So Minkolang die mehreren Schichten werden durch Linien begrenzt endet in $$$dem ich auf das Ende des Schienen Code warf hier: #-3o4o#$$$. Jetzt trifft Minkolang das Leerzeichen und fällt auf den ersten >Platz <>3N.<> ␉//und fährt mit der rechten Ausgabe fort. 3. Es #>konnte nicht zugelassen werden, dass diese Zeile gestartet wird, da versucht würde, einen Perl6-Kommentarblock zu beenden. Dies <wird anstelle des #Ausgleichs zwischen SMBF und Brain verwendet -Flak. Dies ist jedoch ein Brain-Flak- <>Stapeltauschverfahren. Nach dem Beenden von Minkolang wird ein zweiter Satz verwendet, um zur richtigen Antwort von Brain-Flak zurückzukehren.

Labrynth Höckern ähnlich gegen den Raum, aber es verursacht Labrynth in Spalte nach unten bewegt 1. Es dreht sich dann nach unten Linie 2 , wo es fährt bis zu den 3Hits eine andere Wand, so dass es wieder nach Süden drehen und traf ein , ;die die 3 verursacht knallte zu bekommen . Dann fährt das Programm nach rechts fort, wo 36 gespeichert und gedruckt wird, bevor schließlich ein @Ausgang gefunden wird. Dieser Pfad ist länger als nötig, aber ich habe festgestellt, dass das Prelude ein Null-Byte vor der normalen Ausgabe ausgibt, wenn !es weiter links liegt als jetzt, unabhängig von der angezeigten Zeile. Also habe ich es korrekter gemacht, weil ich den Raum dazu hatte.

Als nächstes wurde Haystacks Routing geändert, da es /jetzt vor vZeile 1 kommt und seinen Pfad wie Reng nach oben widerspiegelt. Glücklicherweise lebt Reng recht friedlich zusammen. Das einzige Problem war, dass Haystacks Nadel |ein Reflektor in Reng war, so dass ein Reng einen Befunge-ähnlichen Sprung ( #) über die Nadel verwendet, um Reng korrekt abzuschließen.

Die Befunges fahren entlang der Linie 1 bis zum vund werden nach unten und dann nach rechts in die zweite Linie geleitet, um mit dem gleichen Code wie zuvor abzuschließen. Ich habe das Gefühl, dass dieses Stück jetzt ein bisschen heruntergespielt werden kann, da weniger Sprachen versuchen, den Code sinnvoll zu durchlaufen, aber ich brauchte keine Wände mehr, um meinen Kopf anzustoßen, also habe ich es so belassen, wie es ist.

Schließlich ist Kardinals Ausgangspunkt, %der nicht unbedingt in die ohnehin schon dichten oberen beiden Linien hineingezogen werden musste. Also habe ich es nach unten zu Pythons String verschoben. Die mehreren Codepfade sind jetzt auch durch x's begrenzt, wodurch die Bewegung des Zeigers beendet wird.

Linie 2 & 3

Die einzige signifikante Änderung hier ist, dass alle aus dem :einen oder anderen Grund golfen haben. Vielleicht die (Bedürfnisse von Prelude oder vielleicht waren es einfache Probleme mit der Anzahl der Bytes - wahrscheinlich beides. Die andere Sache ist, dass der Sprungcode des Auslösers zurückgesetzt und als umbenannt wurde auaaZ. Ich hatte Platz zu füllen, um Befunges Codepfad zu erfüllen, und dies schien am besten zu sein. Das <Folgende in diesem Artikel ist auch, um die Anhänger von SMBF auszugleichen >. Schließlich müssen die Einsamen am Ende der zweiten Zeile den String von 05AB1E beibehalten. Außerdem sind yyin Zeile 3 nur Füllzeichen für Labyrinth.

Die Big String Esolangs

Nachdem die oberen beiden Zeilen behoben waren, war es an der Zeit, sich mit den Esolangs mit vollständigerer Analyse zu befassen, und Pip stellte sich als problematisch heraus. Wenn Sie sich erinnern, haben wir uns mit den geschweiften Klammern beschäftigt, {std::cout<<37;}indem wir die Japt-Zeichenfolge entfernt haben, damit Japt dies als Code behandelt. Nun, Pip verwendet die gleiche String-Syntax und mochte diese Zeile nicht als Code und Pip hat sehr ähnliche String-Deklarationsoptionen wie Japt. Beide 'deklarieren mit einer einzigen Zeichenfolge eine Zeichenfolge, beide verwenden dieselbe Escape-Deklaration von \und beide akzeptieren "als Zeichenfolgenbezeichner. Daher war es schwierig, Pip glauben zu lassen, dass dies eine Saite war, ohne dass Japt das Gleiche glaubte.

Es stellte sich heraus, dass Japt einen ausnutzbaren Unterschied hatte - #nimmt den ASCII-Wert des nächsten Zeichens. So #"`endet die Japt / pip string, dann Japt sagen die Asci Wert zu übernehmen ", während Pip erzählt eine neue Zeichenfolge zu starten. Das "könnte wahrscheinlich ein Backtick gewesen sein, und wäre wahrscheinlich besser gewesen, aber meine Überlegung war, einen anderen String-Bezeichner im Inneren als einen weiteren Punkt der String-Manipulation zu verwenden. Hier ist also ein weiterer Ort, an dem Sie ein paar Bytes später sparen können.

Als nächstes musste ich die Japt-Zeichenfolge nach den geschweiften Klammern einleiten, während Pip in einer Zeichenfolge bleiben durfte. Ich tat dies mit '"`einem einfachen Anführungszeichen, einem doppelten Anführungszeichen und einem Backtick. Für Japt 'ist das nicht in einer Zeichenfolge enthalten und daher ein Indikator, um das nächste Zeichen als einzelne Zeichenfolge zu verwenden. Pip sieht das 'als Teil der Zeichenkette und beendet die Zeichenkette mit dem ". Und schließlich `wird Pip und Japt angezeigt, dass eine weitere Zeichenfolge beginnt, die im gesamten Polyglot bis zur letzten Zeile fortgesetzt wird, in der beide Sprachen zufriedenstellend ausgeführt werden.

Jetzt funktionierten sowohl Japt als auch Pip an diesem Punkt, aber 05AB1E scheiterte an der Verwendung von "verursachtem Fehler, der die Offenlegung von Code induzierte. Glücklicherweise war dieses Problem leicht zu lösen, indem ein weiteres Set "um das Ganze gelegt wurde, wobei das Set der String-Manipulationen unverändert blieb "`#"\\'*/{std::cout<<37;}/*'"`".

Schließlich sieht die Leitung jetzt so aus, mit int main() #/*"`#"\'*/{std::cout<<37;}/*'"`"der Underload ein Problem hatte. Die aufeinanderfolgenden *waren ein weiterer Syntaxfehler, also warf ich einen ()in die Mitte *, um ihn zu beschwichtigen.

Die fragilen Esolangs

Die große Hürde war jetzt White Space. Ich werde hier nicht auf jede Menge Details eingehen, da der größte Teil der Whitespace-Lösung in den bereits gegebenen Erklärungen enthalten ist, und ich habe nur die Fälle beschönigt, in denen Whitespace einige Entscheidungen erzwungen hat. Ich schaue dich an Labyrinth. Die große Änderung ist jedoch, dass der eigentliche Code für die Ausgabe der Whitespace-Antwort in Zeile 2-4 statt in Zeile 1-3 steht. Dies ist größtenteils auf Japts Code in Zeile 1 zurückzuführen.

Thutu hatte ursprünglich Probleme mit dem, was diese Linie gewesen war: int main() #/*()"`#"\'*/{std::cout<<37;}/*'"`". Also habe ich kurz vor dem ersten Zeilenvorschub einen Zeilenvorschub eingefügt #, um alle Probleme hinter einem Kommentarindikator zu verbergen, und dann /überall dort, wo Code verfügbar war , eine Reihe von Trailing 's ausgespammt.

Zu diesem Zeitpunkt habe ich Hexagony ausgerichtet und ein neues Problem gefunden. Der Code am Anfang, das Leben begann als # 1"16" 1die gemacht +in /+23!@nicht mehr klar den Stapel. Also habe ich gerade das +is entfernt und festgestellt, dass es jetzt 123 ausgibt. Dies war einfach zu beheben, indem ich das Eröffnungsspiel auf änderte # 1"16" 2und das Hexagony-Teil auf Golf spielte /3!@.

Whirl hatte einige Änderungen, aber es ging hauptsächlich darum, sicherzustellen, dass die richtige Anzahl von führenden Einsen vor der Whirl-Incident-Zeile erschien. Der Vorfall hatte jedoch ein besonders schwieriges Zeichen. Ich hatte genau 3 Exemplare von /*und */.

Ich wollte anfangs nur *//*eine alte Stelle in den Code werfen , um jeweils eine vierte Kopie zu erstellen, aber Underload sah erneut aufeinanderfolgende *, was kein Problem war. Letztendlich habe ich ein /am Ende dieser Zeile geworfen int main() /*, damit es endet. /*/Ich dachte, ich würde die Token überlappen lassen, aber es gelang mir nur, 4 Kopien von einem der beiden Token zu erstellen. Richtig richtig. So funktioniert das. Na ja, ich werfe einfach ein ähnliches /in das Finale */, um dort ein viertes zu machen. Danach ersetzte ich eine Reihe von Hexagony No-Ops durch eine vierte Kopie mehrerer Incident-Token in dieser Zeichenfolge in der letzten Zeile 7LEintndus({})!<>+.

Fazit

Ok, das ist das Detail, das ich für diesen massiven Refaktor habe. Ich verspreche, beim nächsten Mal nicht so viel zu schreiben zu haben. Ich habe keine Ahnung, ob C ++ eine gute oder schlechte Wahl für diesen Polyglott ist, aber meiner Meinung nach eröffnet es einige Optionen. Hoffentlich führt dies zu guten Dingen.

Fröhliches Codieren.


2
Sieht aus wie g++erfordert ein .cpp, so dass ich das zum spezifischen Abschnitt der Dateierweiterung hinzugefügt habe. Musste dann nur noch nutzen run-wrapper.shum damit umzugehen. Ich bearbeite es in.
SnoringFrog

1
Ich möchte symbolisches Brainfuck hinzufügen , da es eine einfache Ergänzung ist, aber Unicode-Zeichen stürzen ab python2 - _ -
SnoringFrog

1
@ SnoringFrog Ich sehe Emoji
Chance am

1
Auch **ist kein Syntaxfehler in Unterlast; Es verbraucht nur eine Menge Stapel, von denen ich annehme, dass sie zu diesem Zeitpunkt nicht verfügbar waren (wahrscheinlich, weil Sie die Doppelpunkte herausgolfen haben). Sie können den Stapel mit in Klammern gesetzten Gruppen oder Doppelpunkten vor oder zwischen ihnen auffüllen oder den Code manchmal vor Unterlast verbergen, indem Sie ihn in Klammern setzen.

2
@ ais523 In den ersten Tagen von C wurde der Präprozessor nur ausgeführt, wenn die erste Zeile mit einem # begann, um Zeit zu sparen, wenn dies nicht erforderlich war. Wenn Sie jedoch nicht möchten, dass Ihre erste Zeile eine Präprozessor-Anweisung ist, müssen Sie daher die erste Zeile mit einem # beginnen lassen, ohne dass sie tatsächlich etwas bewirkt, sodass Sie die Null-Direktive hatten. Ich vermute nachdrücklich, dass die Abwärtskompatibilität mit dem verwendeten Code der Grund für die Aufnahme in den Standard war.
Muzer

34

3. Minkolang v0.15 (26 Bytes)

#>>>>>>>>v
print(1)#>3N.i2

Dieses Programm druckt 1 in Python 3, 2 in Vim und 3 in Minkolang v0.15

Ich hoffe, dass ich mit der Einführung einer 2D-Sprache nichts durcheinander bringe

Probieren Sie es online!

Erläuterung

#                     stops program from moving through time (really does nothing)
 >>>>>>>>             I can't use a space because then the program will move through time
         v            go down
         >            go right
          3N.         Outputs 3 and end program
                      Anything afterward is ignored since program has ended

Vim ignoriert Minkolang irgendwie, also ist das gut

Und es gab wirklich kein Problem mit Python, da es die Kommentare ignoriert #

Nächster...

Für die nächste Sprache schlage ich so etwas wie> <> vor, da es #als Reflektor fungiert (so dass sich die Richtung nach links ändert und sich ganz nach rechts dreht), damit Sie Code hinzufügen können, der von anderen Sprachen ignoriert werden kann


16
"Zeitreise" wat?
TuxCrafting

5
@ TùxCräftîñg Minkolang hat 3 Dimensionen (2d = normal, die 3. ist Zeit). TBH, ich verstehe es nicht, es heißt nur, dass in der Erklärung zum TIO-Link
Kühe

@ mbomb007 Worauf beziehen Sie sich genau?
Kühe quaken

1
@ TùxCräftîñg Ich glaube nicht, dass ich das kann
dkudriavtsev

1
@wat Hm das hat viel zu lange
gedauert, um es

34

5. Python 2 (35 Bytes)

#3N.;n4
print('1'if 1/2else'5')
#i2

Dieses Programm druckt 1 in Python 3, 2 in Vim, 3 in Minkolang v0.15, 4 in> <> und 5 in Python 2.

Versuchen Sie es online Beta!

In Python 2 ist 1/2 0, was ein falscher Wert ist, der Python zum Drucken bringt. In Python 3 ist 1/2 0,5, was ein wahrer Wert ist, der Python zum Drucken bringt.


1
Ich kann bestätigen, dass es in Minkolang funktioniert
Kühe quaken

1
print('1'if 1/2else'5')bricht auf meinem System ohne ein Leerzeichen zwischen 1/2 und sonst
Tasos Papastylianou

Nun, es funktioniert mit beiden Versionen von TIO.
Betseg

28

4.> <> (29 Bytes)

#>>>>>>>>v;n4
print(1)#>3N.i2

Dieses Programm druckt 1 in Python 3, 2 in Vim, 3 in Minkolang v0.15 und 4 in> <>

Probieren Sie es online!

Code lief

#             - change direction to left
            4 - add 4 to stack
           n  - print as a number
          ;   - end the program

Noch eine 2D-Sprache.

Hat keine Auswirkung auf Minkolang, da es Zeichen hinzufügt, nachdem sich die Richtung geändert hat. Aus irgendeinem Grund wird es von Vim ignoriert. #ist ein Kommentar in Python, also ändert sich auch nichts.


28

28. Brain-Flak , 280 Bytes

#v`16/"<"6/b.q@"(::):::   (22)S#;n4"14"
#>3N6@15o|> ^*ttt*~++~~~%
#=~nJ<R"12";
#[
#`<`|
print((eval("1\x2f2")and (9) or (13))-(0and 4)^(1)<<(65)>>62)or'(\{(\{})(\{}\/^23!@[()])}\{})(\{}\{})'#@46(8+9+9+9+9+=!)=#print(17)#]#echo 21#|/=1/24=x=90/
#8␛dggi2␛` |1|6$//''25  #>say 27#"26

␛ steht wie gewohnt für ein buchstäbliches ESC-Zeichen.

Dieses Programm druckt 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 ( hier getestet ), 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 Vim / V , 1 in Python 3

Zunächst möchte ich sagen, welch ein Privileg es ist, zu dieser Herausforderung beitragen zu können. Ich habe erst vor ein paar Wochen von Codegolf gehört und bin seitdem absolut begeistert. Das erste, was ich tat, als ich diese Herausforderung entdeckte, war zu versuchen, den Code in verschiedenen Sprachen auszuführen, um zu sehen, ob ich irgendetwas finden konnte, mit dem ich arbeiten konnte. Dies war damals, als wir auf # 6 waren. Ich dachte ehrlich, dass diese Herausforderung unmöglich war, aber hier sind wir (# 28 Wow!). Was ich damals fand, war, dass Brain-Flak den Wert 2 ausgab. Also machte ich mich daran, es zu lernen.

Brain-Flak erwies sich für diese Art von Herausforderung als ziemlich großartig, da es ziemlich leicht zu erlernen ist und so gut wie alle Charaktere außer den ignoriert (){}[]<>. #Kommt auch Kommentar irgendetwas danach in der gleichen Zeile vor, so war der einzige Teil der letzten Einreichung, der jemals für Brain-Flak in Betracht gezogen wurde, print((eval("1\x2f2")and 9 or 13)-(0and 4)^1<<65>>62)der dann auf gepaart wurde ((())()<<>>). So wurde der Plan zu einer überflüssigen Klammer für den Python-Code.

Ich habe die Python-Bits so modifiziert, dass sie in Brain-Flak analysiert werden. Dies ((() () ())()()<<()>>)entspricht 2 Stapeln, wobei das erste 5 und das zweite 3 sind. Danach quadriere ich die 5 mit ({({})({}[()])}{})und addiere das Ergebnis zu 3 mit ({}{}). Dieses Quadrieren und Hinzufügen geschieht in einer Zeichenfolge aus Python-Sicht. Ich kann nicht behaupten, dass ich Pythons Argumentation hier verstehe, aber ich bin ziemlich sicher, dass diese Zeichenfolge mit nur wenigen Ausnahmen von anderen Sprachen nicht auf sinnvolle Weise bewertet wird.

Wie sich herausstellt, interpretiert Japt geschweifte Klammern in einer Zeichenfolge als Code, aber diese waren leicht genug, um \vor jeder Klammer {in dieser Zeichenfolge herauszukommen . Dies erhöhte jedoch die Anzahl der Bytes. So ist das Leben.

Das Vorspiel war mit all meinen Klammern ziemlich nachsichtig. Ein früherer Kommentar wies darauf hin, dass das Prelude zu vertikal ausgerichteten Klammern passen würde, und ich habe zufällig nur eine erstellt. Süss! Die (in der oberen Reihe reihten sich an die und (9in der großen Reihe. Also musste ich vor dem (in der obersten Zeile ein zusätzliches Leerzeichen einfügen. Ich gehe hier davon aus, dass das doppelte Leerzeichen ein Kommentarindikator für etwas war, sodass das Hinzufügen eines zusätzlichen Leerzeichens trivial erschien, und es funktionierte. Ich sollte darauf hinweisen, dass ich (9)stattdessen versucht habe, zusätzliche Leerzeichen hinzuzufügen , aber Cardinal hat nicht kooperiert.

05AB1E mochte meinen ersten Versuch, die Python-Zeichenfolge in doppelte Anführungszeichen zu setzen, nicht, aber jeder schien mit einfachen Anführungszeichen einverstanden zu sein. Keine große Sache.

Hexagony war die einzige Sprache, die zu diesem Zeitpunkt noch übrig war, und ich war offensichtlich weit hinter der nächsten Hex-Größenschwelle, also war es Zeit, sich schmutzig zu machen. Das /^23!@ist der Hexagony-Code und ich bin sehr aufgeregt, weil ich denke, dass es zukünftige Ergänzungen viel einfacher machen wird. Dieses kleine Stück kann im Grunde genommen an eine beliebige Stelle in der Python-Zeichenfolge verschoben werden, ohne dass Code verloren geht. Dies ist die vollständige Zeichenfolge, damit wir uns alle auf derselben Seite befinden '(\{(\{})(\{}\/^23!@[()])}\{})(\{}\{})'. Das /hier gibt den Weg der Hexagonie von SE -> NW nach W-> E an, mit dem wir viel Spielraum haben. (Das vorhergehende \ist zu entkommen/für thutu BTW). Meine Idee hier ist, dass Sie, wenn Sie Änderungen vornehmen, wahrscheinlich irgendwann diese Zeichenfolge durchgehen und das Hexagony-Teil in der Zeichenfolge herumschieben können, um den Codepfad zu erfassen und zum richtigen Abschluss zu bringen. Pass nur auf, dass du nicht zwischen Japt \und das kommst {. Wenn Sie Probleme damit haben, @bleibt das rechts von der Zeichenfolge nur von einer anderen Hexagony-Lösung übrig und kann ohne Konsequenz für die anderen Sprachen entfernt werden. Und wenn Sie zufällig den Codepfad von Hexagony in die entgegengesetzte Richtung abfangen, können Sie natürlich @!32^\statt verwenden /^23!@. Sie werden möglicherweise auch bemerken, dass meine Lösung das entfernt hat===2aus dem Code, um die Dinge unter dem Byte-Limit zu halten. Jemand erwähnte hier, dass dies für die Ausrichtung von Hexagony war und ich es nicht mehr brauchte.

Schließlich ist hier ein kleines Stück Code, das ich beim Erforschen von Codegolf gefunden habe und das eine Textzeile in ein Hexagony-lesbares Hexagon konvertiert, damit Sie debuggen können. Ich bin sicher, dass viele Leute darüber Bescheid wissen, aber ich hatte es hier noch nicht gesehen, also könnte es auch jemand anderem helfen. Wenn Sie gewarnt sind, müssen Sie die Eingabe ändern, um die Backticks und Wagenrückläufe zu entfernen, und die wörtliche Escape-Anweisung gegen etwas tauschen, das normal viel Platz beansprucht, damit der Code die Dinge in einem hübschen Hexagon anordnet.

PS Während ich das aufschrieb, wurde mir klar, dass ich einen Fehler hatte. Ich hatte geglaubt, ich würde Hexagony's Gedächtnislücke mit dem bereinigen ^, aber anscheinend kann ich es ohne Folgen durch ein No-Op ersetzen. Das ^sollte wahrscheinlich ein sein, +wenn Sie versuchen, diesen Abschnitt zu manipulieren. Ich habe anscheinend +vorher eine durchlaufen , aber zukünftige Polyglotter haben vielleicht nicht so viel Glück.

Viel Glück!


Ich habe auf den Abriss und die Erklärung gewartet, bevor ich abgestimmt habe, aber der Abriss sieht gut aus, also werde ich abstimmen, während ich auf die Erklärung warte :-). Ich gehe davon aus, dass alle zusätzlichen Backslashes einen Syntaxfehler in Thutu vermeiden sollen? Ein interessanter Ansatz für den Ort, an dem Sie Ihren Code hinzugefügt haben, was vermutlich etwas mit Hexagony zu tun hat. Es wird schön sein, die vollständige Erklärung zu sehen. (Willkommen auch bei PPCG!)

Und jetzt sehe ich die Erklärung; Ich habe es genossen, es zu lesen. Der „Python - Code“ ist tatsächlich von mehreren Skriptsprachen (Python, Perl 5, Rubin) verwendet, aber sie alle zu interpretieren andund auf ordie gleiche Weise, so dass Ihre Methode den Code aus in den Skriptsprachen zu kommentieren , aber nicht Brain-Flak geschieht arbeiten in allen von ihnen.

1
Danke @ ais523. Sie haben die Platzierung meines Codes erwähnt. Also wusste ich, dass ich die Brain-Flak-Operatoren an einer Stelle platzieren musste, die für die Skriptsprachen sichtbar war, und meine anfängliche, falsche Annahme war, dass es in einer neuen Zeile am einfachsten sein würde. Dies funktionierte nicht für Retina und ich wollte mich nicht sowohl damit als auch mit den 2D-Sprachproblemen befassen, die ich beim Versuch, Retina zu reparieren, verursachen würde, wenn möglich. Ich hatte das Glück, in die aktuelle Platzierung zu stolpern.
Chance

2
Fantastische Antwort und eine sehr gründliche Erklärung! Ich bin wirklich froh zu hören, dass Sie Brain-Flak genießen. : D
DJMcMayhem

25

38. C, 804 Bytes

#  1"16" 3//v\(@#/;n4"14"
#/*`3 auaaZ<>16/"<"6/b.q@")(22)S#  ␉␉␉␉ 
#yy␉;36!@
# ␉
#=␉>
#[#yy#yy0l0mx01k1k0l0ix0jx0h0h1d111P0eU0bx0b0o1d0b0e0e00x1d0i0fx0g0n0n11x0o0n0cx0c0o0f0c0gx0g0f0h0j0j0i0001k10mx0m0l11111100(^_)
#`<`␉|
print((eval("1\x2f2")and( 9 )or(13 ))-(0and 4)^1<<(65)>>(62))or'(\{(\{})(\{}[()])}\{}\{}\{})'#46(8+9+9+9+9+=!)#1|=/=1/24=x=9[<$+@+-@@@@=>+<@@@=>+<?#>+.--.]/
__DATA__=1#//
#.\."12"*␉
""""#//
=begin␉//
#
#*/␉
#define␉z  sizeof 'c'-1?"38":"37"
#include␉<stdio.h>
int main()  /*/
#()`#`\'*/{puts(z);;}/*'``
$'main'␉//
#-3o4o#$$$
<>3N.<>␉//
#xx
#x%~~~+␉+~*ttt*.x
#xx
=end   #//
"""#"#//
#0]#echo 21#/(\[FAC,1<-#2FAC,1SUB#1<-#52FAC,1SUB#2<-#32FACLEGEREEX,1PLEASEGIVEUPPLEASE)  ap
#_~nJ|#o51\   
#0␛dggi2␛`␉|1|6$//''25  >>>#>27.say# =#print(17)#^_^_7LEintndus({})!<>+]/*///Z222999/(3!@)"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.

Probiere sie online aus!

Heruntergewirtschaftet

Dieses Programm druckt 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, 18in 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.

Hier ist meine leicht überarbeitete Version des Incident- Tokensers , die ein bisschen weniger Golf spielt, aber ein bisschen nützlicher ist.

Erläuterung

Ich habe es immer geliebt, kleine Polyglots zu machen, aber noch nie einen so großen. Ich dachte, ich sollte es wahrscheinlich versuchen!

Nach der wundervollen C ++ - Antwort von @ Chance schien C die nächste logische Wahl zu sein, und angesichts der (im Vergleich zu einigen früheren Antworten) relativ einfachen Hinzufügung entschied ich mich, es zu probieren, wenn ich die Chance dazu hatte!

Ich habe einen sehr bekannten Trick benutzt, um den Unterschied zwischen C und C ++ zu erkennen. Die Größe einer Zeichenkonstante beträgt 1 Byte in C ++, die Größe eines int (garantiert mindestens 16 Bit) in C. Dieser Code sollte sehr portabel sein (mit Ausnahme von Systemen, die Bytes mit genügend Bits für ein int verwenden), sofern nicht Ich habe einen dummen Fehler gemacht.

Ich habe zuerst versucht, printfmit All-In-Line eine zu machen , aber die mehreren Klammern schienen Japt Probleme zu bereiten, deshalb habe ich die Zeile vereinfacht, was anscheinend zu einer Behebung geführt hat.

Als nächstes mochte es Cardinal nicht, ich vermutete wegen des %in der printf, also musste ich dieses Problem lösen, indem ich auf das Manipulieren von Strings umstellte.

Mein nächster Versuch, eine Zeichenfolge zuzuweisen und dann das zweite Byte abhängig vom C-Verhalten zu ändern, war viel zu lang und hätte Hexagony auf die nächste Größe verschoben. Ich wollte das vermeiden, indem ich es in den zusätzlichen Charakteren belasse, mit denen ich spielen musste! Ich brauchte jedes Byte, das ich dafür bekommen konnte, also habe ich die von @Chance vorgeschlagenen bytespeichernden Änderungen implementiert.

Also spielte ich diesen C-Code ein wenig herunter und fand heraus, puts(sizeof'c'-1?"38":"37");was fast funktionierte, mit der Ausnahme, dass Underload fehlerhaft war, vermutlich wegen des komplexen Ausdrucks in den Klammern.

Selbst nach dem Entfernen der zusätzlichen Elemente, >>die <<für die Zuordnung zu Perl6 erforderlich waren, konnte ich den komplexeren Teil nicht präzise genug in eine Char-Array-Zuweisung aufteilen. Also habe ich mir vorgenommen, stattdessen den Präprozessor zu verwenden.

Nach vielem Ausprobieren fand ich eine Lösung, die Retina zu gefallen schien. Das Vorspiel, das mir den ganzen Weg über Probleme bereitete, beendete sich, bevor ich mich umsah, warum es brach (ich schätze, entweder die Klammern oder die, die !ich auf einer Stufe im Ternär hatte und betrachtete) vorherige Antworten).

Die ganze Zeit über habe ich den Whitespace ausgebessert, um etwas zu erhalten, das Whitespace gefallen würde. Ich fand das ziemlich einfach. Insbesondere tab space space spacewar eine sehr nützliche Kombination (die Anweisung, die beiden obersten Elemente auf dem Stapel hinzuzufügen), da dies bedeutete, dass ich Leerzeichen zu Zeilen ohne andere Leerzeichen hinzufügen konnte, ohne dass alles nicht synchron lief (ich vermute seine Position in der Tabelle) Programm bedeutet, dass es nie ausgeführt wird, daher mache ich mir hier keine Sorgen um Stack-Unterläufe.

Ich habe jetzt Incident getestet und es funktioniert! Vielen Dank an @Chance und @LliwTelracs, denen ich gerade klar geworden bin, dass es sich NICHT um einen walisischen Namen handelt, der mir geholfen hat, mich damit auseinanderzusetzen. Siehe diese Syntaxhervorhebung . Ich habe das ;Token entfernt, das vor dem #yyToken angezeigt wurde. Ich tat dies, indem ich einfach ;nach der getsAnweisung ein Extra hinzufügte (mein vorheriger Versuch umfasste das Ersetzen s(was jetzt viel mehr im C-Programm erscheint als im vorherigen) in der "Entschlüsselungs" -String mit einem ;, aber es stellte sich heraus, dass ich es war Eigentlich eine Abkürzung für Hexagony (danke @Chance). Nachdem ich also versucht habe, dieser letzten Zeile ein zusätzliches Zeichen hinzuzufügen, habe ich es einfach zurückgesetzt und das zusätzliche Semikolon an einer anderen Stelle eingefügt.

Ich habe auch das Leerzeichen ein wenig verändert, um einige andere Token zu ändern, um einen Versuch der Zentrierung zu unternehmen, um den Zeilenvorschub für Tabulatoren neu zu kennzeichnen (indem ich den Tabulator am Ende der #includeZeile in die Mitte bewege , um so drei Token zu erstellen) und um de-tokenisiere das Triple-Space-Token, indem du ein Feld in der defineZeile verschiebst.

Schließlich entschied ich mich einen Tag nach der erstmaligen Einreichung, der beängstigenden Präprozessor-Warnung auf den Grund zu gehen, die gcc produzierte (und die Clang zum Scheitern brachte). Ich stellte fest, dass der Grund, warum die erste Zeile überhaupt funktionierte, darin besteht, dass die Ausgabe des Präprozessors Debug-Informationen wie Originaldateinamen und Zeilennummern enthält. Die erste "2" in der ersten Zeile gefiel ihnen nicht, weil dies bedeutete, "von einer eingeschlossenen Datei in die angegebene Datei zurückzukehren", und offensichtlich ist dies unmöglich, da keine eingeschlossenen Dateien vorhanden waren. Nachdem das Ändern auf "1" (normaler Startheader) ein paar zu viele Sprachen zum Erliegen gebracht hatte, änderte ich es auf "3" (interner Startheader), was nur Hexagony brach, da es sich jetzt auf 2 stützte. Zu Beginn des Hexagony-Codes habe ich eine offene Klammer hinzugefügt(Um die 3 in eine 2 zu dekrementieren, müssen Sie )nach dem Ende ( @) des Hexagony-Codes eine schließende Klammer setzen, um Retina, Prelude und Underload zu erfüllen, die alle übereinstimmende Klammern erwarten. Das erneute Testen von Reng und Modular SNUSP ergab keine Probleme, und die Incident-Token sahen richtig aus, sodass ich sie jetzt behoben hatte! Ich habe es auf einer Vielzahl exotischer Architekturen getestet und es scheint zu funktionieren. Ich weiß, dass es für ein Code-Golfspiel nicht wichtig ist, und es macht mir nichts aus, wenn zukünftige Einsender dies erneut unterbrechen müssen, um innerhalb einer Byteanzahl zu bleiben, oder wenn jemand bereits mit dieser Lösung begonnen hat und seine nicht ändern möchte zu viel), aber es gibt einen guten Grund, warum ich das getan habe - der Objective-C-Compiler von TIO unterstützt nur Clang, daher ist dies sehr nützlich, wenn jemand das hinzufügen möchte!

Denken Sie daran, dass ich die meisten dieser Sprachen noch nie benutzt habe. Ich hoffe, mein Erfolg ermutigt mehr Neulinge, dies zu versuchen!


@LliwTelracs Huh, das durch Zufall verknüpfte C-Programm in seiner Antwort hatte eine andere Ausgabe für die Liste der Token: ^ _ ^ _
Muzer

Der Fehler bestand darin, dass ich den Wert in mein Programm kopiert habe, sodass die Registerkarten oder
Escapezeichen

@LliwTelracs Ich versuche nur, die Tokenisierung selbst herauszufinden. Es sieht so aus, als würde jetzt dreimal ein Semikolon angezeigt. Ich könnte ein zusätzliches hinzufügen, außer dass ich nicht denke, dass ich das Byte sparen kann, da dies Hexagony falsch ausrichtet. Hmm ...
Muzer

1
Ereignis funktioniert!
Muzer

1
@Chance Ich habe mir gerade angesehen, wie diese erste Zeile im C-Präprozessor gültig ist. Es sieht so aus, als wäre es die Ausgabe des Präprozessors, die für Debug-Informationen usw. verwendet wird. Linie 1". Ich denke, es ist die 2, die Clang zum Würgen bringt (und gcc warnt), da es nie in irgendwelche Dateien ging, also gibt es nichts, von dem man zurückkehren kann. Wenn ich die Gelegenheit dazu bekomme, experimentiere ich vielleicht damit, es in etwas anderes umzuwandeln, damit es auch in Clang kompiliert wird. Siehe gcc.gnu.org/onlinedocs/cpp/…
Muzer

25

65. ALGOL 68 (Genie) , 1634 Bytes

#16  "(}+?23!@)-("//*\Dv;'[af2.q]PkPPX'#CO)"14";n4
#/*0|7//```"`   [-'][!(>77*,;68*,@;'1,@10␉␉11)(22)S␉␉(1 P''53'S^'q
#>␉
# 36!@␉`
#
#_>++++.>.}+?
#`<`
#<]}} +<[<.>>-]>[
#{
#z}
#
#=x<R+++++[D>+++++++59L+++<-][pPLEASE,2<-#2DO,2SUB#1<-#52DO,2SUB#2<-#32DOREADOUT,2PLEASEGIVEUPFACiiipsddsd4O6O@oh]>@@+.---@.>][
#x%+>+=ttt Z_*.
#D>xU/-<+++L
#R+.----\).>]|
#[#[(?2?20l0v0x1k1kMoOMoOMoOMoOMOO0l0ix0jor0h0h1d111x0eU0yx0y0moO1d0y0e0e00m1d0i0fx0g0n0n11MoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOmOoMOo0moo0n0tx0t0moO0f0t0gOOM0g0f0h0j0j0i0001k1x0vx0v0l111111^_00)
[ "]56p26q[puts 59][exit]" ,'\[' ];#/s\\/;print"24";exit}}__DATA__/
#
###x<$+@+-@@@@=>+<@@@=>+<?#d>+.--.

#
'(((p\';a=a;case $argv[1]+${a:u} in *1*)echo 50;;*A)echo 54;;*)echo 58;;esac;exit;';print((eval("1\x2f2")and 9or 13)-(0and 4)^1<<(65)>>62)or"'x"or'{}{}{}{}({}<(((((()()())){}{})){}{})>){(<{}(({}){})>)}{}({}())wWWWwWWWWwvwWWwWWWwvwWWWwWWWWWWWWwWWWWwWWWWWWWwWWWWWWWW li ha '#}#(prin 45)(bye)46(8+9+9+9+9+=!)((("'3)3)3)"'
__DATA__=1#"'x"
#.;R"12"'
###;console.log 39
""""
=begin
<>{nd
#sseeeemPaeueewuuweeeeeeeeeeCis:ajjap*///;.int 2298589328,898451655,12,178790,1018168591,84934449,12597/*
#define p sizeof'p'-1?"38":"37"
#include<stdio.h>
main ( ){puts(p);}/*
print 61
#}
disp 49;
#{
}<>
$'main'3
#-3o4o#$$$
#<T>"3"O.s
=end
"""#"
#}
#s|o51~nJ;#:p'34'3\=#print (17)#>27.say#]#print(47)#]#echo 21# xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi ax fwwvwWWWwWWWWwvwWWwWWWwvwWWwWWWwvwWWwWWWwvwWWwwwwwwwwwwwWWWwWWWWWwWWWWWWWwWWWWWWWWWwWWWWWWWWWWWWWWWwWWWWWWWWWWWWwvm 
# sss8␛dggi2␛`|$// ''25  16*///~-<~-<~-<<<~-XCOprint("65")#s^_^_2229996#

VIP-Punktzahl ( Versatile Integer Printer ): .005949 (zur Verbesserung sollte der nächste Eintrag nicht mehr als 1710 Byte umfassen)

Probieren Sie es online!

Heruntergewirtschaftet

Dieses Programm druckt 65 in ALGOL 68, 64 in Agony, 63 in Brian & Chuck, 62 in Grass, 61 in SILOS, 60 in Moorhens 2.0, 59 in Tcl, 58 in Ksh, 57 in Wise, 56 in dc, 55 in Brain -Flak Classic, 54 in Zsh, 53 in Shove, 52 in COW, 51 in Assembly, 50 in Bash, 49 in Octave, 48 in Deadfish ~, 47 in Lily, 46 in Cubix, 45in PicoLisp, 44 in alphuck, 43 in reticularis, 42 in Übel, 41 in Gehirnfick, 40 in Minimal-2D, 39 in Coffee, 38 in C, 37 in C ++, 36 in Labyrinth, 35 in INTERCAL, 34 in Schiene, 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> <>, 3in Minkolang, 2 in V / Vim und 1 in Python 3.

Nachprüfung

Die meisten Sprachen können mit dem obigen Testtreiber getestet werden, aber 6 Sprachen müssen lokal getestet werden.

  • Hier kann Reng auf Ausgang 19 getestet werden .

  • Modulares SNUSP kann hier auf Ausgang 31 getestet werden .

  • Der Vorfall wurde durch manuelles Auswuchten der Token auf Test 33 überprüft.

  • Deadfish ~ kann mit diesem Interpreter getestet werden, um 48 lokal auszugeben . Beachten Sie, dass Deadfish ~ den Polyglot für die >>Standardausgabe verwendet , aber eine Reihe von Eingabeaufforderungen an die Standardausgabe ausgibt, die keine unvermeidbare Folge der Ausführung eines Deadfish ~ -Programms sind.

  • Moorhens 2.0 kann mit diesem Interpreter auf Ausgabe 60 getestet werden .

ALGOL 68

ALGOL ist wahrscheinlich die am wenigsten bekannte der vier höheren Programmiersprachen aus den Anfängen der Programmierung. Die restlichen Sprachen dieser nebulösen Unterscheidung sind COBOL, FORTRAN und Lisp. ALGOL war zu dieser Zeit in akademischen und mathematischen Kreisen besser bekannt, ist heute jedoch vor allem für seinen enormen Einfluss auf die modernen Sprachen bekannt. In der Tat können die meisten modernen, praktischen Sprachen als „Algol-ähnlich“ beschrieben werden, nicht zuletzt C, das natürlich eine eigene Linie von Einflüssen und Derivaten aufweist.

Ich bin ziemlich aufgeregt, ALGOL aufzunehmen, weil es ein weiteres wichtiges Sprungbrett in der Computergeschichte ist, das wir diesem Denkmal, das wir Polyglot nennen, hinzufügen können. Das ist cooles Zeug.

ALGOL68 ist die neueste der drei wichtigsten ALGOL-Spezifikationen, die anderen sind ALGOL60 und ALGOL58. Interessanterweise hat die Spezifikation keine feste Syntax, was bedeutet, dass die Token definiert sind, aber nicht die Schreibweisen. Dies macht die Sprache in hohem Maße vom Interpreter abhängig, da jeder gegebene Interpreter ein anderes Symbol verwenden kann, um beispielsweise einen Kommentarblock zu initiieren. Die Spezifikation beschreibt das ¢Einleiten eines Kommentarblocks. Da ¢es sich jedoch nicht um einen der Basis-127-ASCII-Codes handelt, wird dieser verständlicherweise nicht als Kommentarindikator unter den verfügbaren Interpreten verwendet. Nun, es stellt sich heraus, dass der Genie-Interpreter ¢wie #folgt buchstabiert : Das ist alles, was wir brauchen, um an Zeichen 1 vorbeizukommen und einen Polyglot zu machen.

Genie verfügt in der Tat über drei Syntaxoptionen für Kommentare, wobei die beiden anderen cound commentfett geschrieben sind. Ja, mutig. Wenn wir Kursivschrift verwenden, ist das eine Variable. Genie löste das für uns wieder, indem er fett in Großbuchstaben schrieb. Und da COes nirgends in der Mehrsprachigkeit gibt, haben wir eine einfache Methode, um die Mehrsprachigkeit vor dem Parser zu verbergen. Wenn später COeine Sprache benötigt wird, können wir zur ausführlicheren COMMENTSyntax wechseln .

In ALGOL gibt es keine Zeilenkommentare - sie sind alle im Blockstil, was bedeutet, dass sie beendet werden müssen. In Anbetracht des Anfangszustands des Polyglots wird unser ALGOL-Blockkommentar sofort geöffnet und am Ende von Zeile 1 beendet, da Turtlèd dies ebenfalls #als Sprungmarke verwendet. Turtlèd hat zum Glück kein Problem damit, durch die Zeichen Cund zu gehen. Daher Okönnen wir in Zeile 1 COunmittelbar nach der Sekunde #einen Fat Block-Kommentar für ALGOL68 einfügen.

Von hier müssen wir nur noch COprint("65")irgendwo platzieren. Ich habe die letzte Zeile gewählt, weil ich es vorgezogen habe, die Zeile mit einem anderen #Kommentar abzuschließen, und wollte nicht, dass der Kommentar #am Anfang der letzten Zeile endet . Deshalb setzen wir unsere ALGOL-Druckanweisung mit #sund #als letztes Zeichen im Polyglot fort. Das sIn #sist für Alphuck, um das pIn-Print auszugleichen .

Vielen Dank an @ ais523, dass Sie das Ende des Polyglots mit der Antwort 59 geöffnet haben und dies alles möglich gemacht haben.

SMBF

Wir haben dem Ende des Polyglots ein anderes Zeichen hinzugefügt, um den abschließenden Kommentar von ALGOL zu beenden, und SMBF hat zuvor das letzte Zeichen für seine Antwort gelesen. Um dies zu beheben, musste ich SMBF ändern, um das vorletzte Zeichen zu lesen, indem ich diesen Code in Zeile 8 [.>-]in diesen änderte [<.>>-]. Dies ist ein privater SMBF-Codeblock, da der MP von BF bei Einleitung der Schleife auf 0 steht.

Auslösen

Zu diesem Zeitpunkt bemerkte ich ein merkwürdiges Verhalten mit SMBF und es hing mit den Beziehungen zwischen diesen Codesegmenten und dem Ende des Polyglots zusammen.

• Sprungziel des Vorfalls: ^_^_

• Sprungziel des Auslösers plus Antwort: X222999

• Antwort von ALGOL68: COprint("65")#s

Die Antwort von ALGOL hat ein paar Incident-Token in seinem Codesegment markiert, sodass der Code von ALGOL vor dem Codesegment von Incident stehen musste. ALGOL verursachte auch ein Vorspiel-Ausrichtungsproblem, wenn es in der Reihenfolge an erster Stelle stand und daher an zweiter oder dritter Stelle liegen musste. SMBF hatte in der Zwischenzeit einen unerklärlichen Fehler, als der Incident-Code zuletzt ausgeführt wurde, sodass Incident an erster oder zweiter Stelle stehen musste. Nun, ich erkannte, dass dies ein einleitendes logisches Problem war, das unlösbar schien, und machte mich daran, das Unerklärliche noch ... erklärbarer zu machen.

Nachdem ich durch SMBF gegangen war, stellte ich fest, dass das Problem mit ^ _ ^ _ am Ende von Wise herrührte. Wises Code ( ~-<~-<~-<<<~-) ist im Gegensatz zu den meisten Polyglotten nicht hinter einer nicht ausgeführten Schleife verborgen. In Wises Code sind jedoch keine SMBF-Druckcodes enthalten. Es änderte nur die Speicherwerte. Es schien harmlos. Was war das Problem dann? Es war dieser verdammte SM vor dem BF.

Der Code von Wise ändert die Zeichen im Code, die ausgeführt werden sollen, und können Sie den ASCII-Wert des Nachbarn erraten ^? Es ist ]. Wise platzierte einen SMBF-Schleifenabschluss am Ende des Polyglots, wodurch SMBF in eine Endlosschleife geriet. Das ist schlechtes Mojo.

Nach einigem Nachdenken habe ich die 0 - Byte - Lösung für das Problem und getrennte Auslöser des Sprungziel ( X) aus ihrer Antwort ( 222999) und die polyglotten endete so: ~-<~-<~-<<<~-XCOprint("65")#s^_^_2229996#. Dies funktioniert nur, weil nach dem Sprung des Auslösers, der nicht die Antwort des Auslösers ist, kein Zeichen nacheinander erscheint.

Einpacken

Das sind die wichtigsten Änderungen in dieser Runde. Ich habe eine kleine Änderung vorgenommen, um die cin Zeile 1 diskutierte Menge zu kürzen , aber das ist es, um nur Golf zu spielen.

Viel Glück!

Vorfallsbericht

#<q>"3"O.swurde, #<T>"3"O.sweil das Entschlüsseln Tanstelle des qAuswuchtens effizienter war

<>{wurde <>{ndzu erkennen ndund{␊

Fügen Sie ein Leerzeichen zwischen }}und +ein #<]}} +<[<.>>-]>[, um }}+billiger zu erkennen.


25

2. V (11 Bytes)

print(1)#i2

Dieses Programm druckt 1 in Python 3 und 2 in V.

Nur um den Ball ins Rollen zu bringen und meine Lieblingssprache früh in den Mix zu bringen. :)

Es ist eine sehr einfache Antwort.

print(1)#

Zufällig ist es ein NOP in V. (Glück für mich). Dann i2geht es in den Einfügemodus und fügt eine '2' ein. Sie können V hier online testen

Natürlich in Python

print(1)

druckt '1' und

#i2

ist ein Kommentar.


2
Ist das V oder Vim? Der Interpreter, mit dem Sie verbunden sind, ist technisch gesehen "V".
mbomb007

@ mbomb007 Naja, V ist fast vollständig abwärtskompatibel, daher war die Absicht vim. Ich nehme an, dass es technisch gesehen V ist. Ist es zu spät, um sich zu ändern?
DJMcMayhem

2
Nicht wirklich, bearbeite einfach den Titel in den Antworten.
mbomb007

1
@ mbomb007 Ein buchstäbliches ESC-Zeichen erledigt dies (weshalb ich in meiner Einreichung eines verwenden musste).

1
Hinweis für diejenigen, die dies testen: Sie müssen sicherstellen, dass keine Pinnwand aus der vorherigen Vim-Sitzung übertragen wurde.
Riking

24

20. Präludium, 167 Bytes

#v`16 "<" 6/b0\ .q@#;n4"14""
#>3N9@15o|R"12"*^*ttt*~++%
#=|
print((1/2and 9 or 13)-(0and+4)^1<<65>>62);#35(99999+++++!) =#;print(17)
#       ~nJ<
#
#gg99ddi2` |1|1+6

Literale ESC-Zeichen an derselben Stelle wie in den vorherigen Übermittlungen (zwischen #und gund zwischen 2und `in der letzten Zeile), da Sie Vim nicht mit druckbaren Zeichen aus dem Einfügemodus entfernen können.

Dieses Programm druckt 20 in Prelude , 19 in Reng ( hier testbar ), 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 , 8 in Retina , 7 in Japt , 6 in SMBF ,5 in Python 2 , 4 in> <> , 3 in Minkolang , 2 in Vim / V , 1 in Python 3 unda partridgein A Pear Tree .

Der vorhandene Code bricht sich in Prelude so ziemlich von selbst ab und besteht nur aus while-Schleifen mit falschen Argumenten und einigen Stapelmanipulationen für Stapel, die uns egal sind. Noch besser ist, dass es eine Stelle im Code gibt, die in allen Sprachen, in denen sie vorkommen, einen Kommentar enthält (zwischen dem #und =#der vorherigen Einreichung). Der schwierige Teil der Anpassung von Prelude bestand darin, mit nur einem Stapel Zahlen zu generieren, ohne die Bytezahl zu erhöhen. Dieses Programm verwendet eine Schleife, die jedem Stapelelement 45 hinzufügt und es als ASCII ausgibt. Wenn Sie also eine 5 über eine 3 auf dem Stapel platzieren, erhalten Sie 20eine Ausgabe. (20 ist eine einfacher auszugebende Zahl als 19 im Prelude, daher hat es mir ein wenig geholfen, die Antwort 19 zu posten.)


Das Präludium sollte für zukünftige Programme ziemlich einfach zu bearbeiten sein. Einige Ratschläge für alle, bei denen es zu Problemen kommen kann: Klammern nicht vertikal ausrichten lassen; Stellen Sie sicher, dass keine Ausrufezeichen außerhalb von Klammern zulässig sind. und sobald Sie Ziffern außerhalb von Klammern gesetzt haben, platzieren Sie keine weiteren Klammern mehr direkt in derselben Zeile. Die Lücke, in die ich das Prelude-Programm gesteckt habe, ist immer noch offen und es sieht so aus, als ob es ein fruchtbarer Ort für andere 1D-Sprachen ist (Preludes Art von 1½D und verhält sich in diesem Programm eher wie eine 1D-Sprache).

Nizza, schlagen Sie mich zum Schlag mit Prelude :) Ich denke eigentlich, ASCII-only V könnte mit :%sersetzen möglich sein , aber selbst dann ist es ein wenig schwierig (und V ist ärgerlich zu testen)
Sp3000

Wenn Sie :einen Befehl in vim mit a starten, benötigen Sie einen Wagenrücklauf, der zufällig auch nicht druckbar ist. : /
Zwei

4
+10000000000 für a partridgein A Pear Tree. Aber wird es 5 GOLDin RINGS gedruckt ?
immibis

23

30. Leerzeichen , 296 Bytes

#v`16/"<"6/b.q@"(: ::T):  ␉␉␉␉ :(22)S#;n4"14"
#>3N6@15o|>␉^*ttt*~++~~~%
#=~nJ<R"12"; ␉
#[␉
#`<`|
print((eval("1\x2f2")and (9)or(13))-(0and 4)^(1)<<(65)>>62)or'(\{(\{})(\{\/+23!@}[()])}\{})(\{}\{})'#46(8+9+9+9+9+=!)=#print(17)#]#echo 21#|/=1/24=x=90/
#8␛dggi2␛␉` |1|6$//''25  #>say␉␉ 27#T222999"26

␛ steht für buchstäbliche Fluchten.

␉ steht für wörtliche Registerkarten.

Dieses Programm druckt 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, 15 in Haystack , 14 in Turtlèd , 13 in Ruby , 12 in Fission , 11 in Befunge-98 , 10 in Befunge-93 , 9 , 21 in Nim , 20 in Prelude , 19 in Reng ( hier getestet ), 18 in Cardinal , 17 in Julia , 16 in Pyth ,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 .

Whitespace ist ein weiterer Esolang mit begrenztem Zeichensatz. Dieser liest nur Tabulatoren, Leerzeichen und Zeilenvorschübe.

Wenn wir also alle Dinge herausnehmen, die Whitespace nicht liest, bleibt uns der folgende Code übrig:

[space][space][space][LF]
[space][LF]
[LF]
[LF]
[LF]
[space][space][space][space][space][LF]
[space][space][space][space]

Und der Code für die Ausgabe von 30 lautet:

[space][space][space][tab][tab][tab][tab][space][LF]
[tab][LF]
[space][tab]

Die obersten drei Zeilen des vorhandenen Codes erhielten daher zusätzliche Leerzeichen am Zeilenende, um die Anforderungen zu erfüllen. Beachten Sie, dass sich die Tabulatoren und das Leerzeichen in Zeile 1 in der Mitte der Zeile befinden, um den Anforderungen von> <> gerecht zu werden.

Das Feld in Zeile 2 wurde hier in einen Tabulator geändert. Dies scheint identisch mit einem Raum für die 2D-Sprachen zu funktionieren, aber optisch sieht es nicht mehr so ​​aus. ¯ \ _ (ツ) _ / ¯

Nach den Anweisungen zur Ausgabe von 30 bekam das Spiel den Rest der erforderlichen Leerzeichen und Zeilenumbrüche, um sinnlose Dinge zu tun und richtig zu kompilieren.

Leerzeichen enthalten zufällig Anweisungen, die eine Codestelle mit einer Beschriftung markieren / markieren, die eine beliebige Anzahl von Tabulatoren und Leerzeichen zulässt, sodass die Leerzeichen in der langen Zeile besser abgeglichen werden. Es beginnt und endet auch mit einem Zeilenvorschub, sodass wir einige der Zeilenvorschübe in den Zeilen 3 bis 6 verbessern konnten.

Die letzte Zeile kann keinen Zeilenvorschub haben, ohne die Netzhaut zu beschädigen. Daher müssen Sie eine willkürliche Berechnung und Stapelmanipulation durchführen.

Hier ist der vollständige Code mit Leerzeichen, Tabulatoren und Zeilenumbrüchen, die durch unsere Notation ersetzt wurden:

#v`16/"<"6/b.q@"(:[Space]::T):[Space][Space][Tab][Tab][Tab][Tab][Space]:(22)S#;n4"14"[LF]
#>3N6@15o|>[Tab]^*ttt*~++~~~%[LF]
#=~nJ<R"12";[Space][Tab][LF]
#[[Tab][LF]
#`<`|[LF]
print((eval("1\x2f2")and[Space](9)or(13))-(0and[Space]4)^(1)<<(65)>>62)or'(\{(\{})(\{\/+23!@}[()])}\{})(\{}\{})'#46(8+9+9+9+9+=!)=#print(17)#]#echo[Space]21#|/=1/24=x=90/[LF]
#8␛dggi2␛[Tab]`[Space]|1|6$//''25[Space][Space]#>say[Tab][Tab][Space]27#T222999"26[LF]

Und hier ist eine kommentierte Version des Whitespace:

Push 30 onto the stack
[space][space][space][tab][tab][tab][tab][space][LF]

Output the number at the top of the stack
[tab][LF][space][tab] 

Jump to label null if the top of the stack is negative. (it's not)
[LF][Tab][LF]

Label this location as [Space]
[LF][Space][Space][Space][LF]

Add the top two items on the stack and replace them with the result. 
[Tab][Space][Space][Space]

Store the stack.
[Tab][Tab][Space]

Änderungen: Hexagony überspringt entgegen meiner vorherigen Behauptung Tabulatoren wie Leerzeichen. @ ais523 war so freundlich, @ Kenneys Hexagonizer zu aktualisieren, um buchstäbliche Escapes und Tabulatoren zu berücksichtigen. Ich musste es modifizieren, um meine vorherige Behauptung zu korrigieren, dass Tabulatoren als No-Ops gelesen werden, und um wörtliche Escapezeichen durch zu ersetzen, .da das Zeichen breiter als andere Zeichen ist und das Hex leicht falsch ausgerichtet ist. Hier der Link .

Und das ist unser korrigierter aktueller Hex:

          # v 1 6 / " < " 6 /
         b . q @ " ( : : : T )
        : : ( 2 2 ) S # ; n 4 "
       1 4 " # > 3 N 6 @ 1 5 o |
      > ^ * t t t * ~ + + ~ ~ ~ %
     # = ~ n J < R " 1 2 " ; # [ #
    < | p r i n t ( ( e v a l ( " 1
   \ x 2 f 2 " ) a n d ( 9 ) o r ( 1
  3 ) ) - ( 0 a n d 4 ) ^ ( 1 ) < < (
 6 5 ) > > 6 2 ) o r ' ( \ { ( \ { } )
  ( \ { \ / + 2 3 ! @ } [ ( ) ] ) } \
   { } ) ( \ { } \ { } ) ' # 4 6 ( 8
    + 9 + 9 + 9 + 9 + = ! ) = # p r
     i n t ( 1 7 ) # ] # e c h o 2
      1 # | / = 1 / 2 4 = x = 9 0
       / # 8 . d g g i 2 . | 1 |
        6 $ / / ' ' 2 5 # > s a
         y 2 7 # T 2 2 2 9 9 9
          " 2 6 . . . . . . .

Schließlich habe ich ein paar unnötige Zeichen ausgespielt, die größtenteils zuvor hinzugefügt wurden, um Prelude-Klammern und Hexagony-Hexagone in einer Reihe aufzustellen.

Nims Code ist zurück echo 21vonecho 5+5+11

Hexagony #@46ist jetzt#46

Der Code /+23!@=von Hexagony ist zurück von/+23!@

Präludium der Klammerausrichtung von (9) or (13) wurde(9)and(13)

Nun, das ist alles was ich habe. Viel Glück allen!


1
Ich glaube, ich habe alle Verknüpfungen behoben und and an Stellen des Platzes hinzugefügt, die sich aus meinen Kopierpasten ergaben. Nicht sicher, wie Tabs in SE zu Tabs werden, der Code in Tio sollte eindeutig sein. Ich musste auch meine Lösung aus den Anweisungen in dieser Antwort neu erstellen, aber irgendwie endete ich mit 2 Bits weniger ... Ups?
Chance

1
Wir haben gerade einen Fehler in Ihrer Erklärung bemerkt: Wagenrücklauf (ASCII 13) ist ein anderes Zeichen als Zeilenvorschub (ASCII 10). Die überwiegende Mehrheit der Sprachen (einschließlich Whitespace) kümmert sich um die 10er, nicht um die 13er (und es wird angenommen, dass ein Zeilenumbruch in einer PPCG-Übermittlung nur eine einzelne ASCII-10 ist, sofern nicht anders angegeben, da die 13er dazu neigen, Ihre Byteanzahl auf Nein zu erhöhen Vorteil).

1
Ihr Sechseck-Erklärungsbild ist falsch ( druckte23 ), weil es ;nach dem e erscheint, wenn Sie nach der ersten Reflexion NW erreichen. Der obige Link funktioniert, wenn ...?
MildlyMilquetoast

1
Ich bin zu dem Schluss gekommen, dass das TIO für Hexagony Tabulatorzeichen als Leerzeichen / Zeilenumbrüche behandelt. Das von Ihnen bereitgestellte Image des Hexagony-Programms wird nur beendet, wenn Sie es befolgen (oder in TIO ablegen und Tabulatoren durch .s ersetzen ). Kopieren Sie jedoch den Code im Bild in TIO, mit der Ausnahme, dass Sie das Training .(nicht Teil des tatsächlichen Codes) und alle alls entfernen. Es druckt 23.
MildlyMilquetoast

1
Wow, danke @MistahFiggins! Es sieht so aus, als hätte ich einige deduktive Fehler gemacht und sie zu meiner Erklärung weitergegeben. Ich habe die Hexagony-Erklärung, das Hex-Diagramm und das Hexagonoizer-Perl-Skript korrigiert und das Ergebnis direkt mit Hexagony abgeglichen. Alles sollte jetzt gut sein. Guter Fund!
Chance

23

100. brainbool, 2953 bytes

#16  "?63(o?23!*# #@"/*\DZZCv;'[af2.q]PkPPX)\('#CO"14"; */
#/*0|7//```"`  [>.>.])[-'][(>77*;,68*,@,1',;# l1011)(22)S\4n;iiipsddpsdoh coding:utf8ââââ(1P''53'S^'????!?!??!??!!!!???!?!??!!?!?!!!!!?!!!!?????!????????????????????!) (qx
#>â
# 36!@â`  e++++++::@ 
#~
#y
#`<`
#<<<#>>]}}+-[.+..]+-+<[<<.>>x>-]>[
#{
#x}
#2""/*\*
#=x<R+++++[D>+++++++q   L+++<-][pPLEASE,2<-#2FAC,2SUB#1<-#52FAC,2SUB#2<-#32FACREADOUT,2PLEASEGIVEUPFACs]>@@+.---@.>][
#x%+>+=ttt Z_*.
#D>xU/-<+++L
#R+.----\   \).>]4O6O@|
#[#[(?2?20l0v01k1kMoOMoOMoOMoO MOO0l0ix0jor0h0h1d111x0eU0y0yx0moO1d0y0e0e00m1d0i0fx0g0n0n11MoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOmOoMOo0moo0n0tx0t0moO0f0t0gOOM0g0f0h0j0j0i0001k1x0vx0v0l111111^_0 )0\\
[  "]56p26q[puts 59][exit]" ,'\[999'];#/s\\/;print"24";exit}}__DATA__/
###x<$+@+-@@@@=>+<@@@=>+<?#d>+.--.<!\
'(wWWWwWWWWwvwWWwWWWwvwWWWw WWWWWWWWwWW/"78"oo@WWwWWWWWWWwWWWWWWWWwwwwvwWWWwWWWWwvwWWwWWWwvwWWwWWWwvwWWwWWWw              (([5]{})))â\';';print((eval("1\x2f 2")and 9or 13<< (65)>>65or 68)-(0and 4)^1<<(65)>>62)or"'x"or' {}{}{}{}({}<(((((()()())){}{})){}{})>)(({})5){}x{(x<(<()>)({})({}<{}>({}){})>){({}[()])}}({}){}({}()<()()()>)wWW no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no os sp '#}#(prin 45)(bye)46(8+9+9+9+9+=!)((("3'3)))"'a'[[@*3*74[?]*]*(<*.*\>]xxxxxxxxxxxxx)'# \\
__DATA__=1#"'x"
#.;R"12"'
###;console.log 39;'(******* **********819+*+@[*99[?]*]***|!)'
#\\
""""#\
' ( <><        (          )>  ){ ({}[()]  )}{\';      a=$(printf \\x00    );b=${#a};#\\
" }"';           ((   ( (';case "{"$ar[1]"}"${b} in *1)echo 54;;*4)echo 78;; *1*)echo 50;;*)echo 58;;esac;exit;# (((('))))#\
=begin
#p             +555/2+55x%6E2x
;set print "-";print 89;exit#ss 9
utpb now 70 dollar off!
utpb has been selling out worldwide!
#9999 9 seeeemPaeueewuuweeeeeeeeeeCis:ajjappppppp😆😨😒😨💬95💬👥➡
👋🔢🌚🌝🌝🌚🌚🌚🌚🌚

set ! 57
set ! 51
More 91 of thiset of re9
How much is it*/
#if 0
.int 2298589328,898451655,12,178790,1018168591,84934449, 12597
#endif//*
#1"" //*
#include<stdio.h> 
#defineâ x(d)â#d
#define u8 "38\0 "
main ( ) {puts( sizeof (0,u8)-5?u8"67":*u8""?"37":     x( 0'0  "'\"")[9]?"75":'??-'&1? "79":"77");"eg5""6 27""e ' Zing  ";}//*/
#if 0
#endif//* --... ...--
/*/
p=sizeof("9( 999 99\"    ); print'(''72'')';end!"            );main( ){puts(  "92");return(9-9+9 -9);}
#if 0â
#endif//* rk:start | print: "69" rk:end<(9    >5b*:,1-,@
print 61
#}
disp 49 ;9;
#{
}{}<>
$'main'3
#-3o4o#$$$
#<T>"3"O.</+++++++>/+++<-\>+++.---.
#<<<#>>> /
reg end="";print(85);reg s#++++++++++++++++++++++++++++++++++++++++++++++++++++++++.-.
=end
;"""#"#xxxxxxxy"78"\++++>/<~#class P{        function:Main(a:String[] )~Nil{83->Print();} }
#}pS9^7^8^MUOUOF@:8:8\\
#s|)o51~nJ;#:p'34'3  \=#print(17)#>27.say#]# print(47) #]#echo 21#fwwwwwWWWwWWWWWwWWWWWWWwWWWWWWWWWwWWWWWWWWWWWWWWWwWWWWWWWWWWWWwvm>++++
#s8âdggi2âM`|$//''  1$6~-<~-<~-<<<~-COprint ("65")#asss^_^_#
#9 "25"  +/ *///X222999686#

VIP Punktzahl ( Versatile Integer Printer) ): .002953 (zur Verbesserung sollte der nächste Eintrag nicht mehr als 3042 Byte umfassen)

Heruntergewirtschaftet

Dieses Programm druckt 1 in Python 3, 2 in V / Vim, 3 in Minkolang, 4 in> <>, 5 in Python 2, 6 in SMBF, 7 in Japt, 8 in Retina, 9 in Perl 5, 10 in Befunge- 93, 11 in Befunge-98, 12 in Fission, 13 in Ruby, 14 in Turtlèd, 15 in Haystack, 16 in Pyth, 17 in Julia, 18 in Cardinal, 19 in Reng, 20 in Prelude, 21 in Nim, 22 in Underload, 23 in Hexagony, 24 in Thutu, 25 in Pip, 26 in 05AB1E, 27 in Perl 6, 28 in Brain-Flak, 29 in Trigger, 30 in Whitespace, 31 in Modular SNUSP, 32 in Whirl , 33 in Incident, 34 in Rail, 35 in INTERCAL, 36 in Labyrinth, 37 in C ++ 03, 38 in C99, 39 in CoffeeScript, 40 in Minimal-2D, 41 in Brainfuck, 42 im Bösen, 43 im Retikular, 44 im Alphuck, 45 in PicoLisp, 46 in Cubix, 47 in Lily, 48 in Deadfish ~, 49 in Octave, 50 in Bash, 51 in Assembly, 52 in COW, 53 in Shove, 54 in Zsh, 55 in Brain-Flak Classic, 56 in dc, 57 in Wise, 58 in Ksh, 59 in Tcl, 60 in Moorhens, 61 in SILOS, 62 in Grass, 63in Brian & Chuck, 64 in Agony, 65 in ALGOL 68, 83 in Objeck, 66 in Surface, 67 in C11, 68 in Python 1, 69 in rk-lang, 70 in Commercial, 71 in what, 72 in Fortran, 73 in Morse, 74 in Archway, 75 in C ++ 11, 76 in Trefunge- 98, 77 in C ++ 14, 78 in Strich, 79 in C ++ 17, 80 in Klein 201, 81 in Klein 100, 82 in Brain-Flueue, 84 in Klein 001, 85 in zkl, 86 in Miniflak, 87 in Alice, 88 in PingPong, 89 in Gnuplot, 90 in RunR, 91 in Cood, 92 in C89, 93 in Set, 94 in Emotinomicon, 95 in Emoji, 96 in EmojiCoder, 97 in Cubically, 98 in Archway2, 99 in 99 . 100 in brainbool

Nachprüfung

Probieren Sie es online! Für TIO nicht verfügbare Sprachen:

Erläuterung

Ich kann nicht glauben, dass wir es in 100 Sprachen geschafft haben. Ich möchte mir nur die Zeit nehmen, um allen zu danken, die an diesem Prozess beteiligt waren. Es war eine lustige Fahrt und ich hoffe, mit euch 100 mehr hinzuzufügen.

Brainbool ist schon eine Weile in meinem Auge. Da brainbool jedoch nur zwei Zahlen ausgeben kann 1und 0ich es bisher nicht hinzufügen konnte (ich war für 10 und 11 nicht da).

Brainbool ist genau wie Brainfuck, außer dass es nicht mit 256, sondern mit 2 umbrochen wird. Brainbool hat auch kein, -weil es mit dem überflüssig ist +. Unser Brainbool-Code für die Ausgabe von 100 ist ziemlich einfach:

+.+..

Um die Ausgänge für Brainfuck zu maskieren, fügen wir eine Schleife und ein Minus hinzu:

+-[.+..]

Jetzt muss nur noch ein Platz für den Code gefunden werden. Mein bevorzugter Platz war der erste +auf der obersten Ebene des Brainfuck-Codes in Zeile 8. Um das Plus zu ersetzen, haben wir unseren Code und ein hinzugefügt, +-+das als ein +in Brainfuck und ein noop in brainbool fungiert.

+-[.+..]+-+

Cubix

Ich stelle meinen Code vor die Cubix-Kapsel, wodurch sich ein Spiegel in den Pfad des Zeigers bewegt. Um dies zu beheben, bewegte ich die Kapsel ein paar Schritte vor dem beleidigenden Spiegel und alles war in Ordnung.

Überraschenderweise hat nichts anderes den berüchtigten Vorfall gebrochen.


Tatsächlich kann brainbool beliebigen Text ausgeben. Wenn Sie das -bArgument übergeben, werden Einsen und Nullen in Bytes umgewandelt und dann als Zeichen ausgegeben.
Pavel

1
@ WheatWizard Ich bestätige, dass es in Archway2 funktioniert.
Stasoid

1
Glückwunsch! Ich stelle fest, dass die VIP-Punktzahl ebenfalls unter 0,003 gefallen ist.
Ørjan Johansen

1
Ich muss gestehen, als Sie ursprünglich darüber geschrieben haben, dies für 100/101 hinzuzufügen, dachte ich nicht, dass wir jemals hierher kommen würden. Das ist ziemlich verdammt cool.
SnoringFrog

1
@stasoid Ich arbeite daran, Archway auf TIO zu bringen, nur zur Info.
MD XF

21

27. Perl 6 , 235 Bytes

#v`16/"<"6/b.q@"(::):::  (22)S#;n4"14"
#>3N6@15o|> ^*ttt*~++~~~%
#=~nJ<R"12";
#[
#`<`|
print((eval("1\x2f2")and 9 or 13)-(0and 4)^1<<65>>62)#@46(8+9+9+9+9+=!)=#print(17)#3]#echo 21#===2|/=1/24=x=90/
#8␛dggi2␛` |1|6$//''25  #>say 27#"26

␛ steht wie gewohnt für ein buchstäbliches ESC-Zeichen.

Dieses Programm druckt 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 ( hier getestet ), 18 in Cardinal , 17 in Julia , 16 in Pyth , 15 in Haystack , 14 in Turtlèd , 13 in Ruby , 12in 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 Vim / V , 1 in Python 3 und (wie es Weihnachten ist) a partridgein A Pear Tree .

Die Syntax, die Stack Exchange für diese Antwort hervorhebt, ist völlig falsch. #`<ist einer der vielen mehrzeiligen Kommentarmarken #>in Perl 6 und endet bei . Daher ist der einzige Code, der in Perl 6 ausgeführt wird, der sehr einfache say 27. Ich habe diesen speziellen Kommentarmarker ausgewählt, da er <>in den meisten Sprachen nicht zu einem Paar passt. Daher <werden Sprachen wie Retina, die versuchen, ihn zu analysieren, von den nicht übereinstimmenden nicht zerstört.

Ich bin mir nicht ganz sicher, wie die Hexagony funktioniert. Als es kaputt ging, änderte ich eines der Zeichen, die es verwendete, von a +nach a, um 0zu sehen, ob es getroffen wurde. Es stellte sich heraus, dass dies das Programm repariert hat, aber ich bin mir nicht sicher warum (ich weiß, dass es aufgrund einer #in der Ausführungslinie eingebrochen ist , aber es ist unklar, warum die +Fixes entfernt wurden). (Die betreffende Figur wird auch von Thutu analysiert, aber zum Glück hat dies keinen Einfluss auf die Funktionsweise des Thutu-Programms, da an diesem Punkt im Programm alles, was nicht von a vorangestellt =wird, buchstäblich in das Werk kopiert wird string.) Beachten Sie, dass das0and+4 aus einer vorherigen Zeile wurde0and 4, um es aus Sicht von Hexagony um ein Zeichen kürzer zu machen (Hexagony sieht keine Leerzeichen); Dies dient zum Ausgleich des #|Werdens einer vorherigen Zeile #`<`|, die aus Hexagony-Sicht ein Zeichen länger ist (weil sie auch keine Backquotes sieht). Beachten Sie, dass der Code jetzt nur noch fünf Bytes von der Erweiterung der Hexagony-Seitenlänge entfernt ist und alle Informationen zum aktuellen Hexagony-Code enthält. Ich würde trotzdem empfehlen, dies zu tun und nur den Hexagony-Abschnitt des Codes zu wiederholen. Nach einer Erweiterung wird es wahrscheinlich einfacher als schwieriger sein, alles unterzubringen.

Einige andere Sprachen haben sich ebenfalls geändert, hauptsächlich, um eine ausreichende Robustheit zu gewährleisten, damit ich beliebigen Code in die letzte Zeile einfügen kann. $//ist eine Kommentarmarkierung in Japt, die Leerzeichen später in der Zeile zulässt, wodurch das hinzugefügte Programm in Japt weniger anfällig wird //. Ein Leerzeichenpaar ist eine Kommentarmarkierung in Pip, sodass der Pip-Code hier wesentlich vereinfacht werden kann. Dies bedeutet auch, dass wir den 05AB1E bis zu einem Trivial vereinfachen können"26 . Retina braucht die fünfte Zeile, um ein legaler Regex zu sein, der gut zu den Dingen passt (das abschließende|ist also für Retina); es analysiert anders als die entsprechende Zeile im vorherigen Eintrag, aber auf eine Weise, die genauso geeignet ist. Der Kardinal ist auch etwas einfacher als in den vorherigen Einträgen, aber dies ist nur ein Zufall, wie alles vertikal ausgerichtet ist, und die Änderung besteht darin, Code zu verwenden, der sowieso nichts getan hat.

Unter der Annahme , wiederholen Sie die Hexagony (Sie wahrscheinlich werden), gibt sichere Orte sind alle in den letzten drei Zeilen hinzufügen Code auf: die 3in #3]#nur für Hexagony (und leicht geändert); Der Abstand zwischen #und "in der letzten Zeile wird von der überwiegenden Mehrheit der Sprachen ignoriert. und nichts analysiert wirklich das Ende der fünften Zeile außer Retina. (Es gibt viele andere Stellen, an denen Code hinzugefügt werden kann, aber diese sind wahrscheinlich die bequemsten.)


1
Ich habe diese Antwort versehentlich abgelehnt und festgestellt, dass ich abgelehnt habe, als ich festgestellt habe, dass mein Mitarbeiter um 1 gesunken ist. Können Sie die Antwort so bearbeiten, dass ich upvote kann? : D
betseg

4
@betseg: Ich habe ein bisschen mehr Diskussion über die Hexagony hinzugefügt, nur für dich.

2
Herzlichen Glückwunsch zu der Prämie! Ich wollte, dass dieser Beitrag wieder in Bewegung kommt: P
FlipTack

Ich hatte vor, es für Ewigkeiten fortzusetzen, es war nur ein Versuch, die Zeit zu finden. (Ich hatte vor einiger Zeit einen gescheiterten Versuch mit Perl 6 unternommen und ihn nicht veröffentlicht, weil er nicht funktioniert hat. Zum Glück habe ich aus den Fehlern gelernt und diesmal funktioniert er.)

21

31. Modulares SNUSP , 326 Bytes

Programm

#v`16/"<"6/b.q@"(: ::T):  ␉␉␉␉ :(22)S#;n4"14"
#>3N6@15o|>␉^*ttt*~++~~~%
#=~nJ<R"12"; ␉
#[␉
#`<`|
print((eval("1\x2f2")and (9)or(13))-(0and 4)^(1)<<(65)>>62)or'(\{(\{})(\{}[()])}\{})(\{}\{})'#46(8+9+9+9+9+=!)=#print(17)#]#echo 21#|/=1/24=x=9[<$+@+-@@@@=>+<@@@=>+<?#>+.--.]/
#8␛dggi2␛␉` |1|6$//''25  #>say␉␉ 27#T222999+/+23!@"26

Wie üblich ist dies ein buchstäbliches ESC-Zeichen und eine buchstäbliche Registerkarte.

Heruntergewirtschaftet

Dieses Programm druckt 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 im Vorspiel, 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

Warum keine Links im Rundown? Da ich an etwas gearbeitet habe, das das Testen erheblich vereinfacht, führt ein Testtreiber das Programm in den meisten der hier aufgeführten Sprachen aus und gibt das Ergebnis aus. Dies dürfte das Hinzufügen zukünftiger Sprachen zum Polyglot hoffentlich erheblich erleichtern. Sie können die Ergebnisse dieses Programms für 28 der 31 Sprachen erhalten, indem Sie den folgenden TIO-Link ausführen (bei dem es sich um einen in einer Mischung aus Bash, Perl und A Pear Tree geschriebenen Testtreiber handelt):

Probiere sie online aus!

Der Link erzeugt auch den oben gezeigten / -formatierten Codeblock und formatiert den Code für Sie in ein Sechseck:

          # v 1 6 / " < " 6 / b
         . q @ " ( : : : T ) : :
        ( 2 2 ) S # ; n 4 " 1 4 "
       # > 3 N 6 @ 1 5 o | > ^ * t
      t t * ~ + + ~ ~ ~ % # = ~ n J
     < R " 1 2 " ; # [ # < | p r i n
    t ( ( e v a l ( " 1 \ x 2 f 2 " )
   a n d ( 9 ) o r ( 1 3 ) ) - ( 0 a n
  d 4 ) ^ ( 1 ) < < ( 6 5 ) > > 6 2 ) o
 r ' ( \ { ( \ { } ) ( \ { } [ ( ) ] ) }
\ { } ) ( \ { } \ { } ) ' # 4 6 ( 8 + 9 +
 9 + 9 + 9 + = ! ) = # p r i n t ( 1 7 )
  # ] # e c h o 2 1 # | / = 1 / 2 4 = x
   = 9 [ < $ + @ + - @ @ @ @ = > + < @
    @ @ = > + < ? # > + . - - . ] / #
     8 . d g g i 2 . | 1 | 6 $ / / '
      ' 2 5 # > s a y 2 7 # T 2 2 2
       9 9 9 + / + 2 3 ! @ " 2 6 .
        . . . . . . . . . . . . .
         . . . . . . . . . . . .
          . . . . . . . . . . .

Drei Sprachen fehlen: V ist zu langsam und Reng und Modular SNUSP sind nicht auf TIO installiert. Zum Glück haben alle drei Online-Dolmetscher:

  • Sie können das Programm in V / Vim (vorgesehene Ausgabe: 2) hier auf TIO testen .
  • Es gibt einen Online - Reng - Interpreter (vorgesehene Ausgabe: 19) hier .
  • Es gibt eine Online - Modular SNUSP Interpreter (vorgesehene Ausgabe: 31) hier . (Es wird nur als SNUSP-Interpreter beworben, aber Modular SNUSP ist der Dialekt, den es tatsächlich implementiert, wie die @Zeichen auf der ganzen Seite zeigen.)

Alle drei erzeugen die beabsichtigte Ausgabe, sodass alle 31 Programme ordnungsgemäß getestet werden. (Eine Sache, die mich ein wenig beunruhigt, ist, ob das Whitespace-Programm korrekt beendet wird. Allerdings ist das Whitespace hier identisch mit der vorherigen Übermittlung, sodass beide richtig oder beide falsch sind. Wenn sich herausstellt, dass das Programm tatsächlich beendet wird fälschlicherweise ist es wahrscheinlich, dass beide Programme auf die gleiche Weise repariert werden können.)

Erläuterung

Zuallererst die Hexagony, die immer gewechselt werden muss. Es ist tatsächlich viel einfacher als zuvor; Ich habe den Hexagony-Code direkt nach dem Trigger-Code verschoben, was bedeutet, dass das Programm fast zu Ende ist und die Hexagony-Kapsel, die 23 ausgibt und beendet wird, fast sofort ausgeführt werden kann. Die letzte Zeile sieht im Allgemeinen nach einem guten Platz zum Platzieren der Kapsel aus, da weniger Befehle ausgeführt werden, die möglicherweise die Hexagony stören könnten.

Alle anderen Änderungen betreffen die Hinzufügung des Modular SNUSP-Codes. Das erste, was zu beachten ist, ist, dass SNUSP beim ersten $Zeichen im Programm mit der Ausführung beginnt und eine 2D-Sprache ist, die nach dem Verlassen der Programmkante beendet wird und somit das SNUSP-Programm am Ende der langen Zeile (innen) platziert Mit dem Thutu-Code können wir sicherstellen, dass SNUSP keinen Code aus anderen Sprachen erkennt, und die meisten anderen Sprachen kümmern sich nicht um SNUSP. Eine Sprache, die es interessierte, war Perl 6, das spitze Klammern analysiert. Ich habe eine Ausgabe sowohl in SMBF als auch in SNUSP platziert, und wir möchten keine zusätzliche Ausgabe erstellen. Glücklicherweise ist dieses Programm aus Sicht von SMBF< unmittelbar vor dem SNUSP-Code platziert, um ihn glücklich zu machen (da die Klammern natürlich sowieso fast übereinstimmten). Die andere Sprache, die interessiert, ist SMBF;.<.>>[…] gefolgt vom SNUSP-Code, dh das aktuelle Bandelement ist 0. Wenn Sie den SNUSP-Code in eckige Klammern setzen, wird er aus Sicht von SMBF "auskommentiert".

Der Code selbst verwendet einen bekannten Trick zum Schreiben von Konstanten in Modular SNUSP, bei dem Sie viele "Startprozedur" -Befehle hintereinander schreiben und effektiv eine Art Basis-Fibonacci-Zahl erstellen. Die Grundidee ist, dass +die Zahl 1 kodiert; @addiert die Zahl, die durch den Code dargestellt wird, und die Zahl, die durch den Code dargestellt wird, abzüglich des ersten Zeichens; und =ist ein No-Op (wird also @=die Zahl rechts davon verdoppeln). In diesem System habe ich @@@@=+@@@=+#als Darstellung die Nummer 48 gewählt.

Hier gibt es jedoch ein Problem. Die Standardmethode zum Schreiben von Konstanten in SNUSP lässt den Kontrollfluss hinter dem Start des Programms zurück, und mit einem Oneliner (den ich aus offensichtlichen Gründen hier schreiben wollte) gibt es keine Möglichkeit, die IP so zu ändern, dass sie in eine andere Richtung als die richtige zeigt. Das bedeutet, dass wir die IP irgendwie dazu bringen müssen, die gesamte Konstantendefinition zu passieren und nach rechts weiterzumachen, ohne dass das Programm beendet wird (was #normalerweise der Fall wäre). Um dies zu beheben, habe ich sorgfältig eine Definition der Nummer verwendet, der +immer die vorangestellte vorangestellt war =. Dies bedeutet, dass ich Code schreiben kann, um die zweite Zelle über auf 48 zu setzen @@@@=>+<@@@=>+<#, in der Gewissheit, dass keiner der >Befehle von einem übersprungen wird@Befehl (und damit behalten wir die Kontrolle über den Bandzeiger). Außerdem wissen wir, dass #die erste Bandzelle am Ende noch ihren Anfangswert hat. Daher können wir die erste Bandzelle als Markierung verwenden, um zu wissen, ob wir von der Prozedurdefinition zurückkehren oder nach rechts fortfahren sollen (dabei befinden wir uns in einer Unmenge von Prozeduren, aber wir verlassen das Programm, indem wir von der abfallen Rand, so dass es egal ist).

Der endgültige SNUSP-Code lautet daher $+@+-@@@@=>+<@@@=>+<?#>+.--.. Das $markiert den Start des Programms. +@+-Setzt das erste Bandelement auf 1 ( ++-aber sobald die Prozedur mit @return gestartet wurde, wird der Code von Anfang -an ausgeführt, wodurch das Bandelement auf 0 zurückgesetzt wird. ?#Beendet die Prozedur nur, wenn das erste Bandelement ungleich Null ist Wir landen schließlich nach dem #mit dem zweiten Bandelement auf 50 (48 aus der Konstantendefinition plus 2 aus den beiden, >+<wenn wir danach nach rechts gehen). Dann müssen wir nur noch die >+.--.ASCII-Codes 51 ( 3) und ausgeben 49 ( 1) und fallen aus dem Rand des Programms ( ]ist ein No-Op in SNUSP, und /spiegelt den Kontrollfluss vertikal wider, so dass er von der oberen Kante des Programms abläuft); Dieses Bit funktioniert identisch mit Brainfuck.


20

11. Befunge 98 , 102 Bytes

#v;2^0;7||"<+0+0+0+<;n4
#v0#_q@
#>3N.
#|\w*
#8  ^1b0<
#|
#M`
print(None and 9or 1/2and 1or 5)
#jd5ki2

Drucke:

Um ganz ehrlich zu sein, habe ich keine Ahnung, warum die Ausgabe des Vim-Codes 1 Minute dauert. Auch keine Ahnung, wie Retina funktioniert.

Erläuterung:

#v          Skips the v, which would send the IP down
  ;         Unlike '93, where ; is a no-op, '98 skips to the next ;
            and doesn't execute anything in between
   2^0;     Not executed, unlike Befunge 93
       7|   Pushes 7 onto the stack, and then sends the IP up, because 7 is not 0
n0b1        n clears the stack, and #s are pushed until the stack is [0, 11, 1
    *.      multiplies the top 2 values of the stack to give 11, and prints it (yay!)
      _     Sends the IP right, because the top value of the stack is 0
       q    Ends the program (no-op for '93, which continues to @)

Dinge zu beachten:

  • Das 0nächste bElement ist im aktuellen Status des Codes nicht unbedingt erforderlich, und der Stapel wurde gelöscht. Sie kann bei Bedarf entfernt werden, ermöglicht jedoch im Rahmen eines möglichen zukünftigen Programms zuvor eine andere Stapelmanipulation.
  • Das _q@gibt es als Teil von Retina (Ohne geht es nicht, frag mich nicht warum). Das Hinzufügen von qermöglicht es dem '98-Code auch, eine tOperation auszuführen , die die IP aufteilt (zusammen mit dem Veranlassen, dass das Retina-Programm 8 statt 7 druckt).
  • Das _ist nicht einfach, >weil das den SMBF-Teil durcheinander bringen würde.

Edit: Habe gerade erkannt, dass das _q@wohl sein sollte @00(wobei 0s ~ beliebiges Zeichen sein können), um das Programm in Zukunft flexibler zu machen. Ich bin zu faul (und zu müde), um alle Links zu ändern. Werde es irgendwann schaffen ...

Edit 2: Ich hatte nicht so schnell 6 weitere Antworten erwartet. Ich denke, es bleibt wie es ist. Großartige Arbeit an alle!


He, ich schrieb meine 11. Antwort, nur um festzustellen, dass sie bereits gepostet wurde, jetzt änderte ich sie auf die 12. Antwort :)
Kühe quaken

Irgendeine Idee, warum die Ausführung von Vim so lange dauert?
MildlyMilquetoast

@MistahFiggins Ich denke, es liegt daran, dass der Code in Tastenanschläge konvertiert werden muss, aber ansonsten habe ich keine Ahnung
Cows quaken

Ich habe diesen Vim-Interpreter geschrieben und weiß nicht, warum es so lange dauert. Ich habe vorher noch nicht viele Leistungsprobleme bemerkt, aber das liegt daran, dass die meisten meiner V / Vim-Antworten weniger als 40 Byte sind. Ich bin mir nicht sicher, was es verursacht, aber viele Leute haben sich darüber in diesem Thread beschwert.
DJMcMayhem

20

35. INTERCAL (C-INTERCAL), 631 Bytes

#v`16/"<"6/b.q@"(: ::Q):  ␉␉␉␉ :(22)S#;n4"14"
#>3N6@15o|>␉^*ttt*~++~~~%
#= >␉1#v#v0l0mx01k1k0l0ix0jx0h0h1d111P0eU0bx0b0o1d0b0e0e00x1d0i0fx0g0n0n11x0o0n0cx0c0o0f0c0gx0g0f0h0j0j0i0001k10mx0m0l11111100(^_)
#[␉
#`<`|
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"␉*
""""#//
=begin␉//
$'main'//
#-3o4o#␉
=end   #//
"""#"#//
#0]#echo 21#/ (\[FAC,1<-#2FAC,1SUB#1<-#52FAC,1SUB#2<-#32FACLEGEREEX,1PLEASEGIVEUPPLEASE) a
#   +/Jn~
#8␛dggi2␛`␉|1|6$//''25  >>>#>27.say# =#print(17)#$nd^_^_.]Q222999/+23!@1#"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.

Probiere sie online aus!

Heruntergewirtschaftet

Dieses Programm druckt 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. Ich habe Incident lokal auf meinem eigenen System mit dem offiziellen Interpreter getestet.

Beachten Sie, dass ich einige Änderungen am Testtreiber vorgenommen habe, um das Erkennen versteckter Zeichen zu erleichtern. In bestimmten Sprachen hatten sich verschiedene NUL-Bytes in die Programmausgabe eingeschlichen. Ich habe entschieden, dass dies wahrscheinlich kein Problem ist, weil a) eine breite Palette von Einsendungen es getan haben und b) die Befunge-Interpreter zusätzliche NUL-Bytes hinzuzufügen scheinen, obwohl nichts im Programm dies impliziert (es sei denn, ich hab was verpasst) also muss es ewig so gegangen sein und ist wohl ein teil davon wie der dolmetscher arbeitet. (Beachten Sie, dass der Code der Sprachen, die immer noch NUL-Bytes ausgeben - Befunges und Minkolang -, für diese Übermittlung nicht geändert wurde.)

Die vorherige Rail-Übermittlung wird über einen Absturz beendet, was nicht #zulässig ist, aber leicht zu beheben ist (indem am Ende des Rail-Programms ein hinzugefügt und die Hexagony angepasst wird), sodass ich es nicht als großes Problem betrachtete. Die Schiene in dieser Lösung wird korrekt beendet.

Erläuterung

So funktioniert der INTERCAL-Code

INTERCAL parst das gesamte Programm. Syntaxfehler sind jedoch eine Laufzeitsache in INTERCAL und keine Kompilierungszeit, und dies wird häufig zum Erstellen von Kommentaren verwendet. (Wenn ein Syntaxfehler ausgeführt werden soll, stürzt das Programm mit dem Fehler ICL000I ab, was Wikipedia fälschlicherweise behauptet. Wenn Sie die Ausführung jedoch irgendwie verhindern können - und INTERCAL bietet zahlreiche Möglichkeiten, um die Ausführung von Befehlen zu verhindern -, wird dies der Fall sein recht gerne nicht fehlerfrei ausführen.)

Als solches können wir den Müll am Ende der laufenden Datei verhindern, indem wir das Programm einfach zuerst explizit beenden (was ohnehin erforderlich ist, da INTERCAL abstürzt, wenn das Programmende ohne einen expliziten Beendigungsbefehl erreicht wird). Die Handhabung des Programmstarts ist interessanter und nutzt einen Parser-Fehler aus. Sie können so etwas wie DO %20 READ OUT #8eine Ausgabe VIIImit einer Wahrscheinlichkeit von 20% schreiben (und ansonsten nichts tun). Soweit ich das beurteilen kann, analysiert C-INTERCAL das einsame% in der zweiten Zeile als Angabe einer 0% -Wahrscheinlichkeit für die Ausführung des ersten Befehls und führt es daher nicht jedes Mal konsequent aus. (Ich bin mir nicht sicher, warum das so ist, aber wenn ich mir den kompilierten Code ansehe, wird eine Zufallszahl generiert und mit 0 verglichen.)

So sah das INTERCAL-Programm aus, bevor es an den Rest des Polyglots angepasst wurde:

DO,1<-#2
DO,1SUB#1<-#52
DO,1SUB#2<-#32
DOREADOUT,1
PLEASEGIVEUP

Dies ist ziemlich einfach: Instanziiere ein Array mit 2 Elementen; Setzen Sie die Elemente auf 52 bzw. 32 (dezimal) (die INTERCAL-Zeichenfolgencodierung sollte am besten nicht erwähnt werden. Ich habe die Funktionsweise vergessen und musste verschiedene Experimente durchführen, um herauszufinden, warum diese Zahlen codieren 35). lesen Sie es auf Standardausgabe aus; und beenden Sie das Programm. Ich habe am Ende ein zusätzliches PLEASE hinzugefügt, um die GIVE UP-Anweisung zu beenden. Dabei habe ich eine neue Anweisung für den Müll am Ende des Programms gestartet, während ich mich für höfliche Gespräche in akzeptablen Grenzen gehalten habe. Natürlich sieht die INTERCAL im fertigen Produkt nicht ganz so aus. Ich werde erklären, warum wir gehen.

Unter einer Last von SEs begraben

Das offensichtlichste Problem mit dem INTERCAL-Programm ist, dass es den Buchstaben enthält S. Dies ist ziemlich unvermeidlich, da es keine Möglichkeit gibt, ein Array zu indizieren, ohne den betreffenden Buchstaben zu verwenden. Es Sist jedoch ein Ausgabebefehl in Underload, und es gibt keine Möglichkeit, das Parsen des gesamten Programms zu verhindern. Die einzige Lösung besteht darin, den INTERCAL-Code in Klammern zu setzen, die Underloads Entsprechung zu einem Zeichenfolgenliteral darstellen, damit er nicht sofort ausgeführt wird.

Am ^Ende des Programms befinden sich jedoch zwei Zeichen, die den Unterlastungscode ausführen. so dass diese Ses wollen sowieso bekommen ausgeführt , wenn wir etwas über es nicht tun. Ich hätte es in ein anderes Zeichen ändern können, entschied aber, dass es einfacher ist, den Code so zu schützen, dass er bedeutungslos wird. amaskiert einen String in Underload (was bedeutet, dass er ^beim Ausführen des Strings einfach wieder maskiert wird, anstatt schädliche Nebenwirkungen zu verursachen). Wir haben bereits einen ain sayPerl 6 verwendeten Code (der in dieser Anordnung des Codes eigentlich wegen nicht verwandter Änderungen ausreicht). Damit sich die Leute nicht darauf verlassen müssen, fügte ich noch einen hinzuaam Ende der Zeile (ich wollte sowieso, dass ein Zeichen dort sichtbar wird, was sonst nachgestellte Leerzeichen wären, und weil Hexagony so wie es ist eine Auffüllung benötigt; beachte, dass Hexagony in diesem Programm ziemlich einfach zu reparieren war und nicht wirklich müssen separat besprochen werden). Der Underload-Code ist also etwas weniger fragil als er hätte sein können.

Vorspiel zu viel Arbeit und Verwirrung

Ah, Vorspiel. Normalerweise nicht die schwierigste Sprache, aber diesmal war es definitiv. Es gibt zwei wirkliche Probleme: Zum einen besteht die Gefahr, dass das Hinzufügen zusätzlicher Klammern in einer sehr langen Zeile den Kontrollfluss des Prelude-Programms stört (da dies das Äquivalent einer whileSchleife darstellt), und zum anderen besteht das Problem, dass sie nicht ausgekleidet werden vertikal nach oben (was für die meisten zufälligen Bewegungen von Leerzeichen auf Linien verantwortlich ist). Beachten Sie, dass der Whitespace mir auch einige Probleme bereitete, aber dieses Programm ist aus Whitespaces Sicht äquivalent zum vorherigen, so dass es sich im Grunde genommen um "das Prelude zu reparieren, ohne den Whitespace zu brechen" handelte.

Ich bin mir nicht sicher, wie das Prelude an dieser Stelle tatsächlich funktioniert. Es gibt verschiedene Fehlerbehebungen, wie die 0 in der Nähe der linken unteren Ecke, aber sie funktionieren eindeutig nicht so, wie ich es beabsichtigt habe. (Der Julia-Code landete auch am Ende der Zeile, weil die Klammern in seiner printAussage wirklich schwer zu handhaben waren.) Vielleicht müssen wir ihm nur ein Rätsel lassen.

Zusammenbruch in einem Spaltreaktor

Obwohl die obigen Änderungen für ziemlich subtile Probleme waren, die schwer zu beheben sind, gibt es ein viel offensichtlicheres Problem. DOREADOUTstimmt mit dem regulären Ausdruck überein R...Ound führt daher dazu, dass Fission beim vierten Zyklus eine unerwünschte Ausgabe erzeugt. Dies ist nicht genügend Zeit, um die beabsichtigte Ausgabe von auszugeben 12. Und INTERCAL hat nur einen Befehl, der eine Ausgabe erzeugt (es sei denn, Sie zählen Abstürze als Ausgabe). Eine Lösung besteht darin, Leerzeichen zwischen READund einzufügen OUT, um uns Zeit zu geben, die Ausgabe abzufangen. Dies macht Whitespace jedoch wütend. Ich hielt dieses Programm für eine Weile für unmöglich. R, L, U, Und Dsind alle Eintrittspunkte in Fission, und alle in der Lage potentiell problematischen Code ausgeführt wird , und INTERCAL Schlüsselwörter in Großbuchstaben geschrieben werden müssen.

Es gibt jedoch eine Lösung, die ziemlich überraschend ist. Im Rahmen der Internationalisierung akzeptiert C-INTERCAL Keywords in mehreren Sprachen, wobei sowohl Englisch als auch Latein unterstützt werden. Wir konnten dies nicht vermeiden S, aber wir können es vermeiden O; FACist ein vollkommen guter Ersatz für DOund LEGERE EXbedeutet ebenfalls dasselbe wie READ OUT. (Das Programm endete also in einer Mischung aus Englisch und Latein, aber das ist in Ordnung; es macht es kaum weniger lesbar.) Als solches können wir Fission in der unteren rechten Ecke glücklich verrückt werden lassen und es einfach keine produzieren lassen Ausgabe. Wir können den tatsächlichen Fission-Code ändern , um mit *anstatt zu enden;, was das gesamte Programm und nicht nur einen Thread beendet; Dieser Code wird relativ schnell ausgeführt, sodass das Programm beendet wird, bevor alle streunenden Einstiegspunkte Zeit haben, Schaden zu verursachen.

Stricken Sie 6, Perl 6

Das nächste Problem: Die Perl 6-Kommentare funktionieren durch Matching <und >. Der Zuweisungsoperator von INTERCAL ist <-. Zum Glück fügt dies zusätzliche öffnende Klammern hinzu, so dass ich einfach ein paar schließende Klammern hinzufügen kann, um sie an einer nicht analysierten Stelle im Programm zu entfernen (in diesem Fall direkt nach dem Pip-Code).

Ich wollte das Whitespace-Budget des Programms jedoch nicht ändern, aber das Verschieben des Julia-Codes (für Prelude) fügte der letzten Zeile ein zusätzliches Leerzeichen hinzu. Ich musste einen von irgendwo entfernen. Das doppelte Leerzeichen ist eine Kommentarmarkierung in Pip, daher konnte ich diese kaum ändern. Die einzige verbleibende Option ist das Leerzeichen in say 27. Perl 5-Golfer würden sofort denken, "gut, say+27dann" (unary ist +überraschend oft nützlich!), Aber leider ist dies keine gültige Perl 6-Syntax.

Wir können jedoch sayvon der Funktionssyntax zur Methodensyntax wechseln . Ganzzahlige Literale verfügen über eine Reihe von Methoden, einschließlich einer zum Ausdrucken. Dies 27.sayist ein perfekt gültiges Programm mit derselben Länge.

Quadratisch sein? Sei nicht da

Die nächste Ausgabe ist also, dass ich .dem Programm ein Extra hinzugefügt habe . SMBF-Benutzer werden wissen, dass dies eindeutig ein Problem in dieser Sprache ist und eine Streuausgabe erzeugt (in diesem Fall NUL-Bytes). Es gab im letzten Programm bereits eine .Ausgabe, die nicht funktioniert, aber das bedeutet nicht, dass ich die Gelegenheit nicht nutzen sollte, um das Problem zu beheben.

Die Grundidee hier ist, eine SMBF-Schleife zu erstellen, um die anstößigen Anweisungen auszukommentieren. Dies bedeutet, dass Sie die eckigen Klammern verschieben müssen. Ich habe sie aus dem SNUSP-Code genommen (weil sie sowieso nur für Incident da waren und Incident sich nicht darum kümmert, wo sie sich im Programm befinden) und die öffnende Klammer am Anfang des INTERCAL-Codes und der schließende Klammer kurz vor dem Trigger (somit beide .s sauber verstecken ).

Unglücklicherweise sind eckige Klammern für Retina von Bedeutung. es sieht […<-#…und sagt "das macht keinen Sinn, Sie können diesen Bereich nicht erstellen, weil <es nicht vorher kommt #". Glücklicherweise ist dies mit einem strategisch platzierten Backslash leicht zu beheben.

Das Zentrum des Vorfalls

Dies geschah zuletzt, und es wird wahrscheinlich von nun an wiederholt passieren. Verschiedene Zeichenfolgen kamen zufällig dreimal vor und wurden aus der Sicht von Incident in der Mitte des Programms verschoben.

Das dringendste zu behandelnde Token war 1#, das dreimal angezeigt wird, wenn Sie diese Änderungen naiv vornehmen: #= >␉1#am Anfang der dritten Zeile __DATA__=1#, und echo 21#. Warum ist das ein Problem? Da sich die 1#in der dritten Zeile #vunmittelbar danach überlappt und zwei überlappende Token dazu führen, dass keiner von beiden gezählt wird. Und #vist das Token, mit dem wir den Code vor dem Incident-Programm auskommentiert haben? Ich habe das behoben, indem ich kurz vor 1#Ende des Programms ein zusätzliches eingefügt habe (es folgen nur drei Zeichen). Keine der Sprachen, die diesen Teil des Programms analysieren, macht irgendetwas damit.

Es gab verschiedene andere problematische Token, mit denen man sich befassen musste. Ein paar waren einzelne Buchstaben, Pund U; Ich habe mich mit diesen Problemen befasst , indem ich im Incident-Code ein paar Füller-No-Ops von xauf Pbzw. Ugeändert habe, um eine vierte Kopie zu erhalten. Die Änderung des Fission-Codes wird *als Token angezeigt, aber insbesondere wird dieser anders als normal aufgeteilt und erscheint zweimal vor dem Incident-Code und nur einmal danach. Anstatt es zu entfernen, habe ich es verwendet, um den neuen LEToken, der im INTERCAL-Code enthalten ist , teilweise auszugleichen . Das reicht aus, um die Mitte des Programms wieder über ein zu fahren0oZeichen. Natürlich werden Änderungen am Programm dies sehr wahrscheinlich stören. (Meine Versuche, Incident auf TIO zu bringen, scheiterten daran, dass libdivsufsort dort nicht verfügbar ist. Wir könnten also von einem neuen Interpreter profitieren, insbesondere in JavaScript, damit er online ausgeführt werden kann. Wenn Sie interessiert sind, schauen Sie sich diesen an Frage .)


1
Wow, diese Herausforderung hat einen überraschend langen Weg hinter sich. Gut gemacht!
MildlyMilquetoast

Latein?! Wow, was für eine tolle Lösung! Ich finde es toll, dass im Code jetzt "Bitte aufgeben" steht. Es ist, als würde ich aufhören.
Chance

19

1. Python 3 (8 Bytes)

print(1)

Dieses Programm druckt 1 in Python 3.

Beginnen Sie dies mit Python 3, weil ich weiß, dass es für Polyglottes gut ist und in verschiedene Richtungen geführt werden kann (außerdem wollte ich sicherstellen, dass die erste Antwort in einer relativ normalen Sprache und nicht in einem absurden Esolang verfasst wurde, der für Polyglottes schwierig ist mit).


Wäre> <> eine gute Wahl für die 2. Sprache (damit wir mit dem 2. Raum beginnen)?
Kühe quaken

Das heißt, die nächste Antwort kann nicht mehr als 9 Bytes sein? Es wird sehr schwer sein, einen anderen zu finden.
DJMcMayhem

1
@DJMcMayhem Jede Antwort darf nicht länger als 20% oder 20 Bytes (je nachdem, welcher Wert größer ist) sein
Kühe quaken

19

10. Befunge , 95 Bytes

#v02^0;7||"<+0+0+0+<;n4
#v0#@00
#>3N.
#|\w*
#8
#|
#M`
print(None and 9or 1/2and 1or 5)
#jd5ki2

Zwischen jund din der letzten Zeile befindet sich ein buchstäbliches ESC-Zeichen (grr, @ ais523). Es ist nicht in diesem Code enthalten. Um den aktuellen Code zu erhalten, gehen Sie bitte auf den Try it onlineLink.

Dies druckt 1 in Python 3, 2 in Vim, 3 in Minkolang, 4 in <> <, 5 in Python 2, 6 in SMBF, 7 in Japt, 8 in Retina, 9 in Perl und 10 in Befunge.

Dieser Code teilt sich *mit Retina und .mit Minkolang und SMBF.

Probieren Sie es online aus

Erläuterung

Aktuelles Programm

#v02^
    @
    .
    *



    t
    5
#v02^

Die letzte Zeile wurde aus Gründen der Übersichtlichkeit geschrieben ( Befunge- Spielplatz ist zyklisch).

#

Trampolin, überspringt v

02^

Schieben Sie 0und dann 2in Stapel und steigen Sie auf.

5t*.@

Drücken Sie 5, no-op, multiplizieren Sie zwei Elemente im Stapel ( 2und 5), drucken Sie, beenden Sie das Programm.


1
Dies bewirkt, dass SMBF beim ersten Ausdruck ein Null-Byte ausgibt ..
PurkkaKoodari

@ Pietu1998 behoben!
JungHwan Min

Hey, ich habe mich nicht für eine Sprache entschieden, in der viele der wichtigsten Befehle nicht druckbare Zeichen sind die anderen Sprachen. Ich mag die Art und Weise, wie Sie es getan haben, obwohl es möglicherweise

@ ais523 Ich bin damit einverstanden, dass das Ändern dieses Codes schwierig sein kann. Um dies zu mildern, gebe ich einige 0s ein, um darauf hinzuweisen, dass diese Zeichen alles sein können (außer dem "<+0+0+0+<;n4Teil) und Teile des Befunge-Codes verschoben werden können. Und ein Tipp für die nächste Person: Die meisten Zeichen sind in Befunge nicht zulässig, sodass das Hinzufügen weiterer Zeilen den Befunge-Code wahrscheinlich nicht beeinflusst.
JungHwan Min

Überlegen Sie sich, ob Sie eine Befunge-98-Übermittlung (oder eine ähnliche Übermittlung) vornehmen möchten, weil sie eine ganze Reihe von Operationen hinzufügen, die in der regulären Version '93 nicht ausgeführt werden. Es könnte jedoch schwierig sein, sich anzupassen, und ich müsste herausfinden, wie alle anderen Sprachen funktionierten, damit ich sie
umgehen

19

21. Nim (161 Bytes)

#v`16/"<"6/b.q@#;n4"14""
#>3N6@15o|> ^*ttt*~++ %
#=~nJ<R"12";
#[

print((1/2and 9 or 13)-(0and+4)^1<<65>>62)#46(89999+++++!)=#print(17)#]#echo 21
#8dggi2` |1|6

Zwei <ESC>s zwischen 8dund 2`in der letzten Zeile. Sie können sagen, dass mein Vorgänger in Eile Golf gespielt hat, weil ich heute Morgen aufgewacht bin und gemerkt habe, dass ich ein paar mehr ausziehen könnte. Ich hatte 152 Bytes, aber das scheint nur in Perl 5.24.0 zu funktionieren. Aus Gründen der Kompatibilität mit TIO habe ich den ursprünglichen Ausdruck fürs Erste beibehalten.

Druckt 1 in Python 3, 2 in V, 3 in Minkolang, 4 in> <>, 5 in Python 2, 6 in SMBF, 7 in Japt, 8 in Retina, 9 in Perl, 10 in Befunge-93, 11 in Befunge -98, 12 in Fission, 13 in Ruby, 14 in Turtléd, 15 in Haystack, 16 in Pyth, 17 in Julia, 18 in Cardinal, 19 in Reng, 20 in Prelude und 21 in Nim .

Beachten Sie, dass Nim auf ideone.com die Version 0.11.2 verwendet, die etwas zu alt ist, da dieses Programm auf #[ ... ]#mehrzeiligen Kommentaren basiert, die Anfang 2016 hinzugefügt wurden.

Dank des Windows-Interpreters von Cardinal besteht mein Workflow jetzt aus zwei Laptops und einem http.serverdazwischen liegenden Python .


Bearbeiten - noch ein paar Hinweise:

  • Am 8Anfang der letzten Zeile wird das Limit von Retina auf die ersten 8 Treffer gesetzt, sonst würde Retina ohne es ausgeben 2. Beachten Sie, dass dies bedeutet, dass der reguläre Ausdruck der letzten Zeile in der vorletzten Zeile nur noch mindestens achtmal übereinstimmen muss, im Gegensatz zu genau achtmal. Während meiner Einmischung habe ich Prelude modifiziert, um die Retina richtig zu machen, aber es stellte sich heraus, dass dies am Ende unnötig war .
  • Das nicht übereinstimmende Zitat am Ende der ersten Zeile ist so, dass sich Pyth nicht über ungültige Syntax für den Rest des Codes beschwert.
  • Wenn Sie die zweite Zeile ändern, müssen Sie möglicherweise die ändern 6@ für Minkolang ändern, wodurch der Zeiger um 6 Felder springt, um auf der zu landen ^.
  • Da ist ein Paar [] jetzt, also muss SMBF auf einer 0-Zelle sein, bevor es die trifft [, oder alternativ muss das Innere die Zelle löschen.

Es gibt wahrscheinlich mehr zum Golfen (auch jetzt sehe ich vor dem %Kardinal noch ein verstreutes Feld ), aber ich sollte wirklich in den frühen Morgenstunden aufhören, Golf zu spielen.


1
TIO unterstützt jetzt Cardinal
MildlyMilquetoast

19

51. Assembly (x64, Linux, AS) , 1086 Byte

#16  "(}23!@)(" 3//*v\D@;'[af2.qc]'#)"14";n4
#/*` PkPPZ (22)S"[!(>7 7*,;68*,@;'1,@␉␉␉␉ q
#>␉
# >36!@␉
#`<`
#<]+<[.>-]>[
#{
#z}
#
#=x<R+++++[D>+++++++EAL+++<-][pPLEASE,2<-#2DO,2SUB#1<-#52PLEASE,2SUB#2<-#32DOREADOUT,2DOGIVEUPDOiiipsddsdoh]>+.-- -. >][
#x%+>+=+~tt .
#D>xU/-<+++L
#R+.----\).>]|
#[#[(}2}20l0v01k1kx0l0ix0jor0h0h1d111x0eU0bx0b0o1d0b0e0e0@O6O4/0m1d0i0fx0g0n0n11x0o0n0cx0c0o0f0c0gx0g0f0h0j0j0i0001k10vx0v0l111111^_)  0046(8+9+9+9+9+=!)
###|
'\';echo 50;exit;';print((eval("1\x2f2")and(9)or(13))-(0and 4)^1<<(65)>>(62))or"'x"or'({({1})({1}[(0)])}{1}\{1})'#}#(prin 45)(bye)|/=1/24=x<$+@+-@@@@=>+<@@@=>+<?#d>+.--./
__DATA__=1#"'x"//
#.\."12"__*'
###;console.log 39
""""#//
=begin //
#sseemeePaeueewuuweeeeeeeeeeCisajjap*///;.int 2298589328,898451655,12,178790,1018168591,84934449,12597/*
#define p sizeof'p'-1?"38":"37"
#include<stdio.h>
main ( )/*/
#
#"`#"\'*/{puts (p);}/*'"`"
/*
<>{#65}//
#}
disp 49#//
#{
1}<>//
$'main'//
#-3o4o#$$$
#<R>"3"O.
=end #//
"""#"#//
#}
#s|o51~nJ;#:p'34'\=#print (17)#>27.say#]#print(47)#]#echo  21
#sss8␛dggi2␛ `|1|6$//''25  16*///89^_^_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.

Möchten Sie mehr erfahren? Probieren Sie den Polygot-Chat aus !

Probieren Sie es online!

VIP-Punktzahl ( Versatile Integer Printer ): .008186 (zur Verbesserung sollte der nächste Eintrag nicht mehr als 1151 Byte umfassen)

Dieses Programm druckt 51 in Assembly, 50 in Bash, 49 in Octave, 48 in Deadfish ~, 47 in Lily, 46 in Cubix, 45 in PicoLisp, 44 in Alphuck, 43 in Reticular, 42 in Evil , 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, 30in 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, 1 in Python 3.7 in Japt, 6 in SMBF, 5 in Python 2, 4 in> <>, 3 in Minkolang, 2 in V / Vim und

Nachprüfung

Die meisten Sprachen werden vom oben gezeigten Testtreiber getestet.

  • Hier kann Reng auf Ausgang 19 getestet werden .

  • Modulares SNUSP kann hier auf Ausgang 31 getestet werden .

  • Cubix der Würfelform angesehen hier

  • Der Vorfall wird überprüft, indem die Token wie in den vorherigen Antworten beschrieben im Gleichgewicht gehalten werden.

  • Für Deadfish ~ kann die Ausgabe 48 getestet werden , mit diesem . Beachten Sie, dass Deadfish ~ den Polyglot für die Fütterung mit Standard nimmt, aber eine Reihe von druckt>> Eingabeaufforderungen an die Standardausgabe ausgibt, die eine unvermeidliche Folge der Ausführung eines Deadfish ~ -Programms sind.

  • Hier kann die Montage auf Ausgang 51 getestet werden

Danke und Glückwunsch

Als die 50-in-1-k-Antwort von @ ais523 vor zwei Wochen fiel, rollte mir eine Träne über die Wange. Es war zu schön. Und es war in Bash. Es war zu perfekt.

Ich wandte mich an meine Frau und sagte: "Ich denke, die Polyglotte ist erledigt."

Sie drehte sich um, um mir in die Augen zu sehen, hielt einen Moment inne und sagte: „Gut. Nimm jetzt den Müll raus. “

Sie meinte jedoch, dass sie eine tiefe Freude für mich und meine Internetfreunde empfand. Vielen Dank und Glückwunsch an alle.

Montageerklärung

In den folgenden Tagen wanderten meine Gedanken immer wieder zu etwas, das @ ais523 im vielsprachigen Chat sagte, kurz bevor ich Bash postete. Er wies darauf hin, dass einige Varianten von Assembly #Zeilenkommentare und verwenden/* Blockkommentare verwenden. Nun, das war genug für mich, um für die nächsten 2 Wochen langsam den Verstand zu verlieren.

Es gibt eine Art implizite Herausforderung bei Polyglotten, legitime Sprachen einzubeziehen. Ich benutze den Begriff legitim hier sehr locker, aber ich denke, wir können alle verstehen, worauf ich hinaus will. Es ist eine Sache, Brainf *** einzubeziehen, aber es ist eine andere Sache, ganz andere wie Mathlab oder R. Assembly einzubeziehen, und ich konnte es nicht loslassen. Aber ich wusste nichts von Versammlung, also war dies ein harter Kampf.

Nachdem ich eine Weile mit dem Kopf gegen das Problem gestoßen war und nach einer Möglichkeit gesucht hatte, wie Assembly und C / C ++ koexistieren können, stellte ich fest, dass dies die Dokumentation für den GNU-Assembler ist:

Um mit früheren Assemblern kompatibel zu sein, haben Zeilen, die mit '#' beginnen, eine spezielle Interpretation. Nach dem '#' sollte ein absoluter Ausdruck stehen (siehe Ausdrücke): die logische Zeilennummer der nächsten Zeile. Dann ist ein String (siehe Strings) erlaubt: falls vorhanden, ist es ein neuer logischer Dateiname. Der Rest der Zeile sollte, falls vorhanden, Leerzeichen sein.

Mir ist aufgefallen, dass dies unserer Vorprozessor-Direktive für C / C ++ in Zeile 1 des Polyglots ziemlich ähnlich ist. Nach einigem Ausprobieren habe ich das gefunden#1 “bla” 1//* nur für Assembly ein Blockkommentar eingegeben werden würde.

Und so wurde ein Polyglot gemacht.

Nachdem die größten Blockierungsprobleme gelöst waren, machte ich mich auf den Weg zum Golf, um dieses Beispiel aus der Welt von Hallo zu lesen.

.intel_syntax noprefix
.section .data
     msg: .asciz "51"
.section .text
.global _start
_start:
    # write syscall
    mov     rax, 1
    # file descriptor, standard output
    mov     rdi, 1
    # message address
    mov     rsi, OFFSET FLAT:msg
    # length of message
    mov     rdx, 14
    # call write syscall
    syscall
    #End the Program
    mov    rax, 60
    mov    rdi, 0
    syscall

Kredit des Hauptautors

Eigentlich habe ich vor einer Minute gelogen, die allererste Version des Assembly-Codes, den ich verwendet habe, war in der AT & T-Syntax, einem von zwei syntaktischen Zweigen von Assembly. Eines der Hauptelemente der AT & T-Syntax besteht darin, dass die Registerreferenzen ein %Präfix verwenden, und dies ist ein Problem für die Mehrsprachigkeit. Kardinal wird %als Zeigerursprung verwendet. Wenn wir also ein paar davon verunreinigen %würden, wäre dies wie eine zweite Fission-Reaktion.

Der andere syntaktische Zweig, der nicht verwendet wird % als Registerpräfix verwendet wird, heißt Intel-Syntax. Der Exploit, den wir im Polyglot verwenden, um die erste Zeile zu verlassen und einen Blockkommentar einzugeben, befindet sich im GNU Assembler (kurz GAS oder AS). AS hat die glückliche Eigenschaft, beide syntaktischen Zweige zuzulassen. Sie müssen lediglich erklären, dass Sie die Intel-Syntax verwenden möchten, die in Zeile 1 des Assembly-Codes vorkommt.

Assembly verwendet Register, bei denen es sich um eine kleine Anzahl von Speicherplätzen handelt, die sich buchstäblich auf der CPU befinden, um den Zugriff zu beschleunigen. Dies betrifft nicht nur Assembly, sondern auch die Tatsache, dass ihre Verwendung nicht vom Anliegen des Entwicklers abweicht.

Es gibt verschiedene Arten von Registern, die für verschiedene Zwecke verwendet werden. Aus Wikipedia:

• AX multiplizieren / teilen, String laden & speichern

• CX-Anzahl für Zeichenfolgenoperationen und -verschiebungen

• DX-Portadresse für IN und OUT

• BX-Indexregister für MOVE

• SP zeigt auf die Stapelspitze

• BP zeigt auf die Basis des Stapelrahmens

• SI zeigt auf eine Quelle in Stream-Operationen

• DI zeigt auf ein Ziel in Stream-Vorgängen

AX wird in der Leitung der _start Funktion verwendet hier: mov rax, 1. Der rEingang raxzeigt an, dass der Speicher 64-Bit ist. Wenn wir dies gegen einen austauschen ewürden, würde dies einen 32-Bit-Speicher anzeigen, der für einen 64-Bit-Prozessor völlig gültig ist. Wir würden einfach nicht die obere Hälfte des verfügbaren Speichers verwenden. Um 16-Bit-Speicher anzugeben, verwenden Sie einfach ax, was für uns in Ordnung ist, da wir nur Ganzzahlen drucken. Wir können also ein paar Bytes Golf spielen, indem wir alle Registerreferenzen auf 16-Bit ändern.

Okay, nicht alle Registerreferenzen konnten das löschen r. mov rsi, OFFSET FLAT:msg. Wenn Sie mit Assembly vertraut sind, aber nicht mit dieser Anweisung, liegt dies daran, dass dies nur in AS vorkommt. Zumindest das, was ich daraus gelernt habe , was mir geholfen hat, die Aussage auf den Punkt zu bringen lea rsi,m.

Danach stellte ich experimentell fest, dass ich mit nur einer Abmahnung _start:auf den Punkt kommen _pund .global _startganz abschneiden konnte . Zweitens msg:wurde auf nur eine einzelne Zeichenvariable reduziert p:. Ich entschied mich psowohl für die String-Variable als auch sfür die Startfunktion , um einen Teil der Assembly auszugleichen, die zu Alphucks Gunsten hinzugefügt wurde.

Dann setze ich ;Anweisungen ein, um sie alle in einer Zeile abzugrenzen. Dies dient in erster Linie dazu, zu vermeiden, dass #//in jeder Zeile zu viele Nachkommastellen angezeigt werden, was Thutu zugute kommt. Außerdem bemerkte ich, dass bei unserem Assembler die Groß- und Kleinschreibung nicht berücksichtigt wurde. Ich habe daher nur verschiedene Zeichen in Groß- oder Kleinschreibung angegeben, um ein Ungleichgewicht der Vorfälle zu vermeiden.

Das hat uns geschadet:

.intel_syntax noprefix;.text;mov ax,1;mov di,1;lea rsi,m;mov dx,2;syscall;mov ax,60;mov di,0;syscall;m:.asciz "51"

Nach all dem waren Japt und Underload die einzigen Problemkinder in dieser Antwort. Japt hatte etwas Rindfleisch mit dem *in Zeile 1 hinzugefügten, aber es schien behoben zu werden, indem man puts(p);von der C ++ - Antwort zur Zeile zurückkehrte. (Am Ende habe ich auch in diese Zeile ein geworfen und sie dann in Octive's Zeile geschlossen. Dies war so, dass Underload aufhören würde, Fehler zu machen. Eine ähnliche Behandlung wurde in Zeile 1 vorgenommen, um sie *dort hinzuzufügen .

Dies reichte aus, um die Byte-Anforderungen dieser Herausforderung zu erfüllen. Tatsächlich habe ich dies überprüft, indem ich diese Version des Polyglots hergestellt habe. Aber ich wollte versuchen, den VIP-Score so gut wie möglich zu verbessern. Und da ich alle Anforderungen der Herausforderung erfüllt hatte, fühlte ich mich in Ordnung, zusammenzuarbeiten, um den Code herunterzuspielen. Also machte ich einen Zwischenstopp bei Polyglot Chat, um Hilfe beim Golfen zu suchen.

Wir müssen tiefer gehen

@ ais523 demonstrierte eine Technik zum Übergeben der Anweisungen an den Assembler als Maschinencode mit dieser Anweisung.

.text;.long 2298589328,898451655,12,178790,1018168591,84934449,12597 Maschinencode ist eine Reihe von numerischen Befehlen, die direkt von der CPU ausgeführt werden und in Dezimal-, Hexadezimal- oder Oktalform dargestellt werden können. Für unsere Zwecke ist die Dezimalstelle die kürzeste, die es gibt (hex nimmt eine führende Stelle ein, 0xum darzustellen). Die .longAussage hier gibt die Erklärung ab, dass das, was folgt, eine Reihe von dezimalen Maschinencodeanweisungen ist.

Nun, ich habe mich auch mit dieser Aussage befasst, um zu sehen, was der Assembler erlauben würde, und ein paar Änderungen vorgenommen. Zuerst stellte ich fest, dass ich .text;alles zusammen mit nur Warnungsproblemen entfernen kann , was eine ziemlich verkaufte Byte-Einsparung war. Dann eine Weile später fand ich auch diese Aussage in der AS-Spezifikationsdokumentation

.long ist dasselbe wie .int

Cool. Also können wir diesen Swap für ein kurzes Byte machen. Jetzt wurde unsere Baugruppe, aber wirklich der Maschinencode, auf Folgendes reduziert:

.int 2298589328,898451655,12,178790,1018168591,84934449,12597.

Das ist zwar alles schön und gut, aber es ist ziemlich schwierig, direkt mit Maschinencode zu arbeiten, und ich wollte zumindest sehen, wie alle Übersetzungen gemacht werden. Im Idealfall möchten wir den Maschinencode wieder in die Baugruppe zerlegen. Am einfachsten geht das, indem Sie einen Objekt-Dump erstellen, den @ ais523 mit diesem Code-Snippet für mich demonstriert hat.

Hier ist das Code-Snippet.

Und hier ist nur die Versammlung.

nop
mov    $0x1,%al
mov    %eax,%edi
lea    0xc(%rip),%rsi
mov    $0x2,%dx
syscall 
mov    $0x3c,%al
xor    %edi,%edi
syscall 
.byte 0x35
xor    %eax,(%rax)

Dieser Link zeigt auch einige 2-stellige Hexadezimalzahlen neben jeder Assemblierungslinie. Diese entsprechen den Dezimalanweisungen. Zum Beispiel, wenn Sie setzen 2298589328in diesem Dezimal Hex - Konverter, erhalten Sie 8901B090zurück. Und wenn Sie genau hinsehen, sind dies die ersten 4 Hex-Anweisungen aus dem Objektspeicherauszug (in umgekehrter Reihenfolge).

Soweit ich weiß, werden für die Umwandlung in Dezimalzahlen immer Sätze mit 4 Hexadezimalzahlen verwendet. Der wichtigste Trick zum Speichern von Bytes besteht darin, die Assembly so zu strukturieren, dass die letzten Hexadezimalzahlen in unseren 4 Sätzen 00 sind. Diese werden dann transformiert zu führenden Nullen, wenn wir sie in die .intAnweisung setzen, die gerade weggelassen werden.

Dies ist, was in der 12Aussage passiert . Im hexadezimalen Teil des Objekt-Dumps ist dies 0c 00 00 00.

Soweit mein Verständnis der Vollversammlung in 2 Wochen angekommen ist. Was für ein Crashkurs!

Vorfall

Incident war in der kürzeren Assembly-Implementierung schwieriger zu lösen, da die mehrsprachigen Token nach oben viel schwerer gewichtet wurden. Hier ist der Vorfallbericht.

  • ! in Zeile 2 erkannt !

  • Das erste EAauf der INTERCAL-Leitung erkennt sich von selbst

  • Das letzte Leerzeichen in der vorletzten Zeile erkennt ein Leerzeichen-Leerzeichen.

  • 85 in der letzten Zeile erkannt

  • Die Rin #<R>"3"O.detokenizesR

  • 65in <>{#65 }//Tokenizes65

  • 16 in der letzten Zeile erkennt sich

  • 89 in der letzten Zeile markiert sich

Kardinal

Mir ist gerade aufgefallen, dass ich eine Änderung an Cardinal vorgenommen habe, die ich nicht dokumentiert habe. Ich habe einige Zeit damit verbracht, nach Möglichkeiten zu suchen, um Bytes zu sparen, und mich entschlossen, Cardinal zu lernen. Nach einiger Zeit mit der Dokumentation habe ich diese Zeile gesehen.

= kopiert den aktiven Wert des Zeigers in seinen inaktiven Wert.

Dies war kein Trick, der in der Polyglotte verwendet wurde. Die alte Lösung enthielt die folgenden Anweisungen: `++ ~ * t

++ Inkremente bis zu 2.

~ ändert den aktiven Stapel

* fügt die Stapel hinzu.

Ich erkannte, dass ~*dies nur mit der =Anweisung erreicht werden kann, und überarbeitete die Lösung, um unnötiges Stack-Swapping zu vermeiden und diese kleine Byte-Einsparung hinzuzufügen.


3
Ich bin gespannt, wie Sie in dieser erstaunlichen Phase auch weiterhin polyglottieren können. Wie???
Qwerp-Derp

3
Das ist wirklich eine Sache von purer Schönheit.
Muzer

Unary sollte der nächste sein
Christopher

Nein, das würde die VIP-Punktzahl töten (es sei denn, der Code war 3 Bytes oder weniger)
CalculatorFeline

19

6. SMBF , 45 Bytes

#v<++++<;n4
#>3N.
print('1'if 1/2else'5')
#i2

Probieren Sie es online aus

Dieses Programm druckt 1 in Python 3, 2 in V, 3 in Minkolang v0.15, 4 in> <>, 5 in Python 2 und 6 in SMBF.

SMBF (aka Self-Modifying Brainfuck) verwendet <++++<>.. Der Zeiger wird nach links bewegt (bis zum letzten Zeichen des Quellcodes) und die Zelle wird viermal inkrementiert und dann gedruckt.


17

13. Ruby (129 Bytes)

#v;2^0;7||"<+0+0+0+<*!2'!1'L;n4
#v0#_q@
#>3N.
#|\w*
#8  ^1b0<
#|
#M`
print ((0 and'13')or(None and 9 or 1/2 and 1 or 5))
#jd5ki2

Bitte beachten Sie das LiteralzeichenEsc in der letzten Zeile zwischen jund d, wie in der Perl-Antwort von ais523 angegeben .

Probieren Sie es online!

Dies druckt 1 in Python 3, 2 in Vim, 3 in Minkolang, 4 in <> <, 5 in Python 2, 6 in SMBF, 7 in Japt, 8 in Retina, 9 in Perl, 10 in Befunge, 11 in Befunge- 98, 12 in Fission und 13 in Ruby.

Nur eine geringfügige Änderung der bestehenden printAussage, um die Tatsache zu missbrauchen, die 0in Ruby wahr ist. Ich musste den anderen Anweisungen einige Leerzeichen hinzufügen, damit sie korrekt analysiert wurden.


17

15. Heuhaufen (141 Bytes)

#v;2^0;7||"<+0+0+0+<*!2'!1'L#'1r'4;n4
#v0#_q@
#>3N.15o|1
#|\w*
#8  ^1b0<
#|
#M`
print ((0 and'13')or(None and 9 or 1/2 and 1 or 5))
#jd5ki2

Hinweis: In der dritten Zeile steht ein ESCNach ound jin der letzten Zeile ein Nach

Dies druckt 1 in Python 3 , 2 in Vim, 3 in Minkolang, 4 in <> <, 5 in Python 2 , 6 in SMBF, 7 in Japt, 8 in Retina, 9 in Perl, 10 in Befunge, 11 in Befunge- 98 , 12 in Fission, 13 in Ruby, 14 in Turtlèd und 15 in Haystack.

Probieren Sie es online!

Erläuterung

#v                           go down
 v
 >                           go right
  3N.                        does nothing important
     15o|                    outputs 15 and ends program
                             there is an <ESC> after 'o' since 'o' in Vim enters insert mode
         1                   I added this to satisfy Retina

Super, danke, dass du dir Haystack angesehen hast! :)
Kade

@Kade Es ist eine schöne 2D-Sprache, ein Online-Interpreter wäre hilfreicher (obwohl ich den Python-Interpreter bereits heruntergeladen habe) :)
Kühe quaken

@Kade Es gibt jetzt einen TIO-Link für Heuhaufen!
Kühe quaken

@MistahFiggins Der Link funktioniert für mich und gibt 15 aus
Kühe quaken

@MistahFiggins Cache? Weil es bei mir ohne Probleme oder Fehlermeldungen funktioniert
Kühe quaken

17

9. Perl, 84 Bytes

#v;7||"<+0+0+0+<;n4
#>3N.
#|\w*
#8
#|

#M`
print(None and 9or 1/2and 1or 5)
#j␛d5ki2

Zwischen dem jund befindet sich ein buchstäbliches ESC-Zeichen im eigentlichen Code d. Es wurde zur besseren Sichtbarkeit durch ein ␛ ersetzt.

Dies druckt 1 in Python 3 , 2 in Vim (lokal getestet, aber hier ist ein Link für die sehr ähnliche Sprache V), 3 in Minkolang , 4 in <> < , 5 in Python 2 , 6 in SMBF , 7 in Japt , 8 in der Retina und 9 in Perl .

Lassen Sie uns ein paar exoterische Sprachen durch den Missbrauch von Arithmetik lernen, die in verschiedenen Sprachen unterschiedlich funktioniert. ( NoneIst in Python falsch, in Perl jedoch wahr, und and/ orchains funktionieren in beiden Sprachen auf die gleiche Weise.)

Abgesehen von Python musste ich auch den VIM-Code ändern. Anstatt es zu einer Serie von No-Ops zu machen, lasse ich es einfach Junk einfügen und lösche den Junk am Ende wieder.


4
Ernsthaft? Sie werden es für andere extrem schwierig machen, Antworten zu finden, wenn Sie einen wörtlichen ESC eingeben. Wir müssen den Code testen können.
mbomb007

1
Sie müssen das wörtliche ESC nicht in Ihre eigenen Antworten einbeziehen. Ich fand es einfach am einfachsten, dieses zu schreiben. (Außerdem funktioniert es in Firefox und in lokalen Tests einwandfrei. Das einzige, was mich daran hindert, es in den Post zu stellen, ist, dass Chromium, das ich für SE verwende, es nicht in das Eingabefeld stellen möchte.)

1
Sie können auch nicht lokal auf Vim testen. Sprachen werden vom verwendeten Interpreter definiert. Also ist es wirklich V, das wir die ganze Zeit hatten.
mbomb007

1
Ähm, ist kein vimDolmetscher für Vim? (Es funktioniert jedoch sowohl in vimV als auch.)

4
@ ais523 kannst du vielleicht ␛ setzen, um das 0x1B-Byte darzustellen?
Betseg

17

36. Labyrinth , 647 Bytes

#v`16/"<"6/b.q@"(: ::Q):  ␉␉␉␉ :(22)S#;n4"14"
#>3N36!@@15o|>␉^?.*ttt*~++~~~%
#= >␉1#v#v0l0mx01k1k0l0ix0jx0h0h1d111P0eU0bx0b0o1d0b0e0e00x1d0i0fx0g0n0n11x0o0n0cx0c0o0f0c0gx0g0f0h0j0j0i0001k10mx0m0l11111100(^_)
#[␉
#`<`|
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"␉*
""""#//
=begin␉//
$'main'//
#-3o4o#␉
=end   #//
"""#"#//
#0]#echo 21#/ (\[FAC,1<-#2FAC,1SUB#1<-#52FAC,1SUB#2<-#32FACLEGEREEX,1PLEASEGIVEUPPLEASE) a
#   +/Jn~
#0␛dggi2␛`␉|1|6$//''25  >>>#>27.say# =#print(17)#$nd^_^_.]Q2229991#;abcd!fghij/+23!@"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.

Probiere sie online aus!

Heruntergewirtschaftet

Dieses Programm druckt 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 19 bzw. 31 aus. @ ais523 hat geholfen, den Incident-Code zu debuggen und zu reparieren, der jetzt funktioniert.

Wie Labyrinth funktioniert

Labyrinth beginnt damit, einige der Spalten in der Quelle ein wenig zu verschieben, aber nach einigen Schritten gelangt der Zeiger an die Stelle Nin der 2. Zeile (anfangs Nbewegt er sich nach rechts, wenn der Zeiger dort ankommt, nicht mehr dort) mit einer 0 oben auf dem Stapel. Dann drückt und druckt es einfach eine 36 und endet mit36!@

Dinge, die ich getan habe, brachen

Ich wusste, dass ich Labyrinth hinzufügen wollte, da es einer der wenigen Esolangs ist, die ich ein bisschen kenne. Mit dem Debugger stellte ich fest, dass Labyrinth nicht in einer Endlosschleife stecken blieb und seltsamerweise nichts anderes zu brechen schien, indem ich die 8 in der letzten Zeile in eine 0 änderte. Von dort habe ich einfach den benötigten RAW 36- und Output-Befehl eingegeben und diese führten bequem dazu, @Dinge zu beenden.

Dann war es an der Reparatur dessen, was ich gebrochen habe: Minkolang, Cardinal und Hexagony.

Das veranlasste !Minko, den nächsten Buchstaben zu überspringen, den es beenden musste, also fügte ich gerade einen Extra hinzu @. So weit, ist es gut.

Die Längenänderung der 2. Zeile hat Cardinal dazu gebracht, seine Ausgabeanweisung zu verfehlen. Der Versuch, ein Extra .in die erste Zeile einzufügen, ließ Prelude den Verstand verlieren (ehrlich gesagt, keine Ahnung warum), also habe ich eine andere Methode gewählt und es einfach in die zweite Zeile verschoben. Das hat versehentlich einen dritten Kardinal-Zeiger erzeugt, also habe ich die Dinge mit einem aufgefüllt ?(keine notwendige Wahl, nur das erste, was ich gefunden habe, das sowohl Fission als auch Cardinal repariert hat).

Hexagony war glücklicherweise eine relativ einfache Lösung. Ich habe nur eine Reihe von Buchstaben eingegeben, damit der Zeiger den Code fand. Ich dachte, das Alphabet hätte nicht früher auftauchen sollen und würde keine Probleme mit Incident verursachen. In diesem Moment wurde mir auch klar, dass ich Incident nicht getestet hatte. Dank @ ai523 fand ich heraus, dass ich nur ein zusätzliches Ausrufezeichen benötigte, sodass die eZeichenfolge im Alphabet in a geändert wurde !.

Scores von Der vielseitige Ganzzahldrucker

Nur zum Kicken und Loslassen von @Stewie Griffins Kommentar zu der Frage ist hier ein Ausschnitt, der zeigt, wie jede Antwort gewertet worden wäre, wenn sie in "The Verstatile Integer Printer" eingegeben worden wäre.


1
OK, es sieht so aus, als würde dies nur geringfügig zu Problemen mit Incident führen. Das Programm ist nicht zentriert, da es jetzt genau drei Ausrufezeichen enthält. Dies kann jedoch leicht behoben werden, indem ein Füllzeichen in ein viertes Ausrufezeichen geändert wird. Ich habe edas Alphabet geändert, das Sie einem Ausrufezeichen hinzugefügt haben. das scheint zu funktionieren.

1
Nett! Ich habe heimlich auf das Labyrinth gewartet, so gut auf dich. In einer separaten Anmerkung ist der beste Teil des Codes (für mich) die Meldung "PLEASEGIVEUPPLEASE", die Sie auffordert, es einfach nicht mehr zu versuchen. ;)
MildlyMilquetoast

17

41. Brainf *** , 916 Bytes

#  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 DIn-Zeile 1 sendet den Befehlszeiger nach unten zur LIn-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 Uden 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*.xfü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 pin 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, qum 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. OZufä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 \Dweiter 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 1dem Polyglot vor der Incident / Whirl-Zeile ein Extra hinzugefügt . Dieses Extra führte dazu, 1dass Whirl auf die falschen Anweisungen am Lenkrad zeigte. Das allererste 1in 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 Rin #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 xin #= xist 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.


Incident schlägt fehl (es wird gedruckt 3333und wartet dann auf Eingabe), ist jedoch wahrscheinlich leicht zu beheben. Das Problem ist, dass Sie ein Token ( -]) nach dem ^-Token platziert haben, mit dem Sie zuvor zum Ende des Programms gesprungen sind. Die beiden anderen Verwendungen von -]sind aufeinanderfolgend, so dass sich ein… xx… x… Muster bildet, das ein Rückwärtssprung ist. Es ist jedoch wahrscheinlich recht einfach, diesen Vorgang -]etwas früher (oder den ^_nächsten oder beide) durchzuführen.

@ ais523 Danke. Das bekomme ich zum Golfen beim Schreiben. Denken Sie immer daran, die Incident-Kinder zu überprüfen. Glücklicherweise konnte ich dieses Problem durch Addition durch Subtraktion beheben, also denke ich, dass ich insgesamt gewinnen konnte.
Chance

1
Wenn Sie das V mit -v(für ausführlich) ausführen <esc>, können Sie ein buchstäbliches Escape-Zeichen durch ein anderes ersetzen , was die zukünftige Arbeit mit dem Code möglicherweise ein wenig erleichtert. (Ich denke)
Pavel

Beeindruckend! Danke @ ais523 für das Kopfgeld. Was für ein großartiger Start am Montagmorgen!
Chance

Befunge-98 ist älter als Befunge-93?
CalculatorFeline

17

183. Intel 8080- Startabbild (ZEMU), 9870 Byte

Probieren Sie es online!

Erläuterung

Dank Potato44 für die Idee, Maschinencode hinzuzufügen, hat es viel Spaß gemacht, diese Antwort zu machen.

Ich habe keine CP / M-COM-Datei erstellt, da dadurch die Größe der Mehrsprachigkeit auf ca. 60 KB beschränkt wird, was ich vermeiden möchte. Das Boot-Image war noch einfacher als COM, da ZEMU standardmäßig den Boot-Sektor vom 6. Sektor lädt (1-basierte, 128-Byte-logische Sektoren), sodass der Start von Polyglot nicht ausgeführt werden muss. Der Startcode muss im Polyglot den Offset 0x280 ((6-1) * 128) haben.

Ich benutze den ZEMU- Emulator, der von dieser Seite verlinkt ist . So führen Sie Polyglot in ZEMU aus:

  • Datenträger> A: Auswahl einer mehrsprachigen Datei
  • Optionen> Befehlssatz I8080
  • Drücken Sie die Boot-Taste

Die Funktion, die ein cns$otZeichen an console ( ) ausgibt, wurde von BIOS22Dv221.ASM aus der ZEMU-Distribution kopiert. Ich habe zwei Änderungen vorgenommen: Das Zeichen wird nicht in 7-Bit-ASCII-Zeichen maskiert, da wir die Parameter steuern. Es jrz cns$otwird durch ersetzt, jz cns$otda der jrzBefehl Zilog Z80 in Intel 8080 nicht vorhanden ist (Relativsprung bei Null).

Startprogramm ( Intel-Syntax , Assembler von hier aus verlinkt ):

    org 3120h    ; chosen so that cns$ot == 0x3131, easier to generate
                 ; this program will be generated at this offset
                 ; to run it directly specify org 0100h

    mvi c,31h    ; '1'
    call cns$ot
    mvi c,38h    ; '8'
    call cns$ot
    db 38h       ; for answer 188, NOP in I8080
    mvi c,33h    ; '3'
    call cns$ot
    hlt          ; halt processor

;;;;;;;;; copied from BIOS22Dv221.ASM
cno$sp equ 7dh
cno$sb equ 01h
cno$si equ 00h
cno$dp equ 7ch

; print char to console, receives char in c register
cns$ot:
    in cno$sp    ; in status
    xri cno$si   ; adjust polarity
    ani cno$sb   ; mask status bit
    jz cns$ot    ; repeat until ready
    mov a,c      ; get character in a
    out cno$dp   ; out character
    ret

Dieses Programm enthält Zeichen, die nicht direkt in Polyglot verwendet werden können. Die meisten ASCII-Steuerzeichen (Code <0x20) sind in Simula nicht zulässig. Nicht-ASCII-Zeichen (Code> = 0x80) können nicht alleine angezeigt werden, da die Datei UTF-8-gültig sein muss. Das obige Programm wird also von einem anderen UTF-8-gültigen Programm generiert.

Das folgende Programm generiert den benötigten Code und springt dorthin. ld (hl),akann wegen Grass ( 'w'==0x77) nicht verwendet werden . sub h(0x94) und xor a(0xAF) sind UTF-8-Fortsetzungsbytes, ihnen muss das UTF-8- Hauptbyte vorangestellt werden. Der Befehl ret nc(= 0xD0, Rückgabe, wenn nicht Übertragen) wird als UTF-8-Hauptbyte verwendet. Damit es nichts tut, wird ihm ein scfBefehl vorangestellt (setze Carry-Flag). Auch vermieden ','(0x2C) und '.'(0x2E) für DOBELA. org 0100hDie Direktive wird nicht verwendet, da der verwendete Assembler sie nicht versteht (org wird in der GUI festgelegt). Dieses Programm ist ohnehin positionsunabhängig. Ich mag Zilog-Mnemonics mehr, deshalb habe ich sie für ein längeres Programm verwendet.

Zilog-Syntax , Assembler von hier verlinkt :

  ; generate: 0E 31 CD 31 31 0E 38 CD 31 31 38 0E 33 CD 31 31 76 DB 7D EE 00 E6 01 CA 31 31 79 D3 7C C9

  ld hl,3120h

  ld a,3Fh
  scf       ; set carry flag so that ret nc does nothing
  ret nc    ; utf8 lead byte for next insn
  sub h     ; a -= h; a = 0Eh;  utf8 cont byte (opcode 0x94)
  ld c,a

  ld (hl),c ; 0Eh    ; not using ld (hl),a because it is 'w'
  inc hl

  ld (hl),h ; 31h
  inc hl

  ld a,32h
  cpl       ; a = ~a; a = 0xCD
  ld d,a
  ld (hl),d ; CDh
  inc hl

  ld (hl),h ; 31h
  inc hl
  ld (hl),h ; 31h
  inc hl

  ld (hl),c ; 0Eh
  inc hl
  ld (hl),38h ; 38h
  inc hl

  ld (hl),d ; CDh
  inc hl
  ld (hl),h ; 31h
  inc hl
  ld (hl),h ; 31h
  inc hl

  ld (hl),38h ; 38h
  inc hl

  ld (hl),c ; 0Eh
  inc hl
  ld (hl),33h ; 33h
  inc hl

  ld (hl),d ; CDh
  inc hl
  ld (hl),h ; 31h
  inc hl
  ld (hl),h ; 31h
  inc hl

  ld (hl),76h ; 76h
  inc hl

  ld a,23h  ; not using ld a,24h because it has '$' (breaks SNUSP)
  inc a
  cpl       ; a = ~a; a = 0xDB
  ld d,a
  ld (hl),d ; DBh
  inc hl

  ld (hl),7Dh ; 7Dh
  inc hl

  ld a,c    ; a = 0Eh
  cpl       ; a = F1h
  dec a
  dec a
  dec a     ; a = EEh
  ld d,a
  ld (hl),d ; EEh
  inc hl

  scf
  ret nc
  xor a     ; a ^= a; a = 0; utf8 cont byte
  ld c,a
  ld (hl),c ; 00h
  inc hl

  ld a,4Ah
  scf
  ret nc
  sub h     ; a -= h; a = 0x19;  utf8 cont byte
  cpl       ; a = ~a; a = 0xE6
  ld d,a
  ld (hl),d ; E6h
  inc hl

  ld a,c
  inc a
  ld d,a
  ld (hl),d ; 01h
  inc hl

  ld a,35h
  cpl       ; a = 0xCA
  ld d,a
  ld (hl),d ; CAh
  inc hl
  ld (hl),h ; 31h
  inc hl
  ld (hl),h ; 31h
  inc hl

  ld (hl),79h ; 79h
  inc hl

  ld a,2Dh  ; not using ld a,2Ch because it has ','
  dec a
  cpl       ; a = 0xD3
  ld d,a
  ld (hl),d ; D3h
  inc hl

  ld (hl),7Ch ; 7Ch
  inc hl

  ld a,36h
  cpl       ; a = 0xC9
  ld d,a
  ld (hl),d ; C9h

  ld sp,3232h  ; set up stack for generated program

  ld hl,3120h  ; not using ld l,20h because it has '.'
  jp (hl)      ; go to generated program 
               ; confusing mnemonic - actually it is jp hl, ie. PC = HL
               ; opcode 0xE9, utf8 lead byte (0xE9 = 0b11101001), must be followed by 2 cont bytes
  db 80h,80h

Dieses Programm ist zusammengestellt in:

! 1>?7ДOq#t#>2/Wr#t#t#q#68#r#t#t#68#q#63#r#t#t#6v#>#</Wr#6}#y/===Wr#7ЯOq#>J7Д/Wr#y<Wr#>5/Wr#t#t#6y#>-=/Wr#6|#>6/Wr122! 1退

Sie muss im Polyglot den Offset 0x280 haben (siehe Zeile 2). Der Abstraktionstest im Testtreiber überprüft dies.

Refactorings

Muscheln

Verschobene Muscheln zurück zur längsten Linie. Ich mag dieses Layout mehr, weil die Parens nicht mit anderen langs in Einklang gebracht werden. Moorhensen und Flocken wurden vor Muscheln verschoben, sodass sie beim Muschelwechsel nicht brechen. Die längste Zeile hat jetzt dieses Layout:

Grass  Moorhenses  Flaks  Shells  Rubies/Pythons/Perl5  PicoLisp  Prelude  Klein001

Neuer Shells Code:

a=$(printf \\x00)
b=$(echo -n $a | wc -c)
case $b[1] in 1*)echo 54;; 4*)echo 78;; 8*)echo 166;; *1*)echo 50;; *)echo 58;; esac
exit

Code für alte Muscheln:

a=$(printf \\x00)
b=${#a}
case "{"$ar[1]"}"${b} in *1)echo 54;; *4)echo $((19629227668178112600/ 118248359446856100));; *1*)echo 50;; *)echo 58;; esac
exit

Die Länge von $awird $(echo -n $a | wc -c)jetzt berechnet (ab hier ). Anfangs habe ich das benutzt, um es loszuwerden #, aber jetzt wird es wegen des kürzeren Codes verwendet. Muscheln können enthalten, #weil Flocken vor Muscheln sind.

Yash (166) verwendet einen eingebauten Echobefehl, der standardmäßig keine Optionen unterstützt, sodass "-n" und Zeilenvorschub Teil der Ausgabe sind, was zusätzliche 4 Bytes ergibt. Wenn nicht ECHO_STYLEvoreingestellt auf SYSV( -nOption wird nicht akzeptiert).

Dieser TIO-Link testet den Code in allen Shells.

Zusätzliche (((((Vormuscheln fixieren Unterlast und Netzhaut. Ein weiteres Paar von Parens wird hinzugefügt, um sich 58vor dem Präludium zu verstecken (geschlossen mit #)nach exit). {vorher ((((((ist für Japt, ohne dass Japt hängt.

Flocken

Aufgrund der Verlagerung von Flaks kann der Startcode vereinfacht werden - ([])es bleibt nur noch:

     line 21      (Grass(([5]{})))    scripting langs                  clear stack     Flaks main code                                                                                      begin skip code      the rest of polyglot   end skip code   print(85)
old: []{}[][][]   ((([]{})))          ((()()<<()>>)((()([])))<<()>>)   {}{}{}{}{}{}{}  ({}<(((((()()())){}{})){}{})>)(({})){}{(<(<()>)({})({}<{}>({}){})>){({}[()])}}({}){}({}()<()()()>)   (<><()>){({}[()])}{           ...           }{}<>              ()
new: []{}[][][]     ([]  )                                                             ({}<(((((()()())){}{})){}{})>)(({})){}{(<(<()>)({})({}<{}>({}){})>){({}[()])}}({}){}({}()<()()()>)   (<><()>){({}[()])}{           ...           }{}<>              ()

Dieser TIO-Link testet den Code in allen Flaks.

Spaltung & Kardinal

Fission wurde in LNUSP bewegt: R"12"R _*. Der zweite Zeiger wird verwendet, um die Spaltung so schnell wie möglich zu beenden - im dritten Schritt finden Sie in Antwort 54 weitere Informationen.

Kardinal wurde in LNUSP bewegt: @ %"18". Wie in Fission wird der zweite Zeiger verwendet, um Cardinal so schnell wie möglich zu beenden - im dritten Schritt.

MarioLANG

Verwenden Sie ####...statt ====...als Plattform:

Bildbeschreibung hier eingeben

Minimal-2D

Polyglot mit MarioLANG:

Bildbeschreibung hier eingeben

Wierd & 1L_a

Sonderbar: Verwenden Sie das Leerzeichen in Zeile 10, Spalte 79, um die IP-Adresse wiederzugeben.
1L_a, Wierd: Leerzeichen in Zeile 9, Spalte 79 ist wichtig.

Bildbeschreibung hier eingeben

Kubisch

Neuer Code: :1*23!/5x%6E0

:1*23!/5x%6E0
! - skip over / in Klein 201
x - destroy Cardinal pointer before it hits /

pure:
:1*23/5%6E0

faceval:
0 0
1 9
2 18
3 27
4 36
5 45

program:
:1   mem = 9
*23  mem *= 18; mem *= 27
/5   mem /= 45
%6   print mem
E0   exit

9*18*27/45 == 97 (integer division)

6 in %6 is used to print mem because 0-5 are used to print faceval (eg. %3 prints 27)
0 in E0 is not an exit code, it is present just to trigger E instruction

Klein 201/100

Neuer Code: !|*****[[[828+*+@+*99]]]*****|!

Immerhin enthält der Multiplikationsstapel eine einzelne Null, weil das Aufspringen aus dem leeren Stapel Null ergibt. Diese Null wird mit +neben der Hauptzahl addiert @. Zuvor wurde es mit verworfen ?, siehe Klein 001 Antwort .

So funktionieren Türen in Klein:

Bildbeschreibung hier eingeben

Wirbeln

Der Whirl- Code ist im Grunde derselbe. Die einzige Änderung besteht darin, dass der Hauptcode davon ausgeht, dass die aktuelle Operation ops.one (2) und nicht ops.load (4) ist.

Effektiv kann man sich Whirl mit 3 Operationen vorstellen:

  • 1 einen schritt drehen
  • 0 Drehrichtung wechseln
  • 00 Aktuelle Anweisung ausführen und Ring umschalten

Kombinierte Operationen zur Vereinfachung der Überlegungen zum Programm:

  • 0000 Wenn der aktuelle Status des inaktiven Rings noop ist, führen Sie einfach den aktuellen Status des aktiven Rings ohne Nebenwirkungen aus
  • 11..11 Drehe n Schritte
  • 011..11 Drehrichtung wechseln und n Schritte drehen

0000führt den aktuellen Befehl des aktiven Rings aus, führt aber auch den aktuellen Befehl des inaktiven Rings als Nebeneffekt aus. Wenn die derzeitige Anweisung für den inaktiven Ring harmlos ist, können wir uns nur auf Operationen für den aktiven Ring konzentrieren, ohne zu überlegen, was mit dem inaktiven Ring geschieht. Dies ist besonders nützlich bei diesem Programm, da es eine klare Trennung aufweist: Zuerst wird die Nummer 32 nur mit dem mathematischen Ring erstellt, dann wechseln wir zum ops-Ring und führen dort zwei Anweisungen aus (Drucken und Beenden).

Zuerst wollte ich, dass die aktuelle Operation für ops ring nicht aktiv ist, wenn der Hauptcode ausgeführt wird. Es hat 2 Vorteile: 1) Der Haupt-Whirl-Code kann eigenständig ausgeführt werden und 2) wir können den Ops-Ring komplett vergessen, wenn wir die Nummer 32 mit dem Mathe-Ring erstellen. Der Code wird jedoch länger als zuvor, sodass der Hauptcode davon ausgeht, dass der aktuelle Vorgang ops.one (2) ist. Dies bedeutet, dass ops.value als Nebeneffekt von mathematischen Operationen auf 1 gesetzt wird, die dann zum Drucken verwendet werden. Alter Code erzielte den gleichen Effekt mit der Anweisung ops.load, aber die Verwendung von ops.one drückt die Absicht deutlicher aus - ops.value auf einen Wert ungleich Null zu setzen.

at this point current ring is ops, dir = clockwise, cur op = ops.one
00    switch to math ring
011   rotate to math.not
0000  math.not (math.val = 1)
01111 rotate to math.store
0000  math.store (mem[0] = 1)
1     rotate to math.add
0000  math.add (math.val = 2)
01    rotate to math.store
0000  math.store (mem[0] = 2)
011   rotate to math.mult
0000  math.mult (math.val = 4)
0000  math.mult (math.val = 8)
0000  math.mult (math.val = 16)
0000  math.mult (math.val = 32)
011   rotate to math.store
00    math.store (mem[0] = 32), switch to ops ring
up to this point the program is the same as before

01111 rotate to ops.intio
0000  ops.intio - print mem[0] as number
0111  rotate to ops.exit
00    ops.exit

Neuer Code ist kürzer, weil der alte Code im zweiten Teil des Programms einige redundante Richtungswechsel aufweist, nicht aufgrund einer neuen Annahme.

old: (1111) 00011000001111000010000010000011000000000000000001100 01111110000011100
new: (11)   00011000001111000010000010000011000000000000000001100   011110000011100

So behalten Sie Whirl bei, wenn Sie etwas vor der Incident / Whirl-Zeile ändern:

  • Stellen Sie sicher, dass 0vor dem Whirl-Hauptcode eine gerade Anzahl von s steht
  • Stellen Sie sicher, dass keine zwei aufeinander folgenden 0s vorhanden sind
  • genug 1s hinzufügen / entfernen, bis Whirl wieder funktioniert; Das Hinzufügen von ns 1entspricht dem Entfernen von 12-ns 1und umgekehrt

Ich habe unwissentlich gegen die erste Regel verstoßen, als Ropy hinzugefügt wurde. Bei einer ungeraden Anzahl von 0s wird der Hauptcode mit einer falschen Richtung des Operationsrings ausgeführt, wodurch der Beendigungsbefehl unterbrochen wird. Es gibt also jetzt 0Zeile 3, die 0Zeile 1 ausgleicht .

Andere

CoffeeScript : console.log a&&39||180(von hier )

INTERCAL : Umzug in Zeile 37
Brainfuck , Agony : Umzug in andere Brainfuck-Derivate in Zeile 10

xEec : verschoben in 1L_a ( h#115# o#)

CSL : in Zeile 80
verschoben. Trefunge : in Zeile 120
verschoben. Gaot ++ , Stones : in getrennten Zeilen platziert


4
Schön, das ist eine Menge Bytes zum Golfen.
Potato44

16

16. Pyth (159 Bytes)

#v\;2^0\;7||"<+0+0+0+<*!2'!1'L#'1r'4;n4
#v0#_q@
#>3N.15o|1
#|\w*
#8  ^<1b0 <
#|
#M`
print ((0 and'13')or(None and 9 or 1/2 and 1 or 5))
#"07|5//00;16 "jd5ki2

Hinweis: Nach der dritten Zeile und nach der letzten Zeile steht ein ESCByte ( 0x1B) .oj

Das war eine ziemlich lustige Erfahrung. Japt und Pyth sind beide Golfsprachen, aber Japt ist Infix und Pyth ist Präfix, und Pyth fordert die Eingabe automatisch an und schlägt fehl, wenn Argumente fehlen.

Vor der Haystack-Antwort hatte ich eine fast funktionierende Lösung verwendet #, die in Japt einen Zeichencode und in Pyth einen Loop-till-error erhält. Pyth ist in Polyglots sehr nützlich, da das allgemeine Kommentarzeichen im #Wesentlichen als Fehlerschalldämpfer fungiert.

Als ich nach Hause kam, fand ich einen Code, der sowohl //in Japt als auch in Pyth als Kommentar funktioniert. Dann ging es nur noch darum, die Befunges auf den richtigen Weg zu bringen.

Es ist sehr unwahrscheinlich, dass dies optimal ist, aber es ist für den Moment gut genug. Ich habe versucht, sie alle zu testen, aber ich würde es sehr begrüßen, wenn jemand die Übereinstimmung der Ausgänge überprüfen würde.

Druckt 1 in Python 3 , 2 in V , 3 in Minkolang , 4 in> <> , 5 in Python 2 , 6 in Self-Modifying Brainfuck , 7 in Japt , 8 in Retina , 9 in Perl , 10 in Befunge (-93 ) , 11 in Befunge-98 , 12 in Fission , 13 in Ruby , 14 in Turtléd , 15 in Haystack und

16 in Pyth .

Erläuterung

Was Pyth hier sieht, ist:

#v\;2^0\;7||"string
multiline
string"07|5//00;16 "string

Dies übersetzt in den folgenden Pseudocode:

while no errors occur:
    evaluate ";"
    print 2
    print 0 to the power ";"
    print 7
    print "string\nmultiline\nstring" or 0 or 7
    print 5 or 0 divided by 0 divided by (missing)
print 16
do nothing with "string"

Die erste Schleife wird beendet, wenn versucht wird zu bewerten, ;welcher Ausdruck nicht gültig ist. Dann druckt Pyth einfach 16.


Wie erweitern? Ich brauche noch ungefähr 5 Bytes für meine Antwort;)
Alfie Goodacre

@AlfieGoodacre Durch Hinzufügen der restlichen Details zum Beitrag. Ich wollte nur gesund bleiben und habe meinen Code gepostet, bevor jemand meinen Platz gestohlen hat. : D
PurkkaKoodari
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.