Вызов
Разработка алгоритма сжатия, предназначенного для сжатия лабиринтов 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 байт и т. Д.)
- Самый низкий балл побеждает!