Сжатие строковых массивов
ОБНОВЛЕНИЕ: инструменты, представленные в этом совете, с тех пор были переписаны, улучшены и интегрированы в мой интерпретатор Japt . Для достижения наилучших результатов рекомендуется использовать этот компрессор над любым из указанных ниже. Я вернусь к этому совету, когда у меня будет больше времени, и перепишу его с учетом нового компрессора.
Вступление
Если в вашем коде есть массив строк, самый очевидный способ сжать его - прогнать каждую строку поOc
отдельности. Для целей этого совета мы будем работать с массивом ["lollipop","marshmallow","nougat","oreo"]
, который изначально весит 42 байта. Прохождение каждой строки Oc
дает нам:
[`lo¥ipop`,`Ú\hÚaow`,`Í`,`eo`]
Это теперь 33 байта, достойная экономия.
Шаг 1
Но мы можем сделать лучше. Если мы присоединяем массив к строке, разделенной новой строкой, мы можем избавиться от скобок, запятых и лишних обратных символов и разделить их на новую строку, чтобы получить наш массив. Применение этого к нашему массиву примеров дает нам следующее:
`lo¥ipop
Ú\hÚaow
Í
eo`·
Теперь до 26 байтов.
Шаг 2
Но мы можем сделать еще лучше! Мы могли бы использовать строчную букву для разделения строк вместо новой строки, которая может быть включена в сжатие. z
не используется ни в одной из наших строк, поэтому давайте добавим это и посмотрим, как у нас получится.
`lo¥ipopzÚ\hÚaowzÍzeo`qz
Ах, орешки - там нет улучшения; наш счетчик байтов увеличился на один! Там может быть еще одно письмо , вы могли бы использовать , но, в зависимости от ваших строк, не может быть достаточно мало , чтобы попробовать - в нашем примере есть 11: b,c,d,f,j,k,q,v,x,y,z
. Попытка каждого была бы довольно утомительной, и вот тут-то и появился этот удобный инструмент ; передайте ему строки, разделенные новой строкой, и он попытается разграничить строки каждой буквой, не содержащейся ни в одной из них, и вывести:
- самая короткая сжатая строка,
- разделитель, который он использует, и
- его длина.
Выполнение нашего образца строк через это показывает, что b
дает лучшие результаты:
`lo¥ipáæqrÚaowbÍÞo`qb
И вот, у вас это есть, у нас осталось всего 24 байта.
Шаг 3
Но мы можем сделать еще лучше! Если порядок строк в вашем массиве не имеет значения, возможно, существует другая перестановка в сочетании с другим разделителем, который может работать еще короче. Однако пробовать каждую возможность будет гораздо более утомительно. С нашими 4-мя строками можно попробовать 24 разных сочетания. С каждой из 11 возможных букв становится 264! Вот где этот инструмент вступает в игру. Опять же, введите в него строки, разделенные новой строкой, и он попробует каждую комбинацию каждой перестановки и каждой буквы-разделителя, выведя:
- порядок строк в самой короткой сжатой строке,
- сжатая строка,
- разделитель, который он использует, и,
- его длина.
Пропуск наших примерных строк показывает, что "nougat","oreo","lollipop","marshmallow"
при использовании b
в качестве разделителя можно получить наилучшие результаты, а конечное число байтов составляет всего 23:
`ÍÞo½o¥ipáæqrÚaow`qb
Бонусный совет: сжатие целочисленных массивов
Вы можете применить тот же принцип к массивам целых чисел, сначала преобразовав каждое из них в более высокое основание. Используя этот пример, 36-байтовый массив:
[588181,156859,595676,475330,680474]
Мы можем уменьшить это до 29 байт, сначала преобразовав его в массив из 32 строк, а затем запустив его через первую программу сжатия:
`huclt4p5r5ÛÊg62tkogq`qt mnH
Или всего 27 байт, используя вторую программу:
`4p5Ïcl5ÛÊg62tkogq`qt mnH
Возможно, вы сможете сохранить еще один байт или 2, переместив целочисленное преобразование в метод, который вы уже выполняете в массиве.
Примечания
- Не забудьте учесть 1 или 2 дополнительных байтовых
q<letter>(<space>)
затрат ·
. Хотя вы можете использовать один из ярлыков Unicode для возврата байта в зависимости от вашего разделителя ( qÊ
такой же, как ql<space>
, например).
- Осторожно при использовании последнего инструмента: чем больше у вас строк, тем больше будет перестановок и тем медленнее будет работать программа, пока она в конечном итоге не выпадет. Как подробно описано выше, с нашими 4 примерами строк и 11 возможными буквами, которые можно попробовать, существует 264 возможных комбинации, увеличьте количество строк всего на 1 с теми же 11 буквами, и у нас уже есть 1320 комбинаций, которые можно попробовать. (Вы можете использовать этот инструмент для подсчета количества комбинаций, если хотите).
кредиты
- Оливер за вдохновение для создания инструментов, найденных в этом совете.
- ETHпродукция для корректуры.