Dessinez les ombres des bâtiments

23

Contribution:

1
      X                                
      X                                
      X                                
      X      XX    XXXXXX     X X X    
      X      XX    XXXXXX     X X X    
XXX   X      XX    XXXXXX     X X X    
XXX   X      XX    XXXXXX     X X X    

Sortie:

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

Contribution:

2
         XX
         XX
         XX
         XX
         XX
     XX  XX
     XX  XX
     XX  XX
     XX  XX

Sortie:

        .XX
       ..XX
      ...XX
     ....XX
    .....XX
   ..XX..XX
  ...XX..XX
 ....XX..XX
.....XX..XX

Spécification:

  • Vous devez prendre en entrée
    1. Un drapeau indiquant si la lumière vient du coin supérieur gauche ou supérieur droit. Cela peut être 1ou 2, -1ou 1, 0ou 65536, ou ce qui vous convient, tant que les deux indicateurs sont des entiers.
    2. Lignes composées de Xou , toutes de la même longueur en caractères (c.-à-d. Remplies de )
      • Tous les Xs seront sur la dernière ligne ou auront un Xdessous (ce qui signifie pas de bâtiments flottants)
  • Vous devez sortir les lignes (bâtiments) avec des ombres ajoutées. Cela se fait avec la procédure suivante:
    • Si la lumière vient du coin supérieur gauche, tracez un triangle rectangle de .s de même hauteur et largeur que la hauteur du bâtiment, en partant d'un espace au-delà de son bord droit et en allant vers la droite.
    • Sinon, si c'est en haut à droite, faites la même chose mais commencez par un espace au-delà de son bord gauche et en pointant vers la gauche.
    • N'oubliez pas, ne modifiez pas Xs en les changeant en .s; laissez-les tels quels.
    • Il y aura toujours de la "place" pour vos ombres, c'est-à-dire que s'il y a un bâtiment de 3 espaces à la fin, il y aura au moins 3 espaces de rembourrage après.
  • Il s'agit de , donc le code le plus court en octets gagnera!
Poignée de porte
la source
1
Puis-je utiliser {}et {-1*}comme valeurs d'indicateur?
John Dvorak
@Jan Oui, oui, vous le pouvez. Vous pouvez même utiliser potatoet while(1){}. Comme cité dans la question, "ce qui est pratique".
Poignée de porte
2
:( J'allais résoudre ce problème dans des expressions rationnelles (au goût .NET), mais je pense avoir trouvé un bogue dans Regex.Replacelequel je ne peux pas contourner ... ai-je deux problèmes maintenant?
Martin Ender
3
@ Doorknob Quelqu'un va abuser de cette règle pour avoir tout son code en entrée.
ɐɔıʇǝɥʇuʎs
2
@Synthetica C'est l'une des "failles standard".
Poignée de porte

Réponses:

6

GolfScript, 67 caractères

n%(~:S\zip\%.0=\{.' '3$);+{{\(@[\].~<=}%+}:M~'X'/'.'*@@M}%S%zip\;n*

1 / -1 pour les ombres allant à droite / à gauche. Exécutez l'exemple en ligne :

      X.                               
      X..                              
      X...                             
      X....  XX.   XXXXXX.    X.X.X.   
      X..... XX..  XXXXXX..   X.X.X..  
XXX.  X......XX... XXXXXX...  X.X.X... 
XXX.. X......XX....XXXXXX.... X.X.X....
Howard
la source
11

Perl - 85

BEGIN{$d=-<>}$d?s/X /X./g:s/ X/.X/g;s/ /substr($p,$+[0]+$d,1)eq'.'?'.':$&/ge;$p=$_;

EDIT: J'ai totalement oublié le -pdrapeau avec lequel il faut exécuter. Ajout de 2 au nombre de caractères.
Le drapeau spécifié à la première ligne est 0pour les ombres allant à gauche et 2pour les ombres allant à droite.

mniip
la source
4

Python 3 - 233

Eh bien, cela s'est avéré plus long que prévu ...

1 pour les ombres vers la droite, -1 pour les ombres vers la gauche.

d,x=int(input()),[1]
while x[-1]:x+=[input()]
x,o,l,h=list(zip(*x[1:-1]))[::d],[],0,len(x)-1
for i in x:o+=[''.join(i[:len(i)-l])+''.join(i[len(i)-l:]).replace(' ','.')];l=max(l-1,i.count('X'))
for i in zip(*o[::d]):print(''.join(i))

EDIT: Je n'ai pas vu le rembourrage de chaque côté dans les règles. Ehehe. ^^ '

cjfaure
la source
3

JavaScript - 14

eval(prompt())

Le drapeau sur la première ligne est for(p='';l=prompt();)console.log(p=l.replace(/ /g,function(a,b){return p[b+1]=='.'||p[b]=='.'||l[b+1]=='X'?'.':a}));pour les ombres tournées vers la gauche ou for(p='';l=prompt();)console.log(p=l.replace(/ /g,function(a,b){return p[b-1]=='.'||p[b]=='.'||l[b-1]=='X'?'.':a}));pour les ombres vers la droite.

Cela pourrait abuser de la règle "tout ce qui vous convient" pour le drapeau: P


Edit: sans abus (127):

c=prompt();for(p='';l=prompt();)console.log(p=l.replace(/ /g,function(a,b){return p[b+c]=='.'||p[b]=='.'||l[b+c]=='X'?'.':a}));

Le drapeau pour cela est 1ou-1

Zaq
la source
Très bien, j'ai fixé les règles. :-P
Doorknob
Aaww, c'est pas drôle :-( Cela ne fait « les deux drapeaux sont des entiers » conflit avec votre commentaire « Vous pouvez même utiliser potato... », à moins potatoest un entier :-P.
Zaq
c=+prompt()ou bien b+cconcaténera sous forme de chaîne.
nderscore
Optimisation de quelques éléments et réduction à 119: for(c=p=+(P=prompt)(d='.');l=P();)console.log(p=l.replace(/ /g,function(a,b){return p[b]==d|p[b+=c]==d|l[b]=='X'?d:a})) (démo)
nderscore
Enregistrez un autre octet lors de la conversion cen nombre en soustrayant à la place. b-cou b-=cdans mon code ci-dessus. (démo)
nderscore
1

Python 2.7 - 229

p,s,M,J,L=input(),__import__('sys').stdin.readlines(),map,''.join,len
n,s,r,f=L(s),M(str.strip,M(J,zip(*s[::-1]))),0,[]
for l in s[::p]:f,r=f+[(l+'.'*(r-L(l))+' '*n)[:n]],max(r-1,L(l))
print'\n'.join(M(J,zip(*f[::p])[::-1]))

Version non golfée

def shadow(st, pos):
    _len = len(st)
    st = map(str.strip, map(''.join,zip(*st[::-1])))
    prev = 0
    res = []
    for line in st[::[1,-1][pos-1]]:
        res +=[(line+'.'*(prev-len(line)) + ' '*_len)[:_len]]
        prev = max(prev - 1, len(line))
    return '\n'.join(map(''.join,zip(*res[::[1,-1][pos-1]])[::-1]))
Abhijit
la source