इमारतों की छाया खींचना


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उनके नीचे होंगे (जिसका अर्थ है कोई तैरती इमारतें)
  • आपको जोड़े गए छाया के साथ पंक्तियों (इमारतों) को आउटपुट करना होगा। यह निम्नलिखित प्रक्रिया के साथ किया जाता है:
    • यदि प्रकाश ऊपर बाईं ओर से आ रहा है, .तो इमारत की ऊंचाई के समान ऊँचाई और चौड़ाई के साथ एस का एक दाहिने त्रिकोण को आकर्षित करें , जो एक स्थान से शुरू होकर अपने दाहिने किनारे पर और दाईं ओर जा रहा है।
    • अन्यथा, यदि यह शीर्ष दाईं ओर से है, तो ऐसा ही करें लेकिन एक स्थान से इसके बाएं किनारे से शुरू करें और बाईं ओर इंगित करें।
    • याद रखें, Xउन्हें बदलने के लिए .एस बदलकर एस न करें ; वे जैसे हैं वैसे ही उन्हें छोड़ दें।
    • आपकी छाया के लिए हमेशा "कमरा" होगा, अर्थात यदि अंत में 3-स्थान लंबा भवन है, तो इसके बाद कम से कम 3 स्थान गद्दी होगी।
  • यह , इसलिए बाइट्स में सबसे छोटा कोड जीत जाएगा!

1
मैं उपयोग कर सकते हैं {}और {-1*}झंडा मूल्यों के रूप में?
जॉन ड्वोरक

@ जान, हाँ आप कर सकते हैं। आप भी उपयोग कर सकते हैं potatoऔर while(1){}। जैसा कि प्रश्न में उद्धृत किया गया है, "जो कुछ भी सुविधाजनक है।"
दरवाज़े

2
:( मैं इसे (.NET- फ्लेवर्ड) रेगेक्स में हल करने जा रहा था, लेकिन मुझे लगता है कि मुझे एक बग मिला, Regex.Replaceजिसमें मैं काम नहीं कर सकता ... क्या मुझे अब दो समस्याएं हैं?
मार्टिन एंडर

3
@Doorknob कोई व्यक्ति इस नियम का दुरुपयोग करने जा रहा है, ताकि इनपुट में उसका पूरा कोड हो।
atı 14uʎ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))

संपादित करें: नियमों में दोनों ओर पैडिंग नहीं देखी गई। Ehehe। ^^ '


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}));छाया के लिए या दाईं ओर छाया के लिए है।

यह ध्वज के लिए "जो भी आपके लिए सुविधाजनक है" नियम का दुरुपयोग कर सकता है : पी


संपादित करें: दुरुपयोग के बिना (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
ज़ाक

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})) (डेमो)
nderscore

cइसके बजाय घटाकर किसी संख्या में परिवर्तित करने पर किसी अन्य बाइट को सहेजें । b-cया b-=cऊपर मेरे कोड में। (डेमो)
अंडरस्कोर

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

Ungolfed संस्करण

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.