Vẽ trong dấu gạch chéo


23

Viết chương trình lấy một khối văn bản hình chữ nhật được tạo thành từ X's và .', chẳng hạn như phần thô này A:

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

Xuất ra một đại diện của lưới này xoay 45 độ ngược chiều kim đồng hồ bằng cách vẽ một dấu gạch chéo - tiến hoặc lùi tùy theo ngữ cảnh - ở mọi nơi một Xđường viền a .hoặc cạnh của lưới (với các khoảng trống được điền vào phần còn lại):

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

Số lượng dấu cách và dấu cách hàng đầu (và dòng mới) không quan trọng miễn là hình dạng của chữ số Xtrong đầu vào được duy trì bằng dấu gạch chéo. Bạn có thể cắt bớt các hàng hoặc cột thêm ..

Đối với I / O, bạn có thể sử dụng bất kỳ sự kết hợp nào của các tham số dòng lệnh stdin / stdout / files / lệnh. Ví dụ, tập lệnh của bạn có thể lấy tên tệp của X.mẫu và viết lại tệp bằng mẫu gạch chéo. Hoặc tập lệnh của bạn có thể lấy X.mẫu từ dòng stdin theo dòng (nhấn dkhi hoàn thành) và đưa kết quả ra thiết bị xuất chuẩn.

Đầu vào có thể lớn tùy ý, nhưng bạn có thể cho rằng nó luôn được định dạng tốt.

Không có ký tự bên cạnh / \và dòng mới nên có trong bất kỳ đầu ra.

Chấm điểm

Mã ngắn nhất tính bằng byte thắng. Sử dụng https://otherseff.in/byte-corer làm bộ đếm byte nếu bạn sử dụng các ký tự không phải ASCII.

Phần thưởng: Trừ 50 byte nếu bạn có thể thay đổi (thay thế, không xóa) một ký tự trong chương trình của mình để nó xuất ra lưới gạch chéo xoay 45 độ theo chiều kim đồng hồ , ví dụ:

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

Mẫu đầu vào

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

( nguồn mê cung )

Câu hỏi liên quan:
Vẽ đường cong Hilbert bằng cách sử dụng dấu gạch chéo
Căn chỉnh hình dạng ASCII thẳng hàng, góc phải dọc theo đường chéo


Việc thay thế ký tự đơn bằng ký tự khoảng trắng (hoặc khoảng trắng thành ký hiệu) có được chấp nhận không?
Phục hồi Monica - ζ--

@hexafraction Chắc chắn
Sở thích của Calvin

Những gì chúng ta cần là ai đó trả lời điều này trong itflabtijtslwi . Sau đó, chúng ta sẽ có "Vẽ trong dấu gạch chéo trong dấu gạch chéo."
Justin

Câu trả lời:


10

Con trăn 2 - 236, 228, 226, 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)

Tôi đã thêm tính năng phần thưởng tùy chọn chuyển hướng từ chiều kim đồng hồ sang ngược chiều kim đồng hồ. Về cơ bản, dòng thứ hai chỉ đơn giản xoay đầu vào 90 độ. Để chuyển đổi giữa cả hai tùy chọn, thay thế s=zip(...)bằng một cái gì đó như S=zip(...)(tức là gán cho một biến không được sử dụng lại).

.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

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

Bạn có thể tiết kiệm 5bytes bằng kẹp svới Bbằng s=B+s+B.
BeetDemGuise

1
@BeetDemGuise: Cảm ơn! Điều đó dễ dàng hơn nhiều! :)
Falko

7

MATLAB - 286 - 50 = 236

Giảm thiểu:

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]'))

Mở rộng:

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]' ) )

Mã có thể được giảm thêm 6 ký tự (để ràng buộc khách hàng tiềm năng hiện tại) bằng cách loại bỏ các nhân vật để gõ char, nhưng điều này dẫn đến một cảnh báo từ MATLAB, và tôi không chắc liệu điều đó có được phép hay không.

Nó có thể được giảm thêm 13 ký tự nếu đầu vào được yêu cầu phải có định dạng "được đánh dấu" ['X..';'.X.';'..X'], nhưng tôi không cho rằng điều này được cho phép. Hiện tại tập lệnh chỉ chấp nhận hai số (kích thước hàng và cột) và sau đó đọc trong một chuỗi ký tự lưới.

Tiền thưởng

Bằng cách thay đổi 1cuộc gọi x = rot90( ..., 1 );thành a 0, phép biến đổi thay đổi từ xoay 45 ° CCW sang xoay 45 ° CW. Trong thực tế, tất cả các góc quay 45 ° + n · 90 ° có thể có thể bằng cách đẩy tham số này từ 0đến 3.

Đầu ra mẫu:

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

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

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

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

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"}

Đọc từ stdin và in ra thiết bị xuất chuẩn.

Kết quả ví dụ:

XXX
X..
XXX
..X
XXX

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

XXXXXXXXX
X........
X.XXXXXXX
X.X.....X
X.X..X..X
X.XXXX..X
X...X...X
XXXXXXXXX
           /\
          / / 
         / / /\
        / / /  \
       / / / /\ \
      / / / /  \ \
     / / / /    \ \
    / / / / /\   \ \
   / / / /  \ \  / /
   \ \ \ \  / / / /
    \ \ \ \/  \/ /
     \ \ \  /\  /
      \ \ \/ / /
       \ \  / /
        \ \/ /
         \  /
          \/
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.