连接字母


23

您应该编写一个程序或函数,该程序或函数接收一个以字符串表示的字符块,并输出或返回一个类似的字符串,在该字符串中,字母的相邻字母相互连接。

视觉示例(以的形式input => output):

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

细节

  • 输入将是一个包含空格,换行符以及每个第一N个小写字母正好一个的字符串。1 <= N <= 26
  • 输入的行将用空格填充,以创建一个完整的矩形块。
  • 字母表中相邻的每对字母将在同一行,列或对角线上,并应使用来连接直线\ / | or -。(该行的长度可能为0。)
  • 应处理以下两行重叠类型:

    / and \ become X
    | and - become +
    / and / become /
    \ and \ become \
    | and | become |
    - and - become -
    [letter] and [anything] become [letter]
    
  • 没有其他类型的两行重叠。

  • 如果多于两条线重叠,则可以保证其中任意一对都是有效重叠之一。(例如,[letter] / |三重态将永远不会发生)
  • 除了将空间更改为\ / | - X and +输入和输出外,其他应该相同。
  • 尾随换行符是可选的,但输入和输出必须相同。
  • 这是代码高尔夫球,因此最短的条目将获胜。

例子

输入:

b     d        


     h   gi    

      e  f     
c     a        

输出:

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

输入:

     dk    j   

 b    l        

 c   fg        

     a    m    

   i      h    
     e         

输出:

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

输入:

   eti  sqjh k  p  u  cfm vb owgzyx rnd la  

输出:

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

输入:

a

输出:

a

非常好的ASCII艺术
优化

2
如果X和+重叠都应该在同一位置怎么办?还是不是我们应该考虑的情况?
theonlygusti 2015年

@theonlygusti“如果有多于两行重叠,那么任何一对都将是有效重叠之一”例如,/并且-是无效重叠,X并且+/ \ - and |)不能出现在同一位置。
randomra 2015年

仍然感到困惑;为什么不给我们一些例子呢?
theonlygusti 2015年

@theonlygusti:基本上,这不是您应该考虑的情况
Claudiu 2015年

Answers:


3

佩尔(219)

仍有可能进行一些改进。

#!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}

试试


6

的JavaScript(ES6)246 266 280 285 307

相当笨重...

具有字符串参数并返回修改后的字符串的函数。除非输入只有1行,否则尾随换行符是可选的(我需要换行来找到len行)

只是为了让某人开心

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

更具可读性

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

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

输出量

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    

我数341字符。
mbomb007

@ mbomb007不计算缩进空格和换行符
edc65
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.