Tantangan
Tulis sebuah program yang dapat mengambil input dari string baris tunggal yang mengandung karakter ASCII yang dapat dicetak, dan output string yang sama yang disandikan dalam Base85 (menggunakan konvensi big-endian). Anda dapat mengasumsikan bahwa input akan selalu menjadi ≤ 100 karakter.
Panduan untuk Base85
Empat oktet dikodekan menjadi (biasanya) lima karakter Base85.
Karakter Base85 berkisar dari
!
hinggau
(ASCII 33 - 117) danz
(ASCII 122).Untuk menyandikan, Anda terus melakukan pembagian dengan 85 pada empat oktet (angka 32-bit), dan menambahkan 33 ke sisanya (setelah setiap divisi) untuk mendapatkan karakter ASCII untuk nilai yang disandikan. Misalnya, aplikasi pertama dari proses ini menghasilkan karakter paling kanan di blok yang disandikan.
Jika satu set empat oktet hanya berisi byte nol, mereka dikodekan sebagai
z
gantinya!!!!!
.Jika blok terakhir lebih pendek dari empat oktet, itu diisi dengan byte nol. Setelah penyandian, jumlah karakter yang sama yang ditambahkan sebagai padding, dihilangkan dari akhir output.
Nilai yang disandikan harus didahului oleh
<~
dan diikuti oleh~>
.Nilai yang dikodekan tidak boleh mengandung spasi putih (untuk tantangan ini).
Contohnya
In: easy
Out: <~ARTY*~>
In: test
Out: <~FCfN8~>
In: code golf
Out: <~@rGmh+D5V/Ac~>
In: Programming Puzzles
Out: <~:i^JeEa`g%Bl7Q+:j%)1Ch7Y~>
Cuplikan berikut akan menyandikan input yang diberikan ke Base85.
sumber
Jawaban:
CJam,
433935 byteCobalah online di penerjemah CJam .
Bagaimana itu bekerja
Jika input kosong,
N,)
akan diterapkan ke string"<~"
. KarenaN
awalnya memegang satu karakter, hasilnya akan benar.Kami tidak harus berurusan dengan z atau pad potongan yang disandikan hingga panjang 5, karena input hanya akan berisi karakter ASCII yang dapat dicetak.
sumber
a program that can take an input of a single-line string containing any ASCII printable characters,...
Python 3, 71 byte
Saya tidak pernah bermain golf di Python, jadi ini mungkin kurang optimal.
Berkat @ZachGates untuk bermain golf 3 byte!
sumber
input().encode()
alih-alihstr.encode(input())
menyimpan 3 byte.Python 2,
193162 byteIni adalah kode golf pertama saya, jadi saya yakin ada yang salah dengan pendekatan saya. Saya juga ingin benar-benar mengimplementasikan base85 daripada hanya memanggil fungsi perpustakaan. :)
sumber
[:4+len(s)/4*4]
dan tidak ada karakter yang dihapus dari akhir output.while
lingkaran menjadi satu seperti seperti ini:while b:d=chr(b%85+33)+d;b/=85
. Anda juga dapat menghapus ruang antaraprint
pernyataan Anda dan string. Selain itu, hapus ruang di antara argumen yang diteruskan kes.unpack
.Oktaf,
133131 byteTerima kasih kepada @ojdo karena menyarankan saya mengambil input dari argv daripada stdin, menyelamatkan saya 2 byte.
Tidak Disatukan:
Saya telah memposting kode di ideone . Fungsi mandiri tidak memerlukan dan
end
pernyataan, tetapi karena ideone memiliki fungsi dan skrip panggilan dalam file yang sama itu membutuhkan pemisah.Saya masih belum bisa memikirkan bagaimana cara
stdin
mengerjakan ideone. Jika ada yang tahu, saya masih tertarik, jadi tolong beri saya komentar.Contoh keluaran dari ideone :
sumber
argv()
? Deskripsi tugas tampaknya tidak memerlukan input bacaan daristdin
.dec2base
dalam Oktaf memungkinkan basis di atas 36?BASE
harus berupa angka antara 2 dan 36, atau serangkaian simbol . Di sini, ekspresi'i':'u'
memperluas string 85 karakter!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstu
yang berfungsi sebagai basis.Matlab, 175 byte
Contoh:
sumber
PHP, 181 Bytes
Versi Online
Diperluas
sumber
Bash murni, ~ 738
Encoder terlebih dahulu (sesuatu yang golf):
Tes:
dan dekoder sekarang:
Salin ini dalam
enc85.sh
dandec85.sh
,chmod +x {enc,dec}85.sh
, maka:Tetapi Anda bisa melakukan beberapa tes yang lebih kuat:
Dikurangi menjadi 724 karakter:
sumber