Ya, pada dasarnya Anda seorang Romanizer, Sayang , tetapi lebih sulit . seperti, jauh lebih sulit.
Belajar bahasa Korea adalah KERAS. setidaknya untuk seseorang di luar Asia. Tetapi mereka setidaknya memiliki kesempatan untuk belajar, bukan?
Apa yang harus Anda lakukan
Anda akan diberikan Pernyataan Korea. Sebagai contoh 안녕하세요
,. Anda harus mengonversi input ke pengucapan Romawi. Untuk contoh yang diberikan, hasilnya bisa annyeonghaseyo
.
Sekarang menjadi teknis
Karakter Korea memiliki tiga bagian, Konsonan awal, Vokal, dan Konsonan akhir. Konsonan akhir mungkin tidak ada dalam karakter.
Misalnya, 아
adalah ㅇ
(Konsonan awal) dan ㅏ
(Vokal), dan 손
adalah ㅅ
(Konsonan awal), ㅗ
(Vokal), dan ㄴ
(Akhir konsonan).
Evert konsonan dan vokal memiliki pengucapannya. Pengucapan untuk setiap konsonan adalah sebagai berikut.
Korean ㄱ ㄲ ㄴ ㄷ ㄸ ㄹ ㅁ ㅂ ㅃ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ
Romanization Starting g kk n d tt r m b pp s ss – j jj ch k t p h
Ending k k n t – l m p – t t ng t – t k t p h
(- Berarti tidak ada pengucapan atau tidak digunakan. Anda tidak harus menanganinya.)
dan pengucapan untuk setiap vokal adalah sebagai berikut.
Hangul ㅏ ㅐ ㅑ ㅒ ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ ㅡ ㅢ ㅣ
Romanization a ae ya yae eo e yeo ye o wa wae oe yo u wo we wi yu eu ui i
Sekarang bagian yang sangat sulit
Pengucapan konsonan berubah oleh konsonan Ending sebelumnya. Pengucapan untuk setiap konsonan Starting / Ending adalah seperti gambar berikut. (Anda tidak harus melakukan tanda hubung di antara pengucapan. Itu tidak perlu. Jika sel memiliki dua pengucapan atau lebih, pilih satu. Jika tidak ada konsonan akhir, gunakan pengucapan aslinya.)
Contohnya
Korean => English
안녕하세요 => annyeonghaseyo
나랏말싸미 듕귁에달아 => naranmalssami dyunggwigedara //See how the ㅅ in 랏 changes from 't' to 'n'
Saran contoh disambut. Anda bisa mendapatkan jawaban untuk masukan Anda sendiri di sini . (Yang ada di "Teks umum", Direvisi adalah apa yang saya minta)
sumber
ㅎ
diikuti olehㄱ, ㄷ, ㅈ
juga kasus khusus (mereka menjadi aspirasiㅋ, ㅌ, ㅈ
(k, t, j)) harus menyoroti itu juga.Jawaban:
Python 3.6,
400394 byteSunting: Berkat RootTwo untuk -6 byte.
Ini adalah pengajuan pertama saya pada CodeGolf, jadi saya cukup yakin ada cara yang lebih baik untuk bermain golf, tapi saya pikir saya masih akan mempostingnya, karena belum ada yang menyebutkan ide kunci, dan ini masih jauh lebih singkat daripada solusi lain .
Bagaimana itu bekerja
Solusi ini mencoba untuk mengeksploitasi fakta (yang saya pelajari dari tantangan romanisasi Jepang asli) bahwa nama karakter yang diromanisasi dapat diakses melalui modul unicodedata Python. Untuk bahasa Korea, mereka mengambil bentuk
HANGUL SYLLABLE <NAME>
. Sayangnya, memproses nama-nama ini untuk memenuhi spesifikasi yang disediakan dan untuk mencakup semua skenario kombinasi suku kata masih membutuhkan sedikit usaha (dan byte).Nama-nama karakter yang diperoleh mendaftar semua konsonan dalam bentuk suara mereka di mana saja dalam suku kata, misalnya
GGAGG
untuk깎
,R/L
ditranskripsikan sebagaimana dimaksud (mulaiR
, berakhirL
), danCH
diberikan sebagaiC
(ini sebenarnya menghemat sedikit sakit kepala).Pertama-tama, kita menanggalkan
HANGUL SYLLABLE
bagian (16 karakter pertama), menandai batas suku kata dengan-
, dan kemudian menerapkan serangkaian RegEx'es untuk melakukan konversi.RegEx pertama terlihat sangat jahat. Apa yang pada dasarnya dilakukannya adalah konversi konsonan awal ke dalam ekuivalen akhir mereka (juga menghapus huruf tambahan dalam kasus konsonan ganda), ketika mereka tidak diikuti oleh vokal, atau untuk beberapa huruf - ketika mereka didahului oleh
h
. Tampilan di belakang(?<!n)
mencegah pencocokang
yang merupakan bagian daring
, dan(?!\\1)
lookahead memastikan bahwa kami tidak mengonversi, misalnyassa
menjaditsa
.Beberapa RegEx'es berikutnya mengkonversi mulai konsonan ganda menjadi padanan tidak bersuara mereka. Di sinilah
-
pemisah juga berguna karena mereka membantu membedakan tumbukan batas (g-g
) dari konsonan ganda (gg
). Sekarang mereka juga bisa dihapus.Selanjutnya, kami menangani
h+consonant
kombinasi yang tersisa ,l->r
sebelum vokal, dan case khusus lainnya.Akhirnya, kami mengembalikan
c
kech
, dan menyelesaikan beberapa kekhasan lainnya dari nama char kami yang masuk, sepertiyi
bukannyaui
danweo
bukannyawo
.Saya bukan ahli bahasa Korea dan tidak bisa berkomentar lebih banyak, tetapi ini tampaknya lulus semua tes yang diposting di tugas dan di Github. Jelas, beberapa byte lagi dapat dicukur, jika outputnya dapat diterima dalam huruf besar, karena ini adalah apa yang kita dapatkan dari fungsi nama.
sumber
m[0]
sama denganm.group(0)
; menghemat 6 byte.JavaScript (ES6), 480 byte (WIP)
Ini adalah upaya awal berdasarkan spesifikasi saat ini untuk mendapatkan bola bergulir. Ini mungkin memerlukan beberapa perbaikan ketika pertanyaan dalam komentar ditujukan.
Uji kasus
Tampilkan cuplikan kode
Bagaimana?
Setelah didekompresi, array V berisi data berikut:
Kami membagi setiap karakter Hangul menjadi konsonan awal, vokal dan konsonan akhir. Kami menambahkan hasilnya:
V[80 + substitution] + V[vowel]
jika ada substitusiV[40 + previousEndingConsonant] + V[21 + startingConsonant] + V[vowel]
jika tidaksumber
'!'
bisa33
?c
bukan byte. Ini adalah string 1 karakter. Yang mengatakan , ketika menerapkan operasi aritmatika, spasi dipaksa0
sementara karakter non-digit lainnya dipaksaNaN
. Yang berartic<1
harus benar-benar berfungsi seperti yang diharapkan. (Danc<33
juga akan berfungsi untuk karakter non-digit, meskipun ini agak kebetulan.)c<1
juga benar untuk"0"
(yang mungkin OK jika input dijamin tidak mengandung angka Arab.)Tcl, 529 byte
Algoritma
Algoritma ini berderak untuk tujuan tantangan; trade-off adalah bahwa input diasumsikan tidak mengandung karakter alfabet Latin, atau untuk menggunakan karakter di luar blok Hangul U + AC00 seperti yang dijelaskan dalam tantangan. Apakah ini kode asli, saya akan menyimpan semua transformasi di Jamo sampai lulus terakhir.
Saya kira saya bisa melempar lebih banyak kekuatan otak pada vokal-vokal itu dan beberapa pengulangan dalam tabel pencarian, tetapi ini sama baiknya dengan yang saya dapatkan hari ini.
Pengujian
Pastikan Anda dapat menyediakan input UTF-8 ke juru bahasa Tcl. Ini paling mudah dilakukan dengan file teks UTF-8 yang sederhana. Sayangnya, Tcl masih tidak default ke UTF-8 secara default; ini harganya 33 byte.
Ini file pengujian saya (saat ini menyedihkan):
Catatan
Saya tidak tahu apa-apa tentang bahasa Korea (kecuali sedikit yang telah saya pelajari di sini). Ini adalah upaya pertama, sambil menunggu revisi potensial karena pembaruan dalam spesifikasi pertanyaan.
Dan, tentang itu, beberapa informasi tambahan bermanfaat. Secara khusus, tidak ada korespondensi 1: 1 antara konsonan memimpin dan ekor seperti yang disarankan dalam tantangan. Dua situs berikut sangat membantu mengetahuinya:
• Wikipedia: Bahasa Korea, Hangul
• Wikipedia: Hangul Jamo (blok Unicode)
sumber