Terinspirasi oleh kedua tantangan "Unique is Cheap" oleh @Laikoni , di mana skornya berdasarkan pada tantangan itu sendiri, serta jawaban JavaScript (ES6) dari @ETHproductions untuk tantangan "Palindrome Compression" , di mana ia menggunakan yang cukup keren metode kompresi untuk flag palindrome, indikasi huruf besar / kecil, dan huruf.
Tantangan:
Anda akan membuat dua program / fungsi: program / fungsi kompres, dan program / fungsi dekompresi.
Program kompres / fungsi:
Mengingat karakter yang digunakan dalam kode sumber Anda sendiri (baik kode kompres dan dekompresi sumber gabungan) karena hanya masukan mungkin, menggunakan segala jenis metode bit-kompresi pilihan Anda dan output yang dihasilkan 0
dan 1
s dari bit-kompresi masukan ini .
Jumlah bit ( 0
s dan 1
s) yang dikeluarkan harus sesingkat mungkin, dan jumlah ini akan menjadi skor jawaban Anda .
Idenya adalah untuk memiliki keseimbangan yang bagus antara berbagai jenis karakter yang digunakan dalam kode sumber Anda sendiri, ukuran program / fungsi Anda, dan jenis kompresi bit yang Anda gunakan. Atau mengutip @RobertFraser dalam komentar ini :
Ini adalah contoh yang bagus dari dasar-dasar teknik. Mengambil deskripsi masalah, memikirkan berbagai cara untuk menyelesaikannya, dan membuat pertukaran antara persyaratan (yaitu berapa banyak bit yang didedikasikan untuk berbagai gaya), dll.
Aturan tantangan:
- Program / fungsi kompresor dan dekompresor harus dalam bahasa pemrograman yang sama.
- Anda harus menyediakan baik kompresi dan Program dekompresi / fungsi, dan jumlah
0
dan1
s output program kompresi Anda untuk kedua program / fungsi gabungan (concatted) sebagai masukan akan menjadi skor Anda. - Kompresi harus - jelas - bekerja untuk semua karakter yang digunakan dalam kode sumber Anda dari kedua program / fungsi kompresi dan dekompresi Anda, dalam urutan atau jumlah apa pun. (Ini dapat memiliki perilaku tidak terdefinisi untuk karakter apa pun yang tidak ada dalam kode sumber Anda.)
- Tipe input tidak harus berupa string. Bisa juga berupa daftar / larik / aliran karakter, dan bisa juga sebagai argumen program, STDIN, dll. Panggilan Anda.
Hal yang sama berlaku untuk output. Dapat dikembalikan dari fungsi atau dicetak ke STDOUT. Dapat berupa string tunggal, integer-array, dll. - Program kompresi Anda harus menampilkan setidaknya satu
0
atau1
(jadicat
program kosong untuk program kompresi dan dekompresi tidak mungkin). - Kode sumber Anda mungkin tidak hanya berisi
0
s dan1
s, tidak termasuk no-ops (untuk mencegah bahasa pemrograman yang mencetak kode sumber sendiri secara default, di mana baik program kompresi dan dekompresi dapat menjadi tunggal0
atau1
, dan bagian no-ops adalah untuk mencegah perilaku ini dengan komentar yang tidak digunakan; maaf bahasa pemrograman berbasis biner yang hanya menggunakan0
s dan1
s sebagai kode sumber). - Meskipun Anda harus mendukung input 0 atau lebih dari kumpulan karakter yang digunakan dalam program / fungsi Anda, Anda tidak harus mendukung input kosong. Jadi, Anda dapat mengasumsikan setiap input setidaknya terdiri dari 1 karakter.
- Input yang mungkin bisa lebih besar dari gabungan ukuran kompresi dan dekompresi Anda.
- Jika karena alasan apa pun metode kompresi Anda bergantung pada pesanan dan memiliki output yang lebih pendek ketika input Anda
DecompressionProgramCompressionProgram
bukanCompressionProgramDecompressionProgram
, Anda diizinkan untuk memilih salah satu urutan pemekatan dari program / fungsi Anda untuk skor Anda.
Contoh:
Katakanlah program kompresi ABC
, dan program dekompresi adalah 123aBc
. Untuk input apa pun yang mengandung nol atau lebih dari kumpulan karakter 123ABCab
, ia harus dapat mengkompres karakter-karakter tersebut dengan 0
s dan 1
s dengan benar, dan dapat mendekompres ini 0
dan 1
kembali ke karakter yang benar. Beberapa input contoh yang valid untuk kedua program ini dapat: ABC123aBc
(tentu saja); A
; 1Ca
; 22222b1121221b
; dll.
Aturan umum:
- Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat, program lengkap. Panggilanmu.
- Celah default tidak diperbolehkan.
- Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
- Juga, silakan tambahkan penjelasan jika perlu.
Contoh jawaban:
Java 8, skor 1440 bit, 180 (87 + 93) byte
Di sini implementasi yang sangat buruk di Java 8, di mana setiap karakter hanya dicetak sebagai 8-bit String biner.
Fungsi kompresi:
Masukan diberikan sebagai
java.util.stream.IntStream
.s->s.forEach(c->System.out.print("".format("%8s",Long.toString(c,2)).replace(' ','0')))
Fungsi dekompresi:
Masukan diberikan sebagai
String
.s->{for(Integer i=0;i<s.length();System.out.printf("%c",i.parseInt(s.substring(i,i+=8),2)));}
sumber
if input==compr_code+decompr_code then return 0 else return binary charcodes of input
, dekompresor->if input==0 then return compr_code+decompr_code else convert binary codes to characters and return them
. Skor akhir: 1 (serendah mungkin). Program tidak akan sepele untuk ditulis, tetapi dengan beberapa trik dari quines mereka pasti bisa dilakukan.Jawaban:
Jelly, skor 350, 39 + 30 = 69 byte
Kompresor: Jelly , 39 byte
Cobalah online!
Dekompresor: Jelly , 30 byte
Cobalah online!
sumber
Java (OpenJDK 9) , skor 702 bit, 88 (42 + 46) byte
Kompresor, 42 byte
Cobalah online!
Dekompresor, 46 byte
Cobalah online!
sumber
String
diBigInteger
konstruktor .. Kupikir itu akan memberikan NumberFormatException atau sesuatu .. Aku memang tahu tentang itu.toString(2)
. Golf yang bagus dari contoh saya menjawab saya kira. ;)Pyt , skor 179 bit, 9 + 10 = 19 byte
Kompresor:
Cobalah online!
Dekompresor:
Cobalah online!
sumber