वर्णमाला के पार


14

वर्णमाला के पार

इस चुनौती में, आपको वर्णमाला के अक्षरों को याद रखने में परेशानी होती है। इसे दरकिनार करने के लिए, आप वर्णमाला के ऊपर और नीचे जाते हैं, जब तक आप पत्र तक नहीं पहुंच जाते।

क्योंकि आप चाहते हैं कि आपका कोड पोर्टेबल हो, तो आप इसे लेटर ब्लॉक के साथ लिखेंगे। आपके पास सीमित मात्रा में अक्षर ब्लॉक हैं क्योंकि उनमें से अधिकांश चोरी हो गए हैं इसलिए आपको यह सुनिश्चित करने की आवश्यकता है कि आपका कोड जितना संभव हो उतना कम हो।

उदाहरण

इनपुट / आउटपुट जोड़े एक रिक्त रेखा द्वारा अलग किए जाते हैं:

Ac
ABc

Ad
ABcd

fA
fedCBA

adB
abcdcB


Hello, World!
HGfefghijkllmno, WVUTSrqpopqrqponmlkjihgfed!

चुनौती

आपका लक्ष्य A-Za-zउनके बीच के वर्णमाला ( ) के सभी मध्यवर्ती अक्षरों के साथ आसन्न अक्षरों को चेन करना है। यदि पूंजीकरण अलग है, तो पूंजीकरण को बीच में बदलना चाहिए। यदि पूंजीकरण को बीच में समान रूप से परिवर्तित नहीं किया जा सकता है, तो यह मध्य के बाद टूट गया । यदि कोई वर्ण एक वर्णमाला वर्ण नहीं है, तो कोई परिवर्तन नहीं किया जाना चाहिए।

जीतना

यह है जो बाइट्स जीत में सबसे छोटा कोड है!

-10% बोनस: यदि आपका कोड चेन डिजिट करता है


1
आपको पत्र ब्लॉक से क्या मतलब है?
२१:३al पर लीजनमॉम्मल

@ LegionMammal978 लेटर ब्लॉक । चुनौती के लिए वास्तव में प्रासंगिक नहीं है, बस एक यादृच्छिक कारण है कि मैं लघु कोड के लिए आया था
डाउगाट

ठीक है, अगर आप प्रतिबंधित-स्रोत का मतलब सिर्फ सोच रहे हैं ।
लीजनमॉम्मल

अपने नियमों से, आपको नहीं लगता कि adBबदलना चाहिए abcdCBक्योंकि c, d और b के मध्य में है।
जियोकॉवेल

सुंदर मेरे एन्क्रिप्शन के बीच वर्णमाला के समान है , लेकिन यह पहले से ही दो बार वोट है तो मैं सिर्फ मेरा झंडा लगाऊंगा।
चरण

जवाबों:



2

पायथन 2, 303 291 288 282 276 261 253 बाइट्स

यह हेंस कारपिला की तुलना में एक पूरी तरह से अलग एल्गोरिथ्म है, और बहुत सारे गोल्फिंग के बाद, मैंने लंबाई में काफी सुधार किया है। मुझे लगता है कि यह एल्गोरिथ्म अन्य भाषाओं में भी सबसे छोटे कोड में से एक के लिए अनुमति दे सकता है, विशेष रूप से डो-जबकि छोरों और अंतर्निहित साइन-इन कार्यों के साथ भाषाएँ। आगे सुधार का स्वागत करते हैं। (कुछ मुझे बताता है कि पूरे आंतरिक लूप को एक सूची समझ के रूप में फिर से लिखा जाना चाहिए।)

l=map(ord,list(raw_input()));f=q=1
while q:
 q=0;m=~-f/2;c=m
 while abs(c)<len(l)-1:
  u=c+f;d=(l[u]-96)%32-(l[c]-96)%32
  if chr(l[c]).isalpha()*chr(l[u]).isalpha()*(d*d>1):l[:u-m]+=[l[c]+d/abs(d)];u+=f;q=1
  c=u
 f=-f
print "".join(map(chr,l))

1

जावास्क्रिप्ट (ईएस 6), 198 197 194 बाइट्स

f=s=>(o="",a=u=0,[...s].map(c=>{j=c.toUpperCase();p=j==c;b=j<"A"|j>"Z"?0:j.charCodeAt();for(i=0,m=a<b?b-a:a-b;a&&b&&++i<m;)o+=String.fromCharCode(i*(a<b||-1)+a+32*!(i>m/2?p:u));a=b;u=p;o+=c}),o)

प्रयोग

f("Hello, World!")
=> "HGfefghijkllmno, WVUTSrqpopqrqponmlkjihgfed!"

व्याख्या

f=s=>(
  o="",                                   // o = output string
  a=                                      // a = previous character code (or 0 if symbol)
    u=0,                                  // u = 1 if previous character was upper-case
  [...s].map(c=>{                         // iterate through each letter of input

    // Get information about the current character
    j=c.toUpperCase();                    // j = current character in upper-case
    p=j==c;                               // p = current character is upper-case
    b=j<"A"|j>"Z"?0:j.charCodeAt();       // b = current character code (or 0 if symbol)

    // Interpolate characters (unless A or B is a symbol)
    for(i=0,m=a<b?b-a:a-b;a&&b&&++i<m;)   // loop for each character between A and B
      o+=String.fromCharCode(             // add interpolated character to output
        i*(a<b||-1)+a+                    // interpolate character code
          32*!(i>m/2?p:u)                 // apply case of the nearest character
      );

    // Set character A values to B for the next character
    a=b;
    u=p;
    o+=c                                  // add B itself to the output

  }),
  o                                       // return the output
)

1
\wअंकों के साथ प्रयोग विफल हो जाएगा। कोशिश '09'
edc65

कोई तर्क के साथ charCodeAt () का उपयोग करके 1 चार्ट सहेजें
edc65

और Math.abs से बचने के लिए 2 वर्णों को बचाएं a>b?a-b:b-a... और जावास्क्रिप्ट को छोटा करने के लिए अन्य 'मानक' चालें हैं। अपने प्रक्षेप विधि से आप मेरे स्कोर को हरा सकते हैं। इस साइट के संकेत देखें
edc65


जानकारी के लिए धन्यवाद! मैं अभी भी कोड गोल्फ का हैंग हो रहा हूं। :)
1:81 बजे user81655

1

जावास्क्रिप्ट ईएस 6, 168 (186-10%) 176 193

10% बोनस प्राप्त करने के लिए संशोधित संपादित करें

एक EcmaScript 6 अनुरूप ब्राउज़र का उपयोग करके नीचे स्निपेट का परीक्षण करें (मैं फ़ायरफ़ॉक्स का उपयोग करता हूं)

f=s=>[...s].map(c=>{a=parseInt(c,36),m=(a-q)/(d=a>q?1:-1);for(n=1;m&&(a>9)==(q>9)&&(q+=d)!=a;n+=2)r=q.toString(36),o+=n<m&p<'a'|n>=m&c<'a'?r.toUpperCase():r;p=c,q=a,o+=c},o='',p=q=-f)&&o

// Explained
U=s=>(
  o = '', // initialize output
  p = '', // provious char, initialize to none
  q = NaN, // previous char code, initialize to none
  [...s].map( c => { // for each char 
    a = parseInt(c,36), // convert digit/letter to numeric code, case invariant, NaN if invalid
    d = a > q ? 1 : -1, // sign of difference (if not equal)
    m = (a - q) / d; // absolute value of difference or NaN 
    if (m && (a>9)==(q>9)) // if current and prev are different and both alpha or both digits  
      for( n = 1; 
          (q += d) != a; // loop from prev char (not included) to current (not included)
           n += 2)
        r=q.toString(36),
        // add intermediate char to output
        // upcase if: left side & prev is upcase or right side and current is upcase
        o+= n<m&p<'a'|n>=m&c<'a'?r.toUpperCase():r;
    p = c, // copy current to previous
    q = a, // copy current to previous
    o += c // add current char to ouput
  }),
  o
)  

// test
console.log=(...x)=>O.innerHTML+=x+'\n'

;['Ac','Ad','fA','adB','04aQ27','Hello World!'].
forEach(x=>console.log(x + ' -> ' + f(x)))
<pre id=O></pre>


0

पायथन 2, 349 बाइट्स

यह बहुत लंबा है, लेकिन कम से कम यह पहले है।

f=lambda p:ord(p.lower())
u=lambda p:"".join(p).upper()
s=raw_input()
w=s[0]
r=w
for q in s[1:]:
 o=q+w
 if q==w:o=""
 if o.isalpha():
  m=(f(w)<f(q))*2-1
  e=map(chr,range(f(w)+m,f(q)+m,m))
  if o==u(o):e=u(e)
  elif q==u(q):e[len(e)/2:]=u(e[len(e)/2:])
  elif -o.islower()+1:e[:len(e)/2]=u(e[:len(e)/2])
  r+="".join(e)
 else:
  r+=q
 w=q
print r
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.