Tantangan
Tugas Anda adalah menyandikan integer sebagai string karakter ASCII , lalu berhasil mendekodekannya setelah string tersebut diacak secara acak.
Anda akan menulis dua program / fungsi , yang akan disebut sebagai Encoder dan Decoder .
Encoder
- Input: bilangan bulat dalam kisaran .
- Output: string dari ASCII karakter (tidak harus dicetak).
Dekoder
- Input: permutasi acak dari string .
- Output: bilangan bulat .
Mencetak gol
Biarkan menjadi panjang maksimum dari di semua nilai yang mungkin dari . Jika Encoder bertindak non-deterministik (yang diizinkan, lihat di bawah), maka akan menjadi panjang maksimum yang mungkin terjadi (mungkin ).
Biarkan menjadi panjang Encoder dalam byte dan yang panjang Decoder dalam bytes.
Maka skor Anda adalah .
Kemenangan diberikan kepada pengajuan tersebut skor terendah .
Batas waktu
Ada batas waktu yang agak arbitrer 1 menit pada waktu eksekusi Encoder dan Decoder untuk testcase tunggal (yaitu nilai tunggal ).
Tujuannya adalah untuk menghindari solusi yang menemukan bahwa memaksa enkode dengan menghitung semua urutan dengan sifat-sifat tertentu. Jika solusi Anda melakukan sesuatu yang lebih pintar dari itu, kemungkinan besar akan sesuai dengan batasan waktu dan akan dianggap valid. Demikian juga, jika bekerja pada TIO untuk beberapa nilai n yang dipilih secara acak itu akan dianggap valid. Kalau tidak, saya akan mengujinya di komputer saya, tetapi perhatikan bahwa jika solusi Anda murni kasar, hampir pasti akan gagal.
Aturan
- The Encoder dan Decoder harus ditulis dalam bahasa yang sama .
- The Decoder keharusan output yang benar bilangan bulat untuk setiap permutasi yang mungkin dari string dikembalikan oleh Encoder .
- The Encoder dan Decoder yang tidak diizinkan untuk berbagi informasi dengan cara apapun (misalnya dengan cara variabel global atau file).
- Output dari Encoder perlu tidak menjadi deterministik (yaitu, input yang sama dapat menghasilkan string output yang berbeda jika Encoder dijalankan beberapa kali), tetapi Decoder harus selalu menebak bilangan bulat yang benar .
- The Encoder dan Decoder dapat mengambil dan mengembalikan bilangan bulat dalam setiap cara yang nyaman (misalnya jika itu baik untuk masukan untuk menjadi
14
,"14"
atau[1,4]
). - The Encoder mungkin keluaran string baik dengan mencetak pada
stdout
atau dengan mengembalikan string, daftar / array karakter atau daftar / array bilangan bulat dalam rentang ; perhatikan bahwa Decoder akan menerima sebagai input permutasi dari seperti yang dikembalikan oleh Encoder , sehingga ia harus menerima string dalam format yang sama dengan . - Celah standar dilarang.
- Jika memungkinkan, jelaskan cara kerja kode Anda dan mengapa skor yang Anda klaim benar.
Contoh
Asumsikan .
- The Encoder menerima
14
sebagai masukan. Ini dapat menghasilkan"qwerty"
.- The Decoder menerima permutasi dari
"qwerty"
sebagai masukan, misalnya"tweyqr"
. Ini harus menampilkan14
(dalam format apa pun yang nyaman).
The Encoder bisa kembali [113,119,101,114,116,121]
juga, dalam hal ini Decoder akan menerima (misalnya) [116,119,101,121,113,114]
.
Perhatikan bahwa string yang dikembalikan oleh Encoder juga dapat menyertakan karakter ASCII yang tidak dapat dicetak (tetapi selalu dalam jangkauan [0x00, ..., 0x7F]
).
Jawaban:
Jelly , (17 byte + 18 byte) × panjang 6 = 210 poin
Cobalah online! (atau dengan info debug tambahan)
Setelah mencoba menyelesaikan tantangan ini dengan tujuan pada kondisi kemenangan yang dinyatakan, saya pikir akan menarik untuk mencari kondisi kemenangan alternatif hipotetis: kode-golf memberikan panjang maksimum minimum yang mungkin untuk output.
Penjelasan
Pengkodean
Langkah pertama dalam encoding adalah merepresentasikan input sebagai basis 36 (
b36
). 36 6 = 2176782336> 2147483647, sehingga akan ada paling banyak 6 digit dalam hasil, yang masing-masing berada dalam kisaran 0–35.Selanjutnya, kami mengubah ini menjadi representasi yang berisi 6 digit berbeda . Ada beberapa kemungkinan algoritma untuk ini, tetapi yang digunakan di sini adalah menambahkan 1 ke digit terkecil, 2 ke terkecil terkecil, 3 ke terkecil ketiga, dan seterusnya. Ini berarti bahwa jika dua digit sama, salah satunya akan dianggap lebih kecil, dan dengan demikian mereka akan menjadi berbeda; dan jelas, algoritma ini tidak dapat menyebabkan dua digit yang berbeda menjadi sama. Untuk mewakili ini dalam Jelly, kami menggunakan
Ụ
("urutkan indeks menurut nilai") untuk mendapatkan daftar indeks dalam urutan yang diurutkan;Ụ
lagi untuk membalikkan itu, secara efektif memetakan setiap elemen asli ke posisinya dalam urutan diurutkan; danµ…+
untuk menambahkan yang asli ke daftar baru. Hasilnya adalah representasi dari nomor input sebagai enam digit yang berbeda dalam rentang 1-41 (minimum 0 + 1, maksimum 35 + 6).Kami kemudian membaginya menjadi bentuk lain: daftar angka yang diurutkan dalam kisaran 1-41, di samping angka dari 1 hingga 720 yang mewakili dari 720 kemungkinan permutasi yang ada di dalamnya. (
Œ¿
DanṢ
ekstrak nomor permutasi dan diurutkan daftar masing-masing.)Akhirnya, kami mengubah angka dari 1 menjadi 720 menjadi basis 3 (
b3
), membalikkannya (U
), dan menyandikan enam basis 3 digit dan enam 1-41 digit melalui pengemasan masing-masing menjadi karakter ASCII tunggal menggunakan reverse divmod (nilai dari karakter mod 3 adalah angka dasar 3, nilai yang dibagi 3 adalah angka 1-41). Kisaran hasil yang mungkin adalah (1 × 3) + 0 = 3 minimum, dan (41 × 3) + 2 = 125 maksimum, sesuai dengan rentang ASCII kami. Pengepakan dilakukan melalui×3
dan+
, bersama dengan tambahanµ
untuk memastikan bahwa setiap perintah beroperasi pada bit data yang tepat. (Ada sedikit trik bermain golf di sini, karena kita melakukan perkalian dengan 3 sebelum mengekstraksi permutasi; yang menghemat kebutuhan untuk menghabiskan satu byte pada karakter pengelompokan.)Kebetulan, alasan untuk membalikkan angka dasar 3 adalah karena ia mungkin memiliki lebih sedikit digit daripada angka 1-41. (Tidak dapat memiliki lebih banyak; angka terkecil yang n !> 3 n sedikit di atas 6.) Jelly secara efektif memasukkan angka nol saat menambahkan dua angka dengan panjang yang berbeda, untuk membuatnya cocok; membuntuti nol akan memengaruhi interpretasi angka, tetapi memimpin nol tidak akan, jadi sebaliknya digunakan untuk memastikan bahwa nol tambahan berakhir di suatu tempat yang tidak akan mengacaukan jawaban kami.
Decoding
Langkah pertama dalam decoding adalah mengekstraksi dua angka (angka dasar 3 dan angka 1-41). Kita dapat memperoleh digitnya cukup mudah dengan masing-masing divisi (
:3
) dan modulo (%3
), tetapi bagaimana cara mengetahui urutannya? Nah, angka 1-41 memiliki digit dalam urutan, dan digit pada posisi yang sesuai dari dua angka itu disimpan dalam karakter yang sama; dengan demikian, kita dapat menentukan urutan angka 1-41 yang diacak (dengan melihat nilai relatifnya) dan mengetahui bahwa angka angka dasar-3 harus dikocok dengan cara yang sama. Faktanya, karena karakter pengkodean ASCII kami mengurutkan dengan cara yang sama dengan digit angka 1-41 (ini semua berbeda dan mereka lebih signifikan daripada angka dasar 3),Ṣ
. Jadi kedua ekstraksi dimulai denganṢ
, diikuti oleh%3
atau:3
sesuai.Sementara angka 1-41 angka masih dalam urutan, kami memiliki cara yang sangat mudah untuk kembali ke angka 0–35 dari basis 36; kurangi saja 1 dari yang pertama, 2 dari yang kedua, 3 dari yang ketiga, dan seterusnya. Di Jelly, kita bisa melakukannya dengan
_J
("kurangi indeks").Sementara itu, di cabang lain dari decode, kita membalikkan digit angka 3 basis kembali ke urutan (
U
), dan mengubahnya dari basis 3 kembali menjadi indeks permutasi denganḅ3
.Kami kemudian dapat menggabungkan dua cabang dengan
œ?Ç
;œ?
berarti "permutasi yang diberikan indeks permutasi ini", danÇ
berarti "hasil penerapan garis di atas", yaitu yang memberitahu Jelly untuk menjalankan kedua saluran secara terpisah pada input yang sama.Apa yang kita miliki sekarang adalah digit dari angka asli, dalam basis 36 (karena
_J
), dan dalam urutan asli (karenaœ?
), jadi kita bisa melakukan aḅ36
untuk mengubah kembali dari basis 36 menjadi bilangan bulat tunggal.Komentar
TIO! tautan di atas menggunakan 312699167 sebagai nomor untuk disandikan. Angka ini dalam basis 36 adalah
[5, 6, 6, 8, 7, 35]
, dan dengan demikian menunjukkan semua aspek pengkodean: 35 menguji batas kisaran 0-127 yang kita miliki; duplikat 6s menguji resolusi angka identik dalam basis asli 36; dan fakta bahwa angka-angka hampir (tetapi tidak cukup) diurutkan berarti bahwa angka permutasi sangat kecil, sehingga memberikan angka lebih sedikit daripada angka dasar 36, dan dengan demikian menunjukkan kebutuhan untuk membalikkannya sebelum menambahkannya ke aslinya.Sangat nyaman bagaimana semua konstanta di sini cocok bersama. 36 6 hanya cukup tinggi untuk memenuhi 2 31 , 3 6 hanya cukup tinggi untuk masuk ke 6 !, dan (36 + 6) × 3 hanya cukup tinggi untuk masuk dalam 128 kemungkinan yang kita miliki. (Kendala terakhir di sini adalah yang paling ketat, karena kita bisa menggunakan pengindeksan 0 daripada pengindeksan 1 untuk menggunakan karakter dalam kisaran 0-2. Namun, itu hanya akan memberikan ruang yang cukup untuk menggunakan 37 sebagai basis daripada dari 36.)
sumber
Jelly , (
43 byte +65 byte) × panjang 8 =8064 poinCobalah online!
Jelly , (
21 byte +43 byte) × panjang 10 =6040 poinCobalah online!
Penjelasan
Solusi 1
Ini menggunakan algoritma yang berbeda dari sebagian besar jawaban lainnya. Kami mulai dengan menyandikan nilai dalam heksadesimal (
b⁴
), seperti dengan jawaban lainnya, kemudian mengambil jumlah kumulatif (Ä
). Setiap input jelas akan memberikan output yang berbeda (karena kedua operasi ini dapat dibalik), dan mengingat bahwa pengkodean heksadesimal akan berisi paling banyak 8 digit yang maksimumnya 7 (untuk digit terakhir ke-8) dan 15 (untuk yang terakhir hingga ke-7- digit terakhir), jumlah maksimum dalam daftar output adalah 7+ (7 × 15) = 112, kurang dari 127 yang diminta oleh pertanyaan. Selain itu, output harus dalam urutan, memungkinkan kami untuk membalikkan acak.Untuk dekoder, pertama-tama kita membalikkan shuffle dengan sort (
Ṣ
); lalu balikkan jumlah kumulatif, dengan mendahulukan nol (Ż
) dan mengambil perbedaan pasangan berturut-turut (I
); lalu konversikan kembali dari heksadesimal (ḅ⁴
).Solusi 2
Pertanyaannya sebenarnya memungkinkan kita untuk mengambil input sebagai daftar (mungkin desimal) digit, sehingga kita dapat "menipu" dengan hanya menghapus konversi basis; jumlah maksimum yang digunakan dalam output kemudian akan menjadi 2 + (9 × 9) = 83 (sebenarnya 82 karena 2999999999 berada di luar jangkauan, jadi input terburuk yang mungkin adalah 1999999999). Pengkodean yang dihasilkan cukup mengerikan ketika pengodean untuk masalah ini berjalan, tetapi memiliki keuntungan menjadi sangat singkat untuk dihasilkan, yang lebih penting daripada verbositas pengodean.
Jawaban ini terasa sangat curang. Itu bukan solusi utama saya untuk masalah ini, tetapi sepertinya layak untuk ditambahkan karena secara teknis sesuai dengan aturan dan menghasilkan skor yang lebih baik.
Komentar
Saya memiliki beberapa algoritma dalam pikiran untuk mendapatkan di bawah panjang 8, tetapi tampaknya tidak mungkin Anda dapat menerapkan algoritma panjang-7 dalam ≤9 byte (non-curang) atau ≤5 byte (curang), jadi dengan penilaian dalam pertanyaan, ini kemungkinan cara terbaik untuk melakukannya. (Namun saya mungkin harus mencoba solusi untuk alternatif "meminimalkan panjang penyandian", hanya untuk bersenang-senang.)
Tidak seperti beberapa solusi, penggunaan 16 sebagai basis di sini tidak kritis; ada banyak nomor lain yang bisa digunakan untuk solusi panjang 8 (mis. 18). Saya memilih 16 untuk solusi pertama hanya karena Jelly memiliki cara 1-byte untuk menyatakan hal itu, dan basis-basis lain yang layak perlu menggunakan banyak byte dari program. Tentu saja, solusi kedua perlu menggunakan 10 sebagai basis untuk mengeksploitasi celah.
Terima kasih kepada @Dennis karena menunjukkan beberapa perintah Jelly yang lebih baru yang membuat algoritma ini lebih sulit untuk ditulis.
sumber
Ä
kependekan dari+\
,Ż
kependekan dari0;
.Bahasa Pemrograman Shakespeare , 10 * (264 + 494) =
8650 79107580Encoder: 264 byte
Cobalah online!
Decoder: 494
Cobalah online!
Ini suatu hal.
Encoder mengkodekan setiap digit sebagai digit plus indeks dari digit dua belas kali. Decoder menyimpan semua input dalam memori Ford dan kemudian loop di atas penghitung, mengeluarkan kemudian menghapus setiap digit lebih rendah dari penghitung * 12 + 10.
Penjelasan:
Encoder
Dekoder
sumber
Python 2.7, 31 * (52 + 37) = 2759
Encoder (
6952 byte):Dekoder (
4137 byte):Menyimpan semua bit non-nol dalam jumlah input sebagai nilai ascii. Nilai karakter ascii menyimpan posisi bit yang ditetapkan. Misalnya nilai 'a' akan berarti bahwa bit ke-97 diatur.
Beberapa perbaikan, terima kasih kepada @ Delfad0r
Cobalah online!
sumber
e =
dand =
di awal - fungsi anonim baik-baik saja. Juga, perhatikan bahwa pernyataan masalah dengan jelas mengatakan bahwa Encoder dapat mengembalikan daftar bilangan bulat alih-alih karakter, sehingga Anda dapat menghindari integer konversi-> karakter-> integer. Selain itu, Anda dapat menggunakan dann&(1<<i)
bukannyan&(1<<i)>0
menyimpan 2 byte. Akhirnya, batas atas untuki
(127) terlalu banyak, 32 sudah cukup dan menghemat 1 byte.(52+37)*31=2759
sejak terpanjang adalah ketika semua 31 bit ditetapkan.lambda n:[chr(i)*(n&1<<i>0)for i in range(32)]
menyimpan 6 byte.Stax , skor 8 × (10 + 9) = 152
Encoder, 10 byte
Jalankan dan debug itu
Encoder menampilkan string dalam urutan yang meningkat.
Decoder, 9 byte
Jalankan dan debug itu
sumber
05AB1E , 8 panjang maksimum * (8 + 7) byte = 120
Pengkode (8)
Cobalah online!
Dekoder (7)
Cobalah online!
Menggunakan teknik yang sama seperti wastl dan Jonathan .
sumber
Python 3 , 8 * (45 + 38) = 664
Encoder (45 byte):
Dekoder (38 byte):
Cobalah online!
sumber
lambda l:sum(x%16<<x//16*4for x in l)
berfungsi dengan baik :)lambda n:[n>>4*i&15|i<<4for i in range(8)]
dan 1 di decoder:lambda l:sum(x%16<<x//16*4for x in l)
untuk skor total 632JavaScript (ES6), 8 * (40 + 32) = 576
Encoder menampilkan larik0 untuk 8 bilangan bulat. Dekoder mengambil format yang sama dengan input.
Encoder (40 byte)
Dekoder (32 byte)
Demo
Cobalah online!
Bagaimana?
Input dibagi menjadi 8 blok 4 bit dan setiap blok dikodekan dengan 1 di antara 16 karakter yang mungkin. Bit paling signifikan dari blok terakhir tidak pernah disetel.
sumber
Jelly , (8 + 9) byte * 8 panjang maksimal = 136
Encoder (footer memformat daftar seperti yang akan dijelaskan oleh Python)
Dekoder
Secara teori dimungkinkan untuk memiliki panjang maksimal enam, dapatkah itu dilakukan dalam 22 byte atau kurang?
Tidak mungkin dengan maksimal lima panjang sejak itu∑i = 5i = 0( 127+ i127) =321402081<231- 1
Bagaimana?
Sejak231- 1 dapat dikodekan sebagai 8 digit heksadesimal (
7fffffff
atau[7,15,15,15,15,15,15,15]
) kita kemudian dapat menambahkan indeks berbasis nol dari masing-masing hex-digit dikalikan dengan 16 untuk memastikan konversi seperti itu selalu dalam urutan yang disortir dengan tetap menjaga nilai yang paling kanan pun dalam batas (yaitu[7,15,15,15,15,15,15,15] + [0,16,32,48,64,80,96,112] = [7,31,47,63,79,95,111,127]
). Decoding kemudian membalikkan proses yang sama ini.Encoder :
Dekoder :
sumber
Bahasa Pemrograman Shakespeare , 31 * (472 +
383379344) =265052638125296Skor sebelumnya: 16909322 * (246 + 217) = 7829016086
Ini masih sangat tinggi, tetapi ini adalah yang terendah yang dapat saya pikirkan saat ini.
Encoder:
Cobalah online!
Dekoder:
Cobalah online!
Pada dasarnya, jika string berisi karakter dengan kode ASCII (n +1), digit biner ke-n diatur.
sumber
Python 3, (208 byte + 200 byte) * 6 panjang = 2448
Cobalah online! (mengandung keduanya, byte tambahan adalah baris baru di antara mereka).
-4 byte (skor -24) dengan memanfaatkan daftar kosong (yang memungkinkan lebih banyak hal dimulai pada 0)
Encoder (208 byte)
Dekoder (200 byte)
Pengamatan:
Pengocokan dapat dibalikkan tanpa kehilangan untuk daftar ketat yang tidak bertambah (yaitu diurutkan).
Daftar numerik yang tidak bertambah dengan panjang yang sama dapat dipesan secara total (seperti dalam Python).
Kita dapat mendefinisikan bahwa daftar diurutkan berdasarkan panjangnya terlebih dahulu untuk membentuk urutan total dari semua daftar yang diurutkan.
Kita dapat membentuk urutan diindeks dari daftar ini jika kita mendefinisikan bahwa nilai-nilai hanya berlaku dalam daftar adalah bilangan bulat dari
0
ke127
inklusif (yaitu terdapat jumlah terbatas daftar valid dengan panjangL
).Strategi:
Encoder: Diberi nomor
N
, temukan daftar yangN
benar-benar tidak meningkat.Decoder: Diberikan daftar yang valid (dikocok), urutkan dan kembalikan indeksnya dalam urutan daftar yang valid.
Penjelasan kode umum:
T=lambda n,d:n*T(n+1,d-1)//d if d>1else d and n or 1
Menghitung
n
thd
nomor -simplexKarena
d=0
selalu1
Untuk
d=1
,n
(jumlah titik dalam satu garis titik dengan panjangn
)Untuk∑ni = 1saya , (jumlah titik dalam segitiga titik dengan panjang sisi
d=2
,n
)Untuk∑nj = 1∑ji = 1saya , (jumlah titik dalam tetrahedron titik dengan panjang sisi
d=3
,n
)Penjelasan pembuat enkode:
def E(n,h=128):
d=l=0
,s=[]
n
adalah nomor input,h
adalah "nilai tinggi" (yaitu angka tertinggi yang diizinkan + 1),d
adalah panjang output akan,s
adalah output,l
adalah "nilai rendah" (mulai dari 0, dijelaskan lebih lanjut nanti)while n>=T(h,d):
,n-=T(h,d)
,d+=1
Ada daftar panjang yang
T(h,d)
validd
, dan perhitungan kami lebih mudah jikan
merupakan indeks relatif terhadap daftar[0]*d
(pada indeks0
) daripada indeks yang sebenarnya, jadi turunkann
sesuai. Ini juga menyesuaikand
(panjang) menjadi benar untuk yang diberikann
.for i in range(d):
Secara efektif: "untuk
i+1
nomor ke-10 dalam daftar"Di sinilah saya akan menjelaskan
l
, "nilai rendah"Setelah nomor dimasukkan ke dalam daftar, tidak kurang dari itu dapat dimasukkan ke dalam daftar (untuk tetap diurutkan), jadi
l
adalah nomor terakhir yang ditambahkan ke daftar.while n>=T(h-l,d+~i):
,n-=T(h-l,d+~i)
,i+=1
Jika
n
terlalu besar untuk dikodekan denganl
"angka" ini, maka sesuaikann
dan naikkanl
s+=[l]
Encode
n
denganl
"digit" ini.Pada awalnya, kami memiliki
h
opsi untuk "digit" apa yang akan dimasukkan berikutnya, tetapi begitu kami memasukkan "digit" (yang ditugaskan kel
), kami terbatas padah-l
opsi untuk "digit" berikutnya.Pada awalnya ada
T(h,d)
daftar yang valid, tetapi kami telah menambahkan "digit"l
, mengurangi jumlah "digit" yang tersisad-1
dan jumlah "digit" selanjutnya yang validh-l
, sehingga jumlah daftar yang valid setelah ini adalahT(h-l,d-1)
Penjelasan dekoder:
def D(s):
,s.sort()
,l=0
,d=len(s)
s
adalah daftar input (dikocok), jadis.sort()
itu;l
adalah "nilai rendah" (h
"nilai tinggi" hanya literal128
dalam kode untuk menyimpan byte),n
adalah nomor keluaran,d
adalah panjangnya.n=sum(T(128,D)for D in range(d))
Sesuaikan
n
ke titik dalam urutan[0]*length
for i in s:
Untuk setiap digit:
for j in range(l,i):
,n+=T(128-j,d-1)
Sesuaikan
n
ke titik dalam urutan[...prevdigits, thisdigit, 0...]
l=i
: Setel "nilai rendah" ke digit terbarud-=1
: Kurangi panjang sejak kami menggunakan angkareturn n
: Setelahn
disesuaikan untuk semua digit, itu adalah angka yang tepat; Kembalikan.Maaf jika ini tidak jelas, tapi ini versi debug nongolf asli saya Coba online! , yang tidak menggunakan daftar kosong, jadi 1 off dari semua angka yang digunakan dalam versi ini
sumber
Rubi , (36 + 29 bytes) * 8, skor 520
Menyandi:
Cobalah online!
Membaca sandi:
Cobalah online!
Bagaimana itu bekerja:
Angka dikodekan menggunakan potongan 4-bit dan indeks 3-bit.
Decoder mengambil array input dan meletakkan setiap nibble ke tempatnya lagi.
sumber
Arang , skor 10 * (10 + 15) = 250.
Menggunakan desimal; solusi berbasis basis 16 sebelumnya mencetak
328296264.Dapat menampilkan karakter yang tidak dapat dicetak. Secara khusus, karakter 10 sulit untuk dimasukkan ke Arang.
Encoder, 10 byte:
Cobalah online! Tautan adalah untuk mengucapkan versi kode.
Dekoder, 15 byte:
Cobalah online! Tautan adalah untuk mengucapkan versi kode.
Versi menggunakan daftar skor bilangan bulat
360296 (basis 16; desimal akan skor 310):Encoder, 19 byte:
Cobalah online! Tautan adalah untuk mengucapkan versi kode.
Dekoder, 18 byte:
Cobalah online!Tautan adalah untuk mengucapkan versi kode.
Versi menggunakan karakter yang dapat dicetak mencetak 360 (adalah
416384368 pada basis 16):Encoder, 19 byte:
Cobalah online!Tautan adalah untuk mengucapkan versi kode.
Dekoder, 17 byte:
Cobalah online! Tautan adalah untuk mengucapkan versi kode.
sumber
Brachylog , 17 + 18 byte * 8 panjang = 280
Encoder:
Dekoder:
Sebuah p dapat ditambahkan ke ujung encoder tanpa efek. Dekoder dijalankan dengan meletakkan hasil (dikocok) sebagai output dan mendapatkan nomor asli di input.
Jika akan ada predikat jumlah kumulatif (diterapkan dengan benar), skor bisa turun menjadi 20
Cobalah online!
sumber
05AB1E , skor: (2 + 2 byte ) * 11 panjang maksimum = 44
Encoder (2 byte ):
Cobalah online.
Dekoder (2 byte ):
Cobalah online.
Input dari encoder dan output dari decoder adalah daftar digit.
Port dari jawaban Jelly ke-2 @ ais523 .
Penjelasan:
Karena231- 1 memiliki panjang 10 digit, panjang maksimum output adalah 11.
.¥
menambahkan nol ke output, panjang output adalah panjang input + 1. Sejaksumber
Gol> <> , 8 * (14 + 13) = 216
Encoder, Coba online! , 14 byte:
Dekoder Coba online! , 13 byte:
Karena ini dapat menampilkan karakter ascii yang tidak dapat dicetak, sehingga mengacaukan dekoder, sekarang ada versi yang menggunakan angka dalam output / input:
Encoder, Coba online! , 14 byte:
Dekoder Coba online! , 13 byte:
Pengkodean:
Pengkodean bekerja dengan memecah nomor yang diberikan menjadi potongan 8 x 4bit. Potongan-potongan ini kemudian bergeser ke kanan sebanyak 3 bit dan lokasi asli potongan ditambahkan pada bagian akhir sebagai angka antara 0 dan 7. Dengan demikian pengodeannya terlihat seperti ini:
sumber
Perl 6 , 10 * (10 + 12) =
340220Encoder:
Dekoder:
Cobalah online!
Fungsi enkoder mengunci setiap digit dengan indeks-0 angka. Kemudian encoder mengurutkan daftar angka dan mendapatkan modulo sebanyak 10, dengan kata lain digit kedua dari angka tersebut.
Totalnya adalah 10, karena itu panjang maksimum 2 31 -1.
sumber
Haskell , 10 * (23 + 51) = 740
Berikut adalah program yang menyandikan, mengacak, mendekode, dan memvalidasi nilai: Cobalah secara online!
Encoder, 23 byte
Cobalah online!
Decoder, 51 byte
Cobalah online!
Penjelasan
Karena kami diizinkan menggunakan input sebagai digit desimal, kami akan menggunakannya .. Encoder memetakan setiap digit yang terjadi
10*index + digit
, perhatikan bahwa semuadigit
s akan berada di[0..9]
sehingga kami dapat membalikkan di atas dengan menggunakandivMod
. Setelah mengembalikan indeks dan digit itu hanya masalah mengurutkan berdasarkan indeks dan menyingkirkannya.Solusinya diharapkan bekerja untuk nilai hingga231- 1 = 2147483647 yang panjangnya 10 digit, jadi titik kode maksimum yang akan kita dapatkan adalah 9 ⋅ 9 = 81 < 128 . Juga setiap digit akan dikonversi ke "karakter", jadi kita akan berakhir dengan panjang maksimal 10.
sumber
Sekam , 10 * (7 + 8) = 150
Port langsung dari solusi Haskell saya hanya dengan pengamatan itu10 ⋅ 9 = 90 < 128 (Husk
N
adalah berbasis 1):Encoder, 7 byte
Cobalah online!
Decoder, 8 byte
Cobalah online!
sumber
APL (Dyalog Unicode) ,L.E+ LD= 36 ; A = 8 → 288 .
Cobalah online!(berisi 5 byte tambahan untuk penugasan dan baris baru).
Penggunaan
⎕IO←0
Bagaimana:
sumber
PHP, 8 * (44 + 53) = 776
encoder, 44 byte:
mencetak daftar integer yang dipisahkan spasi. Jalankan sebagai pipa dengan
-nR
.maksimum 8 byte dengan 4 bit data (nibble bawah) dan 3 bit berat (nibble atas).
Sederhananya:
Letakkan setiap digit hex dalam karakter sendiri dan gunakan bagian atas byte untuk menyimpan posisi digit.
contoh:
1457893891
(0x56e5b203
) Akan berubah menjadi0x03
,0x10
,0x22
,0x3b
,0x45
,0x5e
,0x66
,0x75
→
3 16 34 59 69 94 102 117
dekoder, 53 byte:
atau
atau
ambil bilangan bulat dari argumen baris perintah. Jalankan dengan
-nr
.Cobalah secara online .
sumber
Python 2 , 10 * (68 + 54) = 1220
Cobalah online!
EDIT: Terima kasih kepada Jo King untuk petunjuknya - tidak yakin mengapa saya mengimbangi 32, dalam retrospeksi.
Mengkodekan posisi dan nilai setiap tempat sebagai karakter tunggal, dimulai dengan
[spasi] (posisi 0, nilai 0)byte NUL 0x0.Dipecahkan oleh:
sumber
32
offset? Selain itu,[-1]
bisa jadi%10
, di tempat yang tepatC (gcc) , 10 * 112 = 1120
Cobalah online!
Saya memiliki variabel global, tetapi sebenarnya tidak menyampaikan info apa pun di antara dua fungsi. Deklarasi variabel untuk
c
digunakan di kedua fungsi menghemat saya 2 byte dalam panjang kode.Versi yang menggunakan ASCII yang dapat dicetak hanya untuk penalti
3byte ada di sini:Terima kasih @ceilingcat untuk peningkatan 70 poin.
sumber