Eğik Çizgilerde Çizim


23

Bu kaba gibi, Xs ve s'den oluşan dikdörtgen bir metin bloğuna giren bir program yazın :.A

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

Bu ızgaraya ait gösterimi, içeriğe bağlı olarak ileriye ya da geriye doğru bir eğik çizgi çizerek saat yönünün tersine 45 derece döndürerek çıktılayın - her bir Xkenarlık çizgisinin a .veya yanının her yerinde (boşlukları doldururken):

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

Sondaki ve öndeki boşlukların (ve yeni satırların) sayısı X, girişteki işaretlerin eğik çizgiler tarafından tutulduğu sürece önemli değildir . Fazladan satır ya da sütunu kırpmanız uygun ..

G / Ç için herhangi bir stdin / stdout / files / komut satırı parametresi kombinasyonunu kullanabilirsiniz. Örneğin, komut dosyanız X.modelin bir dosya adını alabilir ve dosyayı eğik çizgi deseni ile yeniden yazabilir. Veya betiğiniz X., stdin satırındaki satır satır çizgiyi alabilir ( dbittiğinde basarak ) ve sonucu stdout'a çıkartabilir.

Girdi keyfi büyük olabilir, ancak her zaman iyi biçimlendirilmiş olduğunu varsayabilirsiniz.

Bunun dışında karakter yok / \ve yeni satırlar herhangi bir çıktıda olmalıdır.

puanlama

Bayt cinsinden en kısa kod kazanır. ASCII olmayan karakterler kullanıyorsanız, https://mothereff.in/byte-counter öğesini bayt sayacı olarak kullanın .

Bonus: Eksi 50 bayt, programınızdaki bir karakteri değiştirebilir (değiştiremez, çıkaramaz), böylece saat yönünde 45 derece döndürülmüş eğik çizgi ızgarasını çıkarırsa , örneğin:

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

Giriş örnekleri

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

( labirent kaynağı )

İlgili Sorular:
Hilbert eğrisini eğik çizgiler kullanarak çizin
Yatay olarak hizalanmış, dik açılı bir ASCII şeklini çapraz olarak hizalayın


Tek karakterin boşluk karakteriyle (veya sembol için boşlukla) değiştirilmesi kabul edilebilir mi?
Monica’yı eski durumuna getirin - ζ--

@hexafraction Sure
Calvin'in Hobileri

İhtiyacımız bu cevap birileri itflabtijtslwi . Sonra "Slashes'de Slashes'de Çizim Yapmak" olur.
Justin

Yanıtlar:


10

Python 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)

Yönü saat yönünde saat yönünün tersine çeviren isteğe bağlı bonus özelliğini ekledim. Temel olarak, ikinci satır girişi sadece 90 derece döndürür. Her iki seçenek arasında geçiş yapmak için, s=zip(...)benzeri bir şeyle değiştirin S=zip(...)(örn. Bir daha kullanılmayacak bir değişkene atayın).

.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

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

Sen sıkıştırarak 5bytes kurtarabilecek sile Btarafından s=B+s+B.
BeetDemGuise

1
@BeetDemGuise: Teşekkürler! Bu çok daha kolay! :)
Falko

7

MATLAB - 286 - 50 = 236

minified:

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

Expanded:

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

Kod, döküm tipini elimine ederek 6 karakterle (mevcut ipucunu bağlamak için) daha da azaltılabilir char, ancak bu MATLAB'dan bir uyarı ile sonuçlanır ve buna izin verilip verilmediğinden emin değildim.

Girişin "işaretli" bir biçime sahip olması gerekiyorsa, 13 karakter daha azaltılabilir ['X..';'.X.';'..X'], ancak buna da izin verildiğini düşünmedim. Şu anda komut dosyası yalnızca iki sayı kabul eder (satır ve sütun boyutları) ve ardından tek bir kılavuz karakter dizesinde okur.

Bonus

Değiştirerek 1çağrısında x = rot90( ..., 1 );a 0, CW 45 ° dönüş için sola 45 ° dönmesi dönüşüm değişir. Aslında, tüm olası 45 ° + n · 90 ° rotasyonu bu parametre adım ile mümkündür 0için 3.

Örnek çıktılar:

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

Stdin'den okur ve stdout'a yazdırır.

Örnek çıktılar:

XXX
X..
XXX
..X
XXX

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

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