Desafio
Crie um algoritmo de compactação especializado para compactar labirintos ASCII. Você precisará criar um algoritmo de compactação e um algoritmo de descompactação. Sua pontuação será baseada no tamanho dos labirintos compactados.
Labirintos
Estes labirintos são feitas principalmente dos caracteres (pavimentos),
+
, -
, |
, e #
(paredes), e exatamente uma cada de ^
(iniciar) e $
(final). Eles também podem conter letras ASCII, que contam como ladrilhos. Para os propósitos deste desafio, os labirintos não precisam ser solucionáveis e o significado real do conteúdo do labirinto é irrelevante.
+
será usado para células de parede onde houver pelo menos uma célula de parede adjacente horizontalmente e pelo menos uma célula de parede adjacente verticalmente.|
será usado para células da parede onde houver pelo menos uma célula da parede adjacente verticalmente, mas nenhuma célula da parede adjacente horizontalmente.-
será usado para células da parede onde houver pelo menos uma célula da parede adjacente horizontalmente, mas nenhuma célula da parede adjacente verticalmente#
será usado apenas para células da parede que não são ortogonalmente adjacentes a outras células da parede.
Todos os labirintos são retangulares, mas não necessariamente têm um alinhamento regular de grade / parede.
Labirintos para comprimir
Labirinto 1
+----+----
| o | |
| -- | o--+
| | | $
--^-+-+---
Labirinto 2
+-----+---+
| a | |
^ +-+-+ # |
| | | B |
| | | --+ |
| c | $
+-------+--
Labirinto 3
----------+-+-+-----+-+
^ | | | | |
+-- --+R # | |p| | | |
| | | | | |
+---+ +-+-+-- +-+ | | |
| m| | | | | | | |
| +-+ | | | | | --+ | |
| | | h | | | | |
| | | | | | # --+-+ |
| | | | | | S| $
+-----+-+-+-+-+---+----
Labirinto 4
+-----+---+-+---+-------^-----+
| |x | | | tsrq |
+-+-- +-- | +-- # --+---- --+
| | | | | |
| | | | | +-+-+---+ | +-- | +-+
| | | u | | | | | | | | |
| +-+ | | | | +---- +-+---+ | |
| | | | | y | w |
| | --+ | --+ +-- | +---- | | |
| | | | | | | | | |
+-- --+ +-+ | | | | +-- | +-+-+
| | | | | | | | | |
$ | --+-+ | --+-+ | +-+-+-- --+
| | | z| | | v |
+-+---+-------+---+---+-------+
Labirinto 5
++ -----------+
++- Beep|
$ ----+---+--+
+-+boop| | |
| +--- | | | ++
| | | +++
+------+-+--+ ^
Labirinto 6
+-$---------------+-+--
| | |j
| |l ---- # ---+ | |
| | | m | +--+ |
| | | +-+---- # |
| | | | | +----+ |
|o| | | | +----+ | |
| | | | -- | |
| | | | | | -+ | | |
| | | | | | | +--- | |
| | | | +- | | | | ++
+-+ |n| | | ++ +--+ |
| | -+- | | | +-
+---+ +--- | | | ^
| | --+ --+ | |
| -- | | k | | ++
| | | +--- | ++
| | | | | |
+-- -+---- | +----+--+
Labirinto 7
+---+-+-------------+-+^+-----+-------+---+-+---+-+---+-+---+
| |c| | | | c | | | | | | |c| |
+-- | | +-- +-- # | | | +-- --+ +---- +-- | +-+ | | +-+ | --+
| | | | | | | | |c| | |
| | +-- | +-+-- +-+ +-- # +- # -+-- +-- | | --+ | | | | --+C|
|c| | | | c | | |c | | | |
+-+-+---+-+-----+---------+---------+---+-------------+---+$|
Labirinto 8
------+-+-+---+-+---+-----------+---+-----+---------------+-+
^ | | | | | | | | | r | |
+-- | | | t | | +-- +----- # ---+-- +-- --+-- ----+-+ --+ | |
| | | | | | | r | | | | | |
| | | | | +-+ --+ --+-- --------+-- | ----+ --+ | | | --+ | |
| |r| | rotation | | | | | | $
+-+-+-+-----------------------------------+---+-+---+---+-+--
Labirinto 9
|$|^--+-+---+-----+-+---+-+-+---+---+-+---+-----+
| | | | | | | | | | f | | | | |
| +-+ | | # +-+ --+ +-+ | | | # | +-+ +-- | ----+
| | | | f| | | | | | f |
| |F+-+ | | | | +---+ | | | ----+-+ | | --+ --+-+
| | | | | | | | | f | | | |
| | | | +-+-+---+-- | | | +-+-+-+ +-+ +--- # -+ |
| | | | | | | | | | | | | | |
+-+-+ | +---+ --+ | +---+-+ | | --+ f | | | | --+
| | | | | | | | | |
| --+f| | | +-- --+--f--+ --+ | ----+ | +-+ +---+
| | | | | | | | | |
+---+-----+-+-----+-----+---+-+-----------+-----+
Labirinto 10
+-----+-+-----------+
| q | | q |
|Q+-+ | +-+-+-+---- |
$ | | | | | q |
+-+ | | | | | +-- +-+
| | | | | | |
| +-- +-+ |q| +-+ | |
| q| | | | |
| | | +-- | +-+ | --+
| | | | | | | |
+-+-+-+ +-+-+ +-- | |
| | | |
+--- # -+ | | +-- | |
| q | | | | ^
+-+ +-- | | +-+ | +-+
| | | | |q| | |
| +-+-+ | +-+-- | | |
| | | | | | |
| | | +-+-+-- +-+ +-+
| | | | q |
+-+-+---------+-----+
Regras, Premissas, Pontuação
- As brechas padrão são proibidas
- Escreva um programa geral, não um que funcione apenas para os dez casos de teste. Ele deve ser capaz de lidar com qualquer labirinto arbitrário.
- Você pode assumir que haverá exatamente uma entrada e uma saída. As entradas e saídas sempre estarão na fronteira do labirinto.
- Você pode assumir que todas as entradas usam paredes que seguem as regras enumeradas acima. Seu algoritmo de compactação não precisa funcionar para labirintos contendo paredes que violam essas regras.
- Labirintos de entrada podem ou não ser solucionáveis.
- Você pode assumir que o labirinto não terá mais que 100 caracteres em qualquer direção.
- Você pode assumir que as letras não aparecerão na borda do labirinto. (já que este é o caso dos exemplos fornecidos)
- Sua pontuação é o tamanho total, em bytes (octetos), de todos os labirintos compactados.
- Você pode usar hex, base64, seqüências binárias ou qualquer formato semelhante como representação para o seu labirinto compactado, se achar mais conveniente. Você ainda deve contar o resultado em octetos inteiros, arredondados para cada labirinto (por exemplo, 4 dígitos base64 são 3 bytes, 2 dígitos hexadecimais são 1 byte, 8 dígitos binários são 1 byte, etc ...)
- Menor pontuação ganha!
fonte
Respostas:
JavaScript (Node.js) , pontuação =
586 541 503 492479 bytesAs paredes são armazenadas como um fluxo de bits codificado por Huffman, descrevendo se uma função de previsão está retornando a estimativa correta ou não.
Experimente online!
Comum
Compressão
Descompressão
Como?
Um labirinto é codificado como um fluxo de bits que é eventualmente convertido em uma string.
Cabeçalho
O cabeçalho consiste em:
Dados da parede
00
→0000
010
→0001
1001
→0010
11100
→0011
011
→0100
As formas finais das paredes são deduzidas de maneira semelhante à resposta de Nick Kennedy .
Caracteres especiais
Cada caractere especial é codificado como:
O código do caractere:
^
,$
,#
ou[a-z]
[A-O]
[P-Z]
fonte
deflate
? Há muita coisa na prateleira!R, pontuação 668 bytes
Isso tira proveito do fato de que o caráter da parede é determinado por seus arredores. Assim, os caracteres da parede podem ser codificados como bits. As informações restantes que precisam ser armazenadas são as dimensões do labirinto, as posições de início e fim e as posições de qualquer outro personagem que não seja da parede. Como os caracteres que não são da parede são ASCII, usei o bit mais significativo de cada byte para indicar se existe outro caractere a seguir, para que algumas das palavras nos labirintos não precisem ter o local de cada caractere armazenado separadamente. Observe também que para labirintos menores ou iguais a 256 caracteres (por exemplo, labirintos retangulares de até 16x16 ou equivalentes), as posições podem ser armazenadas em um byte, enquanto que para labirintos maiores as posições precisam de dois bytes.
Funções utilitárias
Algoritmo de compressão
Algoritmo de descompressão
Experimente online!
fonte