Dây chằng Squish-unquish


17

Dưới đây là danh sách một số chữ ghép phổ biến trong Unicode (những chữ tôi có thể tạo bằng khóa Soạn trên Debian):

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

Bạn có hai lựa chọn trong thử thách này: sử dụng chữ ghép UTF-8 thực tế hoặc sử dụng biến thể chỉ có ASCII. Nếu bạn sử dụng các biến thể chữ viết UTF-8 thực tế, bạn sẽ nhận được 20% tiền thưởng. Nếu bạn sử dụng biến thể chỉ ASCII, bạn có thể cho rằng dấu ngoặc vuông sẽ không bao giờ được tham gia ngoại trừ để biểu thị một chữ ghép.

Thách thức: đưa ra một chuỗi làm đầu vào, đầu ra cùng một chuỗi

  • với tất cả các chữ ghép gốc được thay thế bằng các đối tác mở rộng của chúng.

    • phù hợp tham lam: affibtrở thành affib( a[ffi]b), không affib( a[ff]ib) hoặc affib( af[fi]b).
  • với tất cả các chuỗi chữ cái "mở rộng" được thay thế bằng chữ ghép.

    • ví dụ: æOEfoo( [ae]OEfoo) trở thành aeŒfoo( ae[OE]foo).

Làm điều này hoàn toàn độc lập: ffi( [ff]i) trở thành ffi( ffi), không ( [ffi]).

Âm thanh đủ đơn giản? Có một nhược điểm: mỗi lần hai chữ không ghép chồng lên nhau bằng chính xác một ký tự , cả hai chữ ghép phải được chèn vào chuỗi. Dưới đây là một vài trường hợp thử nghiệm để chứng minh:

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

Hãy cẩn thận: áp dụng kết hợp tham lam tương tự (đặc biệt lưu ý một vài trường hợp thử nghiệm gần đây nhất).

, vì vậy mã ngắn nhất trong byte thắng.


7
@Mego Chuyện lớn là gì? Nếu ngôn ngữ bạn chọn không thể xử lý thường xuyên, chỉ cần in 0xc3 0xa6, mã hóa UTF-8 của nó.
Dennis

7
Nếu một ngôn ngữ không thể tạo điều kiện cho một nhiệm vụ nhất định, đừng sử dụng ngôn ngữ đó cho nhiệm vụ đó. Đó không phải là một vấn đề lớn.
Alex A.

Câu trả lời:


3

JavaScript (ES6), 213 byte - 20% tiền thưởng = 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)')

Giải trình

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

Kiểm tra


Có thể r="ffl|ffi|fl|fi|ff|IJ|ij|Œ|œ|Æ|æ|ffl|ffi|fl|fi|ff|IJ|ij|OE|oe|AE|ae",x=r.split`|`được viết lại như x="ffl|ffi|fl|fi|ff|IJ|ij|Œ|œ|Æ|æ|ffl|ffi|fl|fi|ff|IJ|ij|OE|oe|AE|ae".split`|`cho -4 byte?
Dendrobium

@Dendrobium Cuộc matchgọi yêu cầu chuỗi được phân tách bằng các |ký tự.
dùng81655
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.