旋转中文棋盘


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度。您可以决定是顺时针还是逆时针旋转,只要一致即可。输入和输出都不应有多余的前导或尾随空格。

这是代码高尔夫球。最短的代码胜出。

Answers:


16

CJam,61 59 43 40 38 36字节

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

这是一个匿名函数,期望在堆栈上有一个字符串和一个整数。

感谢@ jimmy23013高尔夫球了19个字节。

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行(左图)前添加n-1个空格。然后,我们反转行的顺序(如右图所示)。

            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 2015年

@ jimmy23013:比我的排序方法好得多。谢谢!
丹尼斯

liq{_N/eeSf.*W%:szsS-\{_' >{;(}&\}/;]}@*,但是在撰写此挑战时,我想旋转60度而不是45度……
jimmy23013 2015年

@ jimmy23013:哇,谢谢!我尝试了一种不同的方法,但qN/(i{_eeSf.*W%:szSf-{},.{' f+sW<\,' e[}}*N*比以前更长了
丹尼斯(Dennis)

11

Python 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),然后转换回去。

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.