Vẽ bóng của các tòa nhà


23

Đầu vào:

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    

Đầu ra:

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

Đầu vào:

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

Đầu ra:

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

Đặc điểm kỹ thuật:

  • Bạn phải lấy làm đầu vào
    1. Một lá cờ biểu thị cho dù ánh sáng đến từ phía trên bên trái hay trên cùng bên phải. Điều này có thể 1hoặc 2, -1hoặc 1, 0hoặc 65536, hoặc bất cứ điều gì thuận tiện cho bạn, miễn là cả hai cờ đều là số nguyên.
    2. Các hàng bao gồm một Xhoặc , tất cả các độ dài giống nhau trong các ký tự (nghĩa là được đệm bằng )
      • Tất cả Xsẽ ở hàng cuối cùng hoặc có một Xbên dưới (có nghĩa là không có tòa nhà nổi)
  • Bạn phải xuất các hàng (tòa nhà) với bóng được thêm vào. Điều này được thực hiện với thủ tục sau đây:
    • Nếu ánh sáng đến từ phía trên bên trái, hãy vẽ một tam giác vuông .có cùng chiều cao và chiều rộng với chiều cao của tòa nhà, bắt đầu từ một không gian qua cạnh phải của nó và đi sang phải.
    • Mặt khác, nếu nó từ trên cùng bên phải, hãy làm điều tương tự nhưng bắt đầu từ một khoảng trắng qua cạnh trái của nó và chỉ sang trái.
    • Hãy nhớ rằng, không thay đổi Xs bằng cách thay đổi chúng thành .s; để họ như họ
    • Sẽ luôn có "phòng" cho bóng của bạn, tức là nếu có một tòa nhà cao 3 không gian ở cuối sẽ có ít nhất 3 không gian đệm sau nó.
  • Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ giành chiến thắng!

1
Tôi có thể sử dụng {}{-1*}làm giá trị cờ không?
John Dvorak

@Jan Vâng, vâng, bạn có thể. Bạn thậm chí có thể sử dụng potatowhile(1){}. Như được trích dẫn trong câu hỏi, "bất cứ điều gì là thuận tiện."
Doorknob

2
:( Tôi sẽ giải quyết vấn đề này trong regex (có hương vị .NET), nhưng tôi nghĩ rằng tôi đã tìm thấy một lỗi Regex.Replacemà tôi không thể khắc phục được ... bây giờ tôi có hai vấn đề không?
Martin Ender

3
@Doorknob Ai đó sẽ lạm dụng quy tắc này để chỉ có toàn bộ mã của họ trong đầu vào.
ɐɔıʇǝɥʇuʎs

Câu trả lời:


6

GolfScript, 67 ký tự

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

1 / -1 cho bóng đi sang phải / trái. Chạy ví dụ trực tuyế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: Tôi hoàn toàn quên mất -pcờ này cần được chạy cùng. Đã thêm 2 vào số char.
Cờ được chỉ định ở dòng đầu tiên là 0dành cho bóng đổ sang trái và 2bóng đổ sang phải.


4

Con trăn 3 - 233

Chà, hóa ra lâu hơn dự kiến ​​...

1 cho bóng đổ sang phải, -1 cho bóng đổ sang trái.

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: Không thấy phần đệm của một trong hai quy tắc. Ehehe. ^^ '


3

JavaScript - 14

eval(prompt())

Cờ trên dòng đầu tiên là for(p='';l=prompt();)console.log(p=l.replace(/ /g,function(a,b){return p[b+1]=='.'||p[b]=='.'||l[b+1]=='X'?'.':a}));dành cho bóng đổ về bên trái hoặc for(p='';l=prompt();)console.log(p=l.replace(/ /g,function(a,b){return p[b-1]=='.'||p[b]=='.'||l[b-1]=='X'?'.':a}));cho bóng ở bên phải.

Điều này có thể lạm dụng quy tắc "bất cứ điều gì thuận tiện cho bạn" cho cờ: P


Chỉnh sửa: không lạm dụng (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}));

Cờ cho điều này là 1hoặc-1


Tốt, tôi đã sửa các quy tắc. :-P
Doorknob

Aaww, điều đó không vui chút nào :-( Điều này làm cho "cả hai cờ là số nguyên" mâu thuẫn với nhận xét của bạn "Bạn thậm chí có thể sử dụng potato...", trừ khi potatolà một số nguyên. :-P
Zaq

c=+prompt()nếu không b+csẽ nối thành một chuỗi.
nderscore

Tối ưu hóa một số thứ và giảm xuống còn 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})) (bản demo)
nderscore

Lưu một byte khác khi chuyển đổi cthành một số bằng cách trừ thay vào đó. b-choặc b-=ctrong mã của tôi ở trên. (bản demo)
nderscore

1

Con trăn 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]))

Phiên bản Ungolfed

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]))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.