Kompres ke Impress


8

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 0dan 1s dari bit-kompresi masukan ini .

Jumlah bit ( 0s dan 1s) 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 0dan 1s 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 0atau 1(jadi catprogram kosong untuk program kompresi dan dekompresi tidak mungkin).
  • Kode sumber Anda mungkin tidak hanya berisi 0s dan 1s, tidak termasuk no-ops (untuk mencegah bahasa pemrograman yang mencetak kode sumber sendiri secara default, di mana baik program kompresi dan dekompresi dapat menjadi tunggal 0atau 1, dan bagian no-ops adalah untuk mencegah perilaku ini dengan komentar yang tidak digunakan; maaf bahasa pemrograman berbasis biner yang hanya menggunakan 0s dan 1s 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 DecompressionProgramCompressionProgrambukan CompressionProgramDecompressionProgram, 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 0s dan 1s dengan benar, dan dapat mendekompres ini 0dan 1kembali 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')))

Cobalah online.

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)));}

Cobalah online.


Ini bukan tes quine, jadi bisakah saya membaca kode sumber saya?
Weijun Zhou

@ WeijunZhou Tergantung pada apa Anda menggunakannya, tapi saya mungkin mengizinkannya dalam banyak kasus. Saya kira Anda ingin membaca kode sumber Anda dan kemudian memetakan karakter yang mudah dengan tabel pencarian, atau sesuatu seperti itu?
Kevin Cruijssen

Ya, sesuatu yang serupa ada di pikiran saya.
Weijun Zhou

1
Saya mungkin telah melewatkan sesuatu, tetapi inilah celah yang mungkin dalam aturan: kompresor-> 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.
Leo

@ Leo Hmm, Anda memang benar bahwa aturan saat ini memungkinkan jawaban seperti itu (tentu saja tidak sengaja). Tidak yakin bagaimana cara memperbaikinya, .. Saya bisa menyatakan Anda harus memberikan pemetaan yang telah Anda gunakan untuk setiap karakter individu, yang harus sesuai / sama untuk input kompresor + dekompresor serta konfigurasi acak dari karakter ini. Tetapi dalam hal ini saya mungkin membatasi jawaban yang mungkin yang ingin mengompres pasangan karakter, atau apa pun yang muncul. Ada saran tentang aturan untuk menutup lubang lingkaran ini, tapi masih meninggalkan beberapa fleksibilitas untuk kreativitas ..?
Kevin Cruijssen

Jawaban:



2

Java (OpenJDK 9) , skor 702 bit, 88 (42 + 46) byte

Kompresor, 42 byte

$->new java.math.BigInteger($).toString(2)

Cobalah online!

Dekompresor, 46 byte

$->new java.math.BigInteger($,2).toByteArray()

Cobalah online!


Maaf, saya memainkan byte-biaya rendah ( hum , untuk Java, maksud saya) daripada kompresi keras: S
Olivier Grégoire

Bahkan tidak tahu itu mungkin untuk memasukkan apa pun Stringdi BigIntegerkonstruktor .. Kupikir itu akan memberikan NumberFormatException atau sesuatu .. Aku memang tahu tentang itu .toString(2). Golf yang bagus dari contoh saya menjawab saya kira. ;)
Kevin Cruijssen

@KevinCruijssen Memang, seperti saat ini, itu lebih merupakan contoh golf Anda daripada yang lainnya. 703 bit berarti 88 byte. Saya tidak bisa mengompres apa pun dalam waktu kurang dari 88 byte sejauh ini, tapi saya masih berusaha ;-)
Olivier Grégoire

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.