Meta-Bowling Golf

21

Ihre Aufgabe ist es, das kürzeste Programm (A) zu erstellen, das ein anderes Programm (B) mit den eindeutigsten Bytes ausgibt, das wiederum das ursprüngliche Programm (A) ausgibt. Im Wesentlichen spielen Sie eine Hälfte eines Ouroboros-Programms (auch bekannt als periodisch iterierendes Quine) und bowlen die andere Hälfte. A und B können in verschiedenen Sprachen sein.

Regeln und Wertung

Ihre endgültige Punktzahl ist <number of unique bytes in B> / <number of bytes in A>. Höchste Punktzahl gewinnt. Es ist zu beachten, dass die theoretische Höchstpunktzahl 256 beträgt.

  • Programm A muss mindestens ein Byte lang sein
  • Programm B kann nicht vollständig aus No-Ops bestehen, dh mindestens ein Zeichen muss die Ausgabe in irgendeiner Weise beeinflussen.
  • Für beide Programme gelten die Standardregeln für Quines . Insbesondere sind Fehlerquines in beiden Fällen nicht zulässig.

Um die Konsistenz des Antwortformats zu gewährleisten, beginnen Sie Ihre Antwort mit etwas ähnlichem:

# <Language for A> & <Language for B>, Score: <B score> / <A score> = <combined score>
Beefster
quelle
Damit dies klar wird, müssen Sie den zweiten Punkt ein wenig präzisieren. Was bedeutet es für einen Charakter genau, ein No-Op zu sein?
Weizen-Zauberer
Meinen Sie mit eindeutigen Bytes geteilte Bytes oder Ähnlichkeit zwischen den beiden?
KrystosTheOverlord
@KrystosTheOverlord, es wäre einfach innerhalb von Programm B, ohne Bezug zu Programm A. Hat zum Beispiel aaaaaein eindeutiges Byte und abcdehat 5 eindeutige Bytes.
Beefster
1
Ich warte nur auf die Programme, in denen Programm A unärgerlich oder lenguage ist
Verkörperung der Ignoranz
4
@EmbodimentofIgnorance Programm A wird nach der Anzahl der Bytes und nicht nach eindeutigen Bytes bewertet . Lenguage / Unary würde furchtbar treffen
Jo King

Antworten:

14

Japt & Japt , Score: 255/38 = 6,71

Programm A :

"iQ ²¯24
G²õ@i'#+Xd"iQ ²¯24
G²õ@i'#+Xd

Programm B ist über 8 KB lang, so lange, dass die Verknüpfung unterbrochen wird, sodass ich das Ganze nicht einfügen werde. Hier ist ein Beispiel:

#þ"iQ ²¯24
G²õ@i'#+Xd"iQ ²,#ÿ"iQ ²¯24
G²õ@i'#+Xd"iQ ²,#Ā"iQ ²¯24
G²õ@i'#+Xd"iQ ²

Ich konnte keinen Weg finden, ein NULByte zum Laufen zu bringen, weshalb Programm B nur 255 eindeutige Zeichen enthält. Programm B besteht im Wesentlichen aus 255 Kopien eines einzelnen Programms, wobei jedes Mal ein einzelnes irrelevantes Byte geändert wird und die ersten 254 Ausführungen ignoriert werden.

Zur Erklärung beginne ich mit dieser vereinfachten Version von A, damit das resultierende B leichter zu diskutieren ist.

"iQ ²¯23
3õ@i'#+Xd"iQ ²¯23
3õ@i'#+Xd

Dieses Programm basiert auf dem Basis-Japt-Quine, der für Nutzdaten geeignet ist . Die Zeichenfolge am Anfang enthält ein Duplikat des restlichen Programms, iQ ²fügt ein Zitat und Duplikate ein, um eine Zeichenfolgendarstellung des gesamten Programms zu erstellen, und ¯23schneidet dann sich selbst und alles danach ab. Die resultierende Zeichenfolge ist ein Programm, das Programm A ausgibt :

"iQ ²¯23
3õ@i'#+Xd"iQ ²

Ich werde diese Zeichenfolge als bezeichnen U.

Die letzte Zeile von A dupliziert Ueinige Male mit jeweils einer kleinen Änderung. Genauer gesagt, für jede Zahl Xin dem Bereich [1...3]gibt es , "#c" + Uwenn cdas Zeichen mit charCode ist X. Das Standardverhalten von Japt ist die Ausgabe dieser Zeichenfolgen ohne Anführungszeichen und durch Kommas getrennt. Dies ist also die Ausgabe unseres vereinfachten A (beachten Sie, dass zwischen jedem #und "iQ:

#"iQ ²¯23
3õ@i'#+Xd"iQ ²,#"iQ ²¯23
3õ@i'#+Xd"iQ ²,#"iQ ²¯23
3õ@i'#+Xd"iQ ²

Wir werden diese nennen Simplified B .

Vereinfachtes B hat eine einfache Struktur, die zwischen #cund wechselt U. Zum Glück für diese Antwort wird jedes #cund Uals durch ein Komma getrennt behandelt, und in dieser Situation hat das Verhalten von allem außer dem allerletzten Ukeine Auswirkung auf die Ausgabe. Der einzige Teil von Simplified B, der sich auf die Ausgabe auswirkt, ist folgender:

"iQ ²¯23
3õ@i'#+Xd"iQ ²

Das ist identisch mit dem U, was wir bereits wissen. Outputs Simplified A.

Der einzige Unterschied zwischen "Vereinfachtes A" und "Programm A" besteht darin, dass [1...3]das echte Programm keine Kopien für den Bereich erstellt , sondern Kopien für den Bereich [1...256]. Das führt zu 256 Versionen, von denen #cjede ein anderes Zeichen hat, obwohl die letzte Version "Ā" ein Mehrbytezeichen ist, sodass keine eindeutigen Bytes hinzugefügt werden, aber alles außer dem letzten Uwird weiterhin ignoriert.

Kamil Drakari
quelle
Sehr schön :) Würde das für 38 Bytes funktionieren?
Shaggy
@Shaggy Das 27muss immer dann angepasst werden, wenn Bytes gespeichert werden, aber ansonsten scheint es so, als ob es funktioniert.
Kamil Drakari
1
@Shaggy Die Bewertung basiert auf der Anzahl der eindeutigen Bytes in B und es gibt nur 256 mögliche Bytes. Soweit mir bekannt ist, enthält auch die neue Version von B kein Null-Byte.
Kamil Drakari
Übrigens, ich habe ein paar Dinge versucht, damit es mit dem Null-Byte funktioniert, aber alle sind fehlgeschlagen.
Shaggy
5

Programm A, Gol> <> , 256/20 Bytes = 12,8

"44XFL|r2ssl3%Q4s]|H

Probieren Sie es online!

Programm B, Gol> <>

"44XFL|r2ssl3%Q4s]|H	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ

Probieren Sie es online!

Das Programm gibt sich abwechselnd aus, gefolgt von jedem Byte, und gibt sich nur aus.

Erläuterung:

"            Wrapping string literal pushes the first line to the stack backwards
 44X         Push 256
    FL|      Push the range from 0 to 255
       r                  Reverse the stack
        2ss               Push a quote
           l3%            If the stack length is divisible by 3
              Q4s]|       Only take the top 20 characters
                   H      And output the stack
Scherzen
quelle
1

Programm A: 05AB1E , Score: 256/41 256/31 Bytes = 8,258 ...

0"D34çý₅Ýç'q†22ǝ"D34çý₅Ýç'q†22ǝ

Probieren Sie es online aus.

Programm B: 05AB1E

0"D34çý₅Ýç'q†22ǝ"D34çýq 

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnoprstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿÝç'q†22ǝ

Probieren Sie es online aus.

Erläuterung:

Die kürzeste für 05AB1E ist diese: 0"D34çý"D34çý( 14 Byte ) bereitgestellt von @OliverNi . Meine Antwort verwendet eine modifizierte Version dieser Quine durch Hinzufügen ₅Ýç'q†vy27ǝD}J.

0            # Push a 0 to the stack
             #  STACK: [0]
 "D34çý₅Ýç'q†vDy27ǝ}J"
             # Push the string "D34çý₅Ýç'q†vDy27ǝ}J" to the stack
             #  STACK: [0,"D34çý₅Ýç'q†vDy27ǝ}J"]
  D          # Duplicate the string
             #  STACK: [0,"D34çý₅Ýç'q†vDy27ǝ}J","D34çý₅Ýç'q†vDy27ǝ}J"]
   34çý      # Join the stack by '"'
             #  STACK: ['0"D34çý₅Ýç'q†vDy27ǝ}J"D34çý₅Ýç'q†vy27ǝD}J']
₅Ý           # Push a list in the range [0,255]
  ç          # Convert each integer to an ASCII character
   'q†      '# Filter the "q" to the front
      22ǝ    # Insert it at index 22 in the string (replacing the second '₅')
             # (and output the result implicitly)

Programm B wird beendet, sobald es qdas Programm erreicht. Das aktuelle Programm B lautet also:

0"D34çý₅Ýç'q†22ǝ"D34çýq

Alles danach wird ignoriert und der Anfang des Stacks ( 0"D34çý₅Ýç'q†22ǝ"D34çý₅Ýç'q†22ǝ) wird implizit ausgegeben.

Kevin Cruijssen
quelle