Xoay một bàn cờ Trung Quốc


19

Một bàn cờ Trung Quốc trông như thế này (dựa trên câu hỏi này , nhưng lần này nó có kích thước cố định):

            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

Mỗi ký tự không phải khoảng trắng trong ví dụ này có thể được thay thế bằng bất kỳ ký tự ASCII không thể in nào trong đầu vào, trong khi khoảng trắng không bao giờ thay đổi. Lưu ý rằng nó không được đảm bảo là một sự sắp xếp hợp lệ trong trình kiểm tra tiếng Trung (chẳng hạn như nó có thể không có chính xác 7 loại ký tự khác nhau).

Nhiệm vụ của bạn là xoay nó bằng bội số 60 độ.

Đây là ví dụ trên xoay 60 độ theo chiều kim đồng hồ:

            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

Đầu vào là một số nguyên không âm và một bàn cờ Trung Quốc. Chương trình của bạn (hoặc chức năng) sẽ xoay nó theo số nguyên * 60 độ. Bạn quyết định xoay theo chiều kim đồng hồ hay ngược chiều kim đồng hồ, miễn là phù hợp. Cả đầu vào và đầu ra không nên có thêm khoảng trắng ở đầu hoặc cuối.

Đây là mã golf. Mã ngắn nhất sẽ thắng.

Câu trả lời:


16

CJam, 61 59 43 40 38 36 byte

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

Đây là một hàm ẩn danh mong đợi một chuỗi và một số nguyên trên ngăn xếp.

Cảm ơn @ jimmy23013 vì đã chơi golf 19 byte.

Hãy thử trực tuyến trong trình thông dịch CJam .

Ý kiến

Chúng ta có thể chỉ định một đơn đặt hàng cho các ký tự có thể in được của bàn cờ bằng cách đọc chúng về phía đông, sau đó về phía nam.

Bằng cách này, bàn cờ gốc và xoay

            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            

trở nên

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

tương ứng.

Chúng ta có thể tìm thấy chuỗi thứ hai trong bàn cờ đầu tiên bằng cách đọc các ký tự của nó theo hướng đông bắc, sau đó theo hướng đông nam.

Để đạt được điều này trong mã, chúng tôi bắt đầu bằng cách thêm n - 1 khoảng trắng vào hàng thứ n của bảng kiểm tra (hiển thị bên trái). Sau đó, chúng tôi đảo ngược thứ tự của các hàng (hiển thị bên phải).

            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                        

Cuối cùng, chúng tôi hoán chuyển các hàng với các cột:

                 ​



            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

Khoảng trắng ở khắp mọi nơi, nhưng các ký tự có thể in được theo đúng thứ tự nếu chúng ta đọc chúng về phía đông, sau đó về phía nam.

Tất cả những gì còn lại phải làm là thay thế ký tự có thể in thứ n của bảng kiểm tra gốc bằng ký tự có thể in thứ n của lần sửa đổi cuối cùng.

                                   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

@ jimmy23013: Tốt hơn nhiều so với cách tiếp cận sắp xếp của tôi. Cảm ơn!
Dennis

liq{_N/eeSf.*W%:szsS-\{_' >{;(}&\}/;]}@*, nhưng tôi đã nghĩ đến việc xoay 60 độ chứ không phải 45 độ khi tôi viết thử thách này ...
jimmy23013

@ jimmy23013: Wow, cảm ơn! Tôi đã thử một cách tiếp cận khác, nhưng qN/(i{_eeSf.*W%:szSf-{},.{' f+sW<\,' e[}}*N*thậm chí còn dài hơn những gì tôi có trước đây ...
Dennis

11

Python 2, 171 byte

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

Đây có lẽ là lần duy nhất tôi thấy str.splitlineshữu ích - đối với tất cả các lần khác, .split("\n")là ngắn hơn.

Sử dụng như thế nào f(S,10).

Giải trình

Đối với mỗi char trong đầu vào, chúng ta hoặc:

  • Giữ nó nếu đó là một không gian hoặc dòng mới, hoặc
  • Thay thế nó bằng char chính xác

Để tìm ra char nào cần thay thế, chúng ta chuyển đổi lưới thành tọa độ khối (x, y, z) , xoay nthời gian bằng cách chuyển đổi (x, y, z) -> (-y, -z, -x), sau đó chuyển đổi trở lại.

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.