Saya ingin secara kompak kode bilangan bulat positif xmenjadi bit, dengan cara yang memungkinkan decoding kembali ke bilangan bulat asli untuk decoder stateless mengetahui nilai maksimum mmasing-masing x; akan mungkin untuk secara unik memecahkan kode penyandian pengkodean, seperti halnya dalam pengkodean Huffman.
[Pengantar di atas memotivasi yang lain, tetapi bukan bagian dari definisi formal]
Notasi: untuk bilangan bulat non-negatif i, biarkan n(i)jumlah bit yang diperlukan untuk direpresentasikan idalam biner; itu adalah bilangan bulat non-negatif terkecil ksehinggai>>k == 0
i : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ..
n(i): 0 1 2 2 3 3 3 3 4 4 4 4 4 4 4 4 5 5 5 ..
Saya ingin fungsi yang F(x,m)didefinisikan untuk 0<xdan x<=m, dengan menghasilkan string ' 0' atau ' 1', memiliki properti ini:
F(x,m)memiliki panjang kurang dari2*n(x)atau2*n(m)-1, mana yang lebih kecil.- Jika
x<ykemudian:F(x,m)tidak lebih dariF(y,m);F(x,m)danF(y,m)berbeda pada beberapa posisi sepanjangF(x,m);- ada
0diF(x,m)pada posisi yang pertama.
- Ketika untuk
mproperti tertentu 1 dan 2 tidak secara unik mendefinisikanF(x,m)untuk semua positifxpaling banyakm, kami menolak setiap pengkodean memberikan lebihF(x,m)dari beberapa pengkodean yang dapat diterima, untuk yang terkecilxyang panjangnya tidak cocok.
Catatan: Dalam contoh di atas, secara implisit, 0<x, 0<y, 0<m, x<=m, dan y<=m, sehingga F(x,m)dan F(y,m)didefinisikan.
Diminta program terpendek yang, mengingat xdan mmemenuhi batasan di atas dan hingga 9 angka desimal, menghasilkan F(x,m)konsisten dengan aturan di atas. Kerangka kerja C berikut (atau yang setara dalam bahasa lain) tidak dihitung:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define C(c) putchar((c)?'1':'0') // output '0' or '1'
#define S(s) fputs((s),stdout) // output a string
typedef unsigned long t; // at least 32 bits
void F(t x,t m); // prototype for F
int main(int argc,char *argv[]){
if(argc==3)F((t)atol(argv[1]),(t)atol(argv[2]));
return 0;}
void F(t x,t m) { // counting starts on next line
} // counting ends before this line
Komentar: Properti 1 secara agresif membatasi panjang yang disandikan; properti 2 memformalkan bahwa decoding tidak ambigu dimungkinkan, dan mengkanonik encoding; Saya menegaskan (tanpa bukti) ini cukup untuk secara unik mendefinisikan output Fkapan m+1kekuatan dua, dan bahwa properti 3 cukup untuk secara unik mendefinisikan Funtuk lainnya m.
Ini adalah tabel parsial (buatan tangan; versi pertama yang diposting penuh dengan kesalahan, maaf):
x : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
F(x,1) : empty
F(x,2) : 0 1
F(x,3) : 0 10 11
F(x,4) : 0 10 110 111
F(x,5) : 0 10 110 1110 1111
F(x,6) : 0 100 101 110 1110 1111
F(x,7) : 0 100 101 1100 1101 1110 1111
F(x,8) : 0 100 101 110 11100 11101 11110 11111
F(x,15) : 0 100 101 11000 11001 11010 11011 111000 111001 111010 111011 111100 111101 111110 111111
11111, membuat penguraian sandi mustahil dilakukan. Dengan pengkodean yang diusulkan, gabungan beberapa output dapat diterjemahkan secara unik (termasuk dengan mperubahan maksimum secara dinamis). Saya mencoba mengklarifikasi itu.