韓国語の2セットキーボードとqwertyキーボード間の変換


14

前書き

DVORAKキーボードレイアウトに似ています難しくなります。

最初に韓国語のキーボードについて話しましょう。ウィキペディアで見ることができるようにで、韓国語と英語のキーセットを切り替えるKor / Engキーがあります。

韓国人は間違ったタイプを入力することがあります。韓国語でqwertyキーボード、または英語で2セットキーボードで入力しようとします。

だから、ここに問題があります:韓国語の文字を2セットキーボードで入力した場合、それをqwertyキーボードで入力したアルファベット文字に変換します。qwertyで入力されたアルファベット文字が指定されている場合は、2文字キーボードに変更します。

2セットキーボード

以下に2セットのキーボードレイアウトを示します。

ㅂㅈㄷㄱㅅㅛㅕㅑㅐㅔ
 ㅁㄴㅇㄹㅎㅗㅓㅏㅣ
  ㅋㅌㅊㅍㅠㅜㅡ

そして、シフトキーで:

ㅃㅉㄸㄲㅆㅛㅕㅑㅒㅖ

一番上の行だけが変更され、他の行は変更されません。

韓国文字について

ここで終了した場合、簡単かもしれませんが、いいえ。入力するとき

dkssud, tprP!

出力はこの方法では表示されません。

ㅇㅏㄴㄴㅕㅇ, ㅅㅔㄱㅖ!

しかし、このように:

안녕, 세계!(means Hello, World!)

そしてそれは物事をずっと難しくします。

韓国語の文字は、「長城(子音)」、「中城(母音)」、および「J城(音節の末尾の子音:空白にすることができます)」の3つの部分に分かれています。

幸いなことに、それを行う方法があります。

分離方法

19個のチョソン、21個のチョンソン、および28個のジョンソン(空白)があり、0xAC00は韓国語文字の最初の文字である「가」です。これを使用して、韓国語の文字を3つの部分に分けることができます。以下に、それぞれの順序と2セットキーボードでの位置を示します。

選択した順序:

ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ
r R s e E f a q Q t T d w W c z x v g

中城順:

ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ
k o i O j p u P h hk ho hl y n nj np nl b m ml l

ジョンソン順:

()ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ
()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

レッツ・発言が(unicode value of some character) - 0xAC00ありKorean_code、かつ初声、Jungseongのインデックス、JongseongがありますChoJungJong

その後、Korean_codeあります(Cho * 21 * 28) + Jung * 28 + Jong

以下は、便宜上、この韓国語のWebサイトから韓国語の文字を分離するjavascriptコードです。

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]);

組み立てたとき

  1. なおその他のjungseongsの組み合わせです。
ㅗ+ㅏ=ㅘ, ㅗ+ㅐ=ㅙ, ㅗ+ㅣ=ㅚ, ㅜ+ㅓ=ㅝ, ㅜ+ㅔ=ㅞ, ㅜ+ㅣ=ㅟ, ㅡ+ㅣ=ㅢ
  1. チョソンが必要です。ことを意味している場合、frkある、与えられてㄹㄱㅏ、それは2つの方法で変更することができますㄺㅏㄹ가。次に、それを選択した方法に変換する必要があります。jjjrjr与えられた場合、つまりㅓㅓㅓㄱㅓㄱ、リーディングsには選択できるものはありませんが、4番目には選択できるものがあるため、に変更されㅓㅓㅓ걱ます。

別の例:세계tprP)。これは섹ㅖ(ㅅㅔㄱ)(ㅖ))に変更できますが、chosenongが必要であるため、세계(ㅅㅔ)(ㄱㅖ))に

入力1

안녕하세요

出力1

dkssudgktpdy

入力2

input 2

出力2

ㅑㅞㅕㅅ 2

入力3

힘ㄴㄴ

出力3

glass

入力4

아희(Aheui) is esolang which you can program with pure Korean characters.

出力4

dkgml(모뎌ㅑ) ㅑㄴ ㄷ내ㅣ뭏 조ㅑ초 ㅛㅐㅕ ㅊ무 ㅔ갷ㄱ므 쟈소 ㅔㅕㄱㄷ ㅏㅐㄱㄷ무 촘ㄱㅁㅊㅅㄷㄱㄴ.

入力5

dkssud, tprP!

出力5

안녕, 세계!

入力6

ㅗ디ㅣㅐ, 째깅! Hello, World!

出力6

hello, World! ㅗ디ㅣㅐ, 째깅!

最短のコードが優先されます。(バイト単位)

便利な新しいルール

A2種類のキーボードに対応する文字がないような文字は無視できます。これAheuiまでAㅗ뎌ㅑOKです。ただし、に変更Aheuiすると모뎌ㅑ、-5ポイントを獲得できるため、5バイトを獲得できます。

あなたは2つのjungseongsを分離することができます(のようㅗ+ㅏ)。同様rhk고ㅏ、またはhowしますㅗㅐㅈ。ただし、(rhkto howtoなどㅙㅈ)を組み合わせると、追加の-5ポイントを獲得できます。


jungseong注文セクション文字のいずれかが欠落しています。21個の韓国語記号が表示されますが、20個の文字(ペア)しかありません。編集:韓国のシンボルのlmlにトライアルが欠落しているようだ
ケビンクルーッセン

@KevinCruijssen編集 forのl。
LegenDUST

1
複数の解釈が存在する場合があります。たとえば、またはfjfauとして解釈できます。これをどのように解決しますか?럶ㅕ럴며
ニックケネディ

1
@LegenDUSTまあ、私は韓国語を一語も読めないので、説明をしなければなりません。;としてのp tprPテストケース5:この変換にㅅㅔㄱㅖ初声があるが、jungseongとjongseongあります。だから、これは変身should't 섷ㅖ(のようにグループ化された(ㅅㅔㄱ)(ㅖ))の代わりに、세계(のようにグループ化されましたか(ㅅㅔ)(ㄱㅖ))?以前のコメントで、あなたはそれがタイプすることで解釈されると述べているので、私はㅅㅔㄱに変換することを期待しています。または、韓国語は左から右ではなく、右から左に入力していますか?
ケビンクルーッセン

1
Unicode.orgの@KevinCruijssen PDFファイル。AC00()からD7AF()。
LegenDUST

回答:


6

ゼリー296264バイト

Ẏœṣjƭƒ
“ȮdȥŒ~ṙ7Ṗ:4Ȧịعʂ ="÷Ƥi-ẓdµ£f§ñỌ¥ẋaḣc~Ṡd1ÄḅQ¥_æ>VÑʠ|⁵Ċ³(Ė8ịẋs|Ṇdɼ⁼:Œẓİ,ḃṙɠX’ṃØẠs2ḟ€”A
“|zƒẉ“®6ẎẈ3°Ɠ“⁸)Ƙ¿’ḃ2’T€ị¢
¢ĖẈṪ$ÞṚƊ€
3£OŻ€3¦ŒpFḟ0Ɗ€J+“Ḥœ’,ƲyO2£OJ+⁽.[,Ʋ¤y¹ỌŒḊ?€µ¢ṖŒpZF€’ḋ588,28+“Ḥþ’Ʋ0;,ʋ/ṚƲ€ñṣ0ḊḢ+®Ṫ¤Ɗ;ṫ®$Ɗ¹Ḋ;⁶Ṫ⁼ṁ@¥¥Ƈ@¢ṪẈṪ‘;Ʋ€¤ḢƲ©?€ṭḢƲF2£żJ+⁽.[Ɗ$ẈṪ$ÞṚ¤ñỌ

オンラインでお試しください!

引数として文字列を取り、文字列を返す完全なプログラム(暗黙的に印刷されます)。これは3つのパスで機​​能します。最初に、すべての韓国語文字をラテン文字のコードポイントのリストに変換します。次に、複合韓国語文字を識別して構築します。最後に、残りの迷いラテン文字を韓国語の対応するものに変えます。仕様に含まれていない他の文字やラテン文字(例:)Aはそのまま残されます。

仕様外の大文字の小文字への変換が必要な場合、これは追加の10バイトのコストで実行できます

説明

ヘルパーリンク1:引数xおよびyを使用したダイアディックリンク。xは、検索と置換のサブリストのペアのリストです。yは、各検索サブリストを対応する置換サブリストに置き換えます

Ẏ      | Tighten (reduce to a single list of alternating search and replace sublists)
     ƒ | Reduce using y as starting argument and the following link:
    ƭ  | - Alternate between using the following two links:
 œṣ    |   - Split at sublist
   j   |   - Join using sublist

ヘルパーリンク2:韓国語文字のUnicode順序に対応する順序でのラテン文字/文字ペアのリスト

“Ȯ..X’          | Base 250 integer 912...
      ṃØẠ       | Base decompress into Latin letters (A..Za..z)
         s2     | Split into twos
           ḟ€”A | Filter out A from each (used as filler for the single characters)

ヘルパーリンク3:Choseong、Jungseong、およびJongseongに使用されるラテン文字のリスト

“|...¿’        | List of base 250 integers, [1960852478, 2251799815782398, 2143287262]
       ḃ2      | Convert to bijective base 2
         ’     | Decrease by 1
          T€   | List of indices of true values for each list
            ị¢ | Index into helper link 2

ヘルパーリンク4:上記のラテン文字のリストは、長さの降順で列挙およびソートされます

¢         | Helper link 3 as a nilad
       Ɗ€ | For each list, the following three links as a monad
 Ė        | - Enumerate (i.e. prepend a sequential index starting at 1 to each member of the list)
    $Þ    | - Sort using, as a key, the following two links as a monad
  Ẉ       |   - Lengths of lists
   Ṫ      |   - Tail (this will be the length of the original character or characters)
      Ṛ   | - Reverse

メインリンク:Jelly文字列を引数として受け取り、翻訳されたJelly文字列を返すMonad

セクション1:形態素ブロックを対応するラテン文字のUnicodeコードポイントに変換する

セクション1.1:ブロックの作成に必要なラテン文字のリストを取得します

3£      | Helper link 3 as a nilad (lists of Latin characters used for Choseong, Jungseong and Jongseong)
  O     | Convert to Unicode code points
   Ż€3¦ | Prepend a zero to the third list (Jongseong)

セクション1.2:これらの文字のすべての組み合わせを作成します(19×21×28 =適切な字句順で11,172の組み合わせ)

Œp      | Cartesian product
     Ɗ€ | For each combination:
  F     | - Flatten
   ḟ0   | - Filter zero (i.e. combinations with an empty Jonseong)

セクション1.3:ブロックのUnicodeコードポイントをラテン文字の対応するリストとペアにし、これらを使用して入力文字列の形態素ブロックを変換します

       Ʋ   | Following as a monad
J          | - Sequence from 1..11172
 +“Ḥœ’     | - Add 44031
      ,    | - Pair with the blocks themelves
        y  | Translate the following using this pair of lists
         O | - The input string converted to Unicode code points

セクション2:セクション1からの出力の個々の韓国語文字をラテン語の同等のコードポイントに変換します

          ¤  | Following as a nilad
2£           | Helper link 2 (list of Latin characters/character pairs in the order that corresponds to the Unicode order of the Korean characters)
  O          | Convert to Unicode code points
         Ʋ   | Following as a monad:
   J         | - Sequence along these (from 1..51)
    +⁽.[     | - Add 12592
        ,    | - Pair with list of Latin characters
           y | Translate the output from section 1 using this mapping

セクション3:セクション2からの出力で未翻訳の文字を整理します(韓国語から翻訳されたものはすべてサブリストに含まれ、そのため深さ1になるため機能します)

  ŒḊ?€  | For each member of list if the depth is 1:
¹       | - Keep as is
 Ọ      | Else: convert back from Unicode code points to characters
      µ | Start a new monadic chain using the output from this section as its argument

セクション4:ラテン文字の形態素ブロックを韓国語に変換する

セクション4.1:長城と中城の可能な組み合わせをすべて取得する

¢    | Helper link 4 (lists of Latin characters enumerated and sorted in decreasing order of length)
 Ṗ   | Discard last list (Jongseong)
  Œp | Cartesian product

セクション4.2:ベースの形態素ブロックのUnicodeコードポイントで各組み合わせにラベルを付けます(つまり、ジョンソンなし)

                       Ʋ€ | For each Choseong/Jungseong combination
Z                         | - Transpose, so that we now have e.g. [[1,1],["r","k"]]
 F€                       | - Flatten each, joining the strings together
                    ʋ/    | - Reduce using the following as a dyad (effectively using the numbers as left argument and string of Latin characters as right)
                Ʋ         |   - Following links as a monad
   ’                      |     - Decrease by 1
    ḋ588,28               |     - Dot product with 21×28,28
           +“Ḥþ’          |     - Add 44032
                 0;       |     - Prepend zero; used for splitting in section 4.3 before each morphemic block (Ż won’t work because on a single integer it produces a range)
                   ,      |     - Pair with the string of Latin characters
                      Ṛ   |   - Reverse (so we now have e.g. ["rk", 44032]

セクション4.3:セクション3の出力のラテン文字のこれらの文字列を、基本形態素ブロックのUnicodeコードポイントに置き換えます

ñ   | Call helper link 1 (effectively search and replace)
 ṣ0 | Split at the zeros introduced in section 4.2

セクション4.4:各形態素ブロックの一部としてJongseongがあるかどうかを特定する

                                        Ʋ | Following as a monad:
Ḋ                                         | - Remove the first sublist (which won’t contain a morphemic block; note this will be restored later)
                                     €    | - For each of the other lists Z returned by the split in section 4.3 (i.e. each will have a morphemic block at the beginning):
                                  Ʋ©?     |   - If the following is true (capturing its value in the register in the process) 
             Ḋ                            |     - Remove first item (i.e. the Unicode code point for the base morphemic block introduced in section 4.3)
              ;⁶                          |     - Append a space (avoids ending up with an empty list if there is nothing after the morphemic block code point)
                                          |       (Output from the above will be referred to as X below)
                                ¤         |       * Following as a nilad (call this Y):
                        ¢                 |         * Helper link 4
                         Ṫ                |         * Jongseong
                              Ʋ€          |         * For each Jongseong Latin list:
                          Ẉ               |           * Lengths of lists
                           Ṫ              |           * Tail (i.e. length of Latin character string)
                            ‘             |           * Increase by 1
                             ;            |           * Prepend this (e.g. [1, 1, "r"]
                     ¥Ƈ@                  |     - Filter Y using X from above and the following criteria
                Ṫ                         |       - Tail (i.e. the Latin characters for the relevant Jongseong
                 ⁼ṁ@¥                     |       - is equal to the beginning of X trimmed to match the relevant Jongseong (or extended but this doesn’t matter since no Jongseong are a double letter)
                                  Ḣ       |       - First matching Jongseong (which since they’re sorted by descending size order will prefer the longer one if there is a matching shorter one)
           Ɗ                              | - Then: do the following as a monad (note this is now using the list Z mentioned much earlier):
      Ɗ                                   |   - Following as a monad
 Ḣ                                        |     - Head (the Unicode code point of the base morphemic block)
  +®Ṫ¤                                    |     - Add the tail of the register (the position of the matched Jongsepng in the list of Jongseong)
       ;                                  |   - Concatenate to:
        ṫ®$                               |     - The rest of the list after removing the Latin characters representing the Jongseong
            ¹                             | - Else: leave the list untouched (no matching Jongseong)
                                       ṭ  | - Prepend:
                                        Ḣ |   - The first sublist from the split that was removed at the beginning of this subsection

セクション5:韓国語の文字に一致するが、形態素ブロックの一部ではない残りのラテン文字を処理する

F                   | Flatten
                ¤   | Following as a nilad
 2£                 | - Helper link 2 (Latin characters/pairs of characters in Unicode order of corresponding Korean character)
          $         | - Following as a monad
   ż     Ɗ          |   - zip with following as a monad
    J               |     - Sequence along helper link 2 (1..51)
     +⁽.[           |     - Add 12592
             $Þ     | - Sort using following as key
           Ẉ        |   - Lengths of lists
            Ṫ       |   - Tail (i.e. length of Latin string)
               Ṛ    | - Reverse
                 ñ  | Call helper link 1 (search Latin character strings and replace with Korean code points)
                  Ọ | Finally, convert all Unicode code points back to characters and implicitly output

1
出力が間違っています:私が入れたとき、私は除外corしましたが、それは与えましたcBor。そして、それは変更されませんccanに変換する必要がㅊ무ありましたが、それはに変換しましたc무。また、仕様に表示されない大きな文字は大文字になりますが、問題はありません。
LegenDUST

@LegenDUST cの問題が修正されました。私Aは単一文字の2番目の文字のプレースホルダーとして使用しましたが、何らかの理由で1 cつがとして出てきましたB。他の文字を小文字に変換することもできますが、すでに困難な課題に不必要に複雑に感じます。
ニックケネディ

これは難しいと思います。そこで、新しいルールを追加しました。資本を取り除けば、5バイトを獲得できます。しかし、これは問題ありません。
LegenDUST

3

JavaScript(Node.js)587 582 575 569 557 554 550 550バイト

tfwあなたはそれを知らなかったstring.charCodeAt() == string.charCodeAt(0)

s=>s.replace(eval(`/[ㄱ-힣]|${M="(h[kol]?|n[jpl]?|ml?|[bi-puyOP])"}|([${S="rRseEfaqQtTdwWczxvg"}])(${M}((s[wg]|f[raqtxvg]|qt|[${S}])(?!${M}))?)?/g`,L="r,R,rt,s,sw,sg,e,E,f,fr,fa,fq,ft,fx,fv,fg,a,q,Q,qt,t,T,d,w,W,c,z,x,v,g,k,o,i,O,j,p,u,P,h,hk,ho,hl,y,n,nj,np,nl,n,m,ml,l".split`,`,l=L.filter(x=>!/[EQW]/.test(x)),I="indexOf"),(a,E,A,B,C,D)=>a<"~"?E?X(E):A&&C?F(43193+S[I](A)*588+L[I](C)*28+l[I](D)):X(A)+X(C)+X(D):(b=a.charCodeAt()-44032)<0?L[b+31439]||a:S[b/588|0]+L[30+b/28%21|0]+["",...l][b%28],F=String.fromCharCode,X=n=>n?F(L[I](n)+12593):"")

オンラインでお試しください!

547アルファベットおよび韓国語のジャモス以外の文字を無視できる場合。

さて、これを書くのに長い間苦労しましたが、これはうまくいくはずです。韓国語のジャモ/音節は、高すぎる(使用ごとに3バイト)ため使用されません。バイトを節約するために正規表現で使用されます。

s=>                                                    // Main Function:
 s.replace(                                            //  Replace all convertible strings:
  eval(
   `/                                                  //   Matching this regex:
    [ㄱ-힣]                                             //   ($0) All Korean jamos and syllables
    |${M="(h[kol]?|n[jpl]?|ml?|[bi-puyOP])"}           //   ($1) Isolated jungseong codes
    |([${S="rRseEfaqQtTdwWczxvg"}])                    //   ($2) Choseong codes (also acts as lookup)
     (                                                 //   ($3) Jungseong and jongseong codes:
      ${M}                                             //   ($4)  Jungseong codes
      (                                                //   ($5)  Jongseong codes:
       (                                               //   ($6)
        s[wg]|f[raqtxvg]|qt                            //          Diagraphs unique to jongseongs
        |[${S}]                                        //          Or jamos usable as choseongs
       ) 
       (?!${M})                                        //         Not linked to the next jungseong
      )?                                               //        Optional to match codes w/o jongseong
     )?                                                //       Optional to match choseong-only codes
   /g`,                                                //   Match all
   L="(...LOOKUP TABLE...)".split`,`,                  //   Lookup table of codes in jamo order
   l=L.filter(x=>!/[EQW]/.test(x)),                    //   Jongseong lookup - only first half is used
   I="indexOf"                                         //   [String|Array].prototype.indexOf
  ),
  (a,E,A,B,C,D)=>                                      //   Using this function:
   a<"~"?                                              //    If the match is code (alphabets):
    E?                                                 //     If isolated jungseongs code:
     X(E)                                              //      Return corresponding jamo
    :A&&C?                                             //     Else if complete syllable code:
     F(43193+S[I](A)*588+L[I](C)*28+l[I](D))           //      Return the corresponding syllable
    :X(A)+X(C)+X(D)                                    //     Else return corresponding jamos joined
   :(b=a.charCodeAt()-44032)<0?                        //    Else if not syllable:
    L[b+31439]||a                                      //     Return code if jamo (if not, ignore)
   :S[b/588|0]+L[30+b/28%21|0]+["",...l][b%28],        //    Else return code for the syllable
  F=String.fromCharCode,                               //   String.fromCharCode
  X=n=>                                                //   Helper function to convert code to jamo
   n?                                                  //    If not undefined:
    F(L[I](n)+12593)                                   //     Return the corresponding jamo
   :""                                                 //    Else return empty string
 )

2

Wolfram言語(Mathematica)405 401 400バイト

c=CharacterRange
p=StringReplace
q=StringReverse
r=Reverse
t=Thread
j=Join
a=j[alphabet@"Korean",4520~c~4546]
x=j[#,r/@#]&@t[a->Characters@"rRseEfaqQtTdwWczxvgkoiOjpuPh"~j~StringSplit@"hk ho hl y n nj np nl b m ml l 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"]
y=t[""<>r@#&/@Tuples@TakeList[Insert[a,"",41]~p~x~p~x,{19,21,28}]->44032~c~55203]
f=q@p[q@#,#2]&
g=f[#,r/@y]~p~x~f~y&

オンラインでお試しください!

わずかに食べられない

Mathematicaでこれをテストするには、単に;に置き換えalphabetてくださいAlphabet。ただし、TIOはWolfram CloudをサポートしていないためAlphabet["Korean"]、ヘッダーで定義しました。

最初にすべてのハングル音節をハングル文字に分解し、次にラテン文字とハングル文字を交換してから、音節を再構成します。


1
テストケースのinput 2結果は、TIO ㅑㅜㅔㅕㅅ 2ではなくですㅑㅞㅕㅅ 2。同じことが溶液中で起こるが、私は両方以来、働いていたjungseongされている、と私は初声+ jungseong + jongseongまたは初声+ jungseong +空を組み合わせることになる印象の下にありました。なぜOPにㅜㅔなったのかを検証するようOPに依頼しました。
ケビンCruijssen

@KevinCruijssenㅞ(np)はそれ自体が中城です
ニックケネディ

1
これは、2文字の子音または母音では適切に機能しないようです。たとえばfnpfa、単一の文字であるべきですが、代わりに次のようになります루ㅔㄹㅁ
ニックケネディ

修正中です。費用はかかりません。
リトシアスト

2

Java 19、1133 1126 1133バイト

s->{String r="",k="ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ",K[]=k.split(" "),a="r R s e E f a q Q t T d w W c z x v g k o i O j p u P h hk ho hl y n nj np nl b m ml l 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";var A=java.util.Arrays.asList(a.split(" "));k=k.replace(" ","");int i,z,y,x=44032;for(var c:s.toCharArray())if(c>=x&c<55204){z=(i=c-x)%28;y=(i=(i-z)/28)%21;s=s.replace(c+r,r+K[0].charAt((i-y)/21)+K[1].charAt(y)+(z>0?K[2].charAt(z-1):r));}for(var c:s.split(r))r+=c.charAt(0)<33?c:(i=k.indexOf(c))<0?(i=A.indexOf(c))<0?c:k.charAt(i):A.get(i);for(i=r.length()-1;i-->0;r=z>0?r.substring(0,i)+(char)(K[0].indexOf(r.charAt(i))*588+K[1].indexOf(r.charAt(i+1))*28+((z=K[2].indexOf(r.charAt(i+2)))<0?0:z+1)+x)+r.substring(z<0?i+2:i+3):r)for(z=y=2;y-->0;)z&=K[y].contains(r.charAt(i+y)+"")?2:0;for(var p:"ㅗㅏㅘㅗㅐㅙㅗㅣㅚㅜㅓㅝㅜㅔㅞㅜㅣㅟㅡㅣㅢ".split("(?<=\\G...)"))r=r.replace(p.substring(0,2),p.substring(2));return r;}

-5ボーナス以上の費用がかかるためASDFGHJKLZXCVBNM、大文字は変更されません.toLowerCase()

Unicode値20,000を超える韓国語以外の文字のバグ修正として+7バイトを戻します(気づいてくれて@NickKennedyに感謝します)。

オンラインでお試しください。

説明:

s->{                         // Method with String as both parameter and return-type
  String r="",               //  Result-String, starting empty
         k="ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ",
                             //  String containing the Korean characters
         K[]=k.split(" "),   //  Array containing the three character-categories
         a="r R s e E f a q Q t T d w W c z x v g k o i O j p u P h hk ho hl y n nj np nl b m ml l 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"; 
                             //  String containing the English characters
  var A=java.util.Arrays.asList(a.split(" "));
                             //  List containing the English character-groups
  k=k.replace(" ","");       //  Remove the spaces from the Korean String
  int i,z,y,                 //  Temp integers
      x=44032;               //  Integer for 0xAC00
  for(var c:s.toCharArray()) //  Loop over the characters of the input:
    if(c>=x&c<55204){        //   If the unicode value is in the range [44032,55203]
                             //   (so a Korean combination character):
      z=(i=c-x)%28;          //    Set `i` to this unicode value - 0xAC00,
                             //    And then `z` to `i` modulo-28
      y=(i=(i-z)/28)%21;     //    Then set `i` to `i`-`z` integer divided by 28
                             //    And then `y` to `i` modulo-21
      s=s.replace(c+r,       //    Replace the current non-Korean character with:
        r+K[0].charAt((i-y)/21)
                             //     The corresponding choseong
         +K[1].charAt(y)     //     Appended with jungseong
         +(z>0?K[2].charAt(z-1):r));}
                             //     Appended with jongseong if necessary
  for(var c:s.split(r))      //  Then loop over the characters of the modified String:
    r+=                      //   Append to the result-String:
       c.charAt(0)<33?       //    If the character is a space:
        c                    //     Simply append that space
       :(i=k.indexOf(c))<0?  //    Else-if the character is NOT a Korean character:
         (i=A.indexOf(c))<0? //     If the character is NOT in the English group List:
          c                  //      Simply append that character
         :                   //     Else:
          k.charAt(i)        //      Append the corresponding Korean character
       :                     //    Else:
        A.get(i);            //     Append the corresponding letter
  for(i=r.length()-1;i-->0   //  Then loop `i` in the range (result-length - 2, 0]:
      ;                      //    After every iteration:
       r=z>0?                //     If a group of Korean characters can be merged:
          r.substring(0,i)   //      Leave the leading part of the result unchanged
          +(char)(K[0].indexOf(r.charAt(i))
                             //      Get the index of the first Korean character,
                   *588      //      multiplied by 588
                  +K[1].indexOf(r.charAt(i+1))
                             //      Get the index of the second Korean character,
                   *28       //      multiplied by 28
                  +((z=K[2].indexOf(r.charAt(i+2)))
                             //      Get the index of the third character
                    <0?      //      And if it's a Korean character in the third group:
                      0:z+1) //       Add that index + 1
                  +x         //      And add 0xAC00
                 )           //      Then convert that integer to a character
          +r.substring(z<0?i+2:i+3) 
                             //      Leave the trailing part of the result unchanged as well
         :                   //     Else (these characters cannot be merged)
          r)                 //      Leave the result the same
     for(z=y=2;              //   Reset `z` to 2
         y-->0;)             //   Inner loop `y` in the range (2, 0]:
       z&=                   //    Bitwise-AND `z` with:
         K[y].contains(      //     If the `y`'th Korean group contains
           r.charAt(i+y)+"")?//     the (`i`+`y`)'th character of the result
          2                  //      Bitwise-AND `z` with 2
         :                   //     Else:
          0;                 //      Bitwise-AND `z` with 0
                             //   (If `z` is still 2 after this inner loop, it means
                             //    Korean characters can be merged)
  for(var p:"ㅗㅏㅘㅗㅐㅙㅗㅣㅚㅜㅓㅝㅜㅔㅞㅜㅣㅟㅡㅣㅢ".split("(?<=\\G...)"))
                             //  Loop over these Korean character per chunk of 3:
    r=r.replace(p.substring(0,2),
                             //   Replace the first 2 characters in this chunk
         p.substring(2));    //   With the third one in the result-String
  return r;}                 //  And finally return the result-String

1
44032から55203までです。開始位置は既にコーディングされています。最後はちょうど44032 + 19×21×28 - 1
ニックケネディ

今はうまくいきます。私はすでにあなたを支持していたが、そうではなかったので、ここに行く!
ニックケネディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.