TryItOnquine Challenge


48

(basato su questo post e sulla conseguente discussione in chat - grazie anche a Dennis per TIO!)

La sfida

Scegli una lingua attualmente disponibile sul sito TryItOnline , ad esempio PowerShell . Scrivi il codice in quella lingua su quella pagina, che non accetta alcun input, in modo tale che quando si fa clic sul pulsante Esegui , l'output su quella pagina è esattamente lo stesso di quello che si trova nel campo "URL normale" quando il Salva / Store si fa invece clic sul pulsante.

Per un esempio fittizio, supponiamo che aaafosse il codice per una soluzione a questo in PowerShell. Quindi, il risultato del clic su Esegui con aaacome codice attivo https://tio.run/#powershelldovrebbe essere visualizzato https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AA, che è anche il campo "URL normale" quando si fa clic sul pulsante Salva / Store .

punteggio

L' URL risultante è l'invio di questa sfida. Il vincitore è l'URL più breve misurato in byte. Per l'esempio sopra, l'URL https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AAè l'invio alla sfida, a 44 byte . L'URL più breve che soddisfa il resto di questa sfida vince la sfida e guadagna punti brownie (punti non riscattabili). Dato che esiste una lunghezza minima possibile distinta, se due invii si legano in lunghezza, vince l'invio precedente.

Generazione URL

Questo è l'inizio dell'algoritmo di generazione degli URL nel repository. Puoi vedere come viene presa l'area di codice principale, vengono aggiunti eventuali elementi extra, la stringa viene sgonfiata e convertita Base64, quindi ##anteposta, ecc. Non entrerò nei dettagli qui; parte della sfida è analizzare e comprendere come vengono generati gli URL al fine di sfruttare eventuali potenziali stranezze in detto algoritmo.

Regole / Chiarimenti

  • Il codice effettivo non dovrebbe ricevere input e produrre solo l'URL quine come output.
    - questo significa gli unici campi di testo che deve essere compilato quando si fa clic nell'URL sono i Code, Header, Footero corrispondenti campi "Compiler Flag"; i campi Inpute Argumentssono vietati e devono rimanere vuoti / inutilizzati. Fare clic sul pulsante Esegui dovrebbe solo modificare il Outputcampo. Per questa sfida, il Debugcampo viene ignorato in tutte le situazioni.
  • Le regole quine usuali si applicano al codice nella misura del possibile (ad esempio, il codice non può leggere il proprio codice sorgente tramite .code.tio).
  • Includi una descrizione di come funziona il codice nel tuo invio.
  • L'invio di un quine "poco costoso" inviando una richiesta pull Git al repository TIO per creare un URL "scorciatoia" o un collegamento o simili non è consentito.
  • Allo stesso modo, non è consentito inviare una richiesta pull per aggiornare una determinata lingua per produrre un URL "trucco".
  • Sii gentile con i server di Dennis e non abusarne o tentare exploit per il bene di questa sfida.

14
Ricorda, l'ultima regola è importante! Ci sono già un sacco di attacchi DDoS in corso.
Erik the Outgolfer,

Che cos'è un "PR"?
Adám,

1
Esempio fittizio: se la mia presentazione è https://tio.run/##a+ache si collega a un programma che genera https://tio.run/##a+a, è valido anche se il collegamento generato da saveStatesarebbe statohttps://tio.run/##a@a
TwiNight,

1
@TwiNight Buona domanda. Sarebbe una situazione interessante, ma non si adatterebbe alle regole qui e quindi non sarebbe una proposta valida.
AdmBorkBork,

1
Stavi aspettando fino a TIOv2 di pubblicare questo?
mbomb007,

Risposte:


15

Python 2 , lunghezza URL = 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])

Provalo online!

Ciò si basa su tre coincidenze:

  1. Il livello 6 di zlib predefinito sembra dare gli stessi risultati del livello 9 di zlib per questa stringa, modulo l'intestazione che spoglio.
  2. La lunghezza compressa è divisibile per 3, quindi base64 non genera alcun =carattere di riempimento.
  3. L'output di base64 non contiene alcun +carattere.

15

Bash , 174 166 165 157 byte

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

Questo codifica il seguente programma Bash.

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

Provalo online!

Grazie a @ jimmy23013 per aver giocato a golf a 8 byte dal mio approccio originale, per un approccio che ha salvato un altro byte e per aver giocato a golf con altri 8 byte a quell'approccio!



1
@ jimmy23013 Non riesco a contare il numero di volte che ho digitato base64 | tr -d \\nsul mio terminale ... Grazie!
Dennis,

tio.run/##S0oszvj/… Purtroppo ha un + che non so come rimuovere.
jimmy23013,

@ jimmy23013 Gestito per sbarazzarsene, ma costa tre byte. Con fastidio, tio.run/##S0oszvj/… si libera di questo + ma ne introduce un altro altrove.
Dennis,

3
@SteveBennett Penso di avere una buona ragione. Non me lo ricordo bene però.
Dennis,

12

Pyth , lunghezza URL = 134 byte

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

Codice:

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

Provalo online!

Utilizza zlib builtin ( .Z) di Pyth e un'implementazione inline di base64.

Come funziona

Lo stadio esterno:

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

Lo stage interno, ottenuto sostituendo gli spazi bianchi nella stringa Jcon virgolette doppie:

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

(Peccato che il campo "Input" non sia consentito, o avrei una soluzione a 118 byte .)


1
Hai ... Hai appena superato Dennis in una sfida costruita intorno a TIO‽
ingegnere Toast il

4

PowerShell, 274 byte

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

Tutto grazie al seguente frammento:

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

Provalo online!


Cristo santo, puoi spiegare come hai ottenuto questa risposta? Se anche provassi in Java o qualcosa del genere sarebbe pura prova ed errore.
Magic Octopus Urn

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.