Вызов
Разработка алгоритма сжатия, предназначенного для сжатия лабиринтов ASCII. Вам нужно будет создать как алгоритм сжатия, так и алгоритм распаковки. Ваша оценка будет зависеть от размера ваших сжатых лабиринтов.
Лабиринты
Эти лабиринты сделаны в основном из персонажей (этажей),
+
, -
, |
, и #
(стены), и ровно один каждое из ^
(начало) и $
(конец). Они также могут содержать буквы ASCII, которые считаются плитками для пола. Для целей этой задачи лабиринты не должны быть разрешимыми, и фактическое значение содержания лабиринта не имеет значения.
+
будет использоваться для стеновых ячеек, где есть, по крайней мере, одна горизонтально смежная стенка и, по крайней мере, одна вертикально смежная стенка.|
будет использоваться для стеновых ячеек, где есть по крайней мере одна вертикально смежная стеночная ячейка, но нет горизонтально смежных стеночных ячеек.-
будет использоваться для стеновых ячеек, где есть хотя бы одна горизонтально смежная стеночная ячейка, но нет вертикально смежных ячеек#
будет использоваться только для ячеек стены, которые не ортогонально соседствуют с другими ячейками стены.
Все лабиринты имеют прямоугольную форму, но не обязательно имеют регулярное выравнивание сетки / стены.
Лабиринты для сжатия
Лабиринт 1
+----+----
| o | |
| -- | o--+
| | | $
--^-+-+---
Лабиринт 2
+-----+---+
| a | |
^ +-+-+ # |
| | | B |
| | | --+ |
| c | $
+-------+--
Лабиринт 3
----------+-+-+-----+-+
^ | | | | |
+-- --+R # | |p| | | |
| | | | | |
+---+ +-+-+-- +-+ | | |
| m| | | | | | | |
| +-+ | | | | | --+ | |
| | | h | | | | |
| | | | | | # --+-+ |
| | | | | | S| $
+-----+-+-+-+-+---+----
Лабиринт 4
+-----+---+-+---+-------^-----+
| |x | | | tsrq |
+-+-- +-- | +-- # --+---- --+
| | | | | |
| | | | | +-+-+---+ | +-- | +-+
| | | u | | | | | | | | |
| +-+ | | | | +---- +-+---+ | |
| | | | | y | w |
| | --+ | --+ +-- | +---- | | |
| | | | | | | | | |
+-- --+ +-+ | | | | +-- | +-+-+
| | | | | | | | | |
$ | --+-+ | --+-+ | +-+-+-- --+
| | | z| | | v |
+-+---+-------+---+---+-------+
Лабиринт 5
++ -----------+
++- Beep|
$ ----+---+--+
+-+boop| | |
| +--- | | | ++
| | | +++
+------+-+--+ ^
Лабиринт 6
+-$---------------+-+--
| | |j
| |l ---- # ---+ | |
| | | m | +--+ |
| | | +-+---- # |
| | | | | +----+ |
|o| | | | +----+ | |
| | | | -- | |
| | | | | | -+ | | |
| | | | | | | +--- | |
| | | | +- | | | | ++
+-+ |n| | | ++ +--+ |
| | -+- | | | +-
+---+ +--- | | | ^
| | --+ --+ | |
| -- | | k | | ++
| | | +--- | ++
| | | | | |
+-- -+---- | +----+--+
Лабиринт 7
+---+-+-------------+-+^+-----+-------+---+-+---+-+---+-+---+
| |c| | | | c | | | | | | |c| |
+-- | | +-- +-- # | | | +-- --+ +---- +-- | +-+ | | +-+ | --+
| | | | | | | | |c| | |
| | +-- | +-+-- +-+ +-- # +- # -+-- +-- | | --+ | | | | --+C|
|c| | | | c | | |c | | | |
+-+-+---+-+-----+---------+---------+---+-------------+---+$|
Лабиринт 8
------+-+-+---+-+---+-----------+---+-----+---------------+-+
^ | | | | | | | | | r | |
+-- | | | t | | +-- +----- # ---+-- +-- --+-- ----+-+ --+ | |
| | | | | | | r | | | | | |
| | | | | +-+ --+ --+-- --------+-- | ----+ --+ | | | --+ | |
| |r| | rotation | | | | | | $
+-+-+-+-----------------------------------+---+-+---+---+-+--
Лабиринт 9
|$|^--+-+---+-----+-+---+-+-+---+---+-+---+-----+
| | | | | | | | | | f | | | | |
| +-+ | | # +-+ --+ +-+ | | | # | +-+ +-- | ----+
| | | | f| | | | | | f |
| |F+-+ | | | | +---+ | | | ----+-+ | | --+ --+-+
| | | | | | | | | f | | | |
| | | | +-+-+---+-- | | | +-+-+-+ +-+ +--- # -+ |
| | | | | | | | | | | | | | |
+-+-+ | +---+ --+ | +---+-+ | | --+ f | | | | --+
| | | | | | | | | |
| --+f| | | +-- --+--f--+ --+ | ----+ | +-+ +---+
| | | | | | | | | |
+---+-----+-+-----+-----+---+-+-----------+-----+
Лабиринт 10
+-----+-+-----------+
| q | | q |
|Q+-+ | +-+-+-+---- |
$ | | | | | q |
+-+ | | | | | +-- +-+
| | | | | | |
| +-- +-+ |q| +-+ | |
| q| | | | |
| | | +-- | +-+ | --+
| | | | | | | |
+-+-+-+ +-+-+ +-- | |
| | | |
+--- # -+ | | +-- | |
| q | | | | ^
+-+ +-- | | +-+ | +-+
| | | | |q| | |
| +-+-+ | +-+-- | | |
| | | | | | |
| | | +-+-+-- +-+ +-+
| | | | q |
+-+-+---------+-----+
Правила, предположения, оценка
- Стандартные лазейки запрещены
- Напишите общую программу, а не ту, которая работает только для десяти тестовых случаев. Он должен быть в состоянии справиться с любым произвольным лабиринтом.
- Вы можете предположить, что будет ровно один вход и один выход. Входы и выходы всегда будут на границе лабиринта.
- Вы можете предположить, что все входы используют стены, которые следуют правилам, перечисленным выше. Ваш алгоритм сжатия не должен работать для лабиринтов, содержащих стены, которые нарушают эти правила.
- Входные лабиринты могут быть или не быть решаемыми.
- Вы можете предположить, что лабиринт будет не более 100 символов в любом направлении.
- Вы можете предположить, что буквы не появятся на краю лабиринта. (поскольку это относится к приведенным примерам)
- Ваша оценка - это общий размер в байтах (октетах) всех сжатых лабиринтов.
- Вы можете использовать hex, base64, двоичные строки или любой подобный формат в качестве представления для вашего сжатого лабиринта, если вы находите это более удобным. Вы все равно должны считать результат в целых октетах, округленных для каждого лабиринта (например, 4 цифры base64 - это 3 байта, 2 шестнадцатеричные цифры - 1 байт, 8 двоичных цифр - 1 байт и т. Д.)
- Самый низкий балл побеждает!
ascii-art
code-challenge
compression
maze
Beefster
источник
источник
Ответы:
JavaScript (Node.js) , оценка =
586 541 503 492479 байтСтены хранятся в виде потока битов в кодировке Хаффмана, описывающего, возвращает ли функция прогнозирования правильное предположение или нет.
Специальные символы хранятся как( д, С ) , где d расстояние от предыдущего специального символа и с это код ASCII.
Попробуйте онлайн!
общий
компрессия
декомпрессия
Как?
Лабиринт кодируется как поток битов, который в конечном итоге преобразуется в строку.
заголовок
Заголовок состоит из:
Стенные данные
Мы проходим через весь лабиринт и пытаемся предсказать, является ли следующая ячейка стеной или нет, основываясь на ранее обнаруженных ячейках. Мы испускаем0 если мы правы или 1 если мы не правы
Это приводит к последовательности корректирующих битов с (надеюсь) значительно большим0 чем 1 «S. Эта последовательность разбита на кусочки и хранится с использованием жестко закодированных кодов Хаффмана:
00
→0000
010
→0001
1001
→0010
11100
→0011
011
→0100
Расшифровать стенуWN процедура распаковки вычисляет тот же прогноз пN и переключает результат при необходимости, используя корректирующий бит СN :
Окончательные формы стен выводятся способом, аналогичным ответу Ника Кеннеди .
Специальные символы
Каждый спецсимвол закодирован как:
Расстояние минус1 из последнего специального символа (игнорируя стены):
Код персонажа:
^
,$
,#
или[a-z]
[A-O]
[P-Z]
источник
deflate
? На полке очень много!R, оценка 668 байт
Это использует тот факт, что характер стены определяется ее окружением. Таким образом, символы стены могут быть закодированы как биты. Остальная информация, которую нужно сохранить, - это размеры лабиринта, позиции начала и конца и позиции любых других символов, не относящихся к стене. Так как нестрочные символы являются ASCII, я использовал самый значимый бит каждого байта, чтобы указать, есть ли еще один символ, который следует за тем, чтобы в некоторых словах в лабиринтах не хранилось местоположение каждого символа раздельно. Также обратите внимание, что для лабиринтов, меньших или равных 256 символам (например, до 16x16 или эквивалентных прямоугольных лабиринтов), позиции могут быть сохранены в одном байте, тогда как для больших лабиринтов позициям нужны два байта.
Сервисные функции
Алгоритм сжатия
Алгоритм декомпрессии
Попробуйте онлайн!
источник