Menggambar di Slash

23

Tulis program yang menggunakan blok teks segi empat yang terdiri dari X's dan .' s, seperti ini kasar A:

......
..XX..
.X..X.
.XXXX.
.X..X.
.X..X.

Keluarkan representasi dari grid ini diputar 45 derajat berlawanan arah jarum jam dengan menggambar garis miring - maju atau mundur tergantung pada konteks - di mana-mana sebuah Xbatas .atau sisi grid (dengan ruang mengisi sisanya):

 /\/\
/ /\ \
\/ /  \
/\/ /\ \
\  /  \/
 \ \
  \ \
   \/

Jumlah spasi tambahan dan Xgaris depan (dan baris baru) tidak masalah selama bentuk 's dalam input dipertahankan oleh garis miring. Tidak masalah memangkas baris atau kolom .tambahan.

Untuk I / O Anda dapat menggunakan kombinasi parameter stdin / stdout / file / command line. Misalnya skrip Anda mungkin menggunakan nama file dari X.pola dan menulis ulang file dengan pola garis miring. Atau skrip Anda mungkin mengambil X.pola dari stdin baris demi baris (menekan dsaat selesai) dan mengeluarkan hasilnya ke stdout.

Input mungkin besar secara sewenang-wenang, tetapi Anda dapat menganggapnya selalu diformat dengan baik.

Tidak ada karakter selain / \dan baris baru harus dalam output apa pun.

Mencetak gol

Kode terpendek dalam byte menang. Gunakan https://mothereff.in/byte-counter sebagai penghitung byte jika Anda menggunakan karakter non-ASCII.

Bonus: Minus 50 byte jika Anda dapat mengubah (mengganti, tidak menghapus) satu karakter dalam program Anda sehingga menghasilkan garis miring yang diputar 45 derajat searah jarum jam , misalnya:

   /\/\
  / /\ \
 /  \ \/
/ /\ \/\
\/  \  /
    / /
   / /
   \/

Sampel input

XXXXXXXXX
X.......X
X.XXXXX.X
X.X...X.X
X.X.X.X.X
X.X...X.X
X.XXXXX.X
X.......X
XXXXXXXXX

XXX...XXX....XXX...XXX
X..X..X..X..X.....X...
XXX...XXX...X.....X.XX
X.....X.....X.....X..X
X.....X......XXX...XXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...X
X...X...............X...............X...........X...................X...X
X...X...XXXXXXXXX...X...XXXXX...XXXXXXXXX...XXXXX...XXXXX...XXXXX...X...X
X...............X.......X...X...........X...........X...X...X.......X...X
XXXXXXXXX...X...XXXXXXXXX...XXXXXXXXX...XXXXX...X...X...X...XXXXXXXXX...X
X.......X...X...............X...........X...X...X...X...X...........X...X
X...X...XXXXXXXXXXXXX...X...X...XXXXXXXXX...XXXXX...X...XXXXXXXXX...X...X
X...X...............X...X...X.......X...........X...........X.......X...X
X...XXXXXXXXXXXXX...XXXXX...XXXXX...X...XXXXX...XXXXXXXXX...X...XXXXX...X
X...........X.......X...X.......X...X.......X...........X...X...........X
X...XXXXX...XXXXX...X...XXXXX...X...XXXXXXXXX...X...X...X...XXXXXXXXXXXXX
X.......X.......X...X...X.......X.......X.......X...X...X.......X.......X
XXXXXXXXXXXXX...X...X...X...XXXXXXXXX...X...XXXXX...X...XXXXX...XXXXX...X
X...........X...X...........X.......X...X.......X...X.......X...........X
X...XXXXX...X...XXXXXXXXX...XXXXX...X...XXXXX...XXXXX...XXXXXXXXXXXXX...X
X...X.......X...........X...........X.......X...X...X...............X...X
X...X...XXXXXXXXX...X...XXXXX...XXXXXXXXX...X...X...XXXXXXXXXXXXX...X...X
X...X...........X...X...X...X...X...........X...............X...X.......X
X...XXXXXXXXX...X...X...X...XXXXX...XXXXXXXXX...XXXXXXXXX...X...XXXXXXXXX
X...X.......X...X...X...........X...........X...X.......X...............X
X...X...XXXXX...XXXXX...XXXXX...XXXXXXXXX...XXXXX...X...XXXXXXXXX...X...X
X...X...................X...........X...............X...............X...X
X...XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

( sumber maze )

Pertanyaan Terkait:
Gambarlah kurva Hilbert menggunakan garis miring
Sejajarkan bentuk ASCII yang sejajar secara horizontal, sepanjang garis diagonal

Hobi Calvin
sumber
Apakah mengganti karakter tunggal dengan karakter spasi putih (atau spasi putih menjadi simbol) dapat diterima?
Reinstate Monica - ζ--
@hexafraction Sure
Hobbies Calvin
Yang kita butuhkan adalah seseorang untuk menjawab ini di itflabtijtslwi . Lalu kita akan memiliki "Menggambar di Slash dalam Slash."
Justin

Jawaban:

10

Python 2 - 236, 228, 228, 221, 250, 248 246 - 50 = 196

s=input().split()
s=zip(*s[::-1])
X=len(s[0])+2
d=('.',)
B=[d*X]
s=B+[d+tuple(l)+d for l in s]+B
Y=len(s)
for x in range(X,-Y,-1):print' '*abs(x)+''.join(' \\'[s[y-1][x+y-1]!=s[y-1][x+y]]+' /'[s[y-1][x+y]!=s[y][x+y]]for y in range(1,Y)if 0<x+y<X)

Saya menambahkan fitur bonus opsional yang mengubah arah dari searah jarum jam ke berlawanan arah jarum jam. Pada dasarnya, baris kedua hanya memutar input sebesar 90 derajat. Untuk beralih di antara kedua opsi, ganti s=zip(...)dengan sesuatu seperti S=zip(...)(yaitu menetapkan untuk variabel yang tidak akan digunakan lagi).

.XX.X....X...XX.X.X
X...X...X.X.X...X.X
.X..X...XXX..X..XXX
..X.X...X.X...X.X.X
XX..XXX.X.X.XX..X.X

                 /\           /\/\ 
                 \ \          \/\ \ 
               /\ \ \         /\ \/  
               \ \/  \     /\ \/   /\ 
             /\ \  /\ \    \ \/\  / /  
            / /  \ \ \/     \/\/ / /    
            \/    \ \           / /      
            /\/\/\ \/          / /        
            \/\/\/             \ \    /\/\ 
        /\/\    /\              \ \  / /\/  
        \/\ \  / /               \/ /  \/\   
        /\/  \ \/                  / /\  /    
        \  /\ \                    \/ / / /\/\ 
         \ \ \/                      / /  \/\ \ 
   /\     \ \                        \/   /\ \/  
   \ \     \/                          /\ \/   /\ 
 /\ \ \  /\                            \ \/\  / /  
/ /  \ \/ /                             \/\/ / / /\ 
\/    \  /                                  /  \/ /
/\/\/\ \/                                  / /\  /
\/\/\/                                     \/ / /
    /\                                       / /
   / /                                       \/
   \/
Falko
sumber
Anda bisa menghemat 5bytes oleh mengapit sdengan Boleh s=B+s+B.
BeetDemGuise
1
@BeetDemGuise: Terima kasih! Itu jauh lebih mudah! :)
Falko
7

MATLAB - 286 - 50 = 236

Diperkecil:

S=input('');x=rot90(reshape(input('','s'),S),1);S=size(x);D=sum(S);[r,c]=ind2sub(S,find(x==88));A=zeros(D);f=@(o,p)sub2ind([D D],r+c+o-1,c-r+S(1)+p);A(f(1,1))=1;t=f(0,0);A(t)=A(t)+1;A(f(1,0))=3;t=f(0,1);A(t)=A(t)+3;fprintf('%s',char([(1-mod(A,2))*32+(A==1)*47+(A==3)*92,ones(D,1)*13]'))

Diperluas:

S = input('');
x = rot90( reshape( input('','s'), S ), 1 );
S = size( x );
D = sum( S );
[r,c] = ind2sub( S, find( x==88 ) );
A = zeros( D );
f = @(o,p) sub2ind( [D D], r+c+o-1, c-r+S(1)+p );

A(f(1,1)) = 1;
t = f(0,0); A(t) = A(t)+1;
A(f(1,0)) = 3;
t = f(0,1); A(t) = A(t)+3;

fprintf( '%s', char( [(1-mod( A, 2 ))*32 + (A==1)*47 + (A==3)*92, ones( D, 1 )*13]' ) )

Kode ini dapat dikurangi lebih lanjut oleh 6 karakter (untuk mengikat lead saat ini) dengan menghilangkan pemain untuk mengetik char, tetapi ini menghasilkan peringatan dari MATLAB, dan saya tidak yakin apakah itu diizinkan.

Ini dapat dikurangi dengan 13 karakter tambahan jika input diperlukan untuk memiliki format "mark up" seperti ['X..';'.X.';'..X'], tapi saya tidak tahu ini diizinkan juga. Saat ini skrip hanya menerima dua angka (dimensi baris dan kolom) dan kemudian membaca dalam satu string karakter grid.

Bonus

Dengan mengubah 1panggilan x = rot90( ..., 1 );ke a 0, transformasi berubah dari rotasi CCW 45 ° ke rotasi CW 45 °. Faktanya, semua kemungkinan rotasi 45 ° + n · 90 ° dimungkinkan dengan melangkahi parameter ini dari 0hingga 3.

Keluaran sampel:

XXX...XXX....XXX...XXX
X..X..X..X..X.....X...
XXX...XXX...X.....X.XX
X.....X.....X.....X..X
X.....X......XXX...XXX

                     /\    
                    / /    
                   / / /\  
                   \/ /  \ 
                   /\ \/\ \
                   \ \  / /
               /\   \ \/ / 
              / /    \/\/  
             / /           
             \/            
             /\    /\      
             \ \  / /      
              \ \/ /       
        /\/\   \/\/        
       / /\/               
      / / /\               
      \ \/ /               
       \  /                
        \ \                
  /\/\   \ \               
 / /\/    \/               
/ / /\                     
\ \/ /                     
 \  /                      
  \ \                      
   \ \                     
    \/                     

    /\                     
   /  \                    
  / /\ \                   
 /  \ \/                   
/ /\ \/\                   
\/  \/\/                   
          /\               
         /  \              
        / /\ \             
       /  \ \/             
      / /\ \/\             
      \/  \/\/             

               /\/\        
              / /\ \       
             / /  \ \      
             \/    \/      
             /\            
             \ \           
              \ \    /\/\  
               \/   / /\ \ 
                   / /  \ \
                   \/ /\ \/
                   /\ \ \  
                   \ \/ /  
                    \  /   
                     \/    
COTO
sumber
3

Perl - 409

while(<>){$a[$.]=[/./g]}$l=$#a<($g=@{$a[1]})?$#a:$g;$r=$#a+$g-1;for$d(1..$r){for$e(1..$l){if(($b=$a[$c=($d>$g?$d-$g:0)+$e][$n=-($d-$c+1)])&&$n<0){$h[$d][$e]=$b;}}$h[$d]=[(0)x(($l-{@$h[$d]})/2),@{$h[$d]}];}sub z{"\0"x((reverse(1..$g),(2..$r-$g+1))[int($q++/2)-1]).join'',map{$_ eq'X'?($q%2?'/\\':'\/'):"\0\0"}@_}@i="\0"x2x$l;for$f(@h){$i[$#i]=(z@$f)^$i[$#i];$i[$#i+1]=z@$f}for$j(@i){print$j=~s/[\0s]/ /gr."\n"}

Membaca dari stdin dan mencetak ke stdout.

Output contoh:

XXX
X..
XXX
..X
XXX

     /\
    / / 
   / / /\
   \ \/  \
    \  /\ \
     \/ / /
       / /
       \/

XXXXXXXXX
X........
X.XXXXXXX
X.X.....X
X.X..X..X
X.XXXX..X
X...X...X
XXXXXXXXX
           /\
          / / 
         / / /\
        / / /  \
       / / / /\ \
      / / / /  \ \
     / / / /    \ \
    / / / / /\   \ \
   / / / /  \ \  / /
   \ \ \ \  / / / /
    \ \ \ \/  \/ /
     \ \ \  /\  /
      \ \ \/ / /
       \ \  / /
        \ \/ /
         \  /
          \/
faubi
sumber