중국어 바둑판 회전


19

중국어 바둑판은 다음과 같습니다 ( 이 질문에 기반 하지만 이번에는 고정 크기입니다).

            G
           . G
          G G G
         G G . G
B B B B . . Y G . Y . Y Y
 B B B . . G . . . Y Y Y
  B . B . . . . . Y . Y
   B . . . . . . . . Y
    . . . . . . . . .
   . P . . . . . O O .
  P P . . . . . . . O O
 P P P . . . R . . O O .
P P P P . . R . . O O O O
         R . R R
          R R R
           R .
            R

이 예에서 공백이 아닌 문자는 입력에서 공백이 아닌 인쇄 가능한 ASCII 문자로 대체 될 수 있지만 공백은 변경되지 않습니다. 중국어 체커에서는 유효한 배열이 보장되지 않습니다 (예 : 정확히 7 가지의 다른 문자가 없을 수 있음).

당신의 임무는 60 도의 배수로 회전하는 것입니다.

위의 예는 시계 방향으로 60도 회전합니다.

            B
           B B
          B B B
         B . B B
P P P . . . B . . G G . G
 P P P P . . . . . G G G
  P P . . . . . G Y . G
   P . . . . . . . G G
    . . . . . . . . .
   R . . . . . . . . Y
  R . R R . . . . Y Y .
 R R R . . . O . . . Y Y
R . R R . . . O . Y Y Y Y
         O O O .
          O O O
           O .
            O

입력은 음이 아닌 정수이며 중국어 바둑판입니다. 프로그램 (또는 함수)은 정수 * 60도 회전해야합니다. 일관된 한 시계 방향 또는 반 시계 방향으로 회전할지 결정합니다. 입력과 출력 모두에 선행 또는 후행 공백이 없어야합니다.

이것은 코드 골프입니다. 가장 짧은 코드가 승리합니다.

답변:


16

CJam, 61 59 43 40 38 36 바이트

{{_N/eeSf.*:sW%zsS-\{_' >{;(}&+}/}*}

이것은 스택에서 문자열과 정수를 기대하는 익명 함수입니다.

19 바이트의 골프를 즐기신 @ jimmy23013에게 감사드립니다.

CJam 통역사 에서 온라인으로 사용해보십시오 .

생각

바둑판의 인쇄 가능한 문자를 동쪽에서 남쪽으로 읽음으로써 주문을 할당 할 수 있습니다.

이렇게하면 원래의 회전 된 바둑판

            G                                  B            
           . G                                B B           
          G G G                              B B B          
         G G . G                            B . B B         
B B B B . . Y G . Y . Y Y          P P P . . . B . . G G . G
 B B B . . G . . . Y Y Y            P P P P . . . . . G G G 
  B . B . . . . . Y . Y              P P . . . . . G Y . G  
   B . . . . . . . . Y                P . . . . . . . G G   
    . . . . . . . . .                  . . . . . . . . .    
   . P . . . . . O O .                R . . . . . . . . Y   
  P P . . . . . . . O O              R . R R . . . . Y Y .  
 P P P . . . R . . O O .            R R R . . . O . . . Y Y 
P P P P . . R . . O O O O          R . R R . . . O . Y Y Y Y
         R . R R                            O O O .         
          R R R                              O O O          
           R .                                O .           
            R                                  O            

지다

G.GGGGGG.GBBBB..YG.Y.YYBBB..G...YYYB.B.....Y.YB........Y..........P.....OO.PP.......OOPPP...R..OO.PPPP..R..OOOOR.RRRRRR.R

BBBBBBB.BBPPP...B..GG.GPPPP.....GGGPP.....GY.GP.......GG.........R........YR.RR....YY.RRR...O...YYR.RR...O.YYYYOOO.OOOO.O

각기.

첫 번째 바둑판에서 문자를 북동쪽으로 읽은 다음 남동쪽으로 읽으면 두 번째 시퀀스를 찾을 수 있습니다.

코드에서 이것을 달성하기 위해, 우리는 n-1 공백을 바둑판 의 n 번째 행 앞에 추가 합니다 (왼쪽에 표시됨). 그런 다음 행의 순서를 반대로 바꿉니다 (오른쪽에 표시).

            G                                                       R        
            . G                                                   R .        
            G G G                                               R R R        
            G G . G                                           R . R R        
    B B B B . . Y G . Y . Y Y                       P P P P . . R . . O O O O
      B B B . . G . . . Y Y Y                       P P P . . . R . . O O .  
        B . B . . . . . Y . Y                       P P . . . . . . . O O    
          B . . . . . . . . Y                       . P . . . . . O O .      
            . . . . . . . . .                       . . . . . . . . .        
            . P . . . . . O O .                   B . . . . . . . . Y        
            P P . . . . . . . O O               B . B . . . . . Y . Y        
            P P P . . . R . . O O .           B B B . . G . . . Y Y Y        
            P P P P . . R . . O O O O       B B B B . . Y G . Y . Y Y        
                      R . R R                       G G . G                  
                        R R R                       G G G                    
                          R .                       . G                      
                            R                       G                        

마지막으로 행을 열로 바꿉니다.

                 ​



            B    

           BB    

          BBB    

         B.BB    

    PPP...B..GG.G

    PPPP.....GGG

    PP.....GY.G

    P.......GG

    .........

   R........Y

  R.RR....YY.

 RRR...O...YY

R.RR...O.YYYY

OOO.

OOO

O.

O

공백은 도처에 있지만 인쇄 가능한 문자는 동쪽으로 읽은 다음 남쪽으로 읽으면 올바른 순서입니다.

할 남은 것을 모두는 대체 N을 번째 바이 원래 체크 무늬의 인쇄 가능한 문자 N 마지막 수정의 인쇄 가능한 문자.

암호

                                   e# Stack: String B, Integer A
{                               }* e# Repeat A times:
 _N/                               e#   Push a copy of B and split it at linefeeds.
    ee                             e#   Enumerate the lines of B.
      Sf.*:s                       e#   Execute S.*s for each line:
                                   e#     [4 "abc"] -> "    abc"
            W%                     e#   Reverse the order of line lines.
              z                    e#   Zip; transpose rows with columns.
               s                   e#   Flatten the arrays of strings.
                S-                 e#   Remove spaces.
                                   e#   This pushes a string L.
                  \{          }/   e#   For each character C in the unmodified B:
                    _' >           e#     Check if C is bigger than ' '.
                        {  }&      e#     If it is:
                         ;(        e#      Discard C and shift out a char from L.
                             +     e#     Append a char (C or from L) to L.
                                   e#  L is B rotated by 60 degrees. Set L := B.

_,,Sf*\.+W%ze_.
jimmy23013 2016 년

@ jimmy23013 : 내 정렬 방식보다 훨씬 낫습니다. 감사!
Dennis

liq{_N/eeSf.*W%:szsS-\{_' >{;(}&\}/;]}@*, 그러나이 도전 과제를 작성할 때 45 도가 아닌 60도 회전하는 것을 생각하고있었습니다.
jimmy23013 2016 년

@ jimmy23013 :와, 고마워요! 나는 다른 접근법을 시도했지만 qN/(i{_eeSf.*W%:szSf-{},.{' f+sW<\,' e[}}*N*이전보다 훨씬 길었습니다.
Dennis

11

파이썬 2, 171 바이트

def f(S,n):
 o="";E=enumerate;B=S.splitlines(1)
 for r,l in E(B):
  for c,q in E(l):z=r-8;y=6-(z+c)/2;x=-y-z;exec"x,y,z=-y,-z,-x;"*n;o+=q*(q<"!")or B[z+8][12-y+x]
 print o

이것은 아마도 내가 찾은 유일한 시간 일 것입니다 . str.splitlines다른 모든 경우 .split("\n")에는 더 짧습니다.

처럼 사용하십시오 f(S,10).

설명

입력의 각 문자에 대해 다음 중 하나를 수행합니다.

  • 공백이나 줄 바꿈 인 경우 보관하거나
  • 그렇지 않으면 올바른 문자로 교체하십시오

대체 할 문자를 알아 내기 위해 그리드를 큐브 좌표 로 변환하고 변환하여 시간을 (x, y, z)회전 한 다음 다시 변환합니다.n(x, y, z) -> (-y, -z, -x)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.