The Kolmogorov kompleksitas dari string s didefinisikan sebagai panjang dari Program terpendek P yang output s. Jika panjang P lebih pendek dari panjang s, maka s dikatakan dapat kompres , jika tidak maka s tidak dapat dimampatkan . Sebagian besar string tidak dapat dimampatkan ...
Tulis program terpendek yang menghasilkan string ini (tanpa spasi dan tanpa baris baru):
d9 a6 b6 33 56 a7 95 4b 29 b0 ac 7f 2a aa 6d 19 b8 4b 4c f8 b6 2a ac 95
a1 4b 4e a5 9d b3 e7 c9 4c 49 59 ec 94 b3 aa 6c 93 8f 11 5a 4d 39 75 82
ec ea 24 cc d3 2d c3 93 38 4e b7 a6 0d d2 b5 37 23 54 ad 1b 79 aa 6e 49
55 52 94 5a a7 3a 6a e9 e4 52 cd 2d 79 ad c6 12 b5 99 5b b4 76 51 17 4e
94 f3 9a a2 e7 15 6a 55 14 4d 4e 4a a3 5c 2f ab 63 cc b5 a6 a4 92 96 8a
2e c3 d8 88 9b 8c a9 16 f5 33 22 5b a2 e2 cc 1b 27 d4 e8 db 17 a4 39 85
ca aa 5b 4f 36 24 d3 c6 f6 94 ad d7 0f 71 24 e1 b1 c5 ef 65 35 6c 8d d7
1a 87 1e 25 df 5d c0 13 b2 6f 5a 57 28 98 bd 41 66 04 ed a2 52 c9 ac 83
b3 6c 56 7e d1 c6 cc 53 4a 62 c5 59 a9 b2 d4 af 22 a5 a9 f4 b2 99 23 32
f8 fb ae 48 6a 8a 9a b5 46 7a 36 59 9f 92 d3 25 b5 19 bd 8a 4a 49 62 a5
e4 59 fb e5 ba a2 35 dd a9 36 1d a9 c9 69 89 77 6a b2 34 2d 1d 22 61 c5
c2 66 1c e2 76 74 52 a5 d9 84 b9 8a a6 b5 14 ec 29 58 b2 bc 96 16 16 48
f5 c5 bd 2f 32 1b 3d 4f 4b 2e b2 6b 9a d9 32 a4 4b 5c bc 92 b7 b3 26 39
fa 42 2d 64 ed 1a 79 49 4c a3 b7 85 b2 a6 e2 8c d9 55 90 e1 a8 87 4b 60
a6 e1 ba c4 bb ec 32 39 76 90 a6 b4 c6 65 79 61 91 aa 3d 54 b7 18 3d 15
4b 06 db 30 8a 4d 4a a1 35 75 5d 3b d9 98 ac 55 5b 10 dd b3 e2 cc f1 5e
b3 2b 53 90 b6 ee 2b ac 8f 88 8d 95 5a 75 df 59 2d 1c 5a 4c e8 f4 ea 48
b9 56 de a0 92 91 a9 15 4c 55 d5 e9 3a 76 8e 04 ba e7 b2 aa e9 ab 2a d6
23 33 45 3d c4 e9 52 e3 6a 47 50 ba af e4 e5 91 a3 14 63 95 26 b3 8b 4c
bc aa 5a 92 7a ab ad a6 db 53 2e 97 06 6d ba 3a 66 49 4d 95 d7 65 c2 aa
c3 1a 92 93 3f ca c2 6c 2b 37 55 13 c9 88 4a 5c 62 6b a6 ae cc de 72 94
Outputnya akan terlihat seperti:
d9a6b63356a7954b29b0ac7f2aaa6d19b84b4cf8b62aac95a14b4e...7294
Catatan: tidak ada input pengguna yang diizinkan, atau akses web, atau perpustakaan (kecuali yang diperlukan untuk mencetak output).
Sunting I: urutannya tampak acak ... tetapi ternyata sangat kompresif menangani sedikit bilangan prima ...
Sunting II: Bagus sekali! Saya akan meninjau jawaban dalam beberapa jam ke depan, lalu memberikan hadiah. Ini adalah ide saya tentang bagaimana hal itu dapat diselesaikan:
- Jika Anda mencoba mengompres data Anda tidak pergi jauh ...
- Di internet, Anda dapat menemukan Encyclopedia On-Line Sequences Integer (OEIS) (terkenal? );
- mencoba digit heksadesimal pertama
d9, a6, b6, 33, ...
(atau representasi desimalnya) tidak memberikan hasil; - tetapi jika Anda mengonversi angka menjadi biner (
1,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0
) dan mencarinya di OEIS, Anda mendapatkan hasil ini . - Seperti dicatat oleh Claudiu, saya juga memberi sedikit petunjuk dalam pertanyaan (Edit I di atas) ... :-)
Pemenangnya adalah : Peter Taylor (GolfScript, 50), dengan perhatian khusus untuk Claudiu (Python, 92), orang pertama yang "memecahkan" itu.
sumber
Jawaban:
GolfScript (50 byte)
Karena semua orang sekarang mengungkapkan kode mereka, saya juga akan mendahului permintaan OP untuk tidak mengganggu:
Ikhtisar diseksi
38200,{:x,{)x\%!},,2=},
4/
p
kep&2 != 0
, dan lakukan konversi basis-2 ke basis-16:{3\{2&!!1$++}/.57>39*+}%
(di sinilah trik-trik menariknya)+
Diseksi yang lebih rinci tentang konversi basis
Dengan tumpukan yang berisi string kosong dan daftar bilangan prima, kita perlu melakukan dua konversi:
Ada banyak cara yang sama panjang untuk dilakukan 1; misalnya
atau bahkan
Untuk 2, pendekatan yang jelas adalah
Tetapi basis adalah kata yang panjang, dan karena 16 = 2 4 kita dapat dengan mudah menyimpan beberapa karakter
Sekarang limbah yang paling jelas adalah 18 karakter yang dikhususkan untuk string itu. Kami hanya ingin fungsi dari angka ke kode ASCII. Kami ingin memetakan
0
ke'0' = 48
, ...,9
ke'9' = 57
,10
ke'a' = 97
, ...15
ke'f' = 102
.Tapi sekarang lemparkan ke campuran larangan
base
. Kita perlu mengimplementasikannya sendiri. Implementasi yang jelas (ke arah ini, yang mudah) adalahk base
lipatan{\k*+}*
. Alternatif sedikit lebih panjang adalah iterasi sederhana, yang membutuhkan kasus dasar:0\{\k*+}/
. Basis 2 sedikit istimewa:1$++
setara dengan\2*+
untuk panjang yang sama, dan saya telah mengambil pendekatan itu.Keduanya lebih panjang dari 5-char
2base
, tetapi karena kita sekarang mengulangi nilai-nilai kita dapat menarik bagian 1 untuk memiliki satu loop. Kami gantidengan
untuk penghematan 1-char yang bagus, atau
untuk kerugian 1-char.
Tetapi meskipun kerugian 1-char itu terlihat seperti langkah mundur, pertimbangkan apa yang terjadi pada 0. Itu dikalikan dengan 16 dan ditambahkan ke output konversi basis. Dan hal terakhir yang kami lakukan adalah menambahkan kelipatan 16 pada output. Jadi kita bisa menggabungkan keduanya sebagai
Sambungan terpendek dan kepintaran bonus membuatnya lebih menarik.
sumber
base
? Semua solusi lain menggunakan yang setara (penggunaan tambanghex
, penggunaan C satuprintf("%x")
, penggunaan haskellshowHex
)base
ini lebih lama daripada yang ini, karena saya melakukan sebagian besar optimasi setelah mengklarifikasi bahwa saya tidak bisa menggunakannya.base
memberi saya nilai dari 0 hingga 15, jadi masih perlu beberapa pekerjaan untuk dikonversi ke0-9a-f
. Saya mungkin mengunjungi kembali menggunakanbase
beberapa titik, tetapi tidak malam ini.Python, 92 karakter
Ini dia tuan-tuan, kodenya sendiri!
Marzio meninggalkan sedikit pintar dengan mengatakan bahwa "itu ternyata sangat kompresibel menangani sedikit bilangan prima". Saya yakin "sedikit" itu tidak dicetak miring secara tidak sengaja, jadi saya mengubah string heks menjadi bit dan mencoba menemukan pola. Saya pikir pada awalnya dia mewakili semua bilangan prima sebagai bit dan menyatukannya, tetapi itu tidak berhasil. Maka mungkin mengambil hanya beberapa digit, atau menjatuhkan semua nol dalam string bit - masih belum. Mungkin itu adalah bitstring dari bit paling tidak penting dari beberapa bilangan prima pertama? Tidak terlalu. Tapi akhirnya saya menemukan yang berhasil - ini adalah bitstring dari bit paling tidak signifikan kedua dari bilangan prima pertama namun banyak.
Jadi, kode saya tidak hanya itu: menghasilkan bilangan prima yang cukup, ambil bit kedua dari masing-masing (
i/2%2
), menggabungkannya sebagai string biner, kemudian mengubahnya menjadi basis-10 (int(..., 2)
) dan kemudian ke basis-16 (hex(...)
).sumber
Haskell, 105
Hash SHA1:
a24bb0f4f8538c911eee59dfc2d459194ccb969c
Keluaran:
Edit: Kode:
Saya melewatkan aturan tentang tidak menggunakan fungsi pustaka kecuali untuk mencetak (putStr). Saya akan berasumsi bahwa operator matematika, sementara mereka secara teknis berfungsi, diizinkan.
sumber
C,
136116109103 karakterBaiklah kalau begitu, inilah usaha saya:
sumber
printf
mengembalikan jumlah karakter yang ditulis, yang selalu non-nol di sini, Anda dapat menggunakan!printf(...)
alih-alihprintf(...)*0
menyimpan satu karakter.JS, 764
jika kita menganggap string ini sebagai base64, kita dapat memiliki versi yang lebih kecil menggunakan versi un-base-64-ed:
Tapi saya pikir penulis ingin kita menemukan logika di balik string non-acak ini.
sumber
Mathetmatica - 56
Misterinya sudah terpecahkan, jadi tinggal menerapkan idenya
sumber
J - 46 char
Jangan pikirkan aku, hanya mencatat J golf di sini untuk anak cucu. Tidak cukup pintar untuk memahami triknya.
Dijelaskan:
p:i.1007 4
- Buat 1007-baris, 4-kolom matriks bilangan bulat dari 0, lalu ambil bilangan prima yang sesuai dengan bilangan bulat itu. Ya,p:
adalah builtin J. Ya, kami empat bilangan prima pendek.2|<.-:
- Membagi dua setiap angka (-:
), lantai itu (<.
), dan ambil modulo 2 itu (2|
). Ini sama dengan mengambil bit signifikan berikutnya-untuk-sewa.#.
- Konversi setiap baris hasil dari basis 2 menjadi bilangan bulat. Ini memberi kita 1007 angka dari 0 hingga 15 inklusif.'0123456789abcdef'{~#.
- Ambil setiap baris matriks bit ini sebagai biner untuk sebuah angka, dan gunakan angka itu untuk memilih dari daftar digit hex. Ini mengkonversi setiap empat bit ke dalam hex.1!:2&4
- J interpreter memiliki masalah dengan menghasilkan string yang lebih panjang dari 256 karakter, jadi kami harus mengirim data ini langsung ke stdout. Anda memenangkan beberapa, Anda kehilangan beberapa.4[
- Akhirnya, buang hasil dari1!:2
dan sebagai gantinya output yang hilang 4 dari output. Kami melakukan ini karena lebih pendek daripada memasukkan empat bilangan prima terakhir dan mengembalikan hasil kosong di sini.sumber
JS, 503
Mengikuti ide @xem:
sumber
Mathematica, 55
Diuji pada Mathematica 8. Ini menggunakan dua pengamatan:
FromDigits
sebenarnya tidak memeriksa rentang angka yang diberikan, jadi jika Anda menerapkannya ke daftar formulir,{2,0,2,2,0,...}
Anda hanya mendapatkan hasil dua kali lipat seolah-olah melamar{1,0,1,1,0,...}
. Tapi itulah bentuk yang dihasilkan olehBitAnd
bilangan prima dengan 2.sumber