压扁的连字


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

在此挑战中,您有两个选择:使用实际的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])。

听起来很简单?有一个陷阱:每次两个非连字恰好重叠 一个字符时,必须将两个连字都插入到字符串中。这里有一些测试用例来演示:

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有什么大不了的?如果您选择的语言无法本地处理,则只需打印0xc3 0xa6(其UTF-8编码)即可。
丹尼斯

7
如果一种语言无法完成给定的任务,请不要将该语言用于该任务。没什么大不了的。
Alex A.

Answers:


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
  `)

测试


可以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`|`为-4字节吗?
2015年

@Dendrobium match调用需要用字符分隔的字符串|
user81655 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.