TryItOnquine Challenge

48

(basierend auf diesem Beitrag und der anschließenden Diskussion im Chat - auch vielen Dank an Dennis für TIO!)

Die Herausforderung

Wählen Sie eine Sprache aus, die derzeit auf der TryItOnline-Website verfügbar ist , z. B. PowerShell . Schreiben Sie Code in dieser Sprache auf dieser Seite, ohne dass Eingaben erforderlich sind. Wenn Sie auf die Schaltfläche Ausführen klicken, entspricht die Ausgabe auf dieser Seite genau der im Feld "Nur URL" beim Speichern / Speichern angegebenen Klicken Sie stattdessen auf die Schaltfläche.

Angenommen, für ein fiktives Beispiel aaawar dies der Code für eine Lösung in PowerShell. Dann sollte das Ergebnis des Klickens auf Ausführen mit aktiviertem aaaCode https://tio.run/#powershellausgegeben werden. Dies https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AAist auch das Feld "Nur URL", wenn auf die Schaltfläche Speichern / Speichern geklickt wird.

Wertung

Die resultierende URL ist Ihr Beitrag zu dieser Herausforderung. Der Gewinner ist die kürzeste URL, gemessen in Bytes. Im obigen Beispiel ist die URL https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AAdie Übermittlung an die Challenge mit 44 Bytes . Die kürzeste URL, die den Rest dieser Herausforderung erfüllt, gewinnt die Herausforderung und verdient Brownie-Punkte (Punkte nicht einlösbar). Unter der Voraussetzung, dass eine bestimmte Mindestlänge möglich ist, gewinnt die frühere Einreichung, wenn zwei Einreichungen gleich lang sind.

URL-Generierung

Dies ist der Start des URL-Generierungsalgorithmus im Repository. Sie können sehen, wie der Hauptcodebereich eingenommen wird, ob zusätzliche Elemente angehängt werden, die Zeichenfolge entleert und Base64 konvertiert und dann ##vorangestellt wird usw. Ich werde hier nicht näher darauf eingehen. Teil der Herausforderung ist es, zu analysieren und zu verstehen, wie die URLs generiert werden, um potenzielle Macken in diesem Algorithmus auszunutzen.

Regeln / Erläuterungen

  • Der eigentliche Code sollte keine Eingabe annehmen und nur die Quine-URL als Ausgabe erzeugen.
    - Das heißt , die nur Textfelder , die ausgefüllt werden müssen , wenn sie in der URL zu klicken , sind die Code, Header, Footeroder „Compiler - Flag“ Felder entspricht; Die Felder Inputund Argumentssind verboten und müssen leer / unbenutzt bleiben. Klicken Sie auf die Schaltfläche Ausführen , um nur das OutputFeld zu ändern . Bei dieser Herausforderung wird das DebugFeld in allen Situationen ignoriert.
  • Für den Code gelten, soweit möglich, die üblichen Quine-Regeln (der Code kann beispielsweise keinen eigenen Quellcode über lesen .code.tio).
  • Bitte fügen Sie Ihrer Einreichung eine Beschreibung der Funktionsweise des Codes bei.
  • Das Übermitteln einer "betrügerischen" Quine durch Übermitteln einer Git-Pull-Anforderung an das TIO-Repository zum Erstellen einer "Trick" -URL oder -Verknüpfung oder dergleichen ist nicht zulässig.
  • Ebenso ist das Senden einer Pull-Anforderung zum Aktualisieren einer bestimmten Sprache zur Erstellung einer "Trick" -URL nicht zulässig.
  • Bitte seien Sie nett zu Dennis 'Servern und missbrauchen Sie sie nicht und versuchen Sie keine Exploits für diese Herausforderung.
AdmBorkBork
quelle
14
Denken Sie daran, die letzte Regel ist wichtig! Es gibt bereits eine Reihe von DDoS-Angriffen.
Erik der Outgolfer
Was ist eine "PR"?
Adám
1
Fiktives Beispiel: Wenn meine Vorlage ist , https://tio.run/##a+adie zu einem Programm verknüpft , dass die Ergebnisse https://tio.run/##a+a, ist es gültig , auch den Link zäh erzeugten saveStategewesen wärehttps://tio.run/##a@a
TwiNight
1
@ TwiNight Gute Frage. Das wäre eine interessante Situation, würde aber hier nicht in die Regeln passen und wäre daher keine gültige Vorlage.
AdmBorkBork
1
Hast du gewartet, bis TIOv2 dies veröffentlicht hat?
mbomb007

Antworten:

15

Python 2 , URL-Länge = 170 Byte

https://tio.run/##K6gsycjPM/r/v9hWqQDCjqlISwPhYlvVIuvM3IL8ohKFpMTiVDMT64KizLwS9YySkoJiK339ksx8vaLSPH1lZXVtiAK9JDOT1Lzk/JRUDY1iVdViTT0YT70qJzNJXVMz2shK1yRWE2aHEkUW4Db//38A
s="python2\xff\xffs=%r;import base64;print'https://tio.run/##'+base64.b64encode((s%%s).encode(('zlib'))[2:-4])\xff\xff";import base64;print'https://tio.run/##'+base64.b64encode((s%s).encode(('zlib'))[2:-4])

Probieren Sie es online!

Dies beruht auf drei Zufällen:

  1. Die Standard-Zlib-Ebene 6 liefert für diese Zeichenfolge die gleichen Ergebnisse wie die Zlib-Ebene 9 und moduliert den Header, den ich entferne.
  2. Die komprimierte Länge ist durch 3 teilbar, sodass base64 keine Füllzeichen generiert =.
  3. Die base64-Ausgabe enthält keine +Zeichen.
Anders Kaseorg
quelle
15

Bash , 174 166 165 157 Bytes

https://tio.run/##S0oszvj/v6QosUBBV1dBvaAoM68kTSGjpKSg2EpfvyQzP0avqDRPX1lZRQMqp6RaHFORlgbCSgpJQO0KSgkg/QlKNelVmQU1JYmZOQq6ydqGhjVA2VQzEwXdckNjS011BdcIz5D//wE

Dies kodiert das folgende Bash-Programm.

trap -- 'printf https://tio\.run/##$(printf "%s\xff\xff" bash "`trap`"|gzip|tail -c+11|base64 -w139)' EXIT

Probieren Sie es online!

Vielen Dank an @ jimmy23013 für das Golfen von 8 Bytes von meinem ursprünglichen Ansatz, für einen Ansatz, der ein weiteres Byte gespart hat, und für das Golfen von weiteren 8 Bytes von diesem Ansatz!

Dennis
quelle
1
@ jimmy23013 Ich kann nicht zählen, wie oft ich base64 | tr -d \\nin mein Terminal getippt habe ... Danke!
Dennis
tio.run/##S0oszvj/… Leider hat es ein +, das ich nicht entfernen kann.
Jimmy23013
@ jimmy23013 Hat es geschafft, es loszuwerden, aber es kostet drei Bytes. Es ist ärgerlich, dass tio.run/##S0oszvj/… das + beseitigt , aber an anderer Stelle ein anderes einführt.
Dennis
3
@SteveBennett Ich glaube ich hatte einen guten Grund. Ich erinnere mich aber nicht ganz daran.
Dennis
12

Pyth , URL-Länge = 134 Byte

https://tio.run/##K6gsyfj/X68syy/ZS6lYmyujpKSg2EpfvyQzX6@oNE9fWZnLwae4OLrI3dA9NITLQZ9LM8vZxqSkRC@qOJqrAKiby9vZyNTUmwtiBpefl7e3ppnJ//8A

Code:

.vjNcJ"s+
https://tio.run/##
@Lss[rG1GUT
@/
)jC<4tt.Zs[
pyth
KC255K
.vjNcJ
NJKK)64

Probieren Sie es online!

Verwendet Pyths Zlib builtin ( .Z) und eine Inline-Implementierung von base64.

Wie es funktioniert

Die äußere Bühne:

.vjNcJ"…
      "…    take this 75-byte string
     J      assign it to J
    c       split on whitespace
  jN        join on N = '"'
.v          evaluate as Pyth code

Die innere Stufe, erhalten durch Ersetzen von Leerzeichen in der Zeichenfolge Jdurch doppelte Anführungszeichen:

s+"https://tio.run/##"@Lss[rG1GUT"@/")jC<4tt.Zs["pyth"KC255K".vjNcJ"NJKK)64
                                               [                             begin a list:
                                                "pyth"                         string,
                                                       C255                    character 255
                                                      K                        assign that to K,
                                                           K                   K again,
                                                            ".vjNcJ"           string,
                                                                    N          '"',
                                                                     J         J (the 75-byte string),
                                                                      K        K again,
                                                                       K       K again
                                                                        )    end list
                                              s  concatenate
                                            .Z   compress with zlib
                                           t     remove first character
                                          t      remove first character
                                        <4       remove last 4 characters
                                       C         convert from base 256
                                      j                                  64
                                                 convert to base 64 digits
                      @L                         map d ↦ the following indexed at d:
                          [                        begin a list:
                            G                        alphabet ("abcdefghijklmnopqrstuvwxyz")
                           r 1                       uppercase,
                              G                      alphabet again,
                               UT                    unary range of length T = 10: [0, …, 9],
                                 "@/"                string,
                                     )             end list
                         s                         concatenate
                        s                          concatenate (we now have the base64 alphabet)
 +"https://tio.run/##"                           prepend string
s                                                concatenate

(Es ist schade, dass das Eingabefeld nicht zulässig ist, sonst hätte ich eine 118-Byte-Lösung .)

Anders Kaseorg
quelle
1
Haben Sie gerade Dennis bei einer Herausforderung übertroffen, die sich um TIO‽
Engineer Toast entwickelt hat
4

PowerShell, 274 Byte

https://tio.run/##TY/rCsIwDIVfZaiYFV2HooIbgu8xBrYzboXSljYq3p59VkHZjxAOJydf4uwVfehQ676fphO5e1TK8pPSWBfF1StCobW8EYYUJMyrphO@qmtw/xzMluv1t37maJoePpsm8sVGP5eV7V25JDslsozmgOJRHAcQ3t6BldARuVDkOcVBfzb5eAwRYM0FPcUQWSkCblaBvDJtPLxaLDmPnTf2bCjbsppxj06LBlPYwRxgoGdR74E9vw9mnQ2UZObF@v4N

Es ist alles dank des folgenden Snippets:

&($b={[io.file]::writeallbytes('b',[char[]]'powershell'+255+255+[char[]]"&(`$b={$b})"+255+255);gzip -f b;$b=[io.file]::readallbytes('b.gz');'https://tio.run/##'+[convert]::tobase64string($b[12..($b.count-9)]).replace('=','').replace('+','@')|write-host -n})

Probieren Sie es online!

Andrei Odegov
quelle
Heiliger Christus, kannst du erklären, wie du zu dieser Antwort gekommen bist? Wenn ich es überhaupt in Java oder so versucht hätte, wäre es ein Versuch und Irrtum.
Magic Octopus Urn