Latar Belakang
Setelah menerapkan BWT (seperti yang terlihat di Burrows, Wheeler dan Kembali ) dan MTF (seperti yang terlihat di Pindahkan ke depan ASCII yang dapat dicetak ), kompresor bzip2 menerapkan bentuk pengodean run-length yang agak unik.
Definisi
Untuk tujuan tantangan ini, kami mendefinisikan transformasi BRLE sebagai berikut:
Diberikan string input s yang hanya terdiri dari karakter ASCII dengan titik kode antara 0x20 dan 0x7A, lakukan hal berikut:
Ganti setiap run karakter yang sama dengan kemunculan tunggal karakter dan simpan jumlah pengulangan setelah yang pertama.
Menyandikan jumlah pengulangan setelah kemunculan karakter yang pertama , menggunakan bijective base-2 numeration dan simbol
{
and}
.Sebuah bilangan bulat non-negatif n dikodekan sebagai string b k ... b 0 sehingga n = 2 k i (b k ) + ... + 2 0 i (b 0 ) , di mana i (
{
) = 1 dan i (}
) = 2 .Perhatikan bahwa representasi ini selalu unik. Misalnya, angka 0 dikodekan sebagai string kosong.
Masukkan string kurung keriting yang mengkodekan jumlah pengulangan setelah kemunculan tunggal karakter yang sesuai.
Contoh langkah demi langkah
Input: "abbcccddddeeeeeffffffggggggghhhhhhhh"
Step 1: "abcdefgh" with repetitions 0, 1, 2, 3, 4, 5, 6, 7
Step 2: "" "{" "}" "{{" "{}" "}{" "}}" "{{{"
Step 3: "ab{c}d{{e{}f}{g}}h{{{"
Tugas
Menerapkan program atau fungsi yang tidak sadar yang membaca string tunggal dari STDIN atau sebagai baris perintah atau argumen fungsi dan mencetak atau mengembalikan BRLE atau kebalikan dari string input.
Jika input tidak mengandung kurung keriting, terapkan BRLE. Jika input berisi kurung keriting, terapkan kebalikannya.
Contohnya
INPUT: CODEGOLF
OUTPUT: CODEGOLF
INPUT: PROGRAMMING
OUTPUT: PROGRAM{ING
INPUT: PUZ{LES
OUTPUT: PUZZLES
INPUT: 444488888888GGGGGGGGGGGGGGGGWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
OUTPUT: 4{{8{{{G{{{{W{{{{{
INPUT: y}}}{{
OUTPUT: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
Aturan tambahan
Anda tidak dapat menggunakan bawaan apa pun yang menghitung BRLE atau kebalikan dari string.
Anda dapat menggunakan bawaan yang:
Hitung RLE atau RLD dari suatu string, selama jumlah repetisi tidak disimpan dalam bijective base-2.
Lakukan konversi basis apa pun.
Kode Anda dapat mencetak baris tambahan jika Anda memilih STDOUT untuk hasil.
Kode Anda harus berfungsi untuk input 1000 atau kurang karakter ASCII dalam rentang dari 0x20 hingga 0x7A, ditambah kurung keriting (0x7B dan 0x7D).
Jika input berisi kurung keriting, Anda dapat mengasumsikan bahwa itu adalah hasil valid dari menerapkan BRLE ke string.
Aturan golf kode standar berlaku. Pengajuan terpendek dalam byte menang.
sumber
Jawaban:
CJam,
5048 byteTerima kasih untuk Dennis karena telah menghemat 2 byte.
Cobalah online.
Penjelasan
sumber
Pyth, 48
50byte2 byte berkat @Maltysen.
Demonstrasi. Uji harness.
Penjelasan:
sumber
"{}"
yang bisa Anda gunakan`H
, ikat dengan CJam :)OCaml, 252
t
adalah fungsi yang melakukan transformasi.Awalnya saya berpikir saya harus memeriksa keberadaan kurung kurawal, tetapi ternyata tidak perlu. Dekoding jelas tidak berpengaruh pada string yang sudah diterjemahkan, dan bagian pengkodean terbukti sama-sama tidak berbahaya bagi string yang sudah dikodekan.
sumber
the encoding part proved equally harmless
melakukannya? Pengkodean4{{8{{{G{{{{W{{{{{
tidak Anda dapatkan4{{8{}G{{{W{{}
?JavaScript ( ES6 ), 162
Beberapa penjelasan
Nomor n ke BB2 menggunakan 0 dan 1:
(n+1).toString(2).slice(1)
String dalam BB2 ke nomor: to_number ("0b1" + string) - yaitu, tambahkan 1 digit biner paling kiri dan konversikan dari biner (dan kurangi dengan 1, tidak diperlukan dalam contoh khusus ini).
Ekspresi reguler untuk menemukan karakter apa pun yang diikuti oleh
{
atau}
:/[^{}][{}]+/g
Ekspresi reguler untuk menemukan karakter yang diulang:
/(.)\1*/g
Menggunakan regexp di ganti, param pertama adalah char "repeat" (akhirnya hanya mengulang 1 kali), param kedua adalah total string yang diulang, yang panjangnya adalah angka yang harus saya encode dalam BB2 sudah bertambah 1
... lalu letakkan semuanya ...
sumber