Виклик
Розробіть алгоритм стиснення, спеціалізований для стиснення лабіринтів 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 символів в будь-якому напрямку.
- Ви можете припустити, що літери не з’являться на краю лабіринту. (оскільки це стосується поданих прикладів)
- Ваш бал - це загальний розмір усіх стислих лабіринтів у байтах (октетах).
- Ви можете використовувати шістнадцятковий, base64, двійкові рядки або будь-який подібний формат як подання для стисненого лабіринту, якщо вам це зручніше. Ви все одно повинні підраховувати результат цілими октетами, округлими для кожного лабіринту (наприклад, 4 базових 64 цифри - 3 байти, 2 шістнадцяткових цифр - 1 байт, 8 двійкових цифр - 1 байт і т.д. ...)
- Найнижчий рахунок виграє!