Wyzwanie TryItOnquine

48

(na podstawie tego postu i dyskusji na czacie - wielkie dzięki dla Dennisa dla TIO!)

Wyzwanie

Wybierz język, który jest obecnie dostępny w witrynie TryItOnline , na przykład PowerShell . Napisz kod w tym języku na tej stronie, który nie wymaga żadnych danych wejściowych, tak że po kliknięciu przycisku Uruchom dane wyjściowe na tej stronie są dokładnie takie same, jak w polu „Zwykły adres URL”, gdy Zapisz / Zapisz zamiast tego jest kliknięty przycisk.

Dla fikcyjnego przykładu załóżmy, że aaabył to kod rozwiązania tego problemu w PowerShell. Następnie wynik kliknięcia Uruchom z, aaajako że kod https://tio.run/#powershellpowinien zostać wyświetlony https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AA, który jest również polem „Zwykły adres URL” po kliknięciu przycisku Zapisz / Zapisz .

Punktacja

Powstały URL to poddanie się tego wyzwania. Zwycięzcą jest najkrótszy adres URL mierzony w bajtach. W powyższym przykładzie adres URL https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AAoznacza poddanie się wyzwaniu ( 44 bajty) . Najkrótszy adres URL, który spełnia resztę tego wyzwania, wygrywa wyzwanie i zdobywa punkty brownie (punktów nie można wymienić). Biorąc pod uwagę, że istnieje wyraźna minimalna możliwa długość, jeśli dwa zgłoszenia wiążą się ze sobą, wcześniejsze zgłoszenie wygrywa.

Generowanie adresów URL

To początek algorytmu generowania adresu URL w repozytorium. Możesz zobaczyć, jak jest brany główny obszar kodu, dołączane są wszelkie dodatkowe elementy, łańcuch jest deflowany i konwertowany do Base64, a następnie ##dodawany itd. Nie będę tutaj wchodził w szczegóły. część wyzwania polega na analizie i zrozumieniu, w jaki sposób generowane są adresy URL w celu wykorzystania potencjalnych dziwactw w tym algorytmie.

Zasady / wyjaśnienia

  • Rzeczywisty kod nie powinien pobierać żadnych danych wejściowych i generować tylko wyjściowy adres URL quine-URL.
    - Oznacza to, że tylko pola tekstowe, które powinny być zaludnione po kliknięciu na URL są Code, Header, Footerlub odpowiadające im pola „Compiler flaga”; te Inputi Argumentspola są zabronione i musi pozostać pusty / nieużywane. Kliknięcie przycisku Uruchom powinno tylko zmienić Outputpole. W przypadku tego wyzwania Debugpole jest ignorowane we wszystkich sytuacjach.
  • Zwykłe reguły quine mają zastosowanie do kodu w możliwym zakresie (na przykład kod nie może odczytać własnego kodu źródłowego za pośrednictwem .code.tio).
  • W zgłoszeniu podaj opis działania kodu.
  • Przesyłanie „oszukiwanej” quiny poprzez przesłanie żądania ściągnięcia Git do repozytorium TIO w celu utworzenia „trickowego” adresu URL lub skrótu itp. Jest niedozwolone.
  • Podobnie, wysyłanie żądania ściągnięcia w celu aktualizacji określonego języka w celu utworzenia „sztuczkowego” adresu URL jest niedozwolone.
  • Bądź miły dla serwerów Dennisa i nie nadużywaj ich, ani nie próbuj wykorzystywać exploitów na potrzeby tego wyzwania.
AdmBorkBork
źródło
14
Pamiętaj, ostatnia zasada jest ważna! Trwa już wiele ataków DDoS.
Erik the Outgolfer,
Co to jest „PR”?
Adám,
1
Fikcyjny przykład: jeśli moje zgłoszenie dotyczy https://tio.run/##a+alinków do programu, który generuje dane wyjściowe https://tio.run/##a+a, czy jest poprawne, nawet jeśli wygenerowane łącze saveStatebyłobyhttps://tio.run/##a@a
TwiNight
1
@TwiNight Dobre pytanie. To byłaby interesująca sytuacja, ale nie pasowałaby do obowiązujących tutaj zasad, a zatem nie byłaby prawidłowym wnioskiem.
AdmBorkBork,
1
Czy czekałeś, aż TIOv2 to opublikuje?
mbomb007

Odpowiedzi:

15

Python 2 , długość adresu URL = 170 bajtów

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

Wypróbuj online!

Zależy to od trzech zbiegów okoliczności:

  1. Domyślny poziom 6 Zlib daje takie same wyniki jak poziom 9 Zlib dla tego ciągu, modulując nagłówek, który usuwam.
  2. Skompresowana długość jest podzielna przez 3, więc base64 nie generuje żadnych =znaków dopełniających.
  3. Dane wyjściowe base64 nie zawierają żadnych +znaków.
Anders Kaseorg
źródło
15

Bash , 174 166 165 157 bajtów

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

To koduje następujący program Bash.

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

Wypróbuj online!

Dzięki @ jimmy23013 za grę w golfa o 8 bajtów poza moim oryginalnym podejściem, za podejście, które pozwoliło zaoszczędzić kolejny bajt, i za grę w golfa o kolejne 8 bajtów poza tym podejściem!

Dennis
źródło
1
@ jimmy23013 Nie mogę policzyć, ile razy wpisałem base64 | tr -d \\nna terminalu ... Dzięki!
Dennis
tio.run/##S0oszvj/… Niestety ma znak +, którego nie wiem jak usunąć.
jimmy23013
@ jimmy23013 Udało się go pozbyć, ale kosztuje trzy bajty. Irytujące jest to, że tio.run/##S0oszvj/… pozbywa się tego +, ale wprowadza inny w innym miejscu.
Dennis
3
@ SteveBennett Myślę, że miałem dobry powód. Jednak nie do końca pamiętam.
Dennis
12

Pyth , długość adresu URL = 134 bajty

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

Kod:

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

Wypróbuj online!

Wykorzystuje wbudowaną funkcję Pytli zlib ( .Z) i wbudowaną implementację base64.

Jak to działa

Etap zewnętrzny:

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

Wewnętrzny etap, uzyskany przez zastąpienie białych znaków w ciągu Jpodwójnymi cudzysłowami:

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

(Szkoda, że ​​pole „Input” jest niedozwolone lub miałbym rozwiązanie 118-bajtowe ).

Anders Kaseorg
źródło
1
Czy ... Czy właśnie pokonałeś Dennisa podczas wyzwania zbudowanego wokół TIO‽
Toast Engineer
4

PowerShell, 274 bajty

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

Wszystko dzięki poniższemu fragmentowi:

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

Wypróbuj online!

Andrei Odegov
źródło
Chryste, czy możesz wyjaśnić, jak dostałeś się do tej odpowiedzi? Gdybym nawet spróbował w Javie lub coś w tym stylu, byłoby to czystą próbą i błędem.
Magic Octopus Urn
4

JavaScript (Node.js) , 214 bajtów

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

Wypróbuj online!

użytkownik202729
źródło