TryItOnquine Challenge

48

(на основе этого поста и последовавшего обсуждения в чате - также большое спасибо Деннису за TIO!)

Соревнование

Выберите язык, который в настоящее время доступен на сайте TryItOnline , например PowerShell . На этой странице пишите код на этом языке, который не требует ввода, например, когда нажата кнопка « Выполнить» , вывод на этой странице точно такой же, как в поле «Простой URL» при сохранении / сохранении. кнопка нажата вместо.

Для вымышленного примера предположим, что это aaaбыл код для решения этой проблемы в PowerShell. Затем должен появиться результат нажатия кнопки « Выполнить с aaaвключенным кодом» , который также является полем «Простой URL» при нажатии кнопки « Сохранить / Сохранить» .https://tio.run/#powershellhttps://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AA

счет

В результате URL является ваша заявка на этот вызов. Победителем является самый короткий URL, измеренный в байтах. В приведенном выше примере URL-адрес https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AAпредставляет собой запрос на 44 байта . Самый короткий URL, который выполняет оставшуюся часть этого задания, побеждает в конкурсе и зарабатывает очки брауни (очки не подлежат обмену). Учитывая, что существует минимально возможная длина, если длина двух представлений одинакова, выигрывает более ранняя отправка.

Генерация URL

Это начало алгоритма генерации URL в хранилище. Вы можете увидеть, как берется основная область кода, какие-либо дополнительные элементы добавляются, строка сдавливается и преобразуется в Base64, а затем ##добавляется и т. Д. Я не буду вдаваться в подробности; Часть задачи состоит в том, чтобы проанализировать и понять, как генерируются URL-адреса, чтобы использовать любые потенциальные особенности в указанном алгоритме.

Правила / Разъяснения

  • Фактический код не должен вводить и выдавать только quine-URL в качестве вывода.
    - Это означает , что только текстовые поля , которые должны быть заселены при нажатии на URL являются Code, Header, Footerили соответствующим «Compiler флаг» поля; что Inputи Argumentsполя запрещены и должны оставаться пустыми / неиспользованными. Нажатие кнопки « Выполнить» должно только изменить Outputполе. Для этой задачи Debugполе игнорируется во всех ситуациях.
  • Обычные правила quine применяются к коду в максимально возможной степени (например, код не может читать свой собственный исходный код через .code.tio).
  • Пожалуйста, включите описание того, как код работает в вашем представлении.
  • Отправка «обманчивого» квина, отправка запроса Git pull в репозиторий TIO для создания «хитрого» URL-адреса или ярлыка или чего-либо подобного не допускается.
  • Аналогичным образом, отправка запроса извлечения для обновления определенного языка для создания «хитрого» URL не допускается.
  • Пожалуйста, будьте добры к серверам Денниса и не злоупотребляйте ими и не пытайтесь использовать эксплойты ради этого вызова.
AdmBorkBork
источник
14
Помните, последнее правило важно! Уже есть куча DDoS-атак.
Эрик Outgolfer
Что такое "пиар"?
Адам
1
Вымышленный пример: если мое представление о том, https://tio.run/##a+aкакие ссылки ссылаются на программу, которая выводит информацию https://tio.run/##a+a, действительно ли это действительно, даже если saveStateбы сгенерированная ссылка была быhttps://tio.run/##a@a
TwiNight
1
@TwiNight Хороший вопрос. Это была бы интересная ситуация, но она не вписывалась бы в правила здесь и поэтому не была бы действительным представлением.
AdmBorkBork
1
Вы ждали до TIOv2, чтобы опубликовать это?
mbomb007

Ответы:

15

Python 2 , длина URL = 170 байт

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

Попробуйте онлайн!

Это зависит от трех совпадений:

  1. Уровень zlib по умолчанию 6 дает те же результаты, что и уровень zlib 9 для этой строки, по модулю заголовка, который я вырезал.
  2. Сжатая длина делится на 3, поэтому base64 не генерирует никаких дополнительных =символов.
  3. Вывод base64 не содержит никаких +символов.
Андерс Касеорг
источник
15

Баш , 174 166 165 157 байт

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

Это кодирует следующую программу Bash.

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

Попробуйте онлайн!

Спасибо @ jimmy23013 за игру в гольф на 8 байтов от моего первоначального подхода, за подход, который спас еще один байт, и за игру в гольф еще 8 байтов от этого подхода!

Деннис
источник
1
@ jimmy23013 Я не могу сосчитать, сколько раз я набрал base64 | tr -d \\nв своем терминале ... Спасибо!
Деннис
tio.run/##S0oszvj/… К сожалению, у него есть знак +, который я не знаю, как удалить.
jimmy23013
@ jimmy23013 Удалось избавиться от него, но это стоило три байта. Досадно , что tio.run/##S0oszvj/… избавляется от этого +, но вводит другое в другом месте.
Деннис
3
@ SteveBennett Я думаю, у меня была веская причина. Я не совсем помню это все же.
Деннис
12

Pyth , длина URL = 134 байта

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

Код:

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

Попробуйте онлайн!

Использует встроенную в Pyth .Zфункцию zlib ( ) и встроенную реализацию base64.

Как это устроено

Внешняя стадия:

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

Внутренний этап, получаемый путем замены пробела в строке Jдвойными кавычками:

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

(Жаль, что поле «Ввод» не разрешено , иначе у меня будет 118-байтовое решение .)

Андерс Касеорг
источник
1
Разве ... Вы только что превзошли Денниса в испытании, построенном вокруг TIO‽
Инженер Тост
4

PowerShell, 274 байта

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

Это все благодаря следующему фрагменту:

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

Попробуйте онлайн!

Андрей Одегов
источник
Святой Христос, можешь ли ты объяснить, как ты получил этот ответ? Если бы я даже попробовал на Java или что-то еще, это было бы чисто методом проб и ошибок.
Волшебная Урна Осьминога