Dessin en barres obliques

23

Écrivez un programme qui prend dans un bloc de texte rectangulaire composé de X«et .», comme ce brut A:

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

Afficher une représentation de cette grille tournée de 45 degrés dans le sens antihoraire en traçant une barre oblique - vers l'avant ou vers l'arrière selon le contexte - partout une Xbordure a .ou le côté de la grille (avec des espaces remplissant le reste):

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

Le nombre d'espaces de fin et de début (et les retours à la ligne) n'a pas d'importance tant que la forme des caractères Xdans l'entrée est conservée par les barres obliques. Vous pouvez supprimer des lignes ou des colonnes supplémentaires de ..

Pour les E / S, vous pouvez utiliser n'importe quelle combinaison de paramètres de ligne de commande stdin / stdout / files / command. Par exemple, votre script peut prendre un nom de fichier du X.modèle et réécrire le fichier avec le modèle de barre oblique. Ou votre script peut prendre le X.modèle de stdin ligne par ligne (en appuyant une dfois terminé) et afficher le résultat sur stdout.

L'entrée peut être arbitrairement grande, mais vous pouvez supposer qu'elle est toujours bien formatée.

Aucun caractère en plus / \et les sauts de ligne ne doivent apparaître dans aucune sortie.

Notation

Le code le plus court en octets gagne. Utilisez https://mothereff.in/byte-counter comme compteur d'octets si vous utilisez des caractères non ASCII.

Bonus: moins 50 octets si vous pouvez modifier (remplacer, pas supprimer) un caractère de votre programme afin qu'il génère la grille oblique tournée à 45 degrés dans le sens des aiguilles d'une montre , par exemple:

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

Échantillons d'entrée

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

( source du labyrinthe )

Questions connexes:
dessiner la courbe de Hilbert à l'aide de barres obliques
Aligner une forme ASCII à angle droit alignée horizontalement le long d'une diagonale

Loisirs de Calvin
la source
Le remplacement du caractère unique par un espace (ou un espace vers un symbole) est-il acceptable?
Rétablir Monica - ζ--
@hexafraction Sure
Calvin's Hobbies
Nous avons besoin de quelqu'un pour répondre à cela dans itflabtijtslwi . Ensuite, nous aurions "Dessin dans des barres obliques dans des barres obliques."
Justin

Réponses:

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)

J'ai ajouté la fonction bonus en option qui fait basculer le sens horaire dans le sens antihoraire. Fondamentalement, la deuxième ligne fait simplement pivoter l'entrée de 90 degrés. Pour basculer entre les deux options, remplacez-le s=zip(...)par quelque chose comme S=zip(...)(c.-à-d. Attribuez-le à une variable qui ne sera plus utilisée).

.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
la source
Vous pourriez économiser 5 octets en prenant en sandwich savec Bby s=B+s+B.
BeetDemGuise
1
@BeetDemGuise: Merci! C'est tellement plus simple! :)
Falko
7

MATLAB - 286 - 50 = 236

Minifié:

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

Étendu:

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

Le code peut être encore réduit de 6 caractères (pour lier la piste actuelle) en éliminant la distribution au type char, mais cela entraîne un avertissement de MATLAB, et je ne savais pas si cela était autorisé.

Il peut être réduit de 13 caractères supplémentaires si l'entrée doit avoir un format "balisé" tel que ['X..';'.X.';'..X'], mais je n'ai pas pensé que cela était autorisé non plus. Actuellement, le script accepte seulement deux nombres (dimensions de ligne et de colonne) et lit ensuite dans une seule chaîne de caractères de la grille.

Prime

En changeant le 1dans l'appel x = rot90( ..., 1 );en a 0, la transformation passe d'une rotation CCW 45 ° à une rotation CW 45 °. En fait, toutes les rotations possibles de 45 ° + n · 90 ° sont possibles en faisant passer ce paramètre de 0à 3.

Exemples de sorties:

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

Lit depuis stdin et imprime vers stdout.

Exemples de sorties:

XXX
X..
XXX
..X
XXX

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

XXXXXXXXX
X........
X.XXXXXXX
X.X.....X
X.X..X..X
X.XXXX..X
X...X...X
XXXXXXXXX
           /\
          / / 
         / / /\
        / / /  \
       / / / /\ \
      / / / /  \ \
     / / / /    \ \
    / / / / /\   \ \
   / / / /  \ \  / /
   \ \ \ \  / / / /
    \ \ \ \/  \/ /
     \ \ \  /\  /
      \ \ \/ / /
       \ \  / /
        \ \/ /
         \  /
          \/
faubi
la source