pengantar
Ini agak seperti tata letak Keyboard DVORAK , tapi JAUH lebih keras.
Mari kita bicara tentang keyboard Korea terlebih dahulu. Seperti yang Anda lihat di Wikipedia , ada kunci Kor / Eng untuk mengubah antara set kunci Korea dan Inggris.
Orang Korea terkadang salah ketik: mereka mencoba menulis dalam bahasa Korea pada keyboard qwerty atau dalam bahasa Inggris pada keyboard dua set.
Jadi, inilah masalahnya: jika diberikan karakter Korea yang diketik dalam keyboard dua set, ubahlah ke karakter alfabet yang diketik dalam keyboard qwerty. Jika diberi karakter alfabet yang diketik dalam qwerty, ubah ke keyboard dua set.
Keyboard dua set
Berikut adalah tata letak keyboard dua-set:
ㅂㅈㄷㄱㅅㅛㅕㅑㅐㅔ
ㅁㄴㅇㄹㅎㅗㅓㅏㅣ
ㅋㅌㅊㅍㅠㅜㅡ
dan dengan tombol shift:
ㅃㅉㄸㄲㅆㅛㅕㅑㅒㅖ
hanya baris atas yang berubah sementara yang lain tidak.
Tentang Karakter Korea
jika berakhir di sini, itu bisa mudah, tetapi tidak. Saat Anda mengetik
dkssud, tprP!
output tidak ditampilkan dengan cara ini:
ㅇㅏㄴㄴㅕㅇ, ㅅㅔㄱㅖ!
tetapi dengan cara ini:
안녕, 세계!(means Hello, World!)
dan itu membuat segalanya menjadi lebih sulit.
Karakter Korea terpisah menjadi tiga bagian: 'Choseong (konsonan)', 'Jungseong (Vowel)', dan 'Jongseong (konsonan di akhir suku kata: bisa kosong)', dan Anda harus memisahkannya.
Untungnya, ada cara untuk melakukan itu.
Cara memisahkan
Ada 19 Choseong, 21 Jungseong, dan 28 Jongseong (dengan kosong), dan 0xAC00 adalah '가', karakter pertama dari karakter Korea. Dengan ini, kita dapat memisahkan karakter Korea menjadi tiga bagian. Berikut adalah urutan masing-masing dan posisinya di keyboard dua set.
Pesananong:
ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ
r R s e E f a q Q t T d w W c z x v g
pesanan jungseong:
ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ
k o i O j p u P h hk ho hl y n nj np nl b m ml l
pesanan jongseong:
()ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ
()r R rt s sw sg e f fr fa fq ft fx fv fg a q qt t T d w c z x v g
Mari mengatakan (unicode value of some character) - 0xAC00
adalah Korean_code
, dan indeks Choseong, Jungseong, Jongseong adalah Cho
, Jung
,Jong
.
Lalu, Korean_code
adalah(Cho * 21 * 28) + Jung * 28 + Jong
Berikut adalah kode javascript yang memisahkan karakter Korea dari situs web Korea ini, untuk kenyamanan Anda.
var rCho = [ "ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", "ㅂ", "ㅃ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅉ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ" ];
var rJung =[ "ㅏ", "ㅐ", "ㅑ", "ㅒ", "ㅓ", "ㅔ", "ㅕ", "ㅖ", "ㅗ", "ㅘ", "ㅙ", "ㅚ", "ㅛ", "ㅜ", "ㅝ", "ㅞ", "ㅟ", "ㅠ", "ㅡ", "ㅢ", "ㅣ" ];
var rJong = [ "", "ㄱ", "ㄲ", "ㄳ", "ㄴ", "ㄵ", "ㄶ", "ㄷ", "ㄹ", "ㄺ", "ㄻ", "ㄼ", "ㄽ", "ㄾ","ㄿ", "ㅀ", "ㅁ", "ㅂ", "ㅄ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ" ];
var cho, jung, jong;
var sTest = "탱";
var nTmp = sTest.charCodeAt(0) - 0xAC00;
jong = nTmp % 28; // Jeongseong
jung = ((nTmp - jong) / 28 ) % 21 // Jungseong
cho = ( ( (nTmp - jong) / 28 ) - jung ) / 21 // Choseong
alert("Choseong:" + rCho[cho] + "\n" + "Jungseong:" + rJung[jung] + "\n" + "Jongseong:" + rJong[jong]);
Saat dirakit
- Perhatikan bahwa
ㅘ
,ㅙ
,ㅚ
,ㅝ
,ㅞ
,ㅟ
,ㅢ
adalah kombinasi dari jungseongs lainnya.
ㅗ+ㅏ=ㅘ, ㅗ+ㅐ=ㅙ, ㅗ+ㅣ=ㅚ, ㅜ+ㅓ=ㅝ, ㅜ+ㅔ=ㅞ, ㅜ+ㅣ=ㅟ, ㅡ+ㅣ=ㅢ
- Choseong diperlukan. Itu berarti, jika
frk
diberikan, yangㄹㄱㅏ
dapat berubah dalam dua cara:ㄺㅏ
danㄹ가
. Kemudian, Anda harus mengubahnya menjadi cara yang telah memilih. Jikajjjrjr
diberikan, yaituㅓㅓㅓㄱㅓㄱ
, pemimpinㅓ
tidak memiliki apa pun yang dapat dipilih, tetapi yang keempatㅓ
memilikiㄱ
dapat dipilih, sehingga diubah menjadiㅓㅓㅓ걱
.
Contoh lain: 세계
( tprP
). Itu dapat diubah menjadi 섹ㅖ
( (ㅅㅔㄱ)(ㅖ)
), tetapi karena memilihong diperlukan, itu diubah menjadi 세계
( (ㅅㅔ)(ㄱㅖ)
)
Contohnya
masukan 1
안녕하세요
output 1
dkssudgktpdy
masukan 2
input 2
output 2
ㅑㅞㅕㅅ 2
masukan 3
힘ㄴㄴ
keluaran 3
glass
masukan 4
아희(Aheui) is esolang which you can program with pure Korean characters.
keluaran 4
dkgml(모뎌ㅑ) ㅑㄴ ㄷ내ㅣ뭏 조ㅑ초 ㅛㅐㅕ ㅊ무 ㅔ갷ㄱ므 쟈소 ㅔㅕㄱㄷ ㅏㅐㄱㄷ무 촘ㄱㅁㅊㅅㄷㄱㄴ.
masukan 5
dkssud, tprP!
output 5
안녕, 세계!
input 6
ㅗ디ㅣㅐ, 째깅! Hello, World!
output 6
hello, World! ㅗ디ㅣㅐ, 째깅!
Kode terpendek menang. (dalam byte)
Aturan baru untuk kenyamanan Anda
Anda dapat mengabaikan karakter seperti A
yang tidak memiliki pasangannya di papan ketik dua set. sehingga Aheui
untuk Aㅗ뎌ㅑ
OK. Tapi, jika Anda mengubah Aheui
ke모뎌ㅑ
, Anda bisa mendapatkan -5 poin, sehingga Anda bisa mendapatkan 5 byte.
Anda dapat memisahkan dua jungseongs (seperti ㅘ
untuk ㅗ+ㅏ
). seperti rhk
untuk 고ㅏ
, atau how
untuk ㅗㅐㅈ
. Tapi jika Anda menggabungkan itu (seperti rhk
untuk 과
atau how
ke ㅙㅈ
), Anda bisa mendapatkan tambahan -5 poin.
l
setelahml
untuk simbol Koreaㅣ
.fjfau
bisa diartikan sebagai럶ㅕ
atau럴며
. Bagaimana kita menyelesaikan ini?tprP
dalam kasus uji 5: ini berubah menjadiㅅㅔㄱㅖ
, di manaㅅ
Choongong,ㅔ
adalah jungseong danㄱ
adalah sebuah tongong. Jadi bukankah seharusnya ini berubah menjadi섷ㅖ
(dikelompokkan seperti(ㅅㅔㄱ)(ㅖ)
), bukan세계
(dikelompokkan seperti(ㅅㅔ)(ㄱㅖ)
)? Dalam komentar sebelumnya Anda menyatakan itu ditafsirkan dengan mengetik, jadi saya berharapㅅㅔㄱ
untuk berubah menjadi섷
. Atau apakah pengetikan bahasa Korea dari kanan ke kiri bukan dari kiri ke kanan?가
) ke D7AF (힣
).Jawaban:
Jelly ,
296264 byteCobalah online!
Program lengkap yang menggunakan string sebagai argumennya dan mengembalikan string (yang dicetak secara implisit). Ini berfungsi dalam tiga lintasan: pertama itu mengkonversi semua karakter Korea ke daftar titik kode untuk huruf Latin. Kemudian itu mengidentifikasi dan membangun karakter Korea gabungan. Akhirnya, itu mengubah setiap huruf Latin liar yang tersisa menjadi setara dengan Korea. Perhatikan bahwa karakter lain dan huruf Latin yang tidak muncul dalam spesifikasi (mis
A
) Dibiarkan sendiri.Jika konversi ke huruf kecil huruf luar spec diperlukan, ini dapat dilakukan dengan biaya tambahan 10 byte .
Penjelasan
Helper link 1 : link diad dengan argumen x dan y. x adalah daftar pasangan pencarian dan ganti sublists. y akan setiap sublist pencarian diganti dengan sublist pengganti yang sesuai
Tautan bantuan 2 : Daftar karakter Latin / pasangan karakter dalam urutan yang sesuai dengan urutan Unicode dari karakter Korea
Helper link 3 : Daftar karakter Latin yang digunakan untuk Choseong, Jungseong dan Jongseong
Tautan bantuan 4 : Di atas daftar karakter Latin yang disebutkan dan diurutkan dalam urutan panjang yang menurun
Tautan utama : Monad yang menggunakan string Jelly sebagai argumennya dan mengembalikan string Jelly yang diterjemahkan
Bagian 1 : Ubah blok morfemik menjadi titik kode Unicode dari karakter Latin yang sesuai
Bagian 1.1 : Dapatkan daftar karakter Latin yang diperlukan untuk membuat blok
Bagian 1.2 : Buat semua kombinasi huruf-huruf ini (19 × 21 × 28 = 11.172 kombinasi dalam urutan leksikal yang sesuai)
Bagian 1.3 : Pasangkan titik kode Unicode dari blok dengan daftar karakter Latin yang sesuai, dan gunakan ini untuk menerjemahkan blok morfemik dalam string input
Bagian 2 : Konversi karakter Korea individu di output dari bagian 1 ke titik kode setara Latin
Bagian 3 : Rapikan karakter yang tidak diterjemahkan dalam output dari bagian 2 (berfungsi karena apa pun yang diterjemahkan dari bahasa Korea sekarang akan berada dalam sublist dan karenanya memiliki kedalaman 1)
Bagian 4 : Ubah blok morfemik karakter Latin menjadi bahasa Korea
Bagian 4.1 : Dapatkan semua kemungkinan kombinasi Choseong dan Jungseong
Bagian 4.2 : Beri label setiap kombinasi dengan titik kode Unicode untuk blok morfemik dasar (yaitu tanpa Jongseong)
Bagian 4.3 : Ganti string karakter Latin ini dalam output dari bagian 3 dengan titik kode Unicode dari blok morfemik dasar
Bagian 4.4: Identifikasi apakah ada Jongseong sebagai bagian dari setiap blok morfemik
Bagian 5 : Tangani karakter Latin yang tersisa yang cocok dengan karakter Korea tetapi bukan bagian dari blok morphemuc
sumber
책
, saya mengecualikancor
, tetapi hasilnya membericBor
. Dan itu tidak berubahc
menjadiㅊ
.can
harus dikonversi menjadiㅊ무
, tetapi diubah menjadic무
. Dan saya juga mengecualikan karakter besar yang tidak muncul dalam spec akan dipenggal, tetapi bisa baik-baik saja.A
sebagai pengganti untuk karakter kedua dari karakter tunggal, dan untuk beberapa alasan setelahc
itu keluar sebagai aB
. Konversi ke huruf kecil huruf lain bisa dilakukan, tetapi terasa seperti komplikasi yang tidak perlu untuk apa yang sudah merupakan tantangan yang sulit.JavaScript (Node.js) ,
587582575569557554550549 byteJika Anda tidak tahu itu
string.charCodeAt() == string.charCodeAt(0)
.Cobalah online!
547 jika karakter di luar huruf dan jamo korea dapat diabaikan.
Oke saya sudah berjuang begitu lama untuk menulis ini, tetapi ini seharusnya berhasil.
Jamo / suku kata Korea tidak digunakan karena terlalu mahal (3 byte per penggunaan).Digunakan dalam ekspresi reguler untuk menyimpan byte.sumber
Bahasa Wolfram (Mathematica) ,
405401400 byteCobalah online!
Sedikit tidak berbulu
Untuk menguji ini di Mathematica cukup ganti
alphabet
denganAlphabet
; namun, TIO tidak mendukung Cloud Wolfram, jadi saya mendefinisikanAlphabet["Korean"]
di header.Kami pertama-tama mendekomposisi semua suku kata Hangul ke alfabet Hangul, kemudian bertukar karakter Latin dan Hangul, kemudian mengomposisi ulang suku kata tersebut.
sumber
input 2
menghasilkanㅑㅜㅔㅕㅅ 2
bukanㅑㅞㅕㅅ 2
dalam TIO Anda. Meskipun hal yang sama terjadi pada solusi yang saya kerjakan, karena keduanyaㅜ
danㅔ
jungseong, dan saya berada di bawah kesan hanya memilihong + jungseong + jongseong atau Chooseong + jungseong + kosong akan digabungkan. Aku bertanya OP untuk verifikasi mengapaㅜㅔ
menjadiㅞ
.fnpfa
harus karakter tunggal뤪
tetapi berakhir sebagai루ㅔㄹㅁ
Java 19,
113311261133 byteOutput dengan huruf kapital
ASDFGHJKLZXCVBNM
tidak berubah, sejak.toLowerCase()
biayanya lebih dari -5 bonus.Kembalikan +7 byte sebagai perbaikan bug untuk karakter non-Korea di atas nilai unicode 20.000 (terima kasih @NickKennedy karena memperhatikan).
Cobalah online.
Penjelasan:
sumber
44032 + 19×21×28 - 1