Tujuan
Kode morse sering direpresentasikan sebagai suara. Diberi aliran bit yang mewakili apakah suara hidup atau mati, menerjemahkan aliran menjadi huruf dan angka dan spasi.
Spesifik
- Bit stream dianalisis berdasarkan pada panjang bit ON / OFF berulang.
- 1 ON bit adalah sebuah titik
- Bit 3 ON adalah tanda hubung
- 1 OFF bit membatasi titik dan garis
- 3 OFF bit membatasi karakter
- 7 OFF bit membatasi kata-kata (spasi)
- Input mungkin berupa string atau larik. Hanya dua karakter / nilai unik pilihan Anda yang diizinkan dalam input. (mis. 0/1, benar / salah, koma / spasi)
- Output mengembalikan string atau dicetak ke output standar.
Contoh
Input: 101010100010001011101010001011101010001110111011100000001011101110001110111011100010111010001011101010001110101
Analysis: \--H--/ E \---L---/ \---L---/ \----O----/\-- --/\---W---/ \----O----/ \--R--/ \---L---/ \--D--/
Output: HELLO WORLD
Asumsi
- Streaming selalu dimulai dan diakhiri dengan bit ON.
- Tidak ada spasi putih terdepan atau tambahan.
- Masukan selalu valid.
- Semua huruf (tidak peka huruf besar-kecil) dan angka didukung.
Uji Kasus
101010100010001011101010001011101010001110111011100000001011101110001110111011100010111010001011101010001110101
HELLO WORLD
10100000001011100011101110000000101110000000101011101000101000101010001010101
I AM A FISH
1010111011101110001110111011101110111000101110111011101110001110111010101
2017
101010001110111011100010101
SOS
Mencetak gol
Ini kode golf. Kode byte-hitung terendah saat ini menang minggu depan.
Jawaban:
APL (Dyalog) ,
65626057 byte-3 Terima kasih kepada ngn.
Fungsi awalan Tacit.
Cobalah online! Header,,
f←
dan Footer hanya untuk memungkinkan memanggil fungsi dari Input sambil mempertahankan jumlah byte TIO. Dalam sesi APL normal (sesuai dengan bidang Input TIO), itu tidak akan diperlukan .⎕CY'dfns'
c op y the dfns workspace (library)(
...)
menerapkan fungsi ini diam-diam:'1+|(00)+'⎕S 1
PCRE S earch 1-berjalan dan bahkan panjang 0-berjalan dan panjang kembali pertandingan6|
sisa pembagian ketika dibagi dengan 6⊃∘'/. -'¨
untuk setiap panjang pertandingan, memilih sesuai karakter dari string ini'/|[-.]+'⎕S'&'∘
PCRE S earch garis miring dan dash / dot -mulai dan kembalikan yangmorse
diterjemahkan dari kode Morse ke teks biasasumber
Python 2 ,
142135 byteCobalah online!
Penjelasan:
Pisahkan string menjadi huruf-huruf
000
(0
artinya ruang)Ganti masing
111
- masing dengan3
, dan diubah menjadi basis 16.Kemudian setiap angka dimodded oleh
57
, yang memberikan kisaran0..54
, yang merupakan indeks dari karakter saat ini.Versi sebelumnya yang dikonversi ke basis 3:
Python 2 ,
273252247 byteCobalah online!
Versi sebelumnya yang dikonversi menjadi biner:
Python 2 ,
282261256 byteCobalah online!
sumber
Ruby , 123 byte
Cobalah online!
Pisahkan string input pada batas karakter. Gunakan bit 3 atau 4 OFF sehingga spasi dikonversi ke string kosong. Ambil nilai basis 2 dari setiap karakter, dan bawa ke kisaran yang wajar (kurang dari 60 nilai yang mungkin) menggunakan modulo pada 3 divisi berturut-turut.
sumber
0?
dari Regexp itu masih berfungsi untuk empat kasus uji.Python ,
175168 bytePertama-tama ubah string menjadi daftar 0 (dash) / 1 (dot) string, tambahkan awalan
1
(untuk mencegah angka nol di depan dan berurusan dengan spasi putih), kemudian konversikan ke biner.Karena setiap kode memiliki panjang tidak lebih dari 5, hasilnya berkisar dari 0 hingga 63 dan dapat dicantumkan dalam sebuah string.
sumber
lambda s:''.join("_ TEMNAIOGKDWRUS__QZYCXBJP_L_FVH09_8___7_______61_______2___3_45"[int('1'+filter(int,l).replace('2','0'),2)]for l in s.replace('111','2').split('000'))
filter
!Jelly ,
6762 byteCobalah online!
sumber
Visual Basic .NET (.NET Core) , 252 byte
-7 byte terima kasih kepada @recursive
Fungsi yang mengambil string
1
s dan0
s, dan mengembalikan string. (Sebenarnya, hanya0
untuk yangOFF
merupakan persyaratan sulit. Apa pun tidakOFF
dianggap sebagaiON
).Literal string adalah pengaturan kode Morse sebagai tumpukan biner dalam bentuk array. VB.NET memungkinkan Anda mengindeks string sebagai array karakter. The
\
integer divisi, mengambil sub tumpukan kiri untuk1
atau sub tumpukan tepat untuk111
.Saya digunakan
!
sebagai kosong ketika tidak ada nilai di tumpukan tempat itu. Itu hanya perlu untuk pad keluar indeks dengan benar.VB.NET memungkinkan Anda kembali dengan memberikan nilai ke nama fungsi (dalam hal ini,
A
). Saya hanya iteratif melakukan penggabungan string (&
) untuk membangun string keluaran. Pertama kali saya perlu menggunakan&
karena menggunakan+
meninggalkan null char terkemuka, tetapi setiap saat saya bisa menggunakan+
, yang berperilaku sama seperti&
untuk string.Cobalah online!
sumber
"!ETIANMSURWDKGOHVF!L!PJBXCYZQ!!5473!!8290!!!!!16"
, dan kemudian mengindeks menggunakanM(c-c\48*22)
, dan kemudian Anda dapat menyimpan 4 byte lainnya bahkan dengan tidak menggunakanM
, tetapi hanya menggunakan inline string literal.M(c-c\48*22)
, saya mendapatkan indeks di luar batas pada kasus 2017. Saya pikir VB akan melakukan pembagian dan perkalian pada saat yang sama; Apakah saya kehilangan tanda kurung?c\48*22
akan menjadi0
atau22
. Ini adalah cara mengurangi 22 dari kondisic
, untuk membuatM
lebih pendek dengan "melipat" ujung tali. Jika itu tidak berhasil untuk Anda, Anda selalu dapat menghapus paren dariA &=(" ")
untuk 2 byte lainnya. :)&=
ke+=
, dan menghapus dua spasi lainnya.JavaScript (ES6),
170131 byteBagaimana itu bekerja:
Jika Anda mengubah titik ke 0s dan tanda hubung ke 1s, dan awalan dengan 1, Anda mendapatkan angka biner, yang ketika dikonversi ke desimal memberi Anda:
Ini dapat dikonversi ke huruf yang benar dengan mengindeks ke
' ETIANMSURWDKGOHVF L PJBXCYZQ'
.Jika kita mengambil angka-angka ini modulus 11, kita mendapatkan angka 0 - 8 dan 10, yang dapat dikonversi ke angka yang benar dengan pengindeksan ke
'473168290 5'
.Program terpecah pada karakter, kemudian mengubah setiap karakter menjadi titik dan garis, yang dikonversi menjadi output yang sesuai berdasarkan aturan di atas.
Kasus uji:
Tampilkan cuplikan kode
sumber
Python 2 , 127 byte
Cobalah online!
Membangun solusi TFeld dengan menghapus penggantian dan dengan bekerja di basis 10, dengan biaya bitor xor dan string referensi yang lebih panjang.
sumber
PHP,
321284 byteDisimpan 37 byte berkat @ovs
Versi sebelumnya (321 bytes)
Cobalah online!
Versi tidak disatukan:
sumber
Java (OpenJDK 8) , 370 byte
Cobalah online!
sumber
GNU sed , 261 + 1 = 262 byte
+1 byte untuk
-r
bendera.Cobalah online!
Penjelasan
Ini adalah solusi tabel pencarian yang sangat mendasar.
Tiga baris pertama mentransformasikan input sehingga tanda hubung adalah
_
s dan titik adalah1
s. Pertama,000
s diganti dengan;
, sehingga karakter dipisahkan oleh;
dan kata oleh;;0
. Kemudian111
s digantikan oleh_
dan semua0
s yang tersisa dibuang, meninggalkan1
s untuk titik-titik.Baris berikutnya menambahkan tabel pencarian. Dibutuhkan bentuk di
cmcmcm...
manac
karakter danm
adalah urutan_
s dan1
s yang mewakilinya.i
diganti1
dalam tabel untuk disambiguasi. Karena ekspresi reguler dalam sed selalu serakah, tabel diurutkan dari kode terpanjang ke kode terpendek (jadi mis1_
cocokA1_
bukani1____
).Selanjutnya, dalam satu lingkaran, setiap urutan
_
s dan1
s (dan selanjutnya;
) digantikan oleh karakter yang sesuai:Akhirnya, pembersihan:
i
s diganti dengan1
s, sisa;
s adalah spasi, dan tabel pencarian dihapus:sumber
Jelly , 67 byte
Cobalah online!
sumber
JavaScript (ES6),
10410210199 byteUji kasus
Tampilkan cuplikan kode
Bagaimana?
Karena mengkonversi dari biner ke desimal biaya byte, kami menggunakan fungsi hash yang bekerja langsung pada blok biner yang ditafsirkan dalam basis 10.
Contoh
sumber
n*p%m0%m1
untukRetina ,
144138130103 byteCobalah online! Tautan termasuk kasus uji. Penjelasan:
Ubah digit biner ke karakter lain karena 0 dan 1 adalah output yang valid.
Masukkan spasi sebelum setiap karakter dan dua spasi di antara kata-kata.
Asumsikan semua karakter adalah Es.
Terjemahkan semua huruf dengan asumsi bahwa mereka akan diikuti oleh titik. Misalnya, jika kita memiliki E, dan kita melihat titik kedua (kita mengkonsumsi yang pertama ketika kita memasukkan E) maka itu diterjemahkan menjadi I. Untuk huruf yang hanya dapat secara legal diikuti oleh tanda hubung, mereka diterjemahkan dengan asumsi, dan kemudian garis putus-putus dikonsumsi oleh tahap berikutnya. Surat-surat lain dihapus (menjaga
L
biaya byte).Jika diketahui bahwa mereka benar-benar diikuti oleh tanda hubung, maka perbaiki kesalahan penerjemahan. Ini juga mengkonsumsi tanda hubung ketika diasumsikan oleh tahap sebelumnya. Kedua terjemahan diulang sampai semua titik dan garis terputus.
sumber
Perl 5 , 241 + 1 (
-p
) = 242 byteCobalah online!
sumber
PHP, 181 +1 byte
Jalankan sebagai pipa dengan
-nR
atau coba online .sumber
ES6 , 268 byte
Menggunakan pengkodean ASCII setelah pemetaan dari representasi base36 dari morse ke posisi indeks. Bukan hari golf terbaik saya, tetapi hanya butuh sekitar 15 menit.
Lebih mudah dibaca (agak):
sumber
Bahasa Wolfram (Mathematica) , 288 byte
Memikirkan membaca data sebagai biner dari file tapi itu sulit dijelaskan. Basis 36 tampak seperti cara kompromi yang baik untuk menyimpan data secara efisien secara leksikal.
Mengambil string 0 dan 1 sebagai input. Apakah serangkaian penggantian, dimulai dengan berjalan dari 7 nol, kemudian berjalan dari 3, kemudian huruf biner terpanjang hingga yang terpendek. Urutan penggantian itu penting.
Cobalah online!
sumber
Perl 5 , 195 byte
194 byte kode +1 untuk
-p
.Saya tidak bisa mendapatkan ini bekerja hanya dengan string biner dikemas standar, saya harus melarikan diri dari byte byte yang lebih tinggi kalau tidak saya akan berada di 171, jika ada yang tahu apa yang saya lewatkan, atau mengapa melanggar itu akan menjadi besar !
Cobalah online!
Penjelasan
String biner adalah daftar
pack
ed angka yang berhubungan dengan karakter morse (101011101
-349
untukF
dll) dan ini di-zip dengan rentangA..Z,0..9
dan digunakan sebagai pencarian. Thes///
ekspresi mengganti semua berjalan tujuh0
s dengan ruang dan kemudian semua berjalan digit, dipisahkan dengan tiga0
s atau batas kata\b
, dengan kunci yang sesuai mereka dari%h
hash.sumber