Tantangan
Rancang algoritme kompresi yang dikhususkan untuk menekan labirin ASCII. Anda perlu membuat algoritma kompresi dan algoritma dekompresi. Skor Anda akan didasarkan pada ukuran labirin terkompresi Anda.
Labirin
Labirin ini dibuat terutama dari karakter (lantai),
+
, -
, |
, dan #
(dinding), dan tepat satu masing-masing ^
(mulai) dan $
(end). Mereka juga dapat berisi surat ASCII, yang dihitung sebagai ubin lantai. Untuk tujuan tantangan ini, labirin tidak harus dipecahkan dan makna sebenarnya dari konten labirin tidak relevan.
+
akan digunakan untuk sel-sel dinding di mana setidaknya ada satu sel dinding yang berdekatan secara horizontal dan setidaknya satu sel dinding yang berdekatan secara vertikal.|
akan digunakan untuk sel-sel dinding di mana setidaknya ada satu sel dinding yang berdekatan secara vertikal, tetapi tidak ada sel-sel dinding yang berdekatan secara horizontal.-
akan digunakan untuk sel-sel dinding di mana setidaknya ada satu sel dinding yang berdekatan secara horizontal, tetapi tidak ada sel-sel dinding yang berdekatan secara vertikal#
hanya akan digunakan untuk sel-sel dinding yang tidak berdekatan secara ortogonal dengan sel-sel dinding lainnya.
Semua labirin berbentuk persegi panjang, tetapi tidak harus memiliki perataan grid / dinding biasa.
Labirin Untuk Kompres
Labirin 1
+----+----
| o | |
| -- | o--+
| | | $
--^-+-+---
Labirin 2
+-----+---+
| a | |
^ +-+-+ # |
| | | B |
| | | --+ |
| c | $
+-------+--
Labirin 3
----------+-+-+-----+-+
^ | | | | |
+-- --+R # | |p| | | |
| | | | | |
+---+ +-+-+-- +-+ | | |
| m| | | | | | | |
| +-+ | | | | | --+ | |
| | | h | | | | |
| | | | | | # --+-+ |
| | | | | | S| $
+-----+-+-+-+-+---+----
Labirin 4
+-----+---+-+---+-------^-----+
| |x | | | tsrq |
+-+-- +-- | +-- # --+---- --+
| | | | | |
| | | | | +-+-+---+ | +-- | +-+
| | | u | | | | | | | | |
| +-+ | | | | +---- +-+---+ | |
| | | | | y | w |
| | --+ | --+ +-- | +---- | | |
| | | | | | | | | |
+-- --+ +-+ | | | | +-- | +-+-+
| | | | | | | | | |
$ | --+-+ | --+-+ | +-+-+-- --+
| | | z| | | v |
+-+---+-------+---+---+-------+
Labirin 5
++ -----------+
++- Beep|
$ ----+---+--+
+-+boop| | |
| +--- | | | ++
| | | +++
+------+-+--+ ^
Labirin 6
+-$---------------+-+--
| | |j
| |l ---- # ---+ | |
| | | m | +--+ |
| | | +-+---- # |
| | | | | +----+ |
|o| | | | +----+ | |
| | | | -- | |
| | | | | | -+ | | |
| | | | | | | +--- | |
| | | | +- | | | | ++
+-+ |n| | | ++ +--+ |
| | -+- | | | +-
+---+ +--- | | | ^
| | --+ --+ | |
| -- | | k | | ++
| | | +--- | ++
| | | | | |
+-- -+---- | +----+--+
Labirin 7
+---+-+-------------+-+^+-----+-------+---+-+---+-+---+-+---+
| |c| | | | c | | | | | | |c| |
+-- | | +-- +-- # | | | +-- --+ +---- +-- | +-+ | | +-+ | --+
| | | | | | | | |c| | |
| | +-- | +-+-- +-+ +-- # +- # -+-- +-- | | --+ | | | | --+C|
|c| | | | c | | |c | | | |
+-+-+---+-+-----+---------+---------+---+-------------+---+$|
Labirin 8
------+-+-+---+-+---+-----------+---+-----+---------------+-+
^ | | | | | | | | | r | |
+-- | | | t | | +-- +----- # ---+-- +-- --+-- ----+-+ --+ | |
| | | | | | | r | | | | | |
| | | | | +-+ --+ --+-- --------+-- | ----+ --+ | | | --+ | |
| |r| | rotation | | | | | | $
+-+-+-+-----------------------------------+---+-+---+---+-+--
Labirin 9
|$|^--+-+---+-----+-+---+-+-+---+---+-+---+-----+
| | | | | | | | | | f | | | | |
| +-+ | | # +-+ --+ +-+ | | | # | +-+ +-- | ----+
| | | | f| | | | | | f |
| |F+-+ | | | | +---+ | | | ----+-+ | | --+ --+-+
| | | | | | | | | f | | | |
| | | | +-+-+---+-- | | | +-+-+-+ +-+ +--- # -+ |
| | | | | | | | | | | | | | |
+-+-+ | +---+ --+ | +---+-+ | | --+ f | | | | --+
| | | | | | | | | |
| --+f| | | +-- --+--f--+ --+ | ----+ | +-+ +---+
| | | | | | | | | |
+---+-----+-+-----+-----+---+-+-----------+-----+
Labirin 10
+-----+-+-----------+
| q | | q |
|Q+-+ | +-+-+-+---- |
$ | | | | | q |
+-+ | | | | | +-- +-+
| | | | | | |
| +-- +-+ |q| +-+ | |
| q| | | | |
| | | +-- | +-+ | --+
| | | | | | | |
+-+-+-+ +-+-+ +-- | |
| | | |
+--- # -+ | | +-- | |
| q | | | | ^
+-+ +-- | | +-+ | +-+
| | | | |q| | |
| +-+-+ | +-+-- | | |
| | | | | | |
| | | +-+-+-- +-+ +-+
| | | | q |
+-+-+---------+-----+
Aturan, Asumsi, Penilaian
- Celah standar dilarang
- Tulis program umum, bukan program yang hanya berfungsi untuk sepuluh kasus uji. Itu harus mampu menangani labirin yang sewenang-wenang.
- Anda mungkin berasumsi akan ada persis satu pintu masuk dan satu pintu keluar. Pintu masuk dan keluar akan selalu berada di perbatasan labirin.
- Anda dapat mengasumsikan bahwa semua input menggunakan dinding yang mengikuti aturan yang disebutkan di atas. Algoritma kompresi Anda tidak harus bekerja untuk labirin yang berisi dinding yang melanggar aturan tersebut.
- Labirin input mungkin atau mungkin tidak bisa dipecahkan.
- Anda dapat mengasumsikan labirin tidak akan lebih besar dari 100 karakter di kedua arah.
- Anda dapat berasumsi bahwa surat tidak akan muncul di tepi labirin. (Karena ini adalah kasus untuk contoh yang diberikan)
- Skor Anda adalah ukuran total, dalam byte (oktet), dari semua labirin terkompresi.
- Anda dapat menggunakan hex, base64, string biner, atau format serupa lainnya sebagai representasi untuk labirin terkompresi jika Anda merasa lebih nyaman. Anda masih harus menghitung hasilnya dalam seluruh oktet, dibulatkan untuk setiap labirin (mis. 4 basis64 digit adalah 3 byte, 2 digit hex adalah 1 byte, 8 digit biner adalah 1 byte, dll ...)
- Menang skor terendah!
ascii-art
code-challenge
compression
maze
Beefster
sumber
sumber
Jawaban:
JavaScript (Node.js) , skor =
586 541 503 492479 byteDinding disimpan sebagai aliran bit berkode Huffman yang menjelaskan apakah fungsi prediksi mengembalikan tebakan yang benar atau tidak.
Cobalah online!
Umum
Kompresi
Dekompresi
Bagaimana?
Labirin dikodekan sebagai aliran bit yang akhirnya dikonversi menjadi string.
Header
Header terdiri dari:
Data dinding
00
→0000
010
→0001
1001
→0010
11100
→0011
011
→0100
Bentuk dinding terakhir disimpulkan dengan cara yang mirip dengan jawaban Nick Kennedy .
Karakter spesial
Setiap karakter khusus dikodekan sebagai:
Kode karakter:
^
,$
,#
atau[a-z]
[A-O]
[P-Z]
sumber
deflate
? Ada banyak sekali di rak!R, skor 668 byte
Ini mengambil keuntungan dari kenyataan bahwa karakter dinding ditentukan oleh lingkungannya. Dengan demikian, karakter dinding dapat dikodekan sebagai bit. Info yang tersisa yang perlu disimpan adalah dimensi labirin, posisi awal dan akhir, serta posisi karakter non-dinding lainnya. Karena karakter non-dinding adalah ASCII, saya telah menggunakan bit paling signifikan dari setiap byte untuk menunjukkan apakah ada karakter lain yang mengikuti sehingga beberapa kata di labirin tidak harus memiliki lokasi setiap karakter disimpan terpisah. Perhatikan juga bahwa untuk labirin kurang dari atau sama dengan 256 karakter (misalnya hingga 16x16 atau labirin persegi panjang setara), posisi dapat disimpan dalam satu byte, sedangkan untuk labirin yang lebih besar posisi membutuhkan dua byte.
Fungsi utilitas
Algoritma kompresi
Algoritma dekompresi
Cobalah online!
sumber