La Mã hóa tiếng hàn


12

Vâng, về cơ bản, bạn là một Romanizer, Baby , nhưng khó hơn . thích, cách khó hơn.

Học tiếng Hàn là CỨNG. ít nhất là cho một người bên ngoài châu Á. Nhưng ít nhất họ có cơ hội học hỏi, phải không?

Bạn phải làm gì

Bạn sẽ nhận được một tuyên bố của Hàn Quốc. Ví dụ , 안녕하세요. Bạn phải chuyển đổi đầu vào để phát âm La Mã của nó. Đối với ví dụ đã cho, đầu ra có thể annyeonghaseyo.

Bây giờ nó được kỹ thuật

Một nhân vật Hàn Quốc có ba phần, phụ âm bắt đầu, nguyên âm và phụ âm kết thúc. Phụ âm kết thúc có thể không tồn tại trong ký tự.

Ví dụ: (Phụ âm bắt đầu) và (Nguyên âm) và (Phụ âm bắt đầu), (Nguyên âm) và (Phụ âm kết thúc).

Evert phụ âm và nguyên âm có cách phát âm của nó. Cách phát âm cho mỗi phụ âm như sau.

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

(- có nghĩa là không phát âm hoặc không được sử dụng. Bạn không phải xử lý chúng.)

và phát âm cho mỗi nguyên âm như sau.

Hangul          ㅏ  ㅐ  ㅑ  ㅒ   ㅓ  ㅔ  ㅕ  ㅖ  ㅗ   ㅘ   ㅙ  ㅚ ㅛ  ㅜ  ㅝ  ㅞ  ㅟ   ㅠ  ㅡ   ㅢ ㅣ
Romanization    a   ae  ya  yae eo  e   yeo ye  o   wa  wae oe  yo  u   wo  we  wi  yu  eu  ui  i

Bây giờ là phần khó thực sự

Cách phát âm của phụ âm thay đổi bởi phụ âm kết thúc trước đó. Cách phát âm cho mọi phụ âm Bắt đầu / Kết thúc là hình ảnh sau đây. Cảm ơn bạn, Wikipedia.  Nếu không có cái này, tôi phải VIẾT tất cả cái này. (Bạn không phải thực hiện dấu gạch nối giữa các cách phát âm. Không cần thiết. Nếu một ô có hai hoặc nhiều cách phát âm, hãy chọn một. Nếu không có phụ âm kết thúc, hãy sử dụng cách phát âm gốc.)

Ví dụ

Korean => English
안녕하세요 => annyeonghaseyo
나랏말싸미 듕귁에달아 => naranmalssami dyunggwigedara  //See how the ㅅ in 랏 changes from 't' to 'n'

Ví dụ đề nghị hoan nghênh. Bạn có thể nhận được câu trả lời cho đầu vào của riêng bạn ở đây . (Một trong "Văn bản chung", Sửa đổi là những gì tôi đang yêu cầu)


Đầu vào sẽ luôn bao gồm các ký tự Unicode AC00-D7AF + không gian?
Arnauld

1
Có một số kết hợp ㅎ + X đặc biệt không được tô sáng màu vàng (ví dụ + = ch). Điều đó có nghĩa là chúng tôi không phải hỗ trợ họ? (Ngoài ra, được 'roman hóa' là t thay vì h trong ảnh, điều này hơi khó hiểu.)
Arnauld

1
Các trường hợp thử nghiệm: gist.github.com/perey/563282f8d62c2292d11aabcde0b94d2d Như @Arnauld nói, có một số điểm kỳ lạ trong các kết hợp đặc biệt; cái này có các bài kiểm tra cho tất cả những cái tôi tìm thấy trong bảng, dù được tô sáng hay không. Khi có nhiều tùy chọn tồn tại, chúng được phân tách bằng dấu cách. Không có dấu gạch ngang nào được sử dụng như tôi mong đợi mọi người chơi gôn.
Tim Pederick

1
Tôi không thấy "Văn bản chung" trong liên kết kiểm tra đầu ra được đề xuất của bạn; bạn có nghĩa là "những điều chung"? Nếu vậy, chúng ta nên sử dụng một trong ba thứ gì (Revised, McCune, Yale)? Không có gì có vẻ phù hợp với bảng của bạn; ví dụ: ㅈ theo sau là n nên là "nn" theo bạn nhưng là "tr" hoặc "cl" tại liên kết đó. (Lưu ý rằng các trường hợp thử nghiệm của tôi trong nhận xét trước được dựa trên phiên âm trong câu hỏi!)
Tim Pederick

tiếp theo ㄱ, ㄷ, ㅈcũng là những trường hợp đặc biệt (chúng trở nên khao khát ㅋ, ㅌ, ㅈ(k, t, j)) nên cũng làm nổi bật những trường hợp đó.
JungHwan Min

Câu trả lời:


8

Python 3.6, 400 394 byte

Chỉnh sửa: Nhờ RootTwo cho -6 byte.

Đây là lần gửi đầu tiên của tôi trên CodeGolf, vì vậy tôi khá chắc chắn có nhiều cách tốt hơn để chơi golf, nhưng tôi nghĩ tôi vẫn đăng nó, vì chưa ai đề cập đến ý tưởng chính và điều này vẫn ngắn hơn đáng kể so với các giải pháp khác .

import re,unicodedata as u
t='-'.join(u.name(i)[16:]for i in input()).lower()
for i in range(19):t=re.sub('h-[gdb]|(?<!n)([gdbsjc]+)(?!\\1)(?!-?[aeiouyw]) gg dd bb -- - h(?=[nmrcktp])|hh hj l(?=[aeiouyw]) l[nr] [nt][nr] tm pm [pm][nr] km kn|kr|ngr c yi weo'.split()[i],([lambda m:'ktpttt'['gdbsjc'.index(m[0][-1])]]+'kk,tt,pp, ,,t,c,r,ll,nn,nm,mm,mn,ngm,ngn,ch,ui,wo'.split(","))[i],t)
print(t)

Làm thế nào nó hoạt động

Giải pháp cố gắng khai thác thực tế (mà tôi đã học được từ thử thách La tinh gốc của Nhật Bản) rằng các tên nhân vật được La Mã hóa có thể truy cập được thông qua mô-đun unicodingata của Python. Đối với ngôn ngữ Hàn Quốc, họ có hình thức HANGUL SYLLABLE <NAME>. Thật không may, việc xử lý các tên này để đáp ứng các đặc điểm kỹ thuật được cung cấp và để bao gồm tất cả các kịch bản kết hợp âm tiết vẫn đòi hỏi khá nhiều nỗ lực (và byte).

Tên nhân vật được liệt kê tất cả phụ âm dưới hình thức bất cứ nơi nào lên tiếng của họ trong âm tiết, ví dụ như GGAGGcho , R/Lđược phiên mã như dự định (bắt đầu R, kết thúc L), vàCH được cho là C(điều này thực sự tiết kiệm cho chúng ta một chút đau đầu).

Trước hết, chúng tôi lột bỏ HANGUL SYLLABLE phần (16 ký tự đầu tiên), đánh dấu các ranh giới âm tiết với -, sau đó áp dụng một loạt các RegEx để thực hiện chuyển đổi.

RegEx đầu tiên trông đặc biệt khó chịu. Về cơ bản, việc chuyển đổi các phụ âm bắt đầu thành tương đương cuối của chúng (cũng loại bỏ chữ cái phụ trong trường hợp phụ âm kép), khi chúng không được theo sau bởi một nguyên âm hoặc cho một số chữ cái - khi chúng được đặt trước h. Cái (?<!n)nhìn ngăn chặn sự phù hợp glà một phần của ng(?!\\1)lookahead đảm bảo rằng chúng ta không chuyển đổi, ví dụ, ssathành tsa.

Một vài RegEx tiếp theo chuyển đổi các phụ âm kép bắt đầu thành các tương đương không có tiếng vang của chúng. Đây là nơi -phân cách cũng có ích vì chúng giúp va chạm ranh giới rõ ràng (g-g ) từ các phụ âm kép ( gg). Bây giờ họ cũng có thể được gỡ bỏ.

Tiếp theo, chúng tôi xử lý các h+consonantkết hợp còn lại ,l->r trước các nguyên âm và các trường hợp đặc biệt khác.

Cuối cùng, chúng tôi khôi phục cđến ch, và giải quyết một số pecularities khác tên char đến của chúng tôi, chẳng hạn như yithay vì uiweothay vì wo.

Tôi không phải là một chuyên gia về tiếng Hàn và không thể bình luận nhiều hơn, nhưng điều này dường như vượt qua tất cả các bài kiểm tra được đăng trong nhiệm vụ và trên Github. Rõ ràng, một vài byte nữa có thể bị loại bỏ, nếu đầu ra được chấp nhận bằng chữ in hoa, vì đây là những gì chúng ta nhận được từ hàm name.


Chào mừng đến với PPCG! Câu trả lời tuyệt vời đầu tiên.
FantaC

1
Câu trả lời tốt đẹp. Kể từ python 3.6, m[0]cũng giống như m.group(0); tiết kiệm 6 byte.
RootTwo

5

JavaScript (ES6), 480 byte (WIP)

Đây là một nỗ lực sớm dựa trên các thông số kỹ thuật hiện tại để có được quả bóng lăn. Nó có thể yêu cầu một số sửa chữa khi các câu hỏi trong các ý kiến ​​được giải quyết.

s=>[...s].map(c=>c<'!'?c:(u=c.charCodeAt()-44032,y='1478ghjlmnpr'.search((p=t).toString(36)),t=u%28,u=u/28|0,v=u%21,x=[2,5,6,11,18].indexOf(u=u/21|0),~x&~y&&(z=parseInt(V[y+68][x],36))>10?V[z+69]:V[p+40]+V[u+21])+V[v],t=0,V='8a6y8ye6e46ye4y64w8wa6o6y4u/w4w6wi/yu/eu/ui/i/g/k21d/t7r/3b/p0s/ss95j5ch/270h922/197l999930/77ng/77270h/bbcd6afaa8gghi5ffak8alaa8llmn4gghp8abaa8gghq5gghr5ggha5gghs8ng1ng3g/2ll/n1n3d/7r/m1m3b/0s/5ch/h'.replace(/\d/g,n=>'pnkmojeta/'[n]+'/').split`/`).join``

Các trường hợp thử nghiệm

Làm sao?

Sau khi giải nén, mảng V chứa dữ liệu sau:

00-20 vowels
a/ae/ya/yee/eo/e/yeo/ye/o/wa/wae/oe/yo/u/wo/we/wi/yu/eu/ui/i

21-39 starting consonants
g/kk/n/d/tt/r/m/b/pp/s/ss//j/jj/ch/k/t/p/h

40-67 ending consonants
/k/k//n///t/l////////m/p//t/t/ng/t/t/k/t/p/h

68-79 indices of substitution patterns for consecutive consonants
      ('a' = no substitution, 'b' = pattern #0, 'c' = pattern #1, etc.)
bbcde/afaaa/gghij/ffaka/alaaa/llmno/gghpa/abaaa/gghqj/gghrj/gghaj/gghsa

80-97 substitution patterns
ngn/ngm/g/k/ll/nn/nm/d/t/r/mn/mm/b/p/s/j/ch/h

Chúng tôi chia mỗi nhân vật Hangul thành phụ âm bắt đầu, nguyên âm và phụ âm kết thúc. Chúng tôi nối vào kết quả:

  • V[80 + substitution] + V[vowel] nếu có sự thay thế
  • V[40 + previousEndingConsonant] + V[21 + startingConsonant] + V[vowel] nếu không thì

Không thể '!'được 33?
Jonathan Frech

@JonathanFrech ckhông phải là một byte. Đó là một chuỗi 1 ký tự. Điều đó nói rằng , khi áp dụng một phép toán số học, một khoảng trắng bị ép buộc 0trong khi các ký tự không có chữ số khác bị ép buộc NaN. Điều đó có nghĩa là c<1thực sự nên làm việc như mong đợi. (Và c<33cũng sẽ hoạt động cho các ký tự không có chữ số, mặc dù đây là loại tình cờ.)
Arnauld

@JonathanFrech Addendum: c<1cũng sẽ là sự thật cho "0"(điều này có thể ổn nếu đầu vào được đảm bảo không chứa bất kỳ chữ số Ả Rập nào.)
Arnauld

Cảm ơn. Tôi không nghĩ rằng JavaScript sẽ có các ký tự được triển khai dưới dạng một byte, dù sao cũng đã thử. Nó, tuy nhiên, dường như làm việc. Vui mừng bây giờ biết tại sao.
Jonathan Frech

2

Tcl, 529 byte

fconfigure stdin -en utf-8
foreach c [split [read stdin] {}] {scan $c %c n
if {$n < 256} {append s $c} {incr n -44032
append s [string index gKndTrmbPsS-jJCktph [expr $n/588]][lindex {a ae ya yae eo e yeo ye o wa wae oe yo u wo we wi yu eu ui i} [expr $n%588/28]][string index -Ak-n--tl-------mp-BGQDEkFph [expr $n%28]]}}
puts [string map {nr nn
A- g An ngn Ar ngn Am ngm A kk
t- d p- b B- s D- j
nr ll l- r ln ll lr ll
A k B t G t D t E t F t
K kk T tt P pp S ss J jj C ch Q ng
- ""} [regsub -all -- {[tpBDEFh]([nrm])} $s n\\1]]

Thuật toán

  1. Phân rã thành các chỉ số chì, nguyên âm và đuôi
  2. Tra cứu đầu tiên để đại diện bảng chữ cái trung gian
  3. Áp dụng một vượt qua ban đầu cho tất cả các biến đổi xn → nn / xm → nm
  4. Áp dụng một đường chuyền cuối cùng cho các biến đổi còn lại

Thuật toán này được thực hiện cho mục đích của thách thức; sự đánh đổi là đầu vào được cho là không chứa bất kỳ ký tự chữ cái Latinh nào, cũng không sử dụng các ký tự bên ngoài khối Hangul U + AC00 như được mô tả trong thử thách. Đây là mã thực sự, tôi sẽ giữ tất cả các biến đổi trong Jamo cho đến khi vượt qua cuối cùng.

Tôi cho rằng tôi có thể ném thêm một chút năng lực vào việc nghiền nát những nguyên âm đó và một số sự lặp lại trong bảng tra cứu, nhưng điều này cũng tốt như nó nhận được từ tôi ngày hôm nay.

Kiểm tra

Đảm bảo rằng bạn có thể cung cấp đầu vào UTF-8 cho trình thông dịch Tcl. Điều này được thực hiện dễ dàng nhất với tệp văn bản UTF-8 đơn giản. Than ôi, Tcl vẫn không mặc định là UTF-8 theo mặc định; Điều này làm tôi mất 33 byte.

Đây là tệp thử nghiệm (hiện đang thảm hại) của tôi:

한
안녕하세요
나랏말싸미 듕귁에달아

Ghi chú

Tôi không biết gì về ngôn ngữ Hàn Quốc (ngoại trừ những gì tôi đã học được ở đây). Đây là lần thử đầu tiên, đang chờ sửa đổi tiềm năng do cập nhật trong đặc tả câu hỏi.

Và, về điều đó, một số thông tin bổ sung là hữu ích. Cụ thể, không có sự tương ứng 1: 1 giữa phụ âm đầu và đuôi như dường như được đề xuất trong thử thách. Hai trang web sau đây đã giúp tìm ra điều đó:
Wikipedia: Tiếng Hàn, Hangul
Wikipedia: Hangul Jamo (khối Unicode)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.