Trên bảng chữ cái


14

Trên bảng chữ cái

Trong thử thách này, bạn gặp khó khăn khi nhớ các chữ cái trong bảng chữ cái. Để phá vỡ điều này, bạn đi lên và xuống bảng chữ cái, cho đến khi bạn nhận được chữ cái.

Vì bạn muốn mã của mình có thể mang theo được, bạn sẽ viết nó bằng các khối chữ cái. Bạn có số lượng khối chữ cái giới hạn vì hầu hết chúng bị đánh cắp nên bạn cần đảm bảo mã của mình càng ngắn càng tốt.

Ví dụ

Các cặp đầu vào / đầu ra được phân tách bằng một dòng trống:

Ac
ABc

Ad
ABcd

fA
fedCBA

adB
abcdcB


Hello, World!
HGfefghijkllmno, WVUTSrqpopqrqponmlkjihgfed!

Thử thách

Mục tiêu của bạn là xâu chuỗi các chữ cái liền kề với tất cả các chữ cái trung gian của bảng chữ cái ( A-Za-z) giữa chúng. Nếu viết hoa khác nhau, nên viết hoa ở giữa. Nếu viết hoa không thể chuyển đổi đồng đều ở giữa, nó sẽ bị vỡ sau giữa. Nếu một ký tự không phải là một ký tự chữ cái, không nên thực hiện chuyển đổi.

Chiến thắng

Đây là để mã ngắn nhất trong byte thắng!

-10% Tiền thưởng: nếu mã của bạn xâu chuỗi các chữ số


1
Bạn có ý nghĩa gì bởi các khối chữ?
LegionMammal978

@ LegionMammal978 Khối thư . Không thực sự liên quan đến thử thách, chỉ là một lý do ngẫu nhiên mà tôi nghĩ ra với mã ngắn
Downgoat

Được rồi, chỉ tự hỏi nếu bạn có nghĩa là nguồn hạn chế .
LegionMammal978

Theo quy tắc của bạn, bạn không nghĩ adBnên chuyển đổi thành abcdCBvì c ở giữa d và b.
geokavel 7/11/2015

Khá giống với Bảng chữ cái giữa mã hóa của tôi , nhưng cái này đã có gấp đôi số phiếu vì vậy tôi sẽ chỉ gắn cờ của tôi.
giai đoạn

Câu trả lời:



2

Con trăn 2, 303 291 288 282 276 261 253 byte

Đây là một thuật toán hoàn toàn khác so với của Hannes Karppila và sau khi chơi golf, tôi đã cải thiện được chiều dài đáng kể. Tôi nghĩ thuật toán này có thể cho phép một trong những mã ngắn nhất trong các ngôn ngữ khác, đặc biệt là các ngôn ngữ có vòng lặp do-while và các hàm đăng nhập tích hợp. Đề nghị cải thiện hơn nữa chào mừng. (Một cái gì đó cho tôi biết rằng toàn bộ vòng lặp bên trong nên được viết lại dưới dạng hiểu danh sách.)

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

Sử dụng

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

Giải trình

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
Sử dụng \wsẽ thất bại với các chữ số. Hãy thử '09'
edc65

Lưu 1 char bằng charCodeAt () không có đối số
edc65

Và lưu 2 ký tự tránh Math.abs a>b?a-b:b-a... và còn nhiều thủ thuật 'tiêu chuẩn' khác để rút ngắn javascript. Với phương pháp nội suy của bạn, bạn có thể đánh bại điểm số của tôi. Kiểm tra các gợi ý trong trang web này
edc65


Cảm ơn bạn về thông tin! Tôi vẫn đang chơi gôn. :)
user81655

1

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

Chỉnh sửa Sửa đổi để nhận tiền thưởng 10%

Kiểm tra chạy đoạn mã dưới đây bằng trình duyệt tuân thủ EcmaScript 6 (Tôi sử dụng 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>


0

Python 2, 349 byte

Nó quá dài, nhưng ít nhất là trước tiên.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.