Для игры в гольф в формате javascript кодировать кодировкой, декодировать другой - PullRequest
2 голосов
/ 01 августа 2020

В последнее время я играю в гольф на разных языках, и сначала я был 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

1 Ответ

1 голос
/ 01 августа 2020

Стандартный способ переключения между декодированием строк в node.js - использовать Buffer api :

Buffer.from(…, "utf16le").toString("ascii")

Чтобы немного поиграть в это, вы можете воспользоваться некоторые устаревшие параметры и значения по умолчанию:

''+new Buffer(…,"ucs2")

(.toString() без аргументов действительно использует UTF-8, но не имеет значения для данных ASCII)

Поскольку узел поддерживает только UTF16-файл вместо UTF16 - ваша строка не будет работать, вам необходимо поменять местами байты и использовать разные символы:

global.print = console.log;
eval(''+new Buffer("潦⡲㵩㬵⵩㬭
牰湩⡴⩩⥩","ucs2"))

( онлайн демо )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...