편지 연결


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]
    
  • 다른 종류의 2 줄 겹침은 발생하지 않습니다.

  • 둘 이상의 라인이 겹치는 경우 이들 라인 중 하나가 유효한 겹치기 중 하나가 보장됩니다. (예 : [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

정말 좋은 아스키 아트
Optimizer

2
X와 + 오버랩이 동일한 지점에 있어야한다면 어떻게해야합니까? 아니면 우리가 고려해야 할 경우가 아닙니까?
theonlygusti

예로서, "두 개 이상의 라인이 그 중 한 쌍은 상기 유효 중첩 중 하나가 될 겹치면"@theonlygusti /하고 -있는 잘못된 중복을 X하고 +( / \ - and |) 동일한 위치에서 발생할 수있다.
randomra

여전히 혼란스러워; 왜 우리에게 몇 가지 예를 들어주지 않겠습니까?
theonlygusti

@theonlygusti : 기본적으로, 당신이 고려해야 할 경우가 아닙니다
Claudiu

답변:


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

자바 스크립트 (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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.