TryItOnquine Challenge

48

(basé sur ce post et la discussion qui a suivi sur le chat - également, merci beaucoup à Dennis pour TIO!)

Le défi

Choisissez une langue actuellement disponible sur le site TryItOnline , par exemple PowerShell . Écrivez du code dans cette langue sur cette page, sans aucune saisie. Par exemple, lorsque vous cliquez sur le bouton Exécuter , la sortie de cette page est exactement la même que celle du champ "URL simple" lorsque vous cliquez sur Enregistrer / Enregistrer. le bouton est cliqué à la place.

Pour un exemple fictif, supposons qu'il s'agisse aaadu code d'une solution à cela dans PowerShell. Ensuite, le résultat de cliquer sur Exécuter avec aaacomme code sur https://tio.run/#powershelldoit sortir https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AA, qui est également le champ "URL simple" lorsque le bouton Enregistrer / Enregistrer est cliqué.

Notation

L' URL résultante est votre soumission à ce défi. Le gagnant est l'URL la plus courte mesurée en octets. Pour l'exemple ci-dessus, l'URL https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AAest la soumission au défi, à 44 octets . L'URL la plus courte qui remplit le reste de ce défi remporte le défi et gagne des points brownie (points non échangeables). Étant donné qu'il existe une longueur minimale possible distincte, si deux soumissions sont égales, la soumission la plus ancienne l'emporte.

Génération d'URL

C’est le début de l’algorithme de génération d’URL dans le référentiel. Vous pouvez voir comment la zone de code principale est prise, tous les éléments supplémentaires sont ajoutés, la chaîne est dégonflée et convertie en Base64, puis ##ajoutée au début, etc. Je n'entrerai pas dans les détails ici; Une partie du défi consiste à analyser et à comprendre comment les URL sont générées afin d'exploiter les bizarreries potentielles dans ledit algorithme.

Règles / Clarifications

  • Le code réel ne doit prendre aucune entrée et produire uniquement l'URL quine en sortie.
    - Cela signifie que les seuls champs de texte qui doit être rempli lorsque vous cliquez dans l'URL sont Code, Header, Footerou champs correspondants « Drapeau du compilateur »; les champs Inputet Argumentssont interdits et doivent rester vides / non utilisés. Cliquer sur le bouton Exécuter ne devrait changer que le Outputchamp. Pour ce défi, le Debugchamp est ignoré dans toutes les situations.
  • Les règles quine habituelles s'appliquent au code dans la mesure du possible (par exemple, le code ne peut pas lire son propre code source via .code.tio).
  • Veuillez inclure une description du fonctionnement du code dans votre soumission.
  • Il est interdit de soumettre une requête "cheaty" en soumettant une requête Git Pull au référentiel TIO afin de créer une URL "astuce", un raccourci ou autre.
  • De même, l'envoi d'une demande d'extraction pour mettre à jour une langue particulière afin de générer une URL "astuce" n'est pas autorisé.
  • S'il vous plaît, soyez gentil avec les serveurs de Dennis et ne les abusez pas et ne tentez pas d'exploiter au nom de ce défi.
AdmBorkBork
la source
14
Rappelez-vous, la dernière règle est importante! Il y a déjà une série d'attaques DDoS en cours.
Erik the Outgolfer le
Qu'est-ce qu'un "PR"?
Adám
1
Exemple fictif: si ma soumission https://tio.run/##a+acorrespond à un programme qui https://tio.run/##a+agénère des résultats , est-il valable même si le lien généré par saveStateaurait étéhttps://tio.run/##a@a
TwiNight le
1
@ TwiNight Bonne question. Ce serait une situation intéressante, mais ne cadrerait pas avec les règles et ne constituerait donc pas un argument valable.
AdmBorkBork
1
Attendiez-vous que TIOv2 publie cela?
mbomb007

Réponses:

15

Python 2 , longueur de l'URL = 170 octets

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])

Essayez-le en ligne!

Cela repose sur trois coïncidences:

  1. Le niveau de zlib 6 par défaut donne les mêmes résultats que le niveau de zlib 9 pour cette chaîne, modulo l’en-tête que je déshabille.
  2. La longueur compressée est divisible par 3, donc base64 ne génère aucun =caractère de remplissage.
  3. La sortie base64 ne contient aucun +caractère.
Anders Kaseorg
la source
15

Bash , 174 166 165 157 octets

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

Ceci code le programme Bash suivant.

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

Essayez-le en ligne!

Merci à @ jimmy23013 pour avoir joué 8 octets sur mon approche originale, pour une approche qui a économisé un octet supplémentaire, et pour jouer au golf pour 8 autres octets sur cette approche!

Dennis
la source
1
@ jimmy23013 Je ne peux pas compter le nombre de fois où j'ai tapé base64 | tr -d \\ndans mon terminal ... Merci!
Dennis
tio.run/##S0oszvj/… Malheureusement, il a un + que je ne sais pas comment supprimer.
jimmy23013
@ jimmy23013 Nous avons réussi à nous en débarrasser, mais cela coûtait trois octets. Chose gênante , tio.run/##S0oszvj/… se débarrasse de ce + mais en introduit un autre ailleurs.
Dennis
3
@SteveBennett Je pense avoir une bonne raison. Je ne m'en souviens pas très bien.
Dennis
12

Pyth , longueur de l'URL = 134 octets

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

Essayez-le en ligne!

Utilise la bibliothèque intégrée zlib de Pyth ( .Z) et une implémentation en ligne de base64.

Comment ça fonctionne

La scène extérieure:

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

L'étape interne, obtenue en remplaçant les espaces dans la chaîne Jpar des guillemets:

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

(C'est dommage que le champ "Entrée" ne soit pas autorisé ou j'aurais une solution de 118 octets .)

Anders Kaseorg
la source
1
Avez-vous ... Vous venez de surclasser Dennis sur un défi construit autour de TIO‽
Engineer Toast
4

PowerShell, 274 octets

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

Tout cela grâce à l'extrait suivant:

&($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})

Essayez-le en ligne!

Andrei Odegov
la source
Saint-Christ, pouvez-vous expliquer comment vous en êtes arrivé à cette réponse? Si j’essayais même en Java ou quelque chose d’autre, ce serait purement essai et erreur.
Urne magique Octopus
4

JavaScript (Node.js) , 214 octets

v=()=>console.log('https://tio.run/##'+require(`zlib`).deflateRawSync(Buffer.from(`javascript-node\xff\xffv=`+v+`;v()\xff\xff`,`ascii`)).toString("base64"));v()

Essayez-le en ligne!

utilisateur202729
la source