วาดเงาของอาคาร


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อยู่ภายใต้พวกเขา (หมายถึงไม่มีอาคารลอย)
  • คุณต้องแสดงผลแถว (อาคาร) ด้วยเงาที่เพิ่มเข้าไป ทำตามขั้นตอนต่อไปนี้:
    • หากแสงมาจากมุมบนซ้ายให้วาดสามเหลี่ยมมุมฉาก.ที่มีความสูงและความกว้างเท่ากับความสูงของอาคารโดยเริ่มจากที่ว่างหนึ่งผ่านขอบด้านขวาและไปทางขวา
    • มิฉะนั้นถ้ามันมาจากด้านบนขวาทำสิ่งเดียวกัน แต่เริ่มต้นจากช่องว่างหนึ่งผ่านขอบด้านซ้ายและชี้ไปทางซ้าย
    • จำไว้ว่าอย่าเปลี่ยนXs โดยการเปลี่ยนเป็น.s; ปล่อยให้พวกเขาเป็น
    • จะมี "ห้อง" สำหรับเงาของคุณอยู่เสมอเช่นถ้ามีอาคารสูง 3 ชั้นในตอนท้ายจะมีช่องว่างอย่างน้อย 3 ช่องหลังจากนั้น
  • นี่คือดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ!

1
ฉันสามารถใช้{}และ{-1*}เป็นค่าสถานะได้หรือไม่
John Dvorak

@ ม.ค. ใช่คุณทำได้ คุณยังสามารถใช้และpotato while(1){}ตามที่ยกมาในคำถาม "อะไรก็ตามที่สะดวก"
Doorknob

2
:( ฉันกำลังจะแก้ปัญหานี้ใน regex (. NET-flavored) แต่ฉันคิดว่าฉันพบข้อผิดพลาด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

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

แก้ไข: ไม่เห็นช่องว่างด้านใดด้านหนึ่งในกฎ 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
Doorknob

Aaww ไม่สนุก :-( นี่จะทำให้ "ทั้งธงเป็นจำนวนเต็ม" ขัดแย้งกับความคิดเห็นของคุณ "คุณสามารถใช้potato... " เว้นแต่potatoจะเป็นจำนวนเต็ม :-P
Zaq

c=+prompt()มิฉะนั้นb+cจะต่อกันเป็นสตริง
ขีดล่าง

ปรับบางสิ่งให้เหมาะสมแล้วลดระดับลงเป็น 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ในรหัสของฉันด้านบน (สาธิต)
ขีดล่าง

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]))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.