Pertanyaan ini melibatkan mengambil masukan dalam kode Morse sebagai. (titik) dan - (simbol minus), dengan spasi untuk memisahkan input. Tugas Anda adalah mengubah kode menjadi output standar. Anda dapat mengasumsikan bahwa input hanya berisi simbol karakter yang ditemukan dalam alfabet Kode Morse Internasional, ditemukan di sini: http://en.wikipedia.org/wiki/Morse_code#Letters.2C_numbers.2C_punctuation .
Semua output harus menggunakan huruf kecil. Ruang ganda harus ditafsirkan sebagai ruang kata.
Input sampel:
. -..- .- -- .--. .-.. . .-.-.- ... --- ...
Keluaran:
example. sos
Kode terpendek setelah dua minggu menang.
Jawaban:
Mathematica 62
Mathematica memungkinkan kita untuk menipu
Dua simbol pertama
.
dan.-
diperlukan untuk menafsirkan kode kecil dengan benar.sumber
f=ToLowerCase@StringDrop[WolframAlpha[". .- "<>#,"Result"],2]&
untuk huruf kecil.Drat, saya berharap untuk sampai di sini sebelum GolfScripters tiba :-(
Anyhoo ...
C: 228 karakter:
Saya pikir saya akan menambahkan penjelasan tentang cara kerjanya.
Data input diuraikan menurut data pohon di
*c
, yang dapat diperluas sebagai berikut (menggunakan·
untuk mewakili node kosong):Mulai dari bagian atas pohon, turun ke bawah sambil bergerak ke kiri untuk satu titik dan ke kanan untuk garis putus-putus. Kemudian output karakter apa pun yang Anda berada ketika string input berakhir (yaitu, ketika karakter spasi ditemukan). Jadi misalnya, tiga titik dan tanda hubung akan membawa Anda
v
melaluie
,i
dans
. Alih-alih secara eksplisit memeriksa titik (ASCII\x2e
) dan tanda hubung (ASCII\x2d
), kita hanya perlu memeriksa bit terakhir (m[n]&1
), yaitu 0 untuk.
dan 1 untuk-
.Enam baris sudah cukup untuk menyandikan semua kecuali
$
, yang memiliki 7 titik / garis:,...-..-
tetapi karena data input dijamin valid, ini dapat dengan mudah diperbaiki dengan memotong input pada 6 karakter (m[6]=0
) dan menafsirkan...-..
sebagai$
gantinya. Kami juga dapat memotong 7 byte terakhir dari data hierarki, karena semuanya kosong dan tidak diperlukan jika inputnya valid.sumber
c
Dapat diuraikan. Mungkin Anda bisa menggunakan modulo & offset untuk mencoba menyatukan nilai-nilai yang lebih tinggi; inilah yang saya lakukan dalam solusi saya. Ngomong-ngomong, kerja bagus!GolfScript (
116 11397 karakter)Ini termasuk karakter yang tidak dapat dicetak yang digunakan dalam tabel pencarian, jadi saya memberikannya sebagai output xxd:
Ini diterjemahkan ke program yang setara dengan
yang pada dasarnya
Ini menggunakan hash sempurna (non-minimal) berdasarkan ide inti dari algoritma optimal untuk menghasilkan fungsi hash minimal sempurna; Ceko, Havas, dan Majewski; 1992 . Ide dasarnya adalah Anda menggunakan dua fungsi hash,
f1
danf2
, bersama dengan tabel pencariang
, dan hash yang sempurna adalah(g[f1(str)] + g[f2(str)]) % m
(di manam
jumlah string yang ingin kami bedakan); bit pintar adalah cara mereka membangung
. Pertimbangkan semua nilaif1(str)
danf2(str)
untuk untaian yangstr
menarik sebagai simpul dalam grafik yang tidak diarahkan, dan tambahkan keunggulan di antaraf1(str)
danf2(str)
untuk setiap string. Mereka tidak hanya mengharuskan setiap sisi berbeda, tetapi grafik harus asiklik; maka itu hanya DFS untuk menetapkan bobot ke node (yaitu untuk mengisi tabel pencariang
) sehingga setiap tepi memiliki jumlah yang diperlukan.Czech et al menghasilkan fungsi acak
f1
danf2
yang diekspresikan melalui tabel pencarian, tapi itu jelas tidak bagus: Saya mencari hash yang cocok menggunakan konversi basis sederhana dengan dua basis berbeda dari -10 hingga 9. Saya juga melonggarkan persyaratan asiklik. Saya tidak ingin menetapkan nilai string dari 0 hingga 54, tetapi untuk kode ASCII yang sesuai, jadi daripada mengambil(g[f1(str)] + g[f2(str)]) % m
saya ingin(g[f1(str)] + g[f2(str)]) % N
beberapaN > 'z'
. Tapi itu memungkinkan kebebasan untuk mencoba berbagaiN
dan melihat apakah ada di antara mereka yang memungkinkan tabel pencarian yang validg
, terlepas dari apakah ada siklus. Tidak seperti Czech et al, saya tidak peduli jika pencarian untuk fungsi hash yang sempurna adalah O (n ^ 4).Grafik yang dihasilkan oleh
-4base
dan5base
mod59
adalah:yang cukup baik terlepas dari komponen terhubung terbesar, yang memiliki tiga siklus panjang 1. Kita harus naik
N=233
sebelum kita dapat menemukang
yang konsisten.sumber
C, 169 karakter
Saya tidak dapat menemukan fungsi hash yang lebih baik ..
(Saya memposting kode yang tidak dijinakkan tetapi menghitungnya diperkecil; untuk memperkecil hanya lakukan
:%s/ //g | %j!
di vim, lalu masukkan spasi dalam string literal kembali.)Uji coba
(
morse.in
hanya seluruh alfabet dalam morse pada baris terpisah):Penjelasan
Yang ini cukup mudah.
c < 33
menemukan karakter spasi / pemisah (,
\n
, EOF, ...).c % 2
menerjemahkan sebuah titik atau garis menjadi sedikit. Idenya adalah untuk membuat angka unik untuk setiap karakter hanya dengan menafsirkannya sebagai angka biner (setelah awalan dengan 1 untuk berurusan dengan panjang variabel) (interpretasi ini adalahv*2 + c%2
bagian). Saya kemudian mendapatkan 137-char LUT, yang saya padukan dengan hashing nilai yang dihasilkan (v < 64? v : v % 51 + 33
, konstanta ditemukan melalui trial-and-error dan dengan melihat distribusi dan mencoba menemukan celah yang sangat besar). Sayangnya fungsi hash ini memiliki satu tabrakan, itulah sebabnya saya harus melakukan40 → '&'
pemetaan khusus.sumber
R , 145 byte
Diterjemahkan titik ke 2, tanda hubung ke 1 dan menafsirkan angka dalam ternary dan mengambil mod 89, yang memberikan angka unik yang dapat kita gunakan dalam tabel hash. Kehadiran 13 (111 basis-3) berarti menambahkan 1 karena ASCII 13 tidak berfungsi di TIO.
Cobalah online!
R , 236 byte (tidak bersaing)
Ini tidak akan kompetitif, tetapi memungkinkan kami memamerkan sesuatu yang menarik di R: menyimpan pohon kode Morse di dalam struktur bahasa yang dikutip
m
dan mengambilnya dari kode titik dan garis sangat sederhana menggunakan fakta yang[[
dapat diterapkan secara rekursif ke daftar. Misalnyam[[c(2,2,3,2)]]
mengambil titik, titik, tanda hubung, titik atau "f".Cobalah online!
sumber
Powershell, 193 byte
Skrip Tes Kurang Golf:
Keluaran:
sumber
JavaScript (165 byte, hanya menerapkan empat pesawat.)
Input harus ditugaskan
n
, jalankan kode berikut untuk mendapatkan output:sumber
Cannot read property '42' of undefined
, dan IdeOne juga melaporkan kesalahan (meskipun tanpa pesan yang berguna).. -..- .- -- .--. .-.. . .-.-.-
sebagai input, karena kode terakhir adalah panjang 6 karakter. Dalam skrip contoh saya menghilangkannya dan pergi dengan. -..- .- -- .--. .-..
, yang mengingatkan (example
).