Alfabenin karşısında


14

Alfabenin karşısında

Bu meydan okumada, alfabenin harflerini hatırlamakta zorlanıyorsunuz. Bunu atlatmak için, harflere ulaşana kadar alfabeyi yukarı ve aşağı hareket ettirirsiniz.

Kodunuzun taşınabilir olmasını istediğiniz için, harf bloklarıyla yazacaksınız. Sınırlı sayıda harf bloğunuz var, çünkü çoğu çalındı, bu nedenle kodunuzun mümkün olduğunca kısa olduğundan emin olmanız gerekiyor.

Örnekler

Giriş / Çıkış çiftleri boş bir satırla ayrılır:

Ac
ABc

Ad
ABcd

fA
fedCBA

adB
abcdcB


Hello, World!
HGfefghijkllmno, WVUTSrqpopqrqponmlkjihgfed!

Meydan okuma

Amacınız bitişik harfleri aralarındaki alfabenin ( A-Za-z) tüm ara harfleriyle zincirlemek . Büyük harf kullanımı farklıysa, büyük harf kullanımı ortada dönüştürülmelidir. Büyük / küçük harf kullanımı ortada eşit olarak dönüştürülemezse, ortadan sonra parçalanır . Bir karakter alfabetik bir karakter değilse, bir dönüştürme yapılmamalıdır.

Kazanan

Bu bayt en kısa kodu kazanır!

-10% Bonus: kodunuz rakamları zincirliyorsa


1
Harf bloklarıyla ne demek istiyorsun?
LegionMammal978

@ LegionMammal978 Mektup blokları . Bu meydan okuma ile gerçekten ilgili değil, sadece kısa bir kod için geldi rastgele bir neden
Downgoat

Tamam, sadece kısıtlı kaynak mı demek istiyorsun diye merak ediyorum .
LegionMammal978

Kurallarınıza göre, c'ye d ve b'nin ortasında olduğu adBiçin dönüşmesi gerektiğini düşünmüyorsunuz abcdCB.
geokavel

Şifreleme Arasındaki Alfabeme çok benziyor , ama bunun iki katı oyu var, bu yüzden sadece benimkini işaretleyeceğim.
faz

Yanıtlar:



2

Python 2, 303 291 288 282 276 261 253 bayt

Bu, Hannes Karppila'nınkinden tamamen farklı bir algoritma ve çok sayıda golf oynadıktan sonra, uzunluğunda önemli bir gelişme sağladım. Bu algoritmanın diğer dillerdeki en kısa kodlardan birine, özellikle de do-while döngülerine ve yerleşik oturum açma işlevlerine sahip dillere izin verebileceğini düşünüyorum. Daha da geliştirilmesi için öneriler memnuniyetle karşılarız. (Bir şey bana tüm iç döngünün bir liste kavrayışı olarak yeniden yazılması gerektiğini söylüyor.)

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

JavaScript (ES6), 198 197 194 bayt

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)

kullanım

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

açıklama

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
Kullanmak \wrakamlarla başarısız olur. '09' deneyin
edc65

Argüman olmadan charCodeAt () kullanarak 1 karakter kaydedin
edc65

Ve Math.abs kaçınarak 2 karakter kaydedin a>b?a-b:b-a... ve javascript kısaltmak için daha başka 'standart' hileler var. İnterpolasyon yönteminizle puanımı geçebilirsiniz. Bu sitedeki ipuçlarını kontrol edin
edc65


Bilgi için teşekkürler! Hala kod golf asmak alıyorum. :)
user81655

1

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

Düzen % 10 bonus almak için Modifiye

EcipScript 6 uyumlu bir tarayıcı kullanarak aşağıdaki snippet'i çalıştırmayı test edin (FireFox kullanıyorum)

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

Python 2, 349 bayt

Çok uzun, ama en azından önce.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.