스 퀴시 언 퀴퀴 합자


17

다음은 유니 코드로 된 일반적인 합자 목록입니다 (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

이 문제에는 실제 UTF-8 합자를 사용하거나 ASCII 전용 변형을 사용하는 두 가지 옵션이 있습니다. 실제 UTF-8 합자 변형을 사용하면 20 %의 보너스를 얻게됩니다. ASCII 전용 변형을 사용하는 경우 합자를 나타내지 않는 한 대괄호가 절대 포함되지 않는다고 가정 할 수 있습니다.

도전 과제 : 문자열을 입력으로 지정하면 동일한 문자열을 출력합니다.

  • 모든 원래 합자가 확장 된 대응으로 대체되었습니다.

    • 탐욕과 일치 : affib이된다 affib( a[ffi]b),하지 affib( a[ff]ib) 또는 affib( af[fi]b).
  • 모든 "확장 된"문자 시퀀스가 ​​합자로 대체됩니다.

    • 예를 들어 æOEfoo( [ae]OEfoo)는 aeŒfoo( ae[OE]foo)가됩니다.

완전히 독립적으로 수행하십시오. ffi( [ff]i)가 ffi( ffi)가 아닌 ( [ffi])가됩니다.

충분히 간단하게 들리십니까? 캐치있다 : 두 개의 비 합자에 의해 중복마다 정확히 하나 개의 문자가 , 합자의 문자열에 삽입해야합니다. 다음은 몇 가지 테스트 사례입니다.

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을 인쇄하십시오.
Dennis

7
언어가 특정 작업을 수행 할 수없는 경우 해당 작업에 해당 언어를 사용하지 마십시오. 큰 문제가되어서는 안됩니다.
Alex A.

답변:


3

자바 스크립트 (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

@Dendrobium match호출하려면 문자열을 |문자로 구분해야 합니다.
user81655
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.