건물의 그림자를 그립니다


23

입력:

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    

산출:

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

입력:

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

산출:

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

사양:

  • 입력해야합니다
    1. 왼쪽 위 또는 오른쪽 위에서 빛이 들어오는 지 나타내는 플래그입니다. 이 될 수있다 1거나 2, -1또는 1, 0또는 65536, 또는 무엇이든은 한 두 플래그 정수 한, 당신을 위해 편리합니다.
    2. 문자 길이가 모두 같은 X또는 로 구성된 행 (즉,로 채워짐 )
      • 모든 Xs는 마지막 행에 있거나 그 X아래에 있습니다 (부동 건물이 없음을 의미)
  • 그림자가 추가 된 행 (건물)을 출력해야합니다. 이것은 다음 절차로 수행됩니다.
    • 왼쪽 상단에서 빛이 들어오는 경우 .오른쪽 가장자리를지나 한 공간에서 시작하여 오른쪽으로 이동하면서 건물 높이와 높이와 너비가 같은 s의 삼각형을 그립니다 .
    • 그렇지 않으면 오른쪽 상단에있는 경우 동일한 작업을 수행하지만 왼쪽 가장자리를지나 왼쪽을 가리키는 한 공간에서 시작하십시오.
    • Xs를 s로 변경하여 변경하지 마십시오 .. 그대로 두십시오.
    • 그림자를위한 "공간"이 항상있을 것입니다. 즉, 끝에 3 칸 높이의 건물이 있다면 그 뒤에 3 칸 이상이 채워질 것입니다.
  • 이것은 이므로 바이트 단위의 가장 짧은 코드가 이길 것입니다!

1
내가 사용할 수 {}{-1*}플래그 값으로?
John Dvorak

@Jan 예, 가능합니다. 당신은 사용할 수 potatowhile(1){}. 질문에 인용 된 바와 같이, "편리한 것이 무엇이든."
Doorknob

2
: ((. NET-flavoured) 정규식 에서이 문제를 해결하려고했지만 해결할 Regex.Replace수없는 버그를 발견했다고 생각 합니다 ... 지금 두 가지 문제가 있습니까?
Martin Ender

3
@Doorknob 누군가가이 규칙을 남용하여 전체 코드를 입력에 넣습니다.
ɐɔıʇǝɥʇuʎs

답변:


6

GolfScript, 67 자

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

오른쪽 / 왼쪽으로가는 그림자의 경우 1 / -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....

11

펄-85

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

편집 : 나는 -p이것이 실행되어야 하는 플래그 에 대해 완전히 잊었다 . 문자 수에 2를 추가했습니다.
첫 번째 줄에 지정된 플래그는 0그림자가 왼쪽으로 2가고 그림자가 오른쪽으로가는 것입니다.


4

파이썬 3-233

글쎄요, 예상보다 오래 걸렸습니다.

그림자가 오른쪽이면 1, 그림자가 왼쪽이면 -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))

편집 : 규칙에서 양쪽 패딩을 보지 못했습니다. 에헤헤. ^^ '


3

자바 스크립트-14

eval(prompt())

첫 번째 줄의 플래그 for(p='';l=prompt();)console.log(p=l.replace(/ /g,function(a,b){return p[b+1]=='.'||p[b]=='.'||l[b+1]=='X'?'.':a}));는 왼쪽을 향한 for(p='';l=prompt();)console.log(p=l.replace(/ /g,function(a,b){return p[b-1]=='.'||p[b]=='.'||l[b-1]=='X'?'.':a}));그림자 또는 오른쪽을 향한 그림자를위한 것입니다.

이 플래그에 대한 "당신에게 편리한 무엇이든"규칙을 남용 할 수 있습니다 : P


편집 : 남용없이 (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}));

이 플래그는 1또는-1


좋아, 나는 규칙을 고쳤다. :-P
Doorknob

재미 없다 Aaww, :-(이 메이크업 당신의 코멘트와 충돌 "당신도 사용할 수 있습니다"모두 플래그 정수 "하지 potato않는 한 ..." potato정수 - P.
자크

c=+prompt()그렇지 않으면 b+c문자열로 연결됩니다.
nderscore

몇 가지를 최적화하고 이것을 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}))
줄였습니다

c대신 빼서 다른 바이트를 숫자 로 변환 할 때 저장하십시오 . b-c또는 b-=c위의 코드에서. (데모)
nderscore

1

파이썬 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]))

언 골프 버전

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]))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.