หนังสติ๊กที่ไม่มั่นคง


17

นี่คือรายการของหนังสติ๊กทั่วไป ใน Unicode (อันที่ฉันสามารถสร้างได้ด้วยคีย์การเขียนบนเดเบียน):

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 เรื่องใหญ่คืออะไร? หากภาษาที่คุณเลือกไม่สามารถรองรับæได้เพียงพิมพ์ 0xc3 0xa6 การเข้ารหัส UTF-8
เดนนิส

7
หากภาษาไม่สามารถช่วยงานที่มอบหมายได้อย่าใช้ภาษานั้นกับงานนั้น นั่นไม่ควรเป็นเรื่องใหญ่
Alex 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
  `)

ทดสอบ


สามารถ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 ไบต์?
กล้วยไม้สกุลหวาย

@Dendrobium การmatchโทรต้องการสตริงที่คั่นด้วย|อักขระ
user81655
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.