Намалюйте тіні будівель


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*}як значення прапорця?
Джон Дворак

@Jan Так, так, можна. Можна навіть використовувати potatoі while(1){}. Як цитується у запитанні, "все, що зручно".
Doorknob

2
:( я збирався вирішити це в (.NET-ароматизованому) регулярному вираженні, але я думаю, що знайшов помилку, над Regex.Replaceякою я не можу обійтись ... чи є у мене дві проблеми зараз?
Мартін Ендер

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

Perl - 85

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

EDIT: Я повністю забув про -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

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

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

Пітон 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.