Binaların gölgelerini çizin


23

Giriş:

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    

Çıktı:

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

Giriş:

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

Çıktı:

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

Şartname:

  • Giriş olarak almalısınız
    1. Işığın sol üstten veya sağ üstten geldiğini belirten bir bayrak. Bu olabilir 1ya da 2, -1ya da 1, 0ya da 65536, ya da her neyse sürece iki bayrak tam sayılardır olarak, sizin için uygundur.
    2. Aynı uzunluktaki Xveya karakterden oluşan satırlar (yani yastıklı )
      • Hepsi Xya son sırada olacak ya da Xaltlarında olacak (yani yüzen binalar yok)
  • Satırları (binalar) gölgeler eklenmiş olarak çıkarmalısınız. Bu, aşağıdaki prosedürle yapılır:
    • Işık sol üstten geliyorsa ., binanın yüksekliğiyle aynı yüksekliğe ve genişliğe sahip, sağ kenarından bir boşluktan başlayıp sağa doğru giden dik bir s üçgeni çizin .
    • Aksi takdirde, sağ üstten geliyorsa, aynı şeyi yapın, ancak sol kenarından geçen ve sola dönük bir boşluktan başlayın.
    • Unutmayın, Xs'yi değiştirerek değiştirmeyin .; onları olduğu gibi bırakın.
    • Gölgeleriniz için her zaman "oda" olacak, yani sonunda 3 boşluklu bir bina varsa, bundan sonra en az 3 dolgu alanı olacaktır.
  • Bu , yani bayttaki en kısa kod kazanacak!

1
Ben kullanabilir miyim {}ve {-1*}bayrak değerleri olarak?
John Dvorak

@Jan Evet, evet yapabilirsiniz. Hatta kullanabilirsiniz potatove while(1){}. Soruda belirtildiği gibi, "ne uygunsa".
Doorknob

2
: (Bunu, .NET'in aromalı) regex'inde çözecektim, ama içinde Regex.Replaceçalışamayacağım bir hata bulduğumu düşünüyorum ... şimdi iki sorunum var mı?
Martin Ender

3
@Doorknob Birisi, girişte kodun tamamını girmek için bu kuralı suistimal edecek.
ɐɔıʇǝɥʇuʎs

Yanıtlar:


6

GolfScript, 67 karakter

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

Sağa / sola giden gölgeler için 1 / -1. Örneği çevrimiçi çalıştırın :

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

11

Perl - 85

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

EDIT: -pÇalıştırılması gereken bayrağı tamamen unuttum . Karakter sayısına 2 eklendi.
İlk satırda belirtilen bayrak, 0sola 2doğru giden gölgeler ve sağa doğru giden gölgeler içindir.


4

Python 3 - 233

Bu beklenenden daha uzun sürdü ...

Gölgeler için sağa 1, sola gölgeler için -1.

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: Kuralların her iki tarafındaki yastığı görmedim. Ehehe. ^^'


3

JavaScript - 14

eval(prompt())

İlk satırdaki bayrak for(p='';l=prompt();)console.log(p=l.replace(/ /g,function(a,b){return p[b+1]=='.'||p[b]=='.'||l[b+1]=='X'?'.':a}));, sola bakan gölgeler veya for(p='';l=prompt();)console.log(p=l.replace(/ /g,function(a,b){return p[b-1]=='.'||p[b]=='.'||l[b-1]=='X'?'.':a}));sağa gölgeler içindir.

Bu olabilir bayrak için kural "sizin için uygun olan neyse" istismar: P


Düzenleme: kötüye kullanmadan (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}));

Bunun için bayrak 1veya-1


Tamam, kuralları düzelttim. :-P
Doorknob

Aaww, bu eğlenceli değil :-( Bu, "her iki bayrak da tamsayıdır" yorumunuzla potatopotato
çakışır

c=+prompt()ya da başka b+cbir dize olarak birleştirir.
nderscore

Birkaç şeyi optimize 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}))
ettim

cBir sayıya dönüştürürken başka bir baytı, bunun yerine çıkartarak kaydedin . b-cveya b-=cyukarıdaki kodumda. (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]))

Ungolfed Versiyonu

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