TryItOnquine Challenge


48

(на основі цієї публікації та витікаючої з неї дискусії у чаті - також, велике спасибі Деннісу за TIO!)

Змагання

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

Для надуманого прикладу припустимо, що це aaaбув код для вирішення цього питання в PowerShell. Потім слід вивести результат натискання кнопки « Запустити з», aaaоскільки код https://tio.run/#powershellповинен бути виведений https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AA, а також поле «Звичайна URL-адреса» при натисканні кнопки Зберегти / Зберегти .

Оцінка балів

В результаті 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поле ігнорується у всіх ситуаціях.
  • Звичайні правила квоти застосовуються до коду, наскільки це можливо (наприклад, код не може прочитати власний вихідний код через .code.tio).
  • Додайте опис того, як працює код у вашій подачі.
  • Подання "хитрої" квітки шляхом подання запиту на тягнення Git до сховища TIO для створення URL-адреси або ярлика "хитрощі" тощо не дозволяється.
  • Аналогічно, подання запиту на поновлення на оновлення певної мови для створення URL-адреси "фокус" не дозволяється.
  • Будь ласка, будьте приємні до серверів Dennis і не зловживайте ними та не намагайтеся скористатися заради цього завдання.

14
Пам'ятайте, останнє правило важливе! Тут уже триває купа DDoS-атак.
Ерік Аутгольфер

Що таке "піар"?
Адам

1
Надуманий приклад: якщо моє подання - https://tio.run/##a+aце посилання на програму, яка виводить https://tio.run/##a+a, чи saveStatehttps://tio.run/##a@a
справді

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

Спробуйте в Інтернеті!

Використовується zlib вбудованого Pyth ( .Z) та вбудована реалізація 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 T
Інженер Тост

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 або щось таке, це були б чисті проби та помилки.
Magic Octopus Urn

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.