Нарисуйте тени зданий


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 пробела.
  • Это , поэтому выиграет самый короткий код в байтах!

1
Могу ли я использовать {}и {-1*}как значения флага?
Джон Дворак,

@ Ян Да, да, ты можешь. Вы могли бы даже использовать potatoи while(1){}. Как указано в вопросе, «все, что удобно».
Ручка двери

2
:( Я собирался решить эту проблему в регулярном выражении (со вкусом .NET), но я думаю, что нашел ошибку, из-за Regex.Replaceкоторой я не могу обойтись ... у меня сейчас две проблемы?
Martin Ender,

3
@ Doorknob Кто-то собирается злоупотребить этим правилом, чтобы просто ввести весь код во входные данные.
Aprıʇǝɥʇ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

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

Питон 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))

РЕДАКТИРОВАТЬ: не видел обе стороны отступа в правилах. Ehehe. ^^


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
Дверная ручка

Ой, это не весело :-( Это действительно приводит к тому, что «оба флага являются целыми числами» конфликтует с вашим комментарием «Вы можете даже использовать potato...», если не potatoявляется целым числом. :-P
Zaq

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})) (демо)
nderscore

Сохраните другой байт при преобразовании cв число, вычитая вместо этого. b-cили b-=cв моем коде выше. (демо)
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]))

Безголовая версия

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]))
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.