TryItOnquine Challenge

48

(basado en esta publicación y la discusión subsiguiente en el chat, también, ¡muchas gracias a Dennis por TIO!)

El reto

Elija un idioma que esté disponible actualmente en el sitio TryItOnline , por ejemplo, PowerShell . Escriba el código en ese idioma en esa página, que no tome ninguna entrada, de modo que cuando se hace clic en el botón Ejecutar , la salida en esa página es exactamente la misma que la del campo "URL simple" cuando se guarda / almacena se hace clic en el botón en su lugar.

Para un ejemplo ficticio, suponga que ese aaaes el código para una solución a esto en PowerShell. Luego, el resultado de hacer clic en Ejecutar con aaael código https://tio.run/#powershelldebe aparecer https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AA, que también es el campo "URL simple" cuando se hace clic en el botón Guardar / Guardar .

Puntuación

La URL resultante es su envío a este desafío. El ganador es la URL más corta medida en bytes. Para el ejemplo anterior, la URL https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AAes el envío al desafío, a 44 bytes . La URL más corta que cumple el resto de este desafío gana el desafío y gana puntos de brownie (puntos no canjeables). Dado que hay una duración mínima mínima distinta, si dos presentaciones tienen una longitud similar, la presentación anterior gana.

Generación de URL

Este es el comienzo del algoritmo de generación de URL en el repositorio. Puede ver cómo se toma el área del código principal, se añaden los elementos adicionales, se deshincha la cadena y se convierte Base64, y luego se ##anexa, etc. No entraré en detalles aquí; Parte del desafío es analizar y comprender cómo se generan las URL para explotar las posibles peculiaridades de dicho algoritmo.

Reglas / Aclaraciones

  • El código real no debe recibir entrada y producir solo la URL de quine como salida.
    - Esto significa que los únicos campos de texto que debe rellenarse cuando se hace clic en la URL son los Code, Header, Footero los correspondientes campos "Bandera de Compilador"; los campos Inputy Argumentsestán prohibidos y deben permanecer vacíos / sin usar. Hacer clic en el botón Ejecutar solo debería cambiar el Outputcampo. Para este desafío, el Debugcampo se ignora en todas las situaciones.
  • Las reglas habituales de quine se aplican al código en la medida de lo posible (por ejemplo, el código no puede leer su propio código fuente a través de .code.tio).
  • Incluya una descripción de cómo funciona el código en su envío.
  • Enviar una cita "engañosa" enviando una solicitud de extracción de Git al repositorio de TIO para crear una URL o un acceso directo "truco" o algo similar no está permitido.
  • Del mismo modo, no está permitido enviar una solicitud de extracción para actualizar un idioma en particular para producir una URL de "truco".
  • Sea amable con los servidores de Dennis y no los maltrate ni intente explotar en aras de este desafío.
AdmBorkBork
fuente
14
Recuerde, la última regla es importante! Ya hay un montón de ataques DDoS en curso.
Erik the Outgolfer
¿Qué es un "PR"?
Adám
1
Ejemplo ficticio: si mi presentación es https://tio.run/##a+aque une a un programa que salidas https://tio.run/##a+a, ¿es válido incluso aguantar el enlace generado por saveStatehabría sidohttps://tio.run/##a@a
TwiNight
1
@TwiNight Buena pregunta. Esa sería una situación interesante, pero no encajaría en las reglas aquí y, por lo tanto, no sería una presentación válida.
AdmBorkBork
1
¿Estabas esperando hasta TIOv2 para publicar esto?
mbomb007

Respuestas:

15

Python 2 , longitud de 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])

Pruébalo en línea!

Esto se basa en tres coincidencias:

  1. El nivel 6 de zlib predeterminado da los mismos resultados que el nivel 9 de zlib para esta cadena, módulo el encabezado que elimino.
  2. La longitud comprimida es divisible por 3, por lo que base64 no genera ningún =carácter de relleno.
  3. La salida base64 no contiene ningún +carácter.
Anders Kaseorg
fuente
15

Bash , 174 166 165 157 bytes

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

Esto codifica el siguiente programa Bash.

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

Pruébalo en línea!

¡Gracias a @ jimmy23013 por jugar 8 bytes fuera de mi enfoque original, por un enfoque que salvó otro byte y por jugar otros 8 bytes fuera de ese enfoque!

Dennis
fuente
1
@ jimmy23013 No puedo contar la cantidad de veces que escribí base64 | tr -d \\nen mi terminal ... ¡Gracias!
Dennis
tio.run/##S0oszvj/… Lamentablemente tiene un + que no sé cómo eliminar.
jimmy23013
@ jimmy23013 Se las arregló para deshacerse de él, pero costó tres bytes. Molesto, tio.run/##S0oszvj/… se deshace de eso + pero introduce otro en otro lugar.
Dennis
3
@ SteveBennett Creo que tenía una buena razón. Aunque no lo recuerdo del todo.
Dennis
12

Pyth , longitud de 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

Pruébalo en línea!

Utiliza zlib builtin ( .Z) de Pyth y una implementación en línea de base64.

Cómo funciona

La etapa exterior:

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

La etapa interna, obtenida reemplazando espacios en blanco en la cadena Jcon comillas dobles:

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

(Es una lástima que el campo "Entrada" no esté permitido, o tendría una solución de 118 bytes ).

Anders Kaseorg
fuente
1
Did ... Acabas de superar a Dennis en un desafío construido alrededor de TIO‽
Engineer Toast
4

PowerShell, 274 bytes

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

Todo es gracias al siguiente fragmento:

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

Pruébalo en línea!

Andrei Odegov
fuente
Santo Cristo, ¿puedes explicar cómo llegaste a esta respuesta? Si incluso lo intentara en Java o algo así, sería pura prueba y error.
Urna de pulpo mágico
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()

Pruébalo en línea!

usuario202729
fuente