स्क्विश-अयोग्य लिगचर


17

यहाँ यूनिकोड में कुछ सामान्य संयुक्ताक्षरों की सूची दी गई है (जिन्हें मैं डेबियन पर अपनी रचना कुंजी के साथ बना सकता हूं):

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)।
  • सभी "विस्तारित" अक्षर अनुक्रमों के साथ ligatures द्वारा प्रतिस्थापित किया गया है।

    • उदाहरण के लिए, æOEfoo( [ae]OEfoo) बन जाता है aeŒfoo( ae[OE]foo)।

इसे पूरी तरह से स्वतंत्र रूप से करें: ffi( [ff]i) बन जाता है ffi( ffi), नहीं ( [ffi])।

बहुत आसान लग रहा है? वहाँ एक पकड़ है: हर बार दो गैर- ligatures बिल्कुल एक चरित्र द्वारा ओवरलैप करते हैं , दोनों ligatures को स्ट्रिंग में डाला जाना चाहिए। यहाँ कुछ परीक्षण मामलों को प्रदर्शित करना है:

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
@ मेगो क्या बड़ी बात है? यदि आपकी पसंद की भाषा मूल रूप से संभाल नहीं सकती है, तो बस 0xc3 0xa6, उसका UTF-8 एन्कोडिंग प्रिंट करें।
डेनिस

7
यदि कोई भाषा किसी दिए गए कार्य को सुविधाजनक नहीं बना सकती है, तो उस कार्य के लिए उस भाषा का उपयोग न करें। यह एक बड़ी बात नहीं होनी चाहिए।
एलेक्स ए।

जवाबों:


3

जावास्क्रिप्ट (ईएस 6), 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`|`?
डेंड्रोबियम

@ डेंड्रोबियम matchकॉल में स्ट्रिंग को |वर्णों से अलग करने की आवश्यकता होती है ।
user81655
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.