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.

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.

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!



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


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!


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.