Putar kotak-kotak Cina

19

Kotak-kotak Cina terlihat seperti ini (berdasarkan pertanyaan ini , tetapi kali ini ukurannya tetap):

            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

Setiap karakter non-spasi dalam contoh ini dapat diganti dengan karakter ASCII non-spasi yang dapat dicetak dalam input, sementara spasi tidak pernah berubah. Perhatikan bahwa itu tidak dijamin menjadi pengaturan yang valid di pemeriksa Cina (seperti mungkin tidak memiliki 7 jenis karakter yang berbeda).

Tugas Anda adalah memutarnya dengan kelipatan 60 derajat.

Ini adalah contoh di atas yang diputar 60 derajat searah jarum jam:

            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

Inputnya adalah bilangan bulat non-negatif dan kotak-kotak Cina. Program Anda (atau fungsi) harus memutarnya dengan bilangan bulat * 60 derajat. Anda memutuskan apakah akan memutar searah jarum jam atau berlawanan arah jarum jam, selama itu konsisten. Baik input maupun output seharusnya tidak memiliki spasi tambahan tambahan atau spasi tambahan.

Ini adalah kode-golf. Kode terpendek menang.

jimmy23013
sumber

Jawaban:

16

CJam, 61 59 43 40 38 36 byte

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

Ini adalah fungsi anonim yang mengharapkan string dan integer pada stack.

Terima kasih kepada @ jimmy23013 untuk bermain golf 19 byte.

Cobalah online di juru bahasa CJam .

Ide

Kami dapat menetapkan pesanan ke karakter yang dapat dicetak dari papan-papan dengan membacanya ke timur, lalu ke selatan.

Dengan cara ini, kotak-kotak asli dan diputar

            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            

menjadi

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

dan

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

masing-masing.

Kita dapat menemukan urutan kedua di kotak-kotak pertama dengan membaca karakternya di timur laut, lalu ke tenggara.

Untuk mencapai ini dalam kode, kita mulai dengan menambahkan spasi n - 1 ke baris ke- n kotak-kotak (ditunjukkan di sebelah kiri). Kemudian, kami membalikkan urutan baris (ditampilkan di sebelah kanan).

            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                        

Akhirnya, kami mengubah urutan baris dengan kolom:

                 ​



            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

Ruang putih ada di semua tempat, tetapi karakter yang dapat dicetak berada dalam urutan yang benar jika kita membacanya ke timur, lalu ke selatan.

Semua yang tersisa untuk dilakukan adalah mengganti n th karakter yang dapat dicetak dari kotak-kotak asli oleh n th karakter yang dapat dicetak dari modifikasi terakhir.

Kode

                                   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.
Dennis
sumber
_,,Sf*\.+W%ze_.
jimmy23013
@ jimmy23013: Jauh lebih baik daripada pendekatan sortir saya. Terima kasih!
Dennis
liq{_N/eeSf.*W%:szsS-\{_' >{;(}&\}/;]}@*, tapi saya berpikir untuk berputar 60 derajat, bukan 45 derajat ketika saya menulis tantangan ini ...
jimmy23013
@ jimmy23013: Wow, terima kasih! Saya telah mencoba pendekatan yang berbeda, tetapi qN/(i{_eeSf.*W%:szSf-{},.{' f+sW<\,' e[}}*N*bahkan lebih lama dari yang saya miliki sebelumnya ...
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

Ini mungkin satu-satunya waktu yang saya anggap str.splitlinesberguna - untuk semua waktu lainnya, .split("\n")lebih singkat.

Gunakan seperti f(S,10).

Penjelasan

Untuk setiap karakter dalam input, kami juga:

  • Simpan jika itu spasi atau baris baru, atau
  • Ganti dengan karakter yang benar

Untuk mengetahui karakter yang harus diganti, kami mengonversi kisi ke koordinat kubus (x, y, z) , memutar nwaktu dengan mengubah (x, y, z) -> (-y, -z, -x), lalu mengonversi kembali.

Sp3000
sumber