Inspiriert von Hyperprogramming: N + N, N × N, N ^ N in einem .
Vielen Dank an @MartinEnder und @trichoplax für ihre Hilfe im Sandkasten.
Definitionen
Hyperquines
Definieren Sie eine Hyperquine der Ordnung n als ein quineähnliches vollständiges Programm oder eine Funktion P , die alle Regeln erfüllt, die für richtige Quines gelten, und außerdem die folgende Struktur aufweist.
P ist die Verkettung von Zeichen ‡ Gruppen , die bestehen aus n Kopien des gleichen Charakters. Wenn P ausgeführt wird, ist die Ausgabe die Verkettung derselben Gruppen, ergänzt um eine weitere Kopie des Zeichens.
Beispiele
In einer hypothetischen Programmiersprache, in der der Quellcode
aabbcc
die Ausgabe generiertaaabbbccc
, bildet dieses Programm eine Hyperquin der Ordnung 2 .Die Definition erfordert nicht, dass die Zeichen verschiedener Gruppen unterschiedlich sind.
Wenn der Quellcode
aabbcc
die Ausgabe generiertaaaabbbbcccc
, ist das Programm ein Hyperquin der Ordnung 1 ; Der Quellcode besteht aus sechs Einzelzeichengruppen, die Ausgabe aus sechs Zeichenpaaren.In GS2 wird das leere Programm gedruckt
\n
und das Programm wird\n
gedruckt\n\n
. Weder Hyperquine\n
noch\n\n
Hyperquine, da sie nicht alle Eigenschaften von erfüllen richtigen . Kein Teil des Quellcodes kodiert einen anderen Teil der Ausgabe.
Hyperquine Ketten
Definieren Sie eine Hyperquinkette der Länge n als endliche Folge von n vollen Programmen oder n Funktionen
(P 1 ,…, P n ) , die die folgenden Bedingungen erfüllen.
Die Ausgänge von P 1 , ..., P n-1 sind P 2 , ..., P n .
P 1 ,…, P n sind Hyperquinen.
Die Ordnungen von P 1 ,…, P n bilden eine streng ansteigende Folge von benachbarter ganzer Zahlen.
Definieren Sie schließlich eine unendliche Hyperquinkette als eine unendliche Folge von vollständigen Programmen oder Funktionen (P 1 , P 2 ,…), so dass jedes Anfangsintervall (P 1 ,…, P n) ) eine Hyperquinkette der Länge n darstellt .
Beispiele
In einer hypothetischen Programmiersprache, in der der Quellcode
aabbcc
die Ausgabe generiertaaabbbccc
, die wiederum die Ausgabe generiertaaaabbbbcccc
, wird das Paar (aabbcc
,aaabbbccc
) eine Hyperquinkette der Länge 2 .Beachten Sie, dass
aaaabbbbcccc
- die Ausgabe des letzten Hyperquins in der Kette - keine bestimmte Ausgabe erzeugen muss. Es muss nicht einmal gültiger Quellcode sein.Die Fortsetzung des vorherigen Beispiel, wenn
aaaabbbbcccc
das Ausgangssignal erzeugtaaaaabbbbbccccc
, das Triplett (aabbcc
,aaabbbccc
,aaaabbbbcccc
darstellt) , um eine Kette von hyperquine Länge 3 .Wenn dieses Muster für immer fort, die Folge (
aabbcc
,aaabbbccc
,aaaabbbbcccc
, ...) bildet eine unendliche hyperquine Kette.Das Programmpaar (
abc
,aabbcc
) mit Ausgaben (aabbcc
,aaaabbbbcccc
) ist keine Hyperquinkette, da die Ordnungen der Hyperquine beide 1 sind und daher keine streng ansteigende Folge bilden.Das Programmpaar (
aabbcc
,aaaabbbbcccc
) mit den Ausgängen (aaaabbbbcccc
,aaaaabbbbbccccc
) ist keine Hyperquinkette, da die Ordnungen der Hyperquine 1 und 4 sind daher keine Folge benachbarter Ganzzahlen bilden.
Regeln
Aufgabe
Schreiben Sie in einer Programmiersprache Ihrer Wahl eine nicht triviale Hyperquin-Kette, dh eine Kette, die aus mindestens 2 besteht Hyperquinen besteht.
Wie üblich dürfen Ihre Programme in keiner Form Eingaben vornehmen oder auf ihren eigenen Quellcode zugreifen.
Wenn Ihr Interpreter eine implizite Newline druckt, Ihre hyperquines müssen berücksichtigen.
Alle Standardlücken - insbesondere solche, die sich auf Quines beziehen.
Wertung
Die längste Hyperquinkette gewinnt. Wenn zwei oder mehr Einsendungen gleich sind, gewinnt die Einsendung unter diesen, die mit dem kürzesten Hyperquin (gemessen in Zeichen ‡ ) beginnt . Wie üblich ist die Posting-Zeit der letzte Tiebreaker.
‡ Sie müssen dieselbe Zeichenkodierung für Quellcode, Ausgabe, Zeichenzahl und Ausführung verwenden. Zum Beispiel kann das Python - Programm print 42
ist nicht eine 2-Zeichen UTF-32 Einreichung, da der Interpreter jedes Byte als ein einzelnes Zeichen behandelt. Wenn Ihre Sprache nicht zeichenbasiert ist, behandeln Sie alle einzelnen Bytes als Zeichen.
Antworten:
Befunge-98 , unendliche Ordnung,
54523836 BytesZweiter Ansatz - unendliche Ordnung, 36 Bytes
Dieses Programm würde tatsächlich beim 34. Hyperquin brechen, da der ASCII-Wert von
"
die String-Interpretation stören würde (und bei 59;
), aber wir versetzen die Speicherung dieses Werts an eine Position, die niemals ausgeführt wird (dh(0, 1)
anstelle von(0, 0)
).Versuchen Sie es online: 1 , 2 , 10 , 34 , 42
Erläuterung
Erster Ansatz - Ordnung 34, 52 Bytes (verwendet Introspektion, also technisch nicht legal)
Aus dem Grund in dem obigen Beitrag würde dieses Programm bei der Bestellung 34 abbrechen (obwohl ich es nicht getestet habe).
Probieren Sie es online!
quelle
g
, die den Quellcode des Programms direkt zu lesen scheint. Trotzdem bin ich kaum ein Befunge-Experte, daher könnte ich etwas missverstehen.g
verwende hier für zwei Zwecke: zum Speichern von Daten und zum Lesen des Quellcodes. Die zweite ist vielleicht etwas lückenhaft , obwohl esolangs.org/wiki/Befunge#Quine ein Beispiel gibt, mitg
dem auch der Quellcode gelesen werden kann. In der Zwischenzeit werde ich sehen, ob ich eine Version erstellen kann, die keine Selbstbeobachtung verwendet.> <> , unendliche Reihenfolge, 178 Bytes
Das Programm enthält einen nachgestellten Zeilenvorschub.
Probieren Sie es online aus: 1 , 2 , 3 , 10 (Das letzte Mal dauert es eine Weile, bis es ausgeführt wird.)
Retina-Skript zum Generieren der Quelle aus einem linearen Programm.
Erläuterung
Die Hauptidee ist es, die Quine vertikal zu drehen, damit der tatsächliche Kontrollfluss durch die Wiederholung nicht beeinträchtigt wird. ZB beginnt die zweite Hyper-Quine wie folgt:
Da wir uns nur durch die erste Spalte bewegen, müssen wir uns nicht um wiederholte Zeichen kümmern. Auch wenn wir den größten Teil des Codes als Zeichenfolge mit übergeben
'
, wird ein Leerzeichen für jede leere Zeile übergeben, wodurch wir die Anzahl der Wiederholungen bestimmen können. Das heißt, es gibt einige Einschränkungen aufgrund dieser Leerzeilen:"
großen Zahlen als Zeichencodes in den Hauptteil der Quine eingeben, da dies zu einem zusätzlichen Druck führen würde32
s die wir nicht wollen.?
oder!
weil sie nur das nächste Zeichen überspringen, was in diesem Fall ein Leerzeichen wäre (damit sie den nächsten Befehl nicht wirklich überspringen).Daher erfolgt der gesamte Steuerungsfluss mit expliziten Sprüngen (im Grunde genommen 2D goto), deren tatsächliche Offsets wir basierend auf der Anzahl der Wiederholungen berechnen müssen.
Schauen wir uns also den eigentlichen Code an. Wir beginnen damit,
^
dass der Code von unten nach oben ausgeführt wird. Zum leichteren Lesen schreiben wir den eigentlichen Code in der Ausführungsreihenfolge aus (und löschen den Code,^
weil er nie wieder ausgeführt wird):Das
'
ist die Standard - quining Technik für> <> (und Befunge, glaube ich). Es wechselt in den Zeichenkettenmodus, was bedeutet, dass die gefundenen Zeichen auf den Stapel geschoben werden, bis die nächste gefunden'
wird. Leerzeilen werden implizit mit Leerzeichen aufgefüllt, weshalb wir alle Leerzeichen dazwischen setzen. Leerzeilen am Programmende werden ignoriert. Nachdem sich die IP-Adresse geändert hat und erneut trifft'
, haben wir die erste Spalte des Programms auf dem Stapel, mit Ausnahme der eigentlichen'
.Schauen wir uns an, wie wir damit das gesamte Programm drucken.
Das Programm wird beendet, wenn der Stapel leer ist und die erste innere Schleife kein weiteres Zeichen druckt.
quelle