В последнее время я играю в гольф на разных языках, и сначала я был skepti c, потому что он полностью отключен от практики «реального мира», но в конечном итоге я полюбил его ради образовательной цели: я много узнал о своих языки в процессе. И давайте признаем, это весело.
Сейчас я пытаюсь изучить трюки на JS, и вот последнее, что я нашел:
Скажем, у вас есть этот скрипт: for(i=5;i--;)print(i*i)
( 23 символа)
Скрипт состоит из символов ASCII, каждый из которых в основном представляет собой пару шестнадцатеричных цифр. Например, «f» - 66, а «o» - 6f. Итак, если вы сгруппируете информацию этих двух символов, вы получите: 666f, что означает код utf16 для одного символа: 景
Мой скрипт имеет нечетное количество символов, поэтому давайте добавим где-нибудь пробел, чтобы сделать его четным: for(i=5;i--;) print(i*i)
(24 символа) и теперь, применяя предыдущую идею ко всему скрипту, мы получаем: 景 爨 椽 㔻 椭 ⴻ⤠ 灲 楮 琨 椪 椩 (12 символов)
Итак, теперь мой вопрос: как можно Я восстанавливаю сценарий из 12 символов с наименьшим количеством символов? Я придумал это: eval(unescape(escape`景爨椽㔻椭ⴻ⤠灲楮琨椪椩`.replace(/%u(..)/g,'%$1%')))
, но он добавляет постоянную стоимость в 50 символов к процессу, поэтому делает этот метод бесполезным, если ваш скрипт имеет менее 100 символов. Это отлично подходит для длинных скриптов (например, 600 символов превращаются в 350 символов), но в задачах игры в гольф сценарий редко бывает длинным, обычно меньше 100 символов.
Я вообще не специалист по кодированию, поэтому я пришел сюда, потому что я почти уверен, что есть более короткий метод. 30 символов постоянной стоимости уже было бы замечательно, потому что это привело бы к снижению порога со 100 до 60 символов. Обратите внимание, что здесь я использовал utf16, но это может быть другая кодировка, если она укорачивает сценарий, я доволен этим. Моя версия JS: Node 12.13.0