Défi
Concevoir un algorithme de compression spécialisé pour compresser des labyrinthes ASCII. Vous devrez créer à la fois un algorithme de compression et un algorithme de décompression. Votre score sera basé sur la taille de vos labyrinthes compressés.
Labyrinthes
Ces labyrinthes sont faits principalement des personnages (étages),
+
, -
, |
et #
(murs), et exactement un chacun ^
(début) et $
(fin). Ils peuvent également contenir des lettres ASCII, qui comptent comme des carreaux de sol. Aux fins de ce défi, les labyrinthes ne doivent pas nécessairement être résolubles et la signification réelle du contenu du labyrinthe n'est pas pertinente.
+
sera utilisé pour les cellules de paroi où il y a au moins une cellule de paroi adjacente horizontalement et au moins une cellule de paroi adjacente verticalement.|
sera utilisé pour les cellules de paroi où il y a au moins une cellule de paroi adjacente verticalement, mais aucune cellule de paroi adjacente horizontalement.-
sera utilisé pour les cellules de paroi où il y a au moins une cellule de paroi adjacente horizontalement, mais aucune cellule de paroi adjacente verticalement#
ne sera utilisé que pour les cellules de paroi qui ne sont pas orthogonalement adjacentes à d'autres cellules de paroi.
Tous les labyrinthes sont rectangulaires, mais n'ont pas nécessairement un alignement régulier grille / mur.
Labyrinthes à compresser
Labyrinthe 1
+----+----
| o | |
| -- | o--+
| | | $
--^-+-+---
Labyrinthe 2
+-----+---+
| a | |
^ +-+-+ # |
| | | B |
| | | --+ |
| c | $
+-------+--
Labyrinthe 3
----------+-+-+-----+-+
^ | | | | |
+-- --+R # | |p| | | |
| | | | | |
+---+ +-+-+-- +-+ | | |
| m| | | | | | | |
| +-+ | | | | | --+ | |
| | | h | | | | |
| | | | | | # --+-+ |
| | | | | | S| $
+-----+-+-+-+-+---+----
Labyrinthe 4
+-----+---+-+---+-------^-----+
| |x | | | tsrq |
+-+-- +-- | +-- # --+---- --+
| | | | | |
| | | | | +-+-+---+ | +-- | +-+
| | | u | | | | | | | | |
| +-+ | | | | +---- +-+---+ | |
| | | | | y | w |
| | --+ | --+ +-- | +---- | | |
| | | | | | | | | |
+-- --+ +-+ | | | | +-- | +-+-+
| | | | | | | | | |
$ | --+-+ | --+-+ | +-+-+-- --+
| | | z| | | v |
+-+---+-------+---+---+-------+
Labyrinthe 5
++ -----------+
++- Beep|
$ ----+---+--+
+-+boop| | |
| +--- | | | ++
| | | +++
+------+-+--+ ^
Labyrinthe 6
+-$---------------+-+--
| | |j
| |l ---- # ---+ | |
| | | m | +--+ |
| | | +-+---- # |
| | | | | +----+ |
|o| | | | +----+ | |
| | | | -- | |
| | | | | | -+ | | |
| | | | | | | +--- | |
| | | | +- | | | | ++
+-+ |n| | | ++ +--+ |
| | -+- | | | +-
+---+ +--- | | | ^
| | --+ --+ | |
| -- | | k | | ++
| | | +--- | ++
| | | | | |
+-- -+---- | +----+--+
Labyrinthe 7
+---+-+-------------+-+^+-----+-------+---+-+---+-+---+-+---+
| |c| | | | c | | | | | | |c| |
+-- | | +-- +-- # | | | +-- --+ +---- +-- | +-+ | | +-+ | --+
| | | | | | | | |c| | |
| | +-- | +-+-- +-+ +-- # +- # -+-- +-- | | --+ | | | | --+C|
|c| | | | c | | |c | | | |
+-+-+---+-+-----+---------+---------+---+-------------+---+$|
Labyrinthe 8
------+-+-+---+-+---+-----------+---+-----+---------------+-+
^ | | | | | | | | | r | |
+-- | | | t | | +-- +----- # ---+-- +-- --+-- ----+-+ --+ | |
| | | | | | | r | | | | | |
| | | | | +-+ --+ --+-- --------+-- | ----+ --+ | | | --+ | |
| |r| | rotation | | | | | | $
+-+-+-+-----------------------------------+---+-+---+---+-+--
Labyrinthe 9
|$|^--+-+---+-----+-+---+-+-+---+---+-+---+-----+
| | | | | | | | | | f | | | | |
| +-+ | | # +-+ --+ +-+ | | | # | +-+ +-- | ----+
| | | | f| | | | | | f |
| |F+-+ | | | | +---+ | | | ----+-+ | | --+ --+-+
| | | | | | | | | f | | | |
| | | | +-+-+---+-- | | | +-+-+-+ +-+ +--- # -+ |
| | | | | | | | | | | | | | |
+-+-+ | +---+ --+ | +---+-+ | | --+ f | | | | --+
| | | | | | | | | |
| --+f| | | +-- --+--f--+ --+ | ----+ | +-+ +---+
| | | | | | | | | |
+---+-----+-+-----+-----+---+-+-----------+-----+
Labyrinthe 10
+-----+-+-----------+
| q | | q |
|Q+-+ | +-+-+-+---- |
$ | | | | | q |
+-+ | | | | | +-- +-+
| | | | | | |
| +-- +-+ |q| +-+ | |
| q| | | | |
| | | +-- | +-+ | --+
| | | | | | | |
+-+-+-+ +-+-+ +-- | |
| | | |
+--- # -+ | | +-- | |
| q | | | | ^
+-+ +-- | | +-+ | +-+
| | | | |q| | |
| +-+-+ | +-+-- | | |
| | | | | | |
| | | +-+-+-- +-+ +-+
| | | | q |
+-+-+---------+-----+
Règles, hypothèses, notation
- Les failles standard sont interdites
- Écrivez un programme général, pas un qui ne fonctionne que pour les dix cas de test. Il doit être capable de gérer n'importe quel labyrinthe arbitraire.
- Vous pouvez supposer qu'il y aura exactement une entrée et une sortie. Les entrées et sorties seront toujours à la frontière du labyrinthe.
- Vous pouvez supposer que toutes les entrées utilisent des murs qui suivent les règles énumérées ci-dessus. Votre algorithme de compression n'a pas à fonctionner pour les labyrinthes contenant des murs qui violent ces règles.
- Les labyrinthes d'entrée peuvent être résolus ou non.
- Vous pouvez supposer que le labyrinthe ne dépassera pas 100 caractères dans les deux sens.
- Vous pouvez supposer que les lettres n'apparaîtront pas sur le bord du labyrinthe. (puisque c'est le cas pour les exemples fournis)
- Votre score est la taille totale, en octets (octets), de tous les labyrinthes compressés.
- Vous pouvez utiliser hexadécimal, base64, chaînes binaires ou tout autre format similaire comme représentation de votre labyrinthe compressé si cela vous semble plus pratique. Vous devez toujours compter le résultat en octets entiers, arrondi à chaque labyrinthe (par exemple, 4 chiffres de base64 est de 3 octets, 2 chiffres hexadécimaux est de 1 octet, 8 chiffres binaires est de 1 octet, etc ...)
- Le score le plus bas gagne!
la source
Réponses:
JavaScript (Node.js) , score =
586 541 503 492479 octetsLes murs sont stockés sous la forme d'un flux de bits codé par Huffman décrivant si une fonction de prédiction renvoie la supposition correcte ou non.
Essayez-le en ligne!
Commun
Compression
Décompression
Comment?
Un labyrinthe est codé comme un flux binaire qui est finalement converti en chaîne.
Entête
L'en-tête comprend:
Données de mur
00
→0000
010
→0001
1001
→0010
11100
→0011
011
→0100
Les formes finales des murs sont déduites d'une manière similaire à la réponse de Nick Kennedy .
Caractères spéciaux
Chaque caractère spécial est codé comme suit:
Le code du personnage:
^
,$
,#
ou[a-z]
[A-O]
[P-Z]
la source
deflate
? Il y en a énormément sur l'étagère!R, score 668 octets
Cela profite du fait que le caractère du mur est déterminé par son environnement. En tant que tels, les caractères du mur peuvent être codés en bits. Les informations restantes qui doivent être stockées sont les dimensions du labyrinthe, les positions de début et de fin et les positions de tout autre personnage non-mur. Étant donné que les caractères non muraux sont ASCII, j'ai utilisé le bit le plus significatif de chaque octet pour indiquer s'il existe un autre caractère qui suit afin que certains des mots dans les labyrinthes n'aient pas besoin d'avoir l'emplacement de chaque caractère stocké séparément. Notez également que pour les labyrinthes inférieurs ou égaux à 256 caractères (par exemple jusqu'à 16x16 ou les labyrinthes équivalents rectangulaires), les positions peuvent être stockées dans un octet, tandis que pour les labyrinthes plus grands, les positions nécessitent deux octets.
Fonctions utilitaires
Algorithme de compression
Algorithme de décompression
Essayez-le en ligne!
la source