Über das Alphabet

14

Über das Alphabet

Bei dieser Herausforderung fällt es Ihnen schwer, sich an die Buchstaben des Alphabets zu erinnern. Um dies zu umgehen, gehen Sie das Alphabet auf und ab, bis Sie zum Buchstaben kommen.

Da Sie möchten, dass Ihr Code portabel ist, schreiben Sie ihn mit Buchstabenblöcken. Sie haben eine begrenzte Anzahl von Buchstabenblöcken, da die meisten gestohlen wurden. Stellen Sie daher sicher, dass Ihr Code so kurz wie möglich ist.

Beispiele

Eingabe / Ausgabe-Paare werden durch eine Leerzeile getrennt:

Ac
ABc

Ad
ABcd

fA
fedCBA

adB
abcdcB


Hello, World!
HGfefghijkllmno, WVUTSrqpopqrqponmlkjihgfed!

Herausforderung

Ihr Ziel ist es, benachbarte Buchstaben mit allen Zwischenbuchstaben des Alphabets ( A-Za-z) dazwischen zu verketten. Wenn sich die Groß- und Kleinschreibung unterscheidet, sollte die Groß- und Kleinschreibung in der Mitte umgewandelt werden. Wenn die Kapitalisierung in der Mitte nicht gleichmäßig transformiert werden kann, wird sie nach der Mitte aufgelöst. Wenn ein Zeichen kein alphabetisches Zeichen ist, sollte keine Transformation durchgeführt werden.

Gewinnen

Das ist also gewinnt der kürzeste Code in Bytes!

-10% Bonus: Wenn Ihr Code Ziffern enthält

Downgoat
quelle
1
Was meinst du mit Buchstabenblöcken?
LegionMammal978
@ LegionMammal978 Buchstabenblöcke . Nicht wirklich relevant für die Herausforderung, nur ein zufälliger Grund, warum ich mir einen kurzen Code
ausgedacht habe
Okay, ich frage mich nur, ob Sie " Quelle eingeschränkt" gemeint haben .
LegionMammal978
Denken Sie nicht, dass Sie adBnach Ihren Regeln transformieren sollten, abcdCBweil c in der Mitte von d und b liegt.
Geokavel
Ziemlich ähnlich zu meinem Alphabet zwischen Verschlüsselung , aber dieses hat bereits die doppelte Anzahl an Stimmen, also werde ich nur meine markieren.
Phase

Antworten:

2

Python 2, 303 291 288 282 276 261 253 Bytes

Dies ist ein völlig anderer Algorithmus als der von Hannes Karppila, und nach viel Golf habe ich eine wesentliche Verbesserung der Länge erreicht. Ich denke, dass dieser Algorithmus auch in anderen Sprachen einen der kürzesten Codes zulässt, insbesondere in Sprachen mit do-while-Schleifen und integrierten Signum-Funktionen. Verbesserungsvorschläge sind willkommen. (Irgendwas sagt mir, dass die gesamte innere Schleife als Listenverständnis umgeschrieben werden sollte.)

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))
Quintopie
quelle
1

JavaScript (ES6), 198 197 194 Byte

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)

Verwendung

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

Erläuterung

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
)
user81655
quelle
1
Die Verwendung \wschlägt mit Ziffern fehl. Versuchen Sie '09'
edc65
Speichern Sie 1 Zeichen mit charCodeAt () ohne Argument
edc65
Und sparen Sie 2 Zeichen, indem Sie Math.abs vermeiden a>b?a-b:b-a... und es gibt weitere 'Standard'-Tricks, um Javascript zu verkürzen. Mit deiner Interpolationsmethode könntest du meine Punktzahl übertreffen. Überprüfen Sie die Hinweise auf dieser Website
edc65
Danke für die Information! Ich verstehe immer noch den Dreh und Angelpunkt von Code Golf. :)
user81655
1

JavaScript ES6, 168 (186-10%) 176 193

Bearbeiten Geändert, um den 10% -Bonus zu erhalten

Testen Sie das folgende Snippet mit einem EcmaScript 6-kompatiblen Browser (ich verwende FireFox)

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>

edc65
quelle
0

Python 2, 349 Bytes

Es ist viel zu lang, aber zumindest ist es das erste Mal.

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
Hannes Karppila
quelle