绘制建筑物的阴影


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. 一个标志,指示光线是来自左上角还是右上角。只要两个标志都是整数,它可以是12-11065536,或者任何您方便的名称。
    2. X或组成的行,所有字符的长度相同(即用填充
      • 所有Xs要么位于最后一行,要么位于其X下(表示没有浮动建筑物)
  • 您必须输出添加了阴影的行(建筑物)。这可以通过以下过程完成:
    • 如果光线来自左上角,请绘制一个.s的直角三角形,其高度和宽度与建筑物的高度相同,从其右边缘上方的一个空间开始向右移动。
    • 否则,如果它是从右上角开始的,则执行相同的操作,但要从其左边缘上方的一个空间开始并指向左侧。
    • 请记住,不要X通过将s更改为来改变.s;保持原样。
    • 阴影总会有“空间”,即,如果在末端有3层高的建筑物,则在其后至少有3处填充空间。
  • 这是,所以最短的代码(以字节为单位)将获胜!

1
我可以使用{}{-1*}作为标志值吗?
John Dvorak 2014年

@Jan是的,是的,可以。您甚至可以使用potatowhile(1){}。如问题中所引用的,“一切方便”。
门把手

2
:(我本打算在(.NET风格的)正则表达式中解决此问题,但我认为我发现了一个无法解决的错误Regex.Replace……我现在有两个问题吗?
Martin Ender 2014年

3
@Doorknob有人会滥用此规则,只是将其整个代码都包含在输入中。
ɐɔıʇǝɥʇuʎs

Answers:


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

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

Python 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

JavaScript-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
门把手

Aaww,这没什么好玩的:-(这确实会使“两个标志都是整数”与您的注释“您甚至可以使用potato...” 相冲突,除非potato是整数。:-P
Zaq 2014年

c=+prompt()否则b+c将串联为一个字符串。
nderscore 2014年

优化了一些内容,并将结果降至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})) 演示)
nderscore 2014年

c通过减去减法将另一个字节保存为转换成数字。b-cb-=c在我上面的代码中。(演示)
nderscore 2014年

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

非高尔夫版本

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]))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.