スキッシュ-アンスキッシュ合字


17

以下は、Unicodeの一般的な合字のリストです (DebianのComposeキーで作成できるもの):

Orig  Ascii  Lig
ae    [ae]   æ
AE    [AE]   Æ
oe    [oe]   œ
OE    [OE]   Œ
ij    [ij]   ij
IJ    [IJ]   IJ
ff    [ff]   ff
fi    [fi]   fi
fl    [fl]   fl
ffi   [ffi]  ffi
ffl   [ffl]  ffl

この課題には2つのオプションがあります。実際のUTF-8合字を使用するか、ASCIIのみのバリアントを使用します。実際のUTF-8合字バリアントを使用すると、20%のボーナスが得られます。ASCIIのみのバリアントを使用する場合、合字を示す場合を除いて、角括弧は関係しないと想定できます。

課題:入力として文字列を与え、同じ文字列を出力する

  • 元のすべての合字が展開された対応物に置き換えられます。

    • 貪欲に一致:affibとなりaffiba[ffi]b)ではなく、affiba[ff]ib)またはaffibaf[fi]b)。
  • すべての「展開された」文字列が合字に置き換えられます。

    • たとえば、æOEfoo[ae]OEfoo)はaeŒfooae[OE]foo)になります。

:完全に独立してこれを行うffi[ff]iとなり)ffiffi、)ではありません[ffi])。

簡単に聞こえますか?キャッチがあります:2つの非合字がちょうど1文字重複するたびに 、両方の合字を文字列に挿入する必要があります。以下に、いくつかのテストケースを示します。

Input   Ascii-output      Output
fij     [fi][ij]          fiij
fIJ     f[IJ]             fIJ     * remember, capitalization matters!
fffi    [ff][ffi]         ffffi
fff     [ff][ff]          ffff
ffffi   [ff][ff][ffi]     ffffffi
ffffij  [ff][ff][ffi][ij] ffffffiij

注意:同じ貪欲なマッチングが適用されます(特に最後のいくつかのテストケースに注意してください)。

なので、バイト単位の最短コードが優先されます。


7
@Mego大したことは何ですか?選択した言語でネイティブに処理できない場合は、UTF-8エンコーディングである0xc3 0xa6を出力します。
デニス

7
言語が特定のタスクを促進できない場合は、そのタスクにその言語を使用しないでください。それは大したことではないはずです。
アレックスA.

回答:


3

JavaScript(ES6)、213バイト-20%のボーナス= 170.4

s=>eval('for(p=o="";m=s.match(r="ffl|ffi|fl|fi|ff|IJ|ij|Œ|œ|Æ|æ|ffl|ffi|fl|fi|ff|IJ|ij|OE|oe|AE|ae",x=r.split`|`);s=s.slice(i+t.length-(p=t<"z")))o+=s.slice(p,i=m.index)+x[(x.indexOf(t=m[0])+11)%22];o+s.slice(p)')

説明

s=>                           // s = input string
  eval(`                      // use eval to avoid writing {} or return
    for(                      // iterate over each ligature match
      p=                      // p = 1 if the last match was a non-unicode ligature
        o="";                 // o = output string
      m=s.match(              // find the next ligature

        // r = regex string for ligatures (unicode and non-unicode)
        r="ffl|ffi|fl|fi|ff|IJ|ij|Œ|œ|Æ|æ|ffl|ffi|fl|fi|ff|IJ|ij|OE|oe|AE|ae",
        x=r.split\`|\`        // x = arrray of r

      );
      s=s.slice(i+t.length    // remove the part that has been added to the output
        -(p=t<"z"))           // if we matched a non-unicode ligature, keep the last
    )                         //     character so it can be part of the next match
      o+=s.slice(p,i=m.index) // add the text before the match to the output
        +x[(x.indexOf(        // add the opposite type of the matched ligature
          t=m[0]              // t = matched text
        )+11)%22];            // (index + 11) % 22 returns the opposite index
    o+s.slice(p)              // return o + any remaining characters
  `)

テスト


-4バイトのr="ffl|ffi|fl|fi|ff|IJ|ij|Œ|œ|Æ|æ|ffl|ffi|fl|fi|ff|IJ|ij|OE|oe|AE|ae",x=r.split`|`ように書き換えることはできx="ffl|ffi|fl|fi|ff|IJ|ij|Œ|œ|Æ|æ|ffl|ffi|fl|fi|ff|IJ|ij|OE|oe|AE|ae".split`|`ますか?
デンドロビウム

@Dendrobium match呼び出しには、文字で区切られた文字列が必要|です。
user81655
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.