Kết nối chữ cái


23

Bạn nên viết một chương trình hoặc hàm nhận một khối ký tự được biểu diễn dưới dạng một chuỗi và xuất ra hoặc trả về một chuỗi tương tự trong đó các chữ cái liền kề trong bảng chữ cái được kết nối.

Một ví dụ trực quan (dưới dạng input => output):

b     d               b     d        
                      |\   /|        
                      | \ / |        
             =>       |  X  |        
                      | / \ |        
      e               |/   \e        
c     a               c     a        

Chi tiết

  • Đầu vào sẽ là một chuỗi chứa khoảng trắng, dòng mới và chính xác là một trong mỗi Nchữ cái viết thường đầu tiên .1 <= N <= 26
  • Các dòng của đầu vào sẽ được đệm với các khoảng trống tạo ra một khối hình chữ nhật đầy đủ.
  • Mỗi cặp chữ cái liền kề trong bảng chữ cái sẽ nằm trên cùng một hàng, cột hoặc đường chéo và nên được kết nối với một dòng ascii thẳng bằng cách sử dụng \ / | or -. (Dòng có thể có độ dài bằng 0.)
  • Các loại chồng chéo hai dòng sau đây nên được xử lý:

    / and \ become X
    | and - become +
    / and / become /
    \ and \ become \
    | and | become |
    - and - become -
    [letter] and [anything] become [letter]
    
  • Không có loại chồng chéo hai dòng khác sẽ xảy ra.

  • Nếu có nhiều hơn hai dòng trùng nhau, bất kỳ cặp nào trong số chúng sẽ được đảm bảo là một trong các chồng chéo hợp lệ. (ví dụ như [letter] / |bộ ba sẽ không bao giờ xảy ra)
  • Ngoài việc thay đổi không gian thành \ / | - X and +đầu vào và đầu ra nên giống hệt nhau.
  • Trailing newline là tùy chọn nhưng phải giống nhau cho đầu vào và đầu ra.
  • Đây là môn đánh gôn nên bài dự thi ngắn nhất sẽ thắng.

Ví dụ

Đầu vào:

b     d        


     h   gi    

      e  f     
c     a        

Đầu ra:

b     d        
|\   /|        
| \ / |        
|  X h+--gi    
| / \ |  |     
|/   \e--f     
c     a        

Đầu vào:

     dk    j   

 b    l        

 c   fg        

     a    m    

   i      h    
     e         

Đầu ra:

     dk----j   
    /||   /    
 b / |l  /     
 |X  | \/      
 c \ fg/\      
    \|/\ \     
     a  \ m    
    /|   \     
   i-+----h    
     e         

Đầu vào:

   eti  sqjh k  p  u  cfm vb owgzyx rnd la  

Đầu ra:

   eti--sqjh-k--p--u--cfm-vb-owgzyx-rnd-la  

Đầu vào:

a

Đầu ra:

a

nghệ thuật ascii thực sự tốt đẹp
Trình tối ưu hóa

2
Điều gì xảy ra nếu cả X và + trùng nhau phải ở cùng một điểm? Hay đó không phải là một trường hợp chúng ta nên giải thích?
theonlygusti

@theonlygusti "Nếu có nhiều hơn hai dòng trùng nhau, bất kỳ cặp nào trong số chúng sẽ là một trong các phần trùng lặp hợp lệ" Ví dụ /-là các phần trùng lặp không hợp lệ X+( / \ - and |) không thể xảy ra ở cùng một vị trí.
Randomra

Vẫn còn bối rối; Tại sao không cho chúng tôi một số ví dụ?
theonlygusti

@theonlygusti: Về cơ bản, đó không phải là trường hợp bạn nên giải thích
Claudiu

Câu trả lời:


3

Perl, 219

Một số cải tiến có thể vẫn còn có thể.

#!perl -p0
/
/;$x="@-";
sub g{map"(?=$_)(.@_)+[".chr(1+ord).chr(~-ord)."]",a..z}
sub f{for$p(g"{$x}"){s/$p/$&&((_."\177"x~-$x)x y!
!!)/se;$_=lc;s![\0\\]!@_!g}$x++}
f"/";y!\17!/!;f"|";f"\\";y/\17/X/;for$p(g){s/$p/$&=~y! |!-+!r/e}

Hãy thử tôi .


6

JavaScript (ES6) 246 266 280 285 307

Khá cồng kềnh ...

Một hàm với chuỗi param và trả về chuỗi đã sửa đổi. Một dòng mới theo dõi là tùy chọn trừ khi đầu vào chỉ là 1 hàng (tôi cần một dòng mới để tìm hàng len)

Chỉ để làm cho ai đó hạnh phúc

F=b=>b.match(/\w/g).sort().map(l=>(q=b.indexOf(l),~p)?[o=b.indexOf('\n'),~o,o+2,1].map((d,i)=>{k=(q-p)/d|0;if(k&&k*d+p==q)for(m='/|\\-'[i];(p+=k>0?d:-d)-q;c==m|c>'`'&c<'{'?0:b[p]=c>' '?c<'/'|c>'z'?'+':'X':m)c=b[p]}):p=q,p=-1,b=[...b])&&b.join('')

Dễ đọc hơn

F=b=>
  b.match(/\w/g).sort().map(l=>
    (q=b.indexOf(l),~p)?
    [o=b.indexOf('\n'),~o,o+2,1].map((d,i)=>{
      k=(q-p)/d|0;
      if(k&&k*d+p==q)
        for(m='/|\\-'[i];
              (p+=k>0?d:-d)-q;
              c==m|c>'`'&c<'{'?0:b[p]=c>' '?c<'/'|c>'z'?'+':'X':m)
            c=b[p]
    })
    :p=q
  ,p=-1,b=[...b])
  &&b.join('')

Kiểm tra trong bảng điều khiển Firefox / FireBug

console.log(F('\
b     d\n\
       \n\
       \n\
       \n\
       \n\
      e\n\
c     a\n'))

console.log(F('\
     dk    j\n\
            \n\
 b    l     \n\
            \n\
 c   fg     \n\
            \n\
     a    m \n\
            \n\
   i      h \n\
     e      \n'))

console.log(F('\
b     d    \n\
           \n\
           \n\
     h   gi\n\
           \n\
      e  f \n\
c     a    \n'))

Đầu ra

b     d
|\   /|
| \ / |
|  X  |
| / \ |
|/   \e
c     a

     dk----j
    /||   / 
 b / |l  /  
 |X  | \/   
 c \ fg/\   
    \|/\ \  
     a  \ m 
    /|   \  
   i-+----h 
     e      

b     d    
|\   /|    
| \ / |    
|  X h+--gi
| / \ |  | 
|/   \e--f 
c     a    

Tôi đếm số 341ký tự.
mbomb007

@ mbomb007 không tính khoảng trắng và dòng mới thụt lề
edc65
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.