Narysuj cienie budynków

23

Wkład:

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    

Wydajność:

      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....

Wkład:

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

Wydajność:

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

Specyfikacja:

  • Musisz wziąć jako dane wejściowe
    1. Flaga wskazująca, czy światło pochodzi z lewego górnego rogu, czy z prawego górnego rogu. Może to być 1lub 2, -1lub 1, 0lub 65536cokolwiek dogodnego dla ciebie, o ile obie flagi są liczbami całkowitymi.
    2. Wiersze złożone z jednego Xlub wszystkich znaków o tej samej długości (tj. Wypełnione )
      • Wszystkie Xs będą albo w ostatnim rzędzie, albo będą Xpod nimi (co oznacza brak pływających budynków)
  • Musisz wyprowadzić rzędy (budynki) z dodanymi cieniami. Odbywa się to za pomocą następującej procedury:
    • Jeśli światło pochodzi z lewego górnego rogu, narysuj prawy trójkąt o .tej samej wysokości i szerokości co wysokość budynku, zaczynając od jednego miejsca za jego prawą krawędzią i idąc w prawo.
    • W przeciwnym razie, jeśli jest od prawego górnego rogu, zrób to samo, ale zacznij od jednego miejsca za lewą krawędzią i skierowane w lewo.
    • Pamiętaj, nie zmieniaj Xs, zmieniając je na .s; zostaw je takimi, jakie są.
    • Zawsze będzie „miejsce” na twoje cienie, tj. Jeśli na końcu jest wysoki budynek o 3 przestrzeniach, będą za nim co najmniej 3 pola wypełnienia.
  • To jest , więc wygra najkrótszy kod w bajtach!
Klamka
źródło
1
Czy mogę używać {}i {-1*}jako wartości flag?
John Dvorak,
@Jan Tak, tak, możesz. Możesz nawet użyć potatoi while(1){}. Jak wspomniano w pytaniu: „cokolwiek jest wygodne”.
Klamka
2
:( miałem zamiar rozwiązać ten problem w smaku (NET) regex, ale myślę, że znalazłeś błąd w Regex.Replacektórych nie mogę obejść ... mam dwa problemy teraz?
Martin Ender
3
@Doorknob Ktoś zamierza nadużyć tej reguły, aby mieć cały swój kod na wejściu.
Aprıʇǝɥʇuʎs

Odpowiedzi:

6

GolfScript, 67 znaków

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

1 / -1 dla cieni idących w prawo / w lewo. Uruchom przykład online :

      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
źródło
11

Perl - 85

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

EDYCJA: Zupełnie zapomniałem o -pfladze, którą trzeba uruchomić. Dodano 2 do liczby znaków.
Flaga określona w pierwszym wierszu dotyczy 0cieni w lewo i 2cieni w prawo.

mniip
źródło
4

Python 3 - 233

Cóż, okazało się to dłużej niż oczekiwano ...

1 dla cieni w prawo, -1 dla cieni w lewo.

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

EDYCJA: Nie widziałem dopełnienia po obu stronach w regułach. Ehehe. ^^ ”

cjfaure
źródło
3

JavaScript - 14

eval(prompt())

Flaga w pierwszym wierszu dotyczy for(p='';l=prompt();)console.log(p=l.replace(/ /g,function(a,b){return p[b+1]=='.'||p[b]=='.'||l[b+1]=='X'?'.':a}));cieni skierowanych w lewo lub for(p='';l=prompt();)console.log(p=l.replace(/ /g,function(a,b){return p[b-1]=='.'||p[b]=='.'||l[b-1]=='X'?'.':a}));cieni w prawo.

Może to naruszać zasadę „wszystko, co jest dla ciebie wygodne” dla flagi: P


Edycja: bez nadużyć (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}));

Flagą tego jest 1lub-1

Zaq
źródło
Dobrze, poprawiłem zasady. :-P
Klamka
Oo, to nie jest zabawne :-( To powoduje, że „obie flagi są liczbami całkowitymi” kolidują z twoim komentarzem „Możesz nawet użyć potato...”, chyba że potatojest liczbą całkowitą. :-P
Zaq
c=+prompt()w przeciwnym razie b+cpołączy się jako ciąg.
nderscore
Zoptymalizowałem kilka rzeczy i sprowadziłem to do 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})) (demo)
nderscore
Zaoszczędź kolejny bajt po konwersji cna liczbę, odejmując zamiast tego. b-club b-=cw moim kodzie powyżej. (demo)
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]))

Wersja bez golfa

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
źródło