Di alfabet

14

Di alfabet

Dalam tantangan ini, Anda kesulitan mengingat huruf-huruf alfabet. Untuk menghindari ini, Anda naik dan turun alfabet, sampai Anda mendapatkan surat itu.

Karena Anda ingin kode Anda portabel, Anda akan menulisnya dengan blok huruf. Jumlah blok surat Anda terbatas karena sebagian besar dicuri sehingga Anda perlu memastikan kode Anda sesingkat mungkin.

Contohnya

Pasangan input / output dipisahkan oleh baris kosong:

Ac
ABc

Ad
ABcd

fA
fedCBA

adB
abcdcB


Hello, World!
HGfefghijkllmno, WVUTSrqpopqrqponmlkjihgfed!

Tantangan

Tujuan Anda adalah untuk menghubungkan huruf yang berdekatan dengan semua huruf alfabet ( A-Za-z) antara. Jika kapitalisasi berbeda, kapitalisasi harus ditransformasikan di tengah. Jika kapitalisasi tidak dapat ditransformasikan secara merata di tengah, maka kapitalisasi menjadi putus setelah tengah. Jika karakter bukan karakter alfabet, tidak ada transformasi yang harus dilakukan.

Kemenangan

Ini adalah sehingga kode terpendek dalam byte menang!

-10% Bonus: jika kode rantai Anda digit

Downgoat
sumber
1
Apa yang Anda maksud dengan blok huruf?
LegionMammal978
@ LegionMammal978 Blok huruf . Tidak benar-benar relevan dengan tantangan, hanya alasan acak yang saya buat untuk kode pendek
Downgoat
Oke, hanya ingin tahu apakah yang Anda maksud sumber terbatas .
LegionMammal978
Menurut aturan Anda, jangan Anda pikir adBseharusnya bertransformasi abcdCBkarena c ada di tengah d dan b.
geokavel
Cukup mirip dengan Enkripsi Alfabet Antara Saya , tetapi ini sudah memiliki dua kali suara jadi saya hanya akan menandai milik saya.
fase

Jawaban:

2

Python 2, 303 291 288 282 276 261 253 byte

Ini adalah algoritma yang sama sekali berbeda dari algoritma Hannes Karppila, dan setelah banyak bermain golf, saya telah berhasil meningkatkan panjang. Saya pikir algoritma ini mungkin memungkinkan untuk salah satu kode terpendek dalam bahasa lain juga, terutama bahasa dengan loop do-while dan fungsi signum bawaan. Saran untuk perbaikan lebih lanjut disambut. (Sesuatu memberi tahu saya bahwa seluruh loop batin harus ditulis ulang sebagai pemahaman daftar.)

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))
kuintopia
sumber
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)

Pemakaian

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

Penjelasan

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
)
pengguna81655
sumber
1
Penggunaan \wakan gagal dengan angka. Coba '09'
edc65
Simpan 1 char menggunakan charCodeAt () tanpa argumen
edc65
Dan simpan 2 karakter menghindari Math.abs a>b?a-b:b-a... dan ada banyak trik 'standar' lainnya untuk mempersingkat javascript. Dengan metode interpolasi Anda, Anda bisa mengalahkan skor saya. Lihat petunjuk di situs ini
edc65
Terimakasih atas infonya! Saya masih mengerti kode golf. :)
user81655
1

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

Edit Dimodifikasi untuk mendapatkan bonus 10%

Tes menjalankan cuplikan di bawah ini menggunakan peramban yang mendukung EcmaScript 6 (Saya menggunakan 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
sumber
0

Python 2, 349 byte

Itu terlalu lama, tapi setidaknya itu yang pertama.

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
sumber