Gambarlah bayangan bangunan

23

Memasukkan:

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    

Keluaran:

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

Memasukkan:

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

Keluaran:

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

Spesifikasi:

  • Anda harus menerima sebagai masukan
    1. Sebuah bendera yang menandakan apakah cahaya datang dari kiri atas atau kanan atas. Ini bisa menjadi 1atau 2, -1atau 1, 0atau 65536, atau apa pun yang nyaman bagi Anda, selama kedua flag adalah bilangan bulat.
    2. Baris yang terdiri dari salah satu Xatau , semua karakter dengan panjang yang sama (mis. Diisi dengan )
      • Semua Xakan berada di baris terakhir atau di Xbawahnya (berarti tidak ada bangunan terapung)
  • Anda harus menampilkan baris (bangunan) dengan bayangan yang ditambahkan. Ini dilakukan dengan prosedur berikut:
    • Jika cahaya datang dari kiri atas, gambarlah segitiga siku-siku .s dengan tinggi dan lebar yang sama dengan tinggi bangunan, mulai dari satu ruang melewati tepi kanan dan menuju ke kanan.
    • Kalau tidak, jika itu dari kanan atas, lakukan hal yang sama tetapi mulai dari satu ruang melewati tepi kiri dan menunjuk ke kiri.
    • Ingat, jangan ubah Xs dengan mengubahnya menjadi .; biarkan mereka apa adanya.
    • Akan selalu ada "ruang" untuk bayangan Anda, yaitu jika ada bangunan setinggi 3 ruang di ujungnya akan ada setidaknya 3 ruang padding setelahnya.
  • Ini adalah , jadi kode terpendek dalam byte akan menang!
Gagang pintu
sumber
1
Bisakah saya menggunakan {}dan {-1*}sebagai nilai flag?
John Dvorak
@ Jan Ya, ya Anda bisa. Anda bahkan bisa menggunakan potatodan while(1){}. Seperti dikutip dalam pertanyaan, "apa pun yang nyaman."
Gagang Pintu
2
:( Saya akan menyelesaikan ini di regex (.NET-flavored), tapi saya pikir saya menemukan bug di Regex.Replacemana saya tidak bisa mengatasi ... apakah saya memiliki dua masalah sekarang?
Martin Ender
3
@Doorknob Seseorang akan menyalahgunakan aturan ini untuk memasukkan seluruh kode mereka pada input.
ɐɔıʇǝɥʇu
2
@ Sintetika Itu adalah salah satu "celah standar."
Gagang Pintu

Jawaban:

6

GolfScript, 67 karakter

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

1 / -1 untuk bayangan ke kanan / kiri. Jalankan contoh 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
sumber
11

Perl - 85

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

EDIT: Saya benar-benar lupa tentang -pbendera yang perlu dijalankan. Menambahkan 2 ke hitungan char.
Bendera yang ditentukan pada baris pertama adalah 0untuk bayangan ke kiri dan 2untuk bayangan ke kanan.

mniip
sumber
4

Python 3 - 233

Ya, ternyata itu lebih lama dari yang diharapkan ...

1 untuk bayangan ke kanan, -1 untuk bayangan ke kiri.

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: Tidak melihat sisi mana pun yang sesuai dalam aturan. Ehehe. ^^ '

cjfaure
sumber
3

JavaScript - 14

eval(prompt())

Bendera pada baris pertama adalah for(p='';l=prompt();)console.log(p=l.replace(/ /g,function(a,b){return p[b+1]=='.'||p[b]=='.'||l[b+1]=='X'?'.':a}));untuk bayangan yang menghadap ke kiri ataufor(p='';l=prompt();)console.log(p=l.replace(/ /g,function(a,b){return p[b-1]=='.'||p[b]=='.'||l[b-1]=='X'?'.':a})); untuk bayangan ke kanan.

Ini mungkin menyalahgunakan aturan "apa pun yang nyaman bagi Anda" untuk bendera: P


Edit: tanpa penyalahgunaan (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}));

Bendera untuk ini adalah 1atau-1

Zaq
sumber
Baik, saya memperbaiki aturan. :-P
Gagang Pintu
Aaww, itu tidak menyenangkan :-( Ini membuat "kedua flag adalah bilangan bulat" bertentangan dengan komentar Anda "Anda bahkan bisa menggunakan potato...", kecuali potatobilangan bulat. :-P
Zaq
c=+prompt()atau b+cakan digabungkan sebagai string.
nderscore
Dioptimalkan beberapa hal dan turun ke 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
Simpan byte lain pada konversi cke nomor dengan mengurangi sebagai gantinya. b-catau b-=cdalam kode saya di atas. (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]))

Versi Tidak Serigala

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
sumber