আপনি কি সবচেয়ে বড় ঘরে আছেন?


29

ভূমিকা

আপনি সম্প্রতি একটি ভাল গুড সফ্টওয়্যার সংস্থায় একটি কাজের অফার গ্রহণ করেছেন। আপনি নিজের অফিসের আকার নিয়ে বেশ সন্তুষ্ট তবে আপনি কি সবচেয়ে বড় অফিস? আপনি যখন থামবেন তখন আপনার সহকর্মীদের অফিসগুলিতে কেবল চোখের জল ফেলে বলা শক্ত। এটি নির্ধারণের একমাত্র উপায় হ'ল বিল্ডিংয়ের ব্লুপ্রিন্টগুলি পরীক্ষা করা ...

তোমার কাজ

এমন একটি প্রোগ্রাম, স্ক্রিপ্ট বা ফাংশন লিখুন যা আপনার বিল্ডিংয়ের জন্য একটি মেঝে পরিকল্পনা গ্রহণ করে এবং আপনার অফিসটি সবচেয়ে বড় কিনা তা নির্দেশ করে। মেঝে পরিকল্পনা কারণ ভবন একটি হল পড়তে সহজ হয় এন দ্বারা এন বর্গক্ষেত্র।

ইনপুটের গঠিত হবে এন +1 \n -delimited লাইন। প্রথম লাইনে এটিতে n নম্বর থাকবে । পরবর্তী এন লাইনগুলি বিল্ডিংয়ের জন্য ফ্লোরপ্ল্যান হবে। একটি সাধারণ উদাহরণ ইনপুট:

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

ফ্লোরপ্ল্যানের নিয়মগুলি নিম্নরূপ:

  • .(ASCII 46) দেয়ালের প্রতিনিধিত্ব করতে ব্যবহৃত হবে। (স্পেস [ASCII 32]) খোলা জায়গার প্রতিনিধিত্ব করতে ব্যবহৃত হবে।
  • আপনি একজন X(ASCII 88) দ্বারা প্রতিনিধিত্ব করছেন । আপনি আপনার অফিসে আছেন
  • ফ্লোরপ্লানটি এন লাইনগুলির প্রতিটি এন অক্ষরের সাথে থাকবে।
  • ভবনটি চারদিকের দেয়াল দ্বারা সম্পূর্ণভাবে ঘিরে রয়েছে। এটি সূচিত করে যে ইনপুটটির দ্বিতীয় লাইন (ফ্লোরপ্ল্যানের প্রথম লাইন) এবং ইনপুটটির শেষ লাইনটি সমস্ত হবে .। এটি আরও বোঝায় যে প্রতিটি ফ্লোরপ্ল্যান লাইনের প্রথম এবং শেষ অক্ষরগুলি হবে .
  • একটি অফিস আকার সংলগ্ন স্পেসগুলির যোগফল হিসাবে সংজ্ঞায়িত হয় (প্রাচীরের মধ্যে দিয়ে না গিয়ে 4 টি দিক, N, S, E, W, এর সাথে সামঞ্জস্যপূর্ণ)।
  • অফিস আকারের উদ্দেশ্যে, এক্স আপনাকে প্রতিনিধিত্ব করে এমন একটি (খোলা জায়গা) হিসাবে গণনা করে
  • 4 <= n <= 80

আপনার অফিস অন্যান্য অফিসগুলির চেয়ে কঠোরভাবে বড় কিনা তা আপনার আউটপুট করা উচিত। আউটপুট এমন কোনও কিছু হতে পারে যা আপনার পছন্দসই প্রোগ্রামিং ভাষায় সত্য বা মিথ্যাটিকে দ্ব্যর্থহীনভাবে চিহ্নিত করে এবং শূন্য, নাল এবং খালি খালি চিহ্নের মানক কনভেনশনগুলিকে মেনে চলে। সত্যই বোঝায় আপনার অফিসটি কঠোরভাবে বৃহত্তম।

উপরের ইনপুটটির জন্য নমুনা আউটপুট:

1

কারণ আপনার অফিসটি 8 বর্গফুট এবং কেবলমাত্র অন্য অফিস 4 বর্গফুট।

I / O নির্দেশিকা

  • ইনপুটটি স্টিডিন থেকে পড়তে পারে এবং স্ট্যান্ডআউটের উত্তর আউটপুট।

অথবা

  • ইনপুট কোনও ফাংশনের একক স্ট্রিং আর্গুমেন্ট হতে পারে এবং উত্তরটি সেই ফাংশনের রিটার্ন মান হতে পারে।

প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী

  • পুরো বিল্ডিংটি দেয়াল এবং অফিস নিয়ে গঠিত।
  • বিল্ডিংটি এক তলা মাত্র
  • ইনপুটটিতে এক্স হওয়ার নিশ্চয়তা রয়েছে তবে কোনও স্পেস থাকার গ্যারান্টি নেই। আপনার কাছে 1x1 অফিস থাকতে পারে এবং বাকি বিল্ডিংটি দেয়াল (আপনার কাছে সবচেয়ে বড় অফিস! হুর!)।

অন্যান্য উদাহরণ

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

এখানে 3 টি অফিস রয়েছে, আপনার দক্ষিণ অফিসটি আয়তক্ষেত্রাকার, উত্তর-পশ্চিম অফিসটি একটি ত্রিভুজ (ইশ) এবং উত্তর-পূর্ব অফিসটি আশ্চর্যজনকভাবে মিসপেইন, এটি আপনার চেয়েও বড়। আউটপুটটি মিথ্যা হওয়া উচিত।

সংক্ষিপ্ততম কোডটি লেখার পক্ষে এটি একটি চ্যালেঞ্জ, শুভ আইএনজি!


দুর্দান্ত সমস্যার স্পেসিফিকেশন, তবে আপনি ইনপুটটিতে Xঅনুমোদিত সর্বোচ্চ সংখ্যক যুক্ত করতে পারেন । :)
গ্রেগ হিউগিল

4
কেবলমাত্র একটি এক্স রয়েছে। এক্সটি "আপনি" এবং এটি নির্দেশ করে যে এটির ঘরটি আপনার।
টার্বুলেন্সসটো

উত্তর:


11

রুবি ২.০, ১৩৩ টি অক্ষর

@ ভেন্টোরোর সাথে একটি সহযোগিতা। সিনট্যাক্স হাইলাইটারটি ভাঙ্গতে শুরু করলে সর্বদা একটি ভাল লক্ষণ!

এটি একটি পুনরাবৃত্ত বন্যা-পূরণ সমাধান। 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
খুব সুন্দর! আমার মনে হয় আপনি মধ্যে splats সাজানোর দুটি তার বেশি অক্ষরের রক্ষা করতে পারে 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 এবং rh টি পরিবর্তন করতে পারি না , অন্যথায় উভয় পক্ষই অশোধিত অ্যারেতে নির্দেশ করে।
ভেন্টোরো

1
একটি শেষ উন্নতি: আপত্তিজনকভাবে String#scanএবং ARGV, সবচেয়ে বড় ঘরটি সন্ধান করে কিছুটা ছোট করা যেতে পারে:। $_.scan(/ /){$*<<f[$সাইজ]}; পি $ *। সর্বোচ্চ <চ [~ / এক্স /] `
ভেন্টোরো

1
দুঃখিত আপনি আবার bugging জন্য, কিন্তু আমি আসলে অন্য উন্নতি পাওয়া গেছে ... :) থেকে নিয়োগ ইনলাইনিং দ্বারা 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(কোষের মোট সংখ্যা) এবং একে অপরের উন্মুক্ত জায়গার মধ্যে একটি স্বতন্ত্র সংখ্যা ব্যবহার করে 2D অ্যারে তৈরি করে ।

    n/(~.*:N:^;{{5%[0.^(:^N]=}/]}%
    
  2. একটি বন্যা ভরাট।

    {{{.2$*!!{[\]$-1=.}*}*]}%zip}N*
    
  3. চূড়ান্ত গণনা। এটি অ্যারেতে সর্বাধিক সাধারণ উপাদানগুলির জন্য টিপটিতে একটি বৈকল্পিক ব্যবহার করে টাই-ব্রেকার যুক্ত করে যা পক্ষপাতদুষ্ট হয় N

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

আপনার জমা করার জন্য ধন্যবাদ! একজন CJam অনুবাদ: 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আমার জন্যও দেয় (ফায়ারফক্স ৩০.০ তে)
ক্রিস্টোফ বাহ্মওয়ালদার

@ হ্যাকারকো আমি জানি না কেন, তবে আপনি যদি আমার পরীক্ষার কোডটি বিড়াল করে পেস্ট করেন তবে সাদা স্থানগুলি সংকুচিত হবে। প্রতিটি লাইন 10 টি অক্ষর হওয়া উচিত।
edc65

3

সি #, 444 372 / (342 ধন্যবাদ হ্যাকারকো) বাইটস

বরং দরিদ্র স্কোর এবং দেরিতে পার্ট, তবে মনে হয় এটি কাজ করে। আউটপুট 1 যখন আপনার একক বৃহত্তম অফিস থাকে, 0 যখন আপনি না করেন। আমি এখনও গল্ফিংয়ের সাথে খুব জটিল হইনি। ইনপুট (প্রথম লুপ) থেকে বিচ্ছিন্ন সেটগুলি তৈরি করে প্রতিটি সেট (দ্বিতীয় লুপ) এর আকার টাল করে এবং তারপরে আমার সেটটি বৃহত্তম (তৃতীয় লুপ) কিনা তা দেখার জন্য কাজ করে।

দুটি সংস্করণ সরবরাহ করা হয়, একটি হ'ল একটি সংকলনযোগ্য প্রোগ্রাম তাত কমান্ড লাইন থেকে ইনপুট গ্রহণ করে, অন্যটি কেবল একটি ফাংশন যা ইনপুট হিসাবে একটি স্ট্রিং প্রত্যাশা করে এবং ফলাফল হিসাবে একটি int প্রদান করে (এবং এটি প্রথমটির একটি পুনঃনির্মাণ কপি) - এটির জন্য কোনও ক্লজ বা এর মতো কোনও ব্যবহারের দরকার নেই, এটি যে কোনও জায়গায় রাখতে সক্ষম হওয়া উচিত এবং এটি কার্যকর হবে।

প্রোগ্রাম 372 বাইটস :

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

ফাংশন 342 বাইটস :

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 বাইট

বন্যা ভরাটের জন্য একটি ভিন্ন পদ্ধতির approach যদিও, এটি দীর্ঘতর করে তোলে ...

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

এখানে চেষ্টা করুন


আপনার জমা করার জন্য ধন্যবাদ. তবে আপনার প্রোগ্রামটি এই
ইনপুটটির

@ ব্যবহারকারী23013 স্থির।
অপ্টিমাইজার

এগুলি ব্যবহার করে দেখুন: পেস্টবিন.
com

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

ইনপুট জন্য stdin ব্যবহার করে

দ্রষ্টব্য: প্রথমে ifএকটি একক স্পেস দ্বারা ইন্ডেন্ট করা হয়, অন্যান্য ইন্ডেন্টেড লাইনগুলি হয় একক ট্যাব চর বা একটি ট্যাব এবং একটি স্থান ব্যবহার করে।


1

জে: 150 121 বাইট

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

সম্পাদনা করুন : idএবং compহাস্যকরভাবে জটিল এবং ধীর ছিল। এখন এটি cut( ;.) ব্যবহার করে 3x3 উইন্ডো দিয়ে স্ক্যান করার পরিবর্তে 4 বার মানচিত্রটি স্থানান্তর করতে কাজ করে ।

স্ট্রিং হিসাবে ব্লুপ্রিন্টকে আর্গুমেন্ট হিসাবে গ্রহণ করে। নীচে ব্যাখ্যা করা হয়েছে:

    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) এর শুরুতে একটি স্থান যুক্ত করুন
  • 2 এবং 3 লাইনের শুরুতে একটি ট্যাব অক্ষর (+0) দিয়ে স্থানটি প্রতিস্থাপন করুন
  • লাইন 4 শুরুতে সরান (+0)

আমার পুরো দীর্ঘ ব্যাখ্যাটি লিখিত ছিল, তবে দৃশ্যত এটি সঠিকভাবে সংরক্ষণ হয়নি এবং আমি আবারও এটি করছি না lmao

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.