Desafío
Diseñe un algoritmo de compresión especializado para comprimir laberintos ASCII. Deberá crear un algoritmo de compresión y un algoritmo de descompresión. Su puntaje se basará en el tamaño de sus laberintos comprimidos.
Laberintos
Estos laberintos están hechos principalmente de los personajes (pisos),
+
, -
, |
, y #
(paredes), y exactamente un cada uno de ^
(START) y $
(fin). También pueden contener letras ASCII, que cuentan como baldosas. Para los propósitos de este desafío, los laberintos no tienen que ser solucionables y el significado real del contenido del laberinto es irrelevante.
+
se usará para celdas de pared donde hay al menos una celda de pared adyacente horizontalmente y al menos una celda de pared adyacente verticalmente.|
se usará para celdas de pared donde hay al menos una celda de pared adyacente verticalmente, pero no hay celdas de pared adyacentes horizontalmente.-
se usará para celdas de pared donde hay al menos una celda de pared adyacente horizontalmente, pero no hay celdas de pared adyacentes verticalmente#
solo se usará para células de pared que no estén ortogonalmente adyacentes a otras células de pared.
Todos los laberintos son rectangulares, pero no necesariamente tienen una alineación regular de cuadrícula / pared.
Laberintos Para Comprimir
Laberinto 1
+----+----
| o | |
| -- | o--+
| | | $
--^-+-+---
Laberinto 2
+-----+---+
| a | |
^ +-+-+ # |
| | | B |
| | | --+ |
| c | $
+-------+--
Laberinto 3
----------+-+-+-----+-+
^ | | | | |
+-- --+R # | |p| | | |
| | | | | |
+---+ +-+-+-- +-+ | | |
| m| | | | | | | |
| +-+ | | | | | --+ | |
| | | h | | | | |
| | | | | | # --+-+ |
| | | | | | S| $
+-----+-+-+-+-+---+----
Laberinto 4
+-----+---+-+---+-------^-----+
| |x | | | tsrq |
+-+-- +-- | +-- # --+---- --+
| | | | | |
| | | | | +-+-+---+ | +-- | +-+
| | | u | | | | | | | | |
| +-+ | | | | +---- +-+---+ | |
| | | | | y | w |
| | --+ | --+ +-- | +---- | | |
| | | | | | | | | |
+-- --+ +-+ | | | | +-- | +-+-+
| | | | | | | | | |
$ | --+-+ | --+-+ | +-+-+-- --+
| | | z| | | v |
+-+---+-------+---+---+-------+
Laberinto 5
++ -----------+
++- Beep|
$ ----+---+--+
+-+boop| | |
| +--- | | | ++
| | | +++
+------+-+--+ ^
Laberinto 6
+-$---------------+-+--
| | |j
| |l ---- # ---+ | |
| | | m | +--+ |
| | | +-+---- # |
| | | | | +----+ |
|o| | | | +----+ | |
| | | | -- | |
| | | | | | -+ | | |
| | | | | | | +--- | |
| | | | +- | | | | ++
+-+ |n| | | ++ +--+ |
| | -+- | | | +-
+---+ +--- | | | ^
| | --+ --+ | |
| -- | | k | | ++
| | | +--- | ++
| | | | | |
+-- -+---- | +----+--+
Laberinto 7
+---+-+-------------+-+^+-----+-------+---+-+---+-+---+-+---+
| |c| | | | c | | | | | | |c| |
+-- | | +-- +-- # | | | +-- --+ +---- +-- | +-+ | | +-+ | --+
| | | | | | | | |c| | |
| | +-- | +-+-- +-+ +-- # +- # -+-- +-- | | --+ | | | | --+C|
|c| | | | c | | |c | | | |
+-+-+---+-+-----+---------+---------+---+-------------+---+$|
Laberinto 8
------+-+-+---+-+---+-----------+---+-----+---------------+-+
^ | | | | | | | | | r | |
+-- | | | t | | +-- +----- # ---+-- +-- --+-- ----+-+ --+ | |
| | | | | | | r | | | | | |
| | | | | +-+ --+ --+-- --------+-- | ----+ --+ | | | --+ | |
| |r| | rotation | | | | | | $
+-+-+-+-----------------------------------+---+-+---+---+-+--
Laberinto 9
|$|^--+-+---+-----+-+---+-+-+---+---+-+---+-----+
| | | | | | | | | | f | | | | |
| +-+ | | # +-+ --+ +-+ | | | # | +-+ +-- | ----+
| | | | f| | | | | | f |
| |F+-+ | | | | +---+ | | | ----+-+ | | --+ --+-+
| | | | | | | | | f | | | |
| | | | +-+-+---+-- | | | +-+-+-+ +-+ +--- # -+ |
| | | | | | | | | | | | | | |
+-+-+ | +---+ --+ | +---+-+ | | --+ f | | | | --+
| | | | | | | | | |
| --+f| | | +-- --+--f--+ --+ | ----+ | +-+ +---+
| | | | | | | | | |
+---+-----+-+-----+-----+---+-+-----------+-----+
Laberinto 10
+-----+-+-----------+
| q | | q |
|Q+-+ | +-+-+-+---- |
$ | | | | | q |
+-+ | | | | | +-- +-+
| | | | | | |
| +-- +-+ |q| +-+ | |
| q| | | | |
| | | +-- | +-+ | --+
| | | | | | | |
+-+-+-+ +-+-+ +-- | |
| | | |
+--- # -+ | | +-- | |
| q | | | | ^
+-+ +-- | | +-+ | +-+
| | | | |q| | |
| +-+-+ | +-+-- | | |
| | | | | | |
| | | +-+-+-- +-+ +-+
| | | | q |
+-+-+---------+-----+
Reglas, supuestos, puntuación
- Las lagunas estándar están prohibidas
- Escriba un programa general, no uno que solo funcione para los diez casos de prueba. Debe ser capaz de manejar cualquier laberinto arbitrario.
- Puede suponer que habrá exactamente una entrada y una salida. Las entradas y salidas siempre estarán en el borde del laberinto.
- Puede suponer que todas las entradas usan paredes que siguen las reglas enumeradas anteriormente. Su algoritmo de compresión no tiene que funcionar para laberintos que contienen paredes que violan esas reglas.
- Los laberintos de entrada pueden o no tener solución.
- Puede suponer que el laberinto no tendrá más de 100 caracteres en cualquier dirección.
- Puede suponer que las letras no aparecerán en el borde del laberinto. (ya que este es el caso de los ejemplos proporcionados)
- Su puntaje es el tamaño total, en bytes (octetos), de todos los laberintos comprimidos.
- Puede usar hexadecimal, base64, cadenas binarias o cualquier formato similar como representación para su laberinto comprimido si lo encuentra más conveniente. Todavía debe contar el resultado en octetos completos, redondeados para cada laberinto (por ejemplo, 4 dígitos de base64 son 3 bytes, 2 dígitos hexadecimales son 1 byte, 8 dígitos binarios son 1 byte, etc.)
- ¡La puntuación más baja gana!
fuente
Respuestas:
JavaScript (Node.js) , puntuación =
586 541 503 492479 bytesLas paredes se almacenan como una secuencia de bits codificada por Huffman que describe si una función de predicción está devolviendo la suposición correcta o no.
Pruébalo en línea!
Común
Compresión
Descompresión
¿Cómo?
Un laberinto se codifica como un flujo de bits que finalmente se convierte en una cadena.
Encabezamiento
El encabezado consta de:
Datos de la pared
00
→0000
010
→0001
1001
→0010
11100
→0011
011
→0100
Las formas finales de la pared se deducen de manera similar a la respuesta de Nick Kennedy .
Caracteres especiales
Cada carácter especial se codifica como:
El código del personaje:
^
,$
,#
o[a-z]
[A-O]
[P-Z]
fuente
deflate
? ¡Hay muchísimo en el estante!R, puntaje 668 bytes
Esto aprovecha el hecho de que el carácter del muro está determinado por su entorno. Como tal, los caracteres de la pared se pueden codificar como bits. La información restante que debe almacenarse son las dimensiones del laberinto, las posiciones de inicio y finalización y las posiciones de cualquier otro personaje que no sea de muro. Como los caracteres que no son de muro son ASCII, he usado el bit más significativo de cada byte para indicar si hay otro carácter que sigue para que algunas de las palabras en los laberintos no tengan que almacenar la ubicación de cada carácter. por separado. Tenga en cuenta también que para laberintos menores o iguales a 256 caracteres (por ejemplo, hasta 16x16 o laberintos rectangulares equivalentes), las posiciones se pueden almacenar en un byte, mientras que para laberintos más grandes las posiciones necesitan dos bytes.
Funciones de utilidad
Algoritmo de compresión
Algoritmo de descompresión
Pruébalo en línea!
fuente