Desafio TryItOnquine

48

(com base neste post e na discussão subsequente sobre bate-papo - também, muito obrigado a Dennis pelo TIO!)

O desafio

Escolha um idioma atualmente disponível no site TryItOnline , por exemplo, PowerShell . Escreva o código nesse idioma nessa página, que não receba nenhuma entrada, de modo que, quando o botão Executar for clicado, a saída nessa página seja exatamente igual à do campo "URL simples" quando o botão Salvar / armazenar botão é clicado.

Para um exemplo fictício, suponha que esse aaaseja o código para uma solução para isso no PowerShell. Em seguida, o resultado de clicar em Executar com aaacomo código https://tio.run/#powershelldeve ser exibido https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AA, que também é o campo "URL simples" quando o botão Salvar / Armazenar é clicado.

Pontuação

O URL resultante é a sua submissão a este desafio. O vencedor é o URL mais curto medido em bytes. Para o exemplo acima, a URL https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AAé o envio para o desafio, em 44 bytes . O URL mais curto que cumpre o restante deste desafio vence o desafio e ganha pontos brownie (pontos não resgatáveis). Dado que existe um comprimento mínimo possível distinto, se dois envios tiverem o mesmo comprimento, o envio anterior vence.

Geração de URL

Este é o início do algoritmo de geração de URL no repositório. Você pode ver como a área principal do código é ocupada, quaisquer elementos extras são acrescentados, a string é desinflada e Base64 convertida e, em seguida ##, anexada , etc. Não vou entrar em detalhes aqui; parte do desafio é analisar e entender como os URLs são gerados, a fim de explorar quaisquer peculiaridades em potencial no referido algoritmo.

Regras / Esclarecimentos

  • O código real não deve receber entrada e produzir apenas o URL quine como saída.
    - Isso significa que os únicos campos de texto que deve ser preenchido Ao clicar na URL são os Code, Header, Footerou correspondentes campos "Bandeira Compiler"; os campos Inpute Argumentssão proibidos e devem permanecer vazios / sem uso. Clicar no botão Executar deve alterar apenas o Outputcampo. Para esse desafio, o Debugcampo é ignorado em todas as situações.
  • Regras usuais de quine se aplicam ao código na medida do possível (por exemplo, o código não pode ler seu próprio código-fonte via .code.tio).
  • Inclua uma descrição de como o código funciona no seu envio.
  • Enviar um quine "barato" enviando uma solicitação pull do Git ao repositório TIO para criar um URL ou "atalho" de truque "ou algo semelhante não é permitido.
  • Da mesma forma, não é permitido enviar uma solicitação pull para atualizar um idioma específico para produzir um URL de "truque".
  • Por favor, seja gentil com os servidores de Dennis e não os abuse ou tente explorar por causa desse desafio.
AdmBorkBork
fonte
14
Lembre-se, a última regra é importante! Já existem vários ataques DDoS em andamento.
Erik the Outgolfer
O que é um "PR"?
Adám 19/07
11
Exemplo fictício: se a minha submissão é https://tio.run/##a+aque liga para um programa que saídas https://tio.run/##a+a, é válida mesmo duro o link gerado pela saveStateteria sidohttps://tio.run/##a@a
TwiNight
11
@TwiNight Boa pergunta. Essa seria uma situação interessante, mas não se encaixaria nas regras aqui e, portanto, não seria um envio válido.
21817 AdmBorkBork
11
Você estava esperando até o TIOv2 postar isso?
mbomb007

Respostas:

15

Python 2 , comprimento da URL = 170 bytes

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

Experimente online!

Isso se baseia em três coincidências:

  1. O nível padrão do zlib 6 dá os mesmos resultados que o nível 9 do zlib para essa string, modulo o cabeçalho que eu retiro.
  2. O comprimento compactado é divisível por 3, portanto, base64 não gera nenhum =caractere de preenchimento.
  3. A saída base64 não contém nenhum +caractere.
Anders Kaseorg
fonte
15

Bash , 174 166 165 157 bytes

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

Isso codifica o seguinte programa Bash.

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

Experimente online!

Obrigado a @ jimmy23013 por jogar 8 bytes de fora da minha abordagem original, por uma abordagem que salvou outro byte e por jogar mais 8 bytes dessa abordagem!

Dennis
fonte
11
@ jimmy23013 Não consigo contar o número de vezes que digitei base64 | tr -d \\nno meu terminal ... Obrigado!
Dennis
tio.run/##S0oszvj/… Infelizmente, tem um + que não sei como remover.
jimmy23013
@ jimmy23013 Conseguiu se livrar dele, mas custou três bytes. Irritantemente, tio.run/##S0oszvj/… se livra disso +, mas introduz outro em outro lugar.
Dennis
3
@SteveBennett Acho que tive um bom motivo. Não me lembro bem disso.
Dennis
12

Pitão , comprimento do URL = 134 bytes

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

Código:

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

Experimente online!

Usa o zlib builtin ( .Z) do Pyth e uma implementação embutida de base64.

Como funciona

O estágio externo:

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

O estágio interno, obtido substituindo o espaço em branco na cadeia de caracteres Jpor aspas duplas:

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

(Pena que o campo "Entrada" não seja permitido, ou eu teria uma solução de 118 bytes .)

Anders Kaseorg
fonte
11
Será que ... Você acabou de outgolf Dennis em um desafio construído em torno TIO‽
Engenheiro Toast
4

PowerShell, 274 bytes

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

Tudo graças ao seguinte snippet:

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

Experimente online!

Andrei Odegov
fonte
Santo Cristo, você pode explicar como chegou a essa resposta? Se eu tentasse em Java ou algo assim, seria pura tentativa e erro.
Magic Octopus Urn
4

JavaScript (Node.js) , 214 bytes

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

Experimente online!

user202729
fonte