बर्फीले घन ट्रे को भरना


27

मान लीजिए कि रिक्त स्थान का यह ग्रिड Xकुछ अजीब आकार के खाली आइस क्यूब ट्रे के क्रॉस सेक्शन का प्रतिनिधित्व करता है :

   X     X X        
X  X X  XX X  XX   X
XXXXXX XXXXXXXXXXXXX

बिना Xट्रे में छेद या अंतराल का प्रतिनिधित्व करने वाले कॉलम पानी को पकड़ नहीं सकते हैं, जो एक असीम क्षमता के सिंक में निकल जाता है। ग्रिड के सबसे बाएं या दाएं किनारे से गिरने वाला पानी इस अंतहीन सिंक में भी चला जाता है।

अगर हम ट्रे के ऊपर नल लगाते और उन्हें पानी से भर देते, जब तक कि सभी डिब्बों में पानी का स्तर स्थिर नहीं रहता, तब तक भरे जाने वाले सटीक डिब्बों पर निर्भर करता कि पानी की धारा ट्रे के ऊपर स्थित थी या नहीं। (बिना छींटे के साथ पानी की एक पतली, स्थिर धारा मान लें।)


उदाहरण के लिए, यदि हमारा नल Fबहुत बाएं ग्रिड कॉलम से ऊपर था

F                   
   X     X X        
X  X X  XX X  XX   X
XXXXXX XXXXXXXXXXXXX

पानी Xउस स्तंभ में सबसे ऊपर गिर जाएगा और बाएं और दाएं, बाएं आधा शिलिंग नीचे सिंक में फैल जाएगा, और दायां आधा 2 × 1 डिब्बे को भर देगा। एक बार जब डिब्बे भर जाता है, तो पानी की धारा का दाहिना आधा भाग कहीं नहीं होता है, लेकिन सिंक में और पानी का स्तर हर जगह अनिवार्य रूप से स्थिर होता है।

नल को बंद करते हुए, ट्रे अब इस तरह दिखता है: ( ~पानी के साथ )

   X     X X        
X~~X X  XX X  XX   X
XXXXXX XXXXXXXXXXXXX

इसी तरह, अगर हम नल को इस तरह से रखते हैं:

   F                
   X     X X        
X  X X  XX X  XX   X
XXXXXX XXXXXXXXXXXXX

यह दो बचे हुए डिब्बों को भर देगा लेकिन बाकी का पानी निकल जाएगा:

   X     X X        
X~~X~X  XX X  XX   X
XXXXXX XXXXXXXXXXXXX

यदि हम नल को इस तरह रखते हैं:

         F          
   X     X X        
X  X X  XX X  XX   X
XXXXXX XXXXXXXXXXXXX

धारा का बायां आधा हिस्सा सिंक में बह जाएगा लेकिन दाहिना आधा अंत में तीन सबसे दाहिने डिब्बों को भर देगा क्योंकि पानी की समतल सतह पर क्षैतिज रूप से कितनी दूर तक यात्रा की जा सकती है, इसकी कोई सीमा नहीं है:

   X     X~X        
X  X X  XX~X~~XX~~~X
XXXXXX XXXXXXXXXXXXX

हालांकि इस तरह से स्थिति:

        F           
   X     X X        
X  X X  XX X  XX   X
XXXXXX XXXXXXXXXXXXX

सभी नालियों का पानी दूर चला जाता है और कोई भी भराव नहीं होता है:

   X     X X        
X  X X  XX X  XX   X
XXXXXX XXXXXXXXXXXXX

चुनौती

एक प्रोग्राम या फ़ंक्शन लिखें जो रिक्त स्थान के आयताकार ग्रिड में लेता है X, और एक है F। शीर्ष पंक्ति में हमेशा स्थान होगा Fऔर अन्यथा केवल रिक्त स्थान होंगे। Xप्रत्येक स्तंभ में है (यदि कोई हो तो) ग्रिड के आधार से एक ठोस लाइन अप में विस्तार होगा, यानी कोई गुफाओं या overhangs हो जाएगा।

नल Fको भरने के बाद ग्रिड को प्रिंट या वापस करें जो ~ऊपर वर्णित के अनुसार पानी के साथ हो सकता है। Fआउटपुट से शीर्ष पंक्ति छोड़ें ।

  • नल पंक्ति से अलग ग्रिड न्यूनतम 1 × 1 होगा

    F
    X
    

    सबसे छोटा इनपुट है जिसे आपको समर्थन करने की आवश्यकता है।

  • इनपुट पूर्ण पाठ आयत के रूप में आएगा। प्रमुख और अनुगामी रिक्त स्थान इनपुट और आउटपुट में मायने रखते हैं। जैसे इनपुट

        F     
      X  X    
      XXXX    
    

    में परिणाम होना चाहिए

      X~~X    
      XXXX    
    

    (प्रमुख और अनुगामी स्थानों पर ध्यान दें)

  • इनपुट या आउटपुट में एकल अनुगामी न्यूलाइन होना ठीक है।

  • आप किसी भी चार अलग उपयोग कर सकते हैं प्रिंट योग्य ASCII स्पेस के स्थान पर अक्षर, , X, ।F~

बाइट्स में सबसे छोटा कोड जीतता है।


बड़ा उदाहरण:

इनपुट:

                F                                 
              X             X                     
              X             X X                   
X            XXX       X    X X           X    X  
X   X     XXXXXXX      X    XXX     XXXXXXX X  X  
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXX

आउटपुट:

              X~~~~~~~~~~~~~X                     
              X~~~~~~~~~~~~~X~X                   
X~~~~~~~~~~~~XXX~~~~~~~X~~~~X~X~~~~~~~~~~~X    X  
X~~~X~~~~~XXXXXXX~~~~~~X~~~~XXX~~~~~XXXXXXX X  X  
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXX

अरे हाँ, मेरे लिए एक बड़ा अवसर अपने प्रिय का उपयोग करने के लिए zip()<3
cjfaure

2
इसके लिए उत्तर चाहिए: / मैं इस पर काम करूंगा।
TheNumberOne

सेलुलर ऑटोमेटोन बनाने के लिए यह अपेक्षाकृत आसान है जो इसे अनुकरण करता है, लेकिन मैं इसे समाप्त करने का एक तरीका नहीं सोच सकता।
डेनमैन मैन

अभी भी प्रतिस्पर्धा करने के लिए कोई नहीं? इतनी प्यारी चुनौती। ऐसा लग रहा है कि मुझे खुद को हराना होगा :)
जकूज़ी

इसका एक डुप्लिकेट जैसा दिखता है: codegolf.stackexchange.com/questions/2563/fill-in-the-lakes
12Me21

जवाबों:


1

perl -p0, 204 + 2 बाइट्स

विचार

  • यदि F के नीचे द्वीप के दोनों किनारे समान ऊँचाई के हैं, तो उस द्वीप पर सभी X *Xes को प्रतिस्थापित करें X~*X
  • यदि एक पक्ष अधिक है, तो X *Xतों X~*Xको निचली तरफ नाली के बीच तों के साथ बदलें और F जो निकटतम F के निचले बिंदु के शीर्ष से अधिक है।

F के नीचे की जमीन यहां दोनों तरफ के हिस्से के रूप में गिना जाता है।

गोल्फ़

s/.*(F).*
//;$f=@-[1];($%,$r)=map{y///c}/(.{0,$f})\bX+?\b(.*)$/;($a,$b)=map{y///c}/[^~]*^(?(?=(.{$%,$f}X)).{$f} *|.{$f} *X(.*)).{$r}
/m;$a=$%if!$a||$b;$b+=$r;s/(?<=.{$a})\b *\b(?=.{$b})/"~"x length($&)/ge

टिप्पणियाँ

perl -p0e ' # slurp stdin, print the result

s/.*(F).*\n//; # remove the first line, record the index of F
$f=@-[1]; # get the index of F

($l,$r)=map{length}m/(.{0,$f})\bX+?\b(.*)$/;
# gets the distance from either side to the drains closest to F
($a,$b)=map{length}m/[^~]*^(?(?=(.{$l,$f}X)).{$f} *|.{$f} *X(.*)).{$r}\n/m;
# tries to find the lowest line that has at least one X on
# one side of the island, but none on the other
$a=$l if !$a||$b;
$b+=$r; # use the captured groups to calculate the left and right bounds
s/(?<=.{$a})\b *\b(?=.{$b})/"~" x length($&)/ge;
# replace all pools within those bounds
'

इस कार्यान्वयन में मूल एल्गोरिथ्म को पहचानना कठिन हो सकता है क्योंकि पर्ल चर लंबाई के लुकबाइंड का समर्थन नहीं करता है।


6

लुआ 5.2, 581 बाइट्स

फिर, धीमी गति से गोल्फ के लिए अप्रभावी भाषा के साथ और अप्रभावी एल्गोरिथ्म के साथ धीमी शुरुआत करें। लेकिन मैं सुधार करूंगा :)

r=io.read w=io.write F=r()f=F:find("F")o={[1]=F}W=#F i=2 
repeat s=r()if s==nil then break end o[i]={}for j=1,W do o[i][j]=s:sub(j,j)end i=i+1 until false
function e(i,j)
local k,l,b,c=j+1,j-1,false
if i>=#o or(o[i+1][j]==" "and e(i+1,j)==0)then return 0 end
while k<=W do
b=b or o[i][k]=="X"
if b or(o[i+1][k]==" "and e(i+1,k)==0)then break end
k=k+1 end
while l>0 do
c=c or o[i][l]=="X"
if c or(o[i+1][l]==" "and e(i+1,l)==0)then break end
l=l-1 end
if b and c then for m=l+1,k-1 do o[i][m]="~"end return 1 end
return 0 end
e(1,f)for i=2,#o do for j=1,W do w(o[i][j])end w"\n"end

परीक्षण के मामले (जल स्रोत के साथ):

---------
    F    
  X~~X   
  XXXX   
--------------------
         F          
   X     X~X        
X  X X  XX~X~~XX~~~X
XXXXXX XXXXXXXXXXXXX
--------------------
   F                
   X     X X        
X~~X~X  XX X  XX   X
XXXXXX XXXXXXXXXXXXX
--------------------------------------------------
                F                                 
              X~~~~~~~~~~~~~X                     
              X~~~~~~~~~~~~~X~X                   
X~~~~~~~~~~~~XXX~~~~~~~X~~~~X~X~~~~~~~~~~~X    X  
X~~~X~~~~~XXXXXXX~~~~~~X~~~~XXX~~~~~XXXXXXX X  X  
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXX

बैश से इस तरह से परीक्षण करना संभव है, लेकिन यह इतना अच्छा नहीं लगता है:

$ echo "    F     
  X  X    
  XXXX   " | lua f.lua

इस आसान का परीक्षण करने के लिए यहां डॉक्स का उपयोग करें ! इस तरह
रेवरॉन

1

जावास्क्रिप्ट, 460 बाइट्स

ऑनलाइन डेमो (कंसोल में, वर्तमान क्रोम और फ़ायरफ़ॉक्स में परीक्षण किया गया)।

function e(i,j){var k=j+1,l=j-1,b=0,c=0,I=i+1
if(i>(O-2)||(o[I][j]==" "&&e(I,j)==0))return 0
while(k<W){b=b||(o[i][k]=="X")
if(b||(o[I][k]==" "&&e(I,k)==0))break
k++}while(l>=0){c=c||(o[i][l]=="X")
if(c||(o[I][l]==" "&&e(I,l)==0))break
l--}if(b&&c){for(m=l+1;m<k;m++)o[i][m]="~"
return 1}return 0}function f(d){o=d.split("\n")
F=o[0];s=F.indexOf("F");W=F.length;O=o.length
for(i=0;i<O;i++)o[i]=o[i].split("")
e(0,s);for(i=1;i<O;i++)console.log(o[i].join(""))}

खुद को चुनौती देना इतना मजेदार नहीं है, लेकिन फिर भी संभव है। लुआ वन के रूप में एक ही एल्गोरिदम, अब जावास्क्रिप्ट में।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.