Zeichnen in Schrägstrichen


23

Schreibe ein Programm , das in einem rechteckigen Textblock nimmt die aus X's und .s wie dieser rauen A:

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

Ausgabe einer um 45 Grad gegen den Uhrzeigersinn gedrehten Darstellung dieses Rasters durch Zeichnen eines Schrägstrichs - je nach Kontext vorwärts oder rückwärts - überall an einem XRand .oder an der Seite des Rasters (wobei Leerzeichen den Rest ausfüllen):

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

Die Anzahl der nachgestellten und führenden Leerzeichen (und Zeilenumbrüche) spielt keine Rolle, solange die Form der Zeichen Xin der Eingabe durch die Schrägstriche erhalten bleibt. Es ist in Ordnung, zusätzliche Zeilen oder Spalten von .zu kürzen.

Für E / A können Sie eine beliebige Kombination von stdin / stdout / files / Befehlszeilenparametern verwenden. Zum Beispiel könnte Ihr Skript einen Dateinamen des X.Musters aufnehmen und die Datei mit dem Schrägstrichmuster neu schreiben. Oder Ihr Skript nimmt das X.Muster zeilenweise von stdin auf ( dwenn Sie fertig sind, drücken Sie ) und gibt das Ergebnis an stdout aus.

Die Eingabe kann beliebig groß sein, Sie können jedoch davon ausgehen, dass sie immer gut formatiert ist.

Es / \sollten keine Zeichen und Zeilenumbrüche ausgegeben werden.

Wertung

Der kürzeste Code in Bytes gewinnt. Verwenden Sie https://mothereff.in/byte-counter als Bytezähler, wenn Sie Nicht-ASCII-Zeichen verwenden.

Bonus: Mindestens 50 Bytes, wenn Sie ein Zeichen in Ihrem Programm ändern (ersetzen, nicht entfernen) können, sodass es das um 45 Grad im Uhrzeigersinn gedrehte Schrägstrichgitter ausgibt , z.

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

Input Samples

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

( Labyrinthquelle )

Verwandte Fragen:
Zeichnen der Hilbert-Kurve mit Schrägstrichen
Richten Sie eine horizontal ausgerichtete, rechtwinklige ASCII-Form entlang einer Diagonale aus


Ist das Ersetzen eines einzelnen Zeichens durch ein Leerzeichen (oder ein Leerzeichen für ein Symbol) akzeptabel?
ζ--

@hexafraction Sicher
Calvins Hobbys

Was wir brauchen, ist jemand, der dies in itflabtijtslwi beantwortet . Dann hätten wir "Zeichnen in Schrägstrichen in Schrägstrichen".
Justin

Antworten:


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)

Ich habe die optionale Bonusfunktion hinzugefügt, die die Richtung von rechts nach links ändert. Grundsätzlich dreht die zweite Zeile die Eingabe einfach um 90 Grad. Um zwischen beiden Optionen zu wechseln, ersetzen Sie sie s=zip(...)durch etwas wie S=zip(...)(dh weisen Sie eine Variable zu, die nicht mehr verwendet wird).

.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

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

Sie könnten 5bytes sparen gebildet , indem smit Bdurch s=B+s+B.
BeetDemGuise

1
@BeetDemGuise: Danke! Das ist so viel einfacher! :)
Falko

7

MATLAB-286-50 = 236

Minimiert:

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

Erweitert:

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

Der Code kann weiter um 6 Zeichen reduziert werden (um den aktuellen Vorsprung zu binden), indem die Umwandlung in Typ entfernt charwird. Dies führt jedoch zu einer Warnung von MATLAB, und ich war mir nicht sicher, ob dies zulässig war.

Es kann um zusätzliche 13 Zeichen reduziert werden, wenn die Eingabe ein "markiertes" Format haben soll ['X..';'.X.';'..X'], aber ich habe auch nicht gedacht, dass dies erlaubt ist. Gegenwärtig akzeptiert das Skript nur zwei Zahlen (Zeilen- und Spaltendimensionen) und liest dann eine einzelne Zeichenfolge mit Rasterzeichen ein.

Bonus

Durch Ändern von 1in dem Aufruf x = rot90( ..., 1 );in a 0ändert sich die Transformation von einer Drehung im Uhrzeigersinn um 45 ° in eine Drehung im Uhrzeigersinn um 45 °. Tatsächlich sind alle möglichen 45 ° + n · 90 ° -Drehungen möglich, indem dieser Parameter von 0bis schrittweise geändert wird 3.

Beispielausgaben:

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

Liest von stdin und druckt auf stdout.

Beispielausgaben:

XXX
X..
XXX
..X
XXX

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

XXXXXXXXX
X........
X.XXXXXXX
X.X.....X
X.X..X..X
X.XXXX..X
X...X...X
XXXXXXXXX
           /\
          / / 
         / / /\
        / / /  \
       / / / /\ \
      / / / /  \ \
     / / / /    \ \
    / / / / /\   \ \
   / / / /  \ \  / /
   \ \ \ \  / / / /
    \ \ \ \/  \/ /
     \ \ \  /\  /
      \ \ \/ / /
       \ \  / /
        \ \/ /
         \  /
          \/
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.