Latar Belakang
Pada tahun 1870, Emile Baudot menemukan Baudot Code , sebuah pengkodean karakter dengan panjang tetap untuk telegrafi. Dia merancang kode yang akan dimasukkan dari keyboard manual hanya dengan lima tombol; dua dioperasikan dengan tangan kiri dan tiga dengan tangan kanan:
Jari telunjuk kanan, tengah dan jari manis mengoperasikan kunci I , II , dan
III , masing-masing, dan jari telunjuk kiri dan jari tengah mengoperasikan
IV dan Ⅴ . (Selanjutnya saya akan menggunakan angka Arab Barat mereka, yaitu
1 , sampai 5. ) Karakter dimasukkan sebagai akord. Untuk memasukkan huruf "C," misalnya, operator menekan 1 , 3 , dan 4secara bersamaan, dimana lengan sikat berputar membaca setiap tombol secara berurutan dan mentransmisikan arus atau, untuk kunci yang tidak ditekan, tidak ada arus. Hasilnya adalah, dalam istilah modern, pengkodean biner 5-bit-paling-signifikan-bit-pertama, di mana contoh kita, "C," dikodekan sebagai 10110
.
5 bit ??
Anda mungkin berpikir bahwa 5 bit, yang dapat mengekspresikan paling banyak 32 simbol unik, tidak cukup bahkan untuk semua huruf dan angka bahasa Inggris, untuk tidak mengatakan tanda baca. Namun, Baudot punya trik di lengan bajunya: Perangkat karakternya sebenarnya adalah dua perangkat yang berbeda: Surat dan
Angka , dan dia mendefinisikan dua kode khusus untuk beralih di antara mereka.
Letter Shift , yang beralih ke mode Letters, diaktifkan dengan menekan tombol 5 saja ( 00001
), dan Gambar Shift diaktifkan dengan tombol
4 ( 00010
).
Tantangan
Tantangan Anda adalah menulis program atau fungsi yang menerjemahkan transmisi Kode Baudot.
Transmisi yang sebenarnya akan dimulai dengan beberapa bit inisialisasi, ditambah bit mulai dan berhenti sebelum dan sesudah setiap karakter, tetapi kita akan melewatkan itu dan hanya khawatir tentang 5 bit unik untuk setiap karakter. Format input dan output dibahas di bawah ini.
Kode Baudot
Ada dua versi berbeda dari Kode Baudot: Continental dan Inggris. Kita akan menggunakan versi Inggris, yang tidak termasuk karakter seperti "É" dari bahasa Prancis asli Baudot. Kami juga akan mengabaikan semua simbol dalam versi Inggris yang tidak termasuk dalam karakter ASCII yang dapat dicetak. Anda hanya perlu mendekode karakter dalam tabel di bawah ini, yang semuanya merupakan karakter ASCII yang dapat dicetak kecuali tiga karakter kontrol terakhir yang dijelaskan di bawah tabel.
Kolom "Ltr" menunjukkan karakter dalam mode Letter dan "Fig" menunjukkan karakter mode Gambar:
Encoding Encoding
Ltr Fig 12345 Ltr Fig 12345
--- --- -------- --- --- --------
A 1 10000 P + 11111
B 8 00110 Q / 10111
C 9 10110 R - 00111
D 0 11110 S 00101
E 2 01000 T 10101
F 01110 U 4 10100
G 7 01010 V ' 11101
H 11010 W ? 01101
I 01100 X 01001
J 6 10010 Y 3 00100
K ( 10011 Z : 11001
L = 11011 - . 10001
M ) 01011 ER ER 00011
N 01111 FS SP 00010
O 5 11100 SP LS 00001
/ 11000
Tiga baris terakhir di kolom kanan adalah karakter kontrol:
ER
adalah Penghapusan . Mesin telegraf Baudot akan mencetak simbol seperti tanda bintang untuk karakter ini untuk memberi tahu pembaca bahwa karakter sebelumnya harus diabaikan, tetapi kita akan lebih baik kepada pembaca dan benar - benar menghilangkan (tidak mencetak) karakter sebelumnya . Kerjanya sama dalam mode Letter dan Figure.FS
adalah Gambar Shift . Ini mengalihkan set karakter dari Letters ke Angka. Jika decoder sudah dalam mode Gambar, FS diperlakukan sebagai Spasi (ergoSP
di kolom "Ltr"). Ketika decoder berada dalam mode Gambar, ia tetap dalam mode Gambar sampai karakter LS diterima.LS
adalah Letter Shift . Ini beralih set karakter dari Angka ke Surat. Jika decoder sudah dalam mode Letter, LS diperlakukan sebagai Spasi . Ketika dalam mode Letter, decoder tetap dalam mode Letter sampai karakter FS diterima.
Dekoder selalu dimulai dalam mode Letter.
Berikut ini contoh dengan Gambar Shift, Letter Shift, dan Spasi:
01011 10000 00100 00001 00010 10000 11100 00001 10101 11010
M A Y LS/SP FS/SP 1 5 LS/SP T H
Ini menghasilkan pesan MAY 15TH
. Seperti yang Anda lihat, karakter pertama 00001
(Letter Shift / Spasi) bertindak sebagai spasi, karena decoder sudah dalam mode Letter. Karakter berikutnya, 00010
(Pergeseran Gambar / Spasi) mengalihkan dekoder ke mode Gambar untuk dicetak 15
. Kemudian 00001
muncul lagi, tapi kali ini berfungsi sebagai Letter Shift untuk mengembalikan decoder ke mode Letter.
Untuk kenyamanan Anda, berikut adalah karakter dalam format yang mungkin lebih mudah dicerna di editor, diurutkan berdasarkan kode:
A,1,10000|E,2,01000|/,,11000|Y,3,00100|U,4,10100|I,,01100|O,5,11100|FS,SP,00010|J,6,10010|G,7,01010|H,,11010|B,8,00110|C,9,10110|F,,01110|D,0,11110|SP,LS,00001|-,.,10001|X,,01001|Z,:,11001|S,,00101|T,,10101|W,?,01101|V,',11101|ER,ER,00011|K,(,10011|M,),01011|L,=,11011|R,-,00111|Q,/,10111|N,,01111|P,+,11111
Memasukkan
Input akan berupa string, array, atau daftar bit dengan urutan paling tidak signifikan-bit-pertama. Setiap karakter akan diwakili oleh kuintet 5 bit. Bit dapat dalam format apa pun yang masuk akal, misalnya string biner, array 0
s dan 1
s, string "0"
dan "1"
karakter, angka tunggal yang sangat besar, dll., Selama ia memetakan langsung ke bit transmisi.
Setiap transmisi akan memiliki setidaknya satu kwetet yang dapat dicetak dan paling banyak 255 kwintet (dapat dicetak atau sebaliknya), yaitu 5–1.275 bit inklusif.
Input hanya dapat berisi bit-bit transmisi, dengan dua pengecualian yang diizinkan: Sejumlah 0
bit leading atau trailing dan / atau, untuk input string, baris baru trailing tunggal dapat ditambahkan ke transmisi. Leading atau trailing bits atau karakter tidak dapat ditambahkan sebelum atau setelah setiap quintet, yaitu Anda tidak dapat menambahkan setiap quintet ke 8 bit (atau mengambil setiap quintet sebagai angka tunggal dalam sebuah array — kecuali bahasa Anda memiliki tipe integer 5-bit) atau terpisah kwintet dengan bit tambahan, mis "01111\n11100"
.
Catatan & tepi kasus
Transmisi hanya akan berisi karakter di kolom "Ltr" dan "Fig" pada tabel di atas. Anda tidak akan pernah menerima mis
01110
dalam mode Gambar, karena tidak ada di kolom "Gambar".Diasumsikan bahwa decoder akan selalu dalam mode Letter di awal transmisi. Namun, karakter pertama mungkin merupakan karakter FS untuk segera beralih ke mode Gambar.
Ketika decoder dalam mode Letter, itu mungkin menerima karakter LS, dan ketika itu dalam mode Gambar itu mungkin menerima karakter FS. Dalam kedua kejadian tersebut karakter Space harus dicetak (lihat Output).
Karakter ER tidak akan pernah menjadi karakter pertama dalam suatu transmisi, juga tidak akan pernah segera mengikuti LS, FS, atau ER lainnya.
Karakter FS dapat segera mengikuti karakter LS dan sebaliknya.
Baik karakter LS maupun FS tidak akan menjadi karakter terakhir dalam transmisi apa pun.
The
/
dan-
karakter dapat diterima baik dalam modus Surat (kode11000
dan10001
, masing-masing) atau mode Gambar (10111
dan00111
).
Keluaran
Output mungkin dalam format yang masuk akal, yang paling masuk akal adalah ASCII (atau UTF-8, yang semua karakter yang diwakilkan sama dengan ASCII). Harap cantumkan dalam jawaban Anda jika output Anda dalam format atau penyandian lain.
Catatan
- Karakter spasi (lihat 3. di atas) harus berupa spasi ASCII (0x20) atau yang setara dengan pengkodean Anda, yaitu apa yang Anda dapatkan saat menekan bilah spasi.
Kemenangan
Ini adalah kode-golf . Kode terpendek dalam byte menang.
Batasan
Celah standar dilarang.
Spasi trailing dan / atau satu trailing newline diperbolehkan. Spasi terdepan atau karakter lain (yang bukan bagian dari transmisi) tidak diizinkan.
Anda tidak boleh menggunakan fungsi perpustakaan atau built-in apa saja yang menerjemahkan kode Baudot (atau keturunannya, misalnya Kode Murray, ITA-1, dll.).
Uji Kasus
Input: 001101000010100111101110010101
Output: BAUDOT
Input: 11010010001001100011110111101111100
Output: HELLO
Input: 01011100000010000001000101000011100000011010111010
Output: MAY 15TH
Input: 0001000100010000001000001011101110011100101010010110101010001111100101
Output: 32 FOOTSTEPS
Input: 10110000110101011100111100001111011010000001101110
Output: GOLF
Input: 000100011000001111100000100010110111001100010110010000111111
Output: 8D =( :P
Input: 0000100001000010000100010001111011111011000011100010001
Output (4 leading spaces): -/=/-
00010
terdaftar sebagaiSP
dalam mode huruf, danFS
dalam mode angka. Menurut deskripsi, jika kita dalam mode huruf dan kita menerima kode00010
, kita harus beralih ke mode angka, tetapi nilai-nilai dalam tabel tampaknya sebaliknya. Demikian juga sebaliknya untuk00001
.Jawaban:
Pyth,
98979593908380 byteKode ini berisi karakter yang tidak patut
xxd
dicetak , jadi ini adalah hexdump yang dapat dibalik:Cobalah online. Suite uji.
Cukup lama, tetapi tabel pencarian memakan
sebagianbesar ruang.Untuk 117 byte, inilah hal yang sama tanpa unsintables (membutuhkan ISO-8859-1, meskipun):
Atau, untuk 93 byte, tanpa kompresi di tabel pencarian:
sumber
JavaScript (ES6),
160158153 bytesumber
Batch,
306304 byteMengambil input pada STDIN. Karena Batch tidak memiliki konversi biner, saya harus memalsunya menggunakan konversi oktal dan hex.
0
). Nilai yang mungkin adalah00
,01
,10
dan11
. Dua yang terakhir memiliki nilai8
dan9
tetapi saya ingin2
atau3
jadi saya mengambil modulo sisanya6
.14
atau yang252
diinginkan, untuk saya ambil modulo sisanya14
(252=14*18
).c
adalah string koder
sejauh ini hasilnyad
adalah array decodings
adalah indeks (dengan mempertimbangkan status shift) dari karakter yang mengganti status shiftn
adalah decode biner plus bit 5 daris
, yang sama dengan keadaan shift, dalam hal ini keadaan shift diaktifkan, atau indeks ke dalam array decoding untuk menemukan karakter berikutnya (atau! untuk menghapus)sumber
PHP, 206 Bytes
sumber
Chip , 1069 byte
Itu besar, tapi cukup menyenangkan untuk menulis.
Mengambil input sebagai string
"1"
's dan"0"
' s. (Meskipun itu hanya terlihat pada bit rendah.)Cobalah online!
Catatan: Erasure menggunakan karakter backspace ASCII (
\x08
), yang berarti mereka akan terlihat lucu di TIO, tetapi mereka terlihat baik-baik saja, katakanlah, xterm.Struktur dasar
Di atas, di atas
=
garis, adalah dekoder input. Ini mengubah input menjadi salah satu dari 32 sinyal terpisah. Ini dikirim dario
's di atas=
ke yang di bawah ini.Pegunungan segitiga
L
's danR
' s hanya memutar pola dari baris terpisah ke kolom. Kotak di bawah ini yang menerjemahkan setiap kolom ke karakter keluarannya. Untuk sinyal yang tidak dikenal, NUL (\x00
) diproduksi. Untuk shift khusus, alih-alih mencetak karakter, gumpalan kecil ke kanan mengubah mode.Mobil kabel seperti di antara dua gunung menekan setiap percetakan di antara masing-masing kuintet, jika tidak, ini juga akan mencoba untuk memecahkan kode semua quintet yang tumpang tindih juga. Coba ganti
!
dengan spasi untuk melihatnya sendiri. (Berjalan dalam mode verbose-v
mungkin juga menarik di sini.)Saya tidak yakin bagaimana membuat ini lebih kecil saat ini; sudah cukup padat untuk ukurannya.
sumber
GNU sed, 334 + 1 = 335 byte
+1 byte untuk
-r
bendera. Mengambil input pada STDIN.Melihat tantangan lama saya menyadari ini akan sangat mudah dengan sed, dan bagus untuk latihan. Saya belum mencoba kompresi apa pun, jadi tabel pencarian lebih dari setengah kode.
Cobalah online!
Penjelasan
Kode ini berfungsi dalam dua fase: Pertama, ia menggantikan setiap proses 5 digit biner dengan dua karakter yang sesuai (huruf dan gambar) dari tabel pencarian. Tabel pencarian dalam format 𝟎𝟎𝟎𝟎𝟎𝐋𝐅𝟎𝟎𝟎𝟎𝟎𝐋𝐅 ... di mana 𝟎 adalah digit biner dan 𝐋 dan 𝐅 masing-masing adalah huruf dan gambar yang sesuai.
%
mendukung karakter yang hilang (ini bisa berupa karakter apa pun selain baris baru).FS/SP
diwakili olehf<space>
danSP/LS
adalah<space>l
.ER
diwakili oleh<<
.Kemudian ia melangkah melalui setiap pasangan dengan "kursor" yang sesuai dengan
#
mode saat ini— untuk mode huruf,@
untuk mode gambar. The#
kursor menghilangkan karakter kedua dari pasangan dan kemudian maju ke pasangan berikutnya, dan@
menghilangkan pertama dan kemajuan. Dengan kata lain,#A1B8
menjadiA#B8
laluAB#
, dan@A1B8
menjadi1@B8
lalu18@
. Ketika#
kursor bertemuf<space>
itu menghapusnya dan menggantikannya dengan@
kursor, dan sebaliknya ketika@
bertemu<space>l
.Ketika tidak ada pasangan yang tersisa, kursor terakhir akan dihapus bersama dengan karakter apa pun yang diikuti oleh
<
.sumber