क्या आप सबसे बड़े कमरे में हैं?


29

परिचय

आपने हाल ही में एक प्रिटी गुड सॉफ्टवेयर कंपनी में नौकरी का प्रस्ताव स्वीकार किया है। आप अपने कार्यालय के आकार के साथ बहुत संतुष्ट हैं, लेकिन क्या आपके पास सबसे बड़ा कार्यालय है? जब आप अपने सहकर्मियों के दफ्तरों में जाकर रुकते हैं, तो यह बताना मुश्किल है। इसका पता लगाने का एकमात्र तरीका भवन के लिए ब्लूप्रिंट की जांच करना है ...

आपका कार्य

एक कार्यक्रम, स्क्रिप्ट, या फ़ंक्शन लिखें जो आपके भवन के लिए एक फर्श योजना लेता है और इंगित करता है कि क्या आपका कार्यालय सबसे बड़ा है। मंजिल योजना क्योंकि इमारत एक है पढ़ने में आसान है n से n वर्ग।

इनपुट में n + 1 \n -delimited लाइनें शामिल होंगी। पहली पंक्ति में उस पर संख्या n होगी । अगली एन लाइनें इमारत के लिए फ़्लोरप्लान होंगी। एक सरल उदाहरण इनपुट:

6
......
.  . .
.X . .
.  . .
.  . .
......

फ्लोरप्लान के नियम इस प्रकार हैं:

  • .(ASCII 46) दीवारों का प्रतिनिधित्व करने के लिए उपयोग किया जाएगा। (अंतरिक्ष [ASCII 32]) का उपयोग खुली जगह का प्रतिनिधित्व करने के लिए किया जाएगा।
  • आपको X(ASCII 88) द्वारा दर्शाया गया है । आप अपने कार्यालय में हैं।
  • फ़्लोरप्लान एन लाइनें होंगी, प्रत्येक में एन अक्षर होंगे।
  • इमारत पूरी तरह से दीवारों से घिरा हुआ है। इसका तात्पर्य यह है कि इनपुट की दूसरी पंक्ति (फ्लोरप्लान की पहली पंक्ति) और इनपुट की अंतिम पंक्ति सभी .s होगी । इसका मतलब यह भी है कि हर फ्लोरप्लान लाइन के पहले और आखिरी अक्षर .एस होंगे।
  • एक कार्यालय के आकार को आसन्न रिक्त स्थान के योग के रूप में परिभाषित किया गया है (4 दिशाओं, एन, एस, ई, डब्ल्यू, एक दीवार के माध्यम से जाने के बिना चलती है)।
  • कार्यालय आकार के उद्देश्य से, आपका प्रतिनिधित्व करने वाला X एक (खुली जगह) के रूप में गिना जाता है
  • 4 <= n <= 80

आपको यह उत्पादन करना चाहिए कि आपका कार्यालय अन्य सभी कार्यालयों से कड़ाई से बड़ा है या नहीं। आउटपुट कुछ भी हो सकता है जो स्पष्ट रूप से आपकी पसंद की प्रोग्रामिंग भाषा में True या False को दर्शाता है और शून्य, शून्य और खाली हस्ताक्षर करने वाले False के मानक सम्मेलनों का पालन करता है। यह सच है कि आपका कार्यालय सख्ती से सबसे बड़ा है।

उपरोक्त इनपुट के लिए नमूना आउटपुट:

1

क्योंकि आपका कार्यालय 8 वर्ग फीट का है, और केवल दूसरा कार्यालय 4 वर्ग फीट का है।

I / O दिशानिर्देश

  • इनपुट को स्टडिन से पढ़ा जा सकता है, और आउटपुट को स्टडआउट करने के लिए उत्तर दिया जा सकता है।

या

  • इनपुट किसी फ़ंक्शन के लिए एक एकल स्ट्रिंग तर्क हो सकता है, और उत्तर उस फ़ंक्शन का रिटर्न मान हो सकता है।

सामान्य प्रश्न

  • पूरी इमारत में दीवारें और कार्यालय हैं।
  • भवन केवल एक मंजिल है
  • इनपुट में एक एक्स होने की गारंटी है, लेकिन किसी भी जगह होने की गारंटी नहीं है। आपके पास 1x1 कार्यालय हो सकता है और बाकी इमारत दीवारें हैं (आपके पास सबसे बड़ा कार्यालय है! हुर्रे!)।

अन्य उदाहरण

10
..........
.   .  . .
.  .   . .
.  .   . .
. ..   . .
..       .
..........
.      X .
.        .
..........

यहाँ 3 कार्यालय हैं, आपका दक्षिण कार्यालय आयताकार है, उत्तर-पश्चिम कार्यालय एक त्रिभुज (ish) है और उत्तर-पूर्व कार्यालय अजीब तरह से मिस्पेन है, फिर भी आपसे बड़ा है। आउटपुट गलत होना चाहिए।

यह सबसे छोटा कोड, खुश आईएनजी लिखने की एक चुनौती है !


अच्छी समस्या विनिर्देश, लेकिन आप Xइनपुट में अनुमत अधिकतम संख्या जोड़ सकते हैं । :)
ग्रेग हेविल

4
केवल एक एक्स है। एक्स "आप" है और यह दर्शाता है कि यह जिस कमरे में है वह आपका है।
टर्बोलेन्टू

जवाबों:


11

रूबी 2.0, 133 अक्षर

@ वेंटरो के साथ एक सहयोग। हमेशा एक अच्छा संकेत जब यह सिंटैक्स हाइलाइटर को तोड़ना शुरू कर देता है!

यह एक पुनरावर्ती बाढ़-भरण समाधान है। STDIN से पढ़ता है और STDOUT को आउटपुट देता है:

f=->*a{a.product([~n=$_.to_i,-1,1,n+1]){|p,d|a|=[p]if$_[p+=d]<?.}!=a ?f[*a]:a.size}
gets(p).scan(/ /){$*<<f[$`.size]}
p$*.max<f[~/X/]

इसे आइडोन पर दौड़ते हुए देखें ।


1
बहुत अच्छा! मुझे लगता है कि आप में सूचकों उलटफेर से दो और पात्रों को बचा सकता है fएक सा: f=->l{a=[*l];a.product([~n,-1,1,n+1]){|p,d|a|=[p+d]if$_[p+d]<?.};a!=l ?f[a]:l.size}। और मुझे सही करें अगर मैं गलत हूं, लेकिन ऐसा लगता है कि यह वास्तव में कोई फर्क नहीं पड़ता अगर लंबाई वाली पहली पंक्ति को छोड़ दिया जाता है $_, जो आपको इनपुट पार्सिंग को छोटा करने की अनुमति देगाgets$e;n=$_.to_i
वेंटरो

1
आह, और भी बेहतर। :) आपके पिछले संपादन पर एक और सुधार: gets(p)जैसा pकि कुछ भी नहीं है और nilअगर कोई तर्क नहीं दिया जाता है, तो वापस आ जाता है।
वेंतोरो

1
असल में, मैंने पहले जो कहा था उसे वापस लेता हूं। आपकी प्रारंभिक स्थान व्यवस्था का उपयोग करते हुए, हम इस तथ्य का उपयोग कर सकते हैं कि productरिसीवर को lपूरी तरह से समाप्त करने के लिए वापस लौटाता है : f=->*a{a.product([~n,-1,1,n+1]){|p,d|a|=[p+d]if$_[p+d]<?.}!=a ?f[*a]:a.size}- दुर्भाग्य से हम !=अंतरिक्ष को हटाने के लिए lhs और rhs को स्विच नहीं कर सकते हैं , अन्यथा दोनों पक्ष अनमॉडिफाइड सरणी को इंगित करते हैं।
वेंटरो

1
एक अंतिम सुधार: गाली String#scanदेने से और ARGV, सबसे बड़ा कमरा खोजने पर थोड़ा छोटा किया जा सकता है: $_.scan(/ /){$*<<f[$.Size]}; p $ *। अधिकतम <f [~ / X /] `
Ventero

1
खेद है कि आपको फिर से गुस्सा दिलाना के लिए है, लेकिन मैं वास्तव में एक और सुधार पाया ... :) के लिए काम इनलाइन करने तक nमें fकी तरह कुछ के साथ [~n=$_.to_i,...], आप तो में पहले और तीसरे लाइन को जोड़ सकते हैं gets(p).scan(...134 पात्रों के लिए कुल।
वेंटरो

7

गोल्फस्क्रिप्ट (85 बाइट्स)

n/(~.*:N:^;{{5%[0.^(:^N]=}/]}%{{{.2$*!!{[\]$-1=.}*}*]}%zip}N*[]*0-:A{.N=A@-,2*+}$0=N=

ऑनलाइन डेमो

इसके तीन खंड हैं:

  1. एक प्रारंभिक इनपुट परिवर्तन जो मेरी शुरुआत की स्थिति का प्रतिनिधित्व करने के लिए 0एक दीवार, N(कोशिकाओं की कुल संख्या) का प्रतिनिधित्व करने के लिए 2 डी सरणी का उत्पादन करता है , और एक दूसरे के लिए एक खुली जगह के बीच एक अलग संख्या।

    n/(~.*:N:^;{{5%[0.^(:^N]=}/]}%
    
  2. एक बाढ़-भराव।

    {{{.2$*!!{[\]$-1=.}*}*]}%zip}N*
    
  3. अंतिम गिनती। यह एक सरणी में सबसे आम तत्व के लिए टिप पर एक प्रकार का उपयोग करता है , एक टाई-ब्रेकर को जोड़ता है जिसके खिलाफ पूर्वाग्रह होता है N

    []*0-:A{.N=A@-,2*+}$0=N=
    

आपकी प्रस्तुति के लिए धन्यवाद! एक सीजेम अनुवाद qN/(~_*:T:U;{[{i5%[0_U(:UT] =}/]}%{{[{_2$*!!{[\]$W=_}*}*]}%z}T*:+0-:A{_T=A@-,2*+}$0=T=:।
jimmy23013

3

जावास्क्रिप्ट (E6) 155 292

F=(a,n=parseInt(a)+1,x,y)=>[...a].map((t,p,b,e=0,f=p=>b[p]==' '|(b[p]=='X'&&(e=1))&&(b[p]=1,1+f(p+n)+f(p-n)+f(p+1)+f(p-1)))=>(t=f(p))&&e?y=t:t<x?0:x=t)|y>x

बिना आधार वाला संस्करण

F=a=>
{
  var k, max=0, my=0, k=1, t, n = parseInt(a)+1;
  [...a].forEach( 
    (e,p,b) =>
    {
       x=0;
       F=p=>
       {
          var r = 1;
          if (b[p] == 'X') x = 1;
          else if (b[p] != ' ') return 0;
          b[p] = k;
          [n,1,-n,-1].forEach(q => r+=F(q+p));
          return r;
       }
       t = F(p);
       if (t) {
          if (x) my = t;
          if (t > max) max = t;
          k++;
          console.log(b.join(''));
       }    
    }
  )
  return my >= max
}

परीक्षा

फ़ायरफ़ॉक्स में जावास्क्रिप्ट कंसोल

F('6\n......\n. . .\n.X . .\n. . .\n. . .\n......')

1

F('10\n..........\n. . . .\n. . . .\n. . . .\n. .. . .\n.. .\n..........\n. X .\n. .\n..........\n')

0

दूसरा 1मेरे लिए भी (फ़ायरफ़ॉक्स 30.0 में)
क्रिस्टोफ़ बोह्मवल्डर

@HackerCow मैं नहीं जानता कि क्यों, लेकिन अगर आप मेरे परीक्षण कोड से बिल्ली और पेस्ट करते हैं, तो सफेद स्थान संकुचित होते हैं। प्रत्येक पंक्ति 10 वर्ण की होनी चाहिए।
edc65

3

सी #, 444 372 / (342 धन्यवाद हैकरको) बाइट्स

बल्कि खराब स्कोर और पार्टी के लिए देर से, लेकिन काम करने लगता है। आउटपुट 1 जब आपके पास सबसे बड़ा कार्यालय है, 0 जब आप नहीं करते हैं। मैं अभी तक गोल्फ के साथ बहुत जटिल नहीं था। इनपुट (प्रथम लूप) से असंबद्ध सेट के निर्माण द्वारा काम करता है, प्रत्येक सेट (दूसरा लूप) के आकार को टैली करना और फिर यह देखना है कि मेरा सेट सबसे बड़ा (तीसरा लूप) है या नहीं।

दो संस्करण प्रदान किए गए हैं, एक एक प्रोग्राम प्रोग्राम है जो कमांड लाइन से इनपुट को स्वीकार करता है, दूसरा सिर्फ एक फ़ंक्शन है जो इनपुट के रूप में एक स्ट्रिंग की अपेक्षा करता है और परिणाम के रूप में एक इंट रिटर्न देता है (और पहले की एक reworked प्रतिलिपि है) - इसे क्लॉज़ या इस तरह के किसी भी उपयोग की आवश्यकता नहीं है, इसे कहीं भी रखने में सक्षम होना चाहिए और यह काम करेगा।

कार्यक्रम 372bytes :

using System;class P{static void Main(){int s=int.Parse(Console.ReadLine()),e=0,d=s*s,a=d;int[]t=new int[d],r=new int[d];Func<int,int>T=null,k=v=>t[T(v)]=t[v]>0?a:0;T=v=>t[v]!=v?T(t[v]):v;for(;a>0;)foreach(var m in Console.ReadLine()){a--;if(m!=46){t[a]=a;e=m>46?a:e;k(a+s);k(a+1);}}for(a=d;a-->2;)r[T(a)]++;for(;d-->1;)a=d!=T(e)&&r[d]>=r[T(e)]?0:a;Console.WriteLine(a);}}

समारोह 342bytes :

static int F(string g){var b=g.Split('\n');int s=int.Parse(b[0]),e=0,d=s*s,a=d;int[]t=new int[d],r=new int[d];System.Func<int,int>T=null,k=v=>t[T(v)]=t[v]>0?a:0;T=v=>t[v]!=v?T(t[v]):v;for(;a>0;)foreach(var m in b[a/s]){a--;if(m!=46){t[a]=a;e=m>46?a:e;k(a+s);k(a+1);}}for(a=d;a-->2;)r[T(a)]++;for(;d-->1;)a=d!=T(e)&&r[d]>=r[T(e)]?0:a;return a;

कम गोल्फ वाला:

using System;

class P
{
    static int F(string g)
    {
        var b=g.Split('\n');
        int s=int.Parse(b[0]),e=0,d=s*s,a=d;
        int[]t=new int[d],r=new int[d];
        System.Func<int,int>T=null,k=v=>t[T(v)]=t[v]>0?a:0;
        T=v=>t[v]!=v?T(t[v]):v;

        for(;a>0;)
            foreach(var m in b[a/s])
            {
                a--;
                if(m!=46)
                {
                    t[a]=a;
                    e=m>46?a:e;
                    k(a+s);
                    k(a+1);
                }
            }
        for(a=d;a-->2;)
            r[T(a)]++;
        for(;d-->1;)
            a=d!=T(e)&&r[d]>=r[T(e)]?0:a;
        return a;
    }

    static void Main()
    {
        /* F() test
        var s=Console.ReadLine();
        int i=int.Parse(s);
        for(;i-->0;)
        {
            s+="\n"+Console.ReadLine();
        }
        Console.WriteLine(F(s));*/


        int s=int.Parse(Console.ReadLine()),e=0,d=s*s,a=d;
        int[]t=new int[d],r=new int[d];
        Func<int,int>T=null,k=v=>t[T(v)]=t[v]>0?a:0;
        T=v=>t[v]!=v?T(t[v]):v;

        for(;a>0;)
            foreach(var m in Console.ReadLine())
            {
                a--;
                if(m!=46)
                {
                    t[a]=a;
                    e=m>46?a:e;
                    k(a+s);
                    k(a+1);
                }
            }
        for(a=d;a-->2;)
            r[T(a)]++;
        for(;d-->1;)
            a=d!=T(e)&&r[d]>=r[T(e)]?0:a;
        Console.WriteLine(a);
    }
}

1
जिस तरह से मैंने समझा कि आपको वास्तव में एक कार्यशील कार्यक्रम लिखना नहीं है, एक फ़ंक्शन पर्याप्त है। इसलिए यदि आप Mainफ़ंक्शन से पहले सभी सामान छोड़ देते हैं और फ़ंक्शन को इसके साथ प्रतिस्थापित करते हैं, int f(string s)तो आप कहते हैं कि आप s.Split('\n')[0]इसके बजाय उपयोग कर सकते Console.ReadLine()हैं 1या वापस आ सकते हैं 0। इससे आपको बहुत सारे कोड बचाना चाहिए
क्रिस्टोफ बोहमवल्डर

@ हैकर धन्यवाद, मैं पूरी तरह से उस खंड को याद किया! मैं अपने अगले संपादन में एक फ़ंक्शन संस्करण डालूँगा।
विजुअलमेल जू

2

सीजेएम, 106 बाइट्स

बाढ़ भराव के लिए एक अलग दृष्टिकोण। हालाँकि, इसे लंबा बनाता है ...

liqN-'Xs0aer\_:L*{_A=' ={[AAL-A(]1$f=$:D1=Sc<{D2<(aer}*D0=_' ={T):T}@?A\t}*}fAT),\f{\a/,}_$W%_2<~>@@0=#0=&

इसे यहाँ आज़माएँ


आपकी प्रस्तुति के लिए धन्यवाद। लेकिन आपका प्रोग्राम इस इनपुट के साथ एक अपवाद फेंकता है: pastebin.com/v989KhWq
jimmy23013

@ user23013 तय किया।
ऑप्टिमाइज़र

इनका प्रयास करें: pastebin.com/WyRESLWE
jimmy23013

2

पायथन 2 - 258 बाइट्स

r=range;h=input();m="".join(raw_input()for x in r(h))
w=len(m)/h;n=0;f=[x!='.'for x in m]
for i in r(w*h):
 if f[i]:
    a=[i];M=s=0
    while a:
     i=a.pop();s+=1;M|=m[i]=='X';f[i]=0
     for j in(i-1,i+1,i-w,i+w):a+=[[],[j]][f[j]]
    n=max(s,n)
    if M:A=s
print A==n

इनपुट के लिए स्टड का उपयोग करता है

नोट: पहले ifएक सिंगल स्पेस द्वारा इंडेंट किया जाता है, अन्य इंडेंटेड लाइनें या तो सिंगल टैब चार या टैब और स्पेस का उपयोग कर रही हैं।


1

जे: 150 121 बाइट्स

(({~[:($<@#:I.@,)p=1:)=([:({.@#~(=>./))/@|:@}.({.,#)/.~@,))(>./**@{.)@(((,|."1)0,.0 _1 1)&|.)^:_[(*i.@:$)2>p=:' X'i.];._2

संपादित करें : idऔर compहास्यास्पद जटिल और धीमी गति से थे। अब यह मैप को 4 बार शिफ्ट करने का काम करता है, इसके बजाय इसे एक 3x3 विंडो के साथ स्कैन करके cut( ;.) इस्तेमाल किया जाता है ।

स्ट्रिंग के रूप में ब्लूप्रिंट को तर्क के रूप में लेता है। नीचे समझाया गया है:

    s =: 0 :0
..........
.   .  . .
.  .   . .
.  .   . .
. ..   . .
..       .
..........
.      X .
.        .
..........
)
p=:' X' i. ];._2 s                NB. 0 where space, 1 where X, 2 where wall
id=:*i.@:$2>p                     NB. Give indices (>0) to each space
comp =: (>./ * *@{.)@shift^:_@id  NB. 4 connected neighbor using shift
  shift =: ((,|."1)0,.0 _1 1)&|.  NB. generate 4 shifts
size=:|:}.({.,#)/.~ , comp        NB. compute sizes of all components
NB. (consider that wall is always the first, so ditch the wall surface with }.)
NB. is the component where X is the one with the maximal size?
i=: $<@#:I.@,                     NB. find index where argument is 1
(comp {~ i p=1:) = {.((=>./)@{: # {.) size

NB. golfed:
(({~[:($<@#:I.@,)p=1:)=([:({.@#~(=>./))/@|:@}.({.,#)/.~@,))(>./**@{.)@(((,|."1)0,.0 _1 1)&|.)^:_[(*i.@:$)2>p=:' X'i.];._2 s
0

0

पायथन 2 - 378 बाइट्स

वाह। मैं अभ्यास से बाहर हूं।

def t(l,x,y,m,c=' '):
 if l[y][x]==c:l[y][x]=m;l=t(l,x-1,y,m);l=t(l,x+1,y,m);l=t(l,x,y-1,m);l=t(l,x,y+1,m)
 return l
def f(s):
 l=s.split('\n');r=range(int(l.pop(0)));l=map(list,l);n=1
 for y in r:
    for x in r:l=t(l,x,y,*'0X')
 for y in r:
  for x in r:
    if l[y][x]==' ':l=t(l,x,y,`n`);n+=1
 u=sum(l,[]).count;o=sorted(map(u,map(str,range(n))));return n<2or u('0')==o[-1]!=o[-2]

यह एक फ़ंक्शन उत्तर है, लेकिन यह वैश्विक नाम स्थान को प्रदूषित करता है। यदि यह अस्वीकार्य है, तो इसे 1 बाइट की कीमत पर तय किया जा सकता है:

  • पंक्ति 1 (+1) की शुरुआत में एक स्थान जोड़ें
  • टैब वर्ण (+0) के साथ लाइनों 2 और 3 की शुरुआत में स्थान बदलें
  • शुरुआत में लाइन 4 को स्थानांतरित करें (+0)

मेरे पास एक पूरी लंबी व्याख्या थी, लेकिन जाहिर तौर पर यह ठीक से नहीं बची और मैं फिर से ऐसा नहीं कर रहा

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