Çinli bir dama tahtası döndürme


19

Çinli bir dama tahtası şöyle görünür ( bu soruya dayanarak, bu sefer sabit bir boyuta sahiptir):

            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

Bu örnekteki boşluk olmayan her karakterin yerine, girişteki boşluk bırakılamaz yazdırılabilir ASCII karakteri kullanılabilir; boşluklar asla değiştirilmez. Çince denetleyicide geçerli bir düzenleme olduğu garanti edilmez (tam olarak 7 farklı türde karakter olmayabilir).

Göreviniz 60 derecenin katıyla döndürmektir.

Bu, saat yönünde 60 derece döndürülen yukarıdaki örnektir:

            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

Giriş, negatif olmayan bir tamsayı ve bir Çin dama tahtasıdır. Programınız (veya fonksiyonunuz) tamsayı * 60 derece döndürmelidir. Tutarlı olduğu sürece saat yönünde mi yoksa saat yönünün tersinde mi döneceğine siz karar verirsiniz. Hem giriş hem de çıkışta fazladan önde veya arkada boşluk olmamalıdır.

Bu kod golfü. En kısa kod kazanır.

Yanıtlar:


16

CJam, 61 59 43 40 38 36 bayt

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

Bu, yığında bir dize ve bir tam sayı bekleyen anonim bir işlevdir.

@ Jimmy23013'e 19 bayt golf için teşekkürler.

CJam yorumlayıcısında çevrimiçi deneyin .

Fikir

Dama tahtalarının yazdırılabilir karakterlerine önce doğuya, sonra güneye okuyarak bir sipariş atayabiliriz.

Bu şekilde orijinal ve döndürülmüş dama tahtası

            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            

olmak

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

ve

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

sırasıyla.

İlk dama tahtasında ikinci sırayı karakterlerini önce kuzeydoğusunda, sonra güneydoğuda okuyarak bulabiliriz.

Kod içinde amaca ulaşmak için, prepending başlamak 1 - n için boşluk N inci dama satır (sol tarafta). Ardından, satırların sırasını tersine çeviririz (sağda gösterilir).

            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                        

Son olarak, sütun içeren satırları aktarırız:

                 ​



            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

Boşluk her yerde, ancak doğudan sonra güneyden okursak yazdırılabilir karakterler doğru sırada.

Yapmak kaldı Bütün değiştiriyor n inci orijinal dama tahtası yazdırılabilir karakteri n inci son değişikliğin basılabilir karakterler.

kod

                                   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: Sıralama yaklaşımımdan çok daha iyi. Teşekkürler!
Dennis

liq{_N/eeSf.*W%:szsS-\{_' >{;(}&\}/;]}@*, ama bu zorluğu yazarken 45 derece değil 60 derece
dönmeyi düşünüyordum

@ jimmy23013: Vay canına, teşekkürler! Farklı bir yaklaşım deniyordum, ama qN/(i{_eeSf.*W%:szSf-{},.{' f+sW<\,' e[}}*N*daha önce sahip olduğumdan bile daha uzun ...
Dennis

11

Python 2, 171 bayt

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

Bu belki de str.splitlinesyararlı bulduğum tek zamandır - diğer tüm zamanlar .split("\n")için daha kısa.

Gibi kullanın f(S,10).

açıklama

Girişteki her karakter için:

  • Bir boşluk veya yeni satırsa saklayın veya
  • Aksi takdirde doğru karakterle değiştirin

Hangi karakterin değiştirileceğini bulmak için, ızgarayı küp koordinatlarına dönüştürüyoruz (x, y, z), dönüşerek nsüreleri döndürüyoruz (x, y, z) -> (-y, -z, -x), sonra geri dönüştürüyoruz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.