あなたは一番大きな部屋にいますか?


29

前書き

最近、Pretty Good Software Companyでの求人を受け入れました。あなたはオフィスの大きさに満足していますが、最大のオフィスはありますか?立ち寄ったときに同僚のオフィスをただ見回すだけではわかりにくい。これを理解する唯一の方法は、建物の設計図を調べることです...

あなたのタスク

建物のフロアプランを取り、オフィスが最大かどうかを示すプログラム、スクリプト、または関数を作成します。建物はn × nの正方形であるため、フロアプランは読みやすくなっています。

入力は、n + 1で \n区切られた行で構成されます。最初の行には番号nが付きます。次のn行は、建物のフロアプランです。簡単な入力例:

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

フロアプランのルールは次のとおりです。

  • .(ASCII 46)壁を表すために使用されます。(スペース[ASCII 32])は、オープンスペースを表すために使用されます。
  • あなたはX(ASCII 88)で表されます。あなたはあなたのオフィスにいます。
  • フロアプランはn行で、各行にn文字が含まれます。
  • 建物は四方を壁で完全に囲まれています。これは、入力の2行目(フロアプランの最初の行)と入力の最後の行がすべて.sであることを意味します。また、すべてのフロアプランラインの最初と最後の文字が.sであることを意味します。
  • オフィスのサイズは、隣接するスペースの合計として定義されます(壁を通過することなく、N、S、E、Wの4方向に移動することにより連続します)。
  • オフィスのサイズの目的で、あなたを表すXは(オープンスペース)としてカウントされます
  • 4 <= n <= 80

あなたのオフィスが他のすべてのオフィスよりも厳密に大きいかどうかを出力する必要があります。出力は、選択したプログラミング言語でTrueまたはFalseを明確に示し、ゼロ、null、および空を示すFalseの標準規則に準拠するものであれば何でもかまいません。Trueは、オフィスが厳密に最大であることを意味します。

上記の入力のサンプル出力:

1

オフィスは8平方フィートで、他のオフィスは4平方フィートしかないためです。

I / Oガイドライン

  • 入力は標準入力から読み取られ、出力は標準出力に返されます。

または

  • 入力は関数への単一の文字列引数であり、answerはその関数の戻り値です。

よくある質問

  • 建物全体が壁とオフィスで構成されています。
  • 建物は1階のみ
  • 入力にはXが含まれることが保証されますが、スペースが含まれることは保証されません。1x1のオフィスがあり、建物の残りの部分は壁です(最大のオフィスがあります!

その他の例

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

ここには3つのオフィスがあり、南のオフィスは長方形、北西のオフィスは三角形(ish)、北東のオフィスは奇妙な形をしていますが、あなたのオフィスよりも大きくなっています。出力はFalseになります。

これは、最短のコードを作成するための挑戦であり、幸せなです!


素敵な問題仕様ですがX、入力で許可される最大数を追加できます。:)
グレッグヒューギル14年

4
Xは1つだけです。Xは「あなた」であり、その部屋があなたのものであることを意味します。
turbulencetoo 14年

回答:


11

Ruby 2.0、133文字

@Venteroとのコラボレーション。構文ハイライターを壊し始めるときは常に良い兆候です!

これは再帰的なフラッドフィルソリューションです。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/]

Ideone実行されいるのをご覧ください。


1
非常に素晴らしい!スプラットをf少し並べ替えることで、さらに2つのキャラクターを保存できると思います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
Ventero

1
ああ、さらに良い。:)最後の編集に対するもう1つの改善:gets(p)p何もせず、nil引数なしで呼び出された場合に戻ります。
ヴェンテロ14年

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}でき!=ます。
ヴェンテロ14年

1
最後の一つの改良:悪用することでString#scanARGV:、最大の部屋は少し短縮することができます見つけること$_.scan(/ /){$*<<f[$.size]}; P $ *最大<F [〜/ X /] `。
Ventero

1
申し訳ありませんが、再びあなたを盗聴するために、私は実際に割り当てをインライン化することにより:) ...別の改善を見つけnfのようなもので[~n=$_.to_i,...]、あなたが、その後に第一および第三のラインを組み合わせることができますgets(p).scan(...134文字の合計。
ヴェンテロ14年

7

GolfScript(85バイト)

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

オンラインデモ

これには3つのセクションがあります。

  1. 0壁を表すのに使用する2D配列を生成する初期入力変換N(セルの総数)を使用して開始位置を表し、各オープンスペースの異なる数を表します。

    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 14年

3

Javascript(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
}

テスト

FirefoxのJavascriptコンソール

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

2番目のもの1も(Firefox 30.0で)私に与えます
クリストフベームヴァルダー14

@HackerCow理由はわかりませんが、テストコードからcat&pasteすると、空白が圧縮されます。各行は10文字にする必要があります。
edc65 14

3

C#、444 372 /(342 thanks HackerCow)bytes

かなり悪いスコアでパーティーに遅れましたが、うまくいくようです。最大のオフィスが1つある場合は1、ない場合は0を出力します。私はまだゴルフにあまり精通していません。入力から互いに素なセットを構築し(最初のループ)、各セットのサイズを集計し(2番目のループ)、次に私のセットが最大かどうかを確認します(3番目のループ)。

2つのバージョンが提供されます。1つはコマンドラインからの入力を受け入れるコンパイル可能なプログラム、もう1つは入力として文字列を期待し、結果としてintを返す関数です(最初のコピーを修正したものです)。 using句などは必要ありません。どこにでも配置でき、機能します。

プログラム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()を返すことができると言います。これはあなたに保存する必要があり、多くのコード10
クリストフBöhmwalder

@HackerCowありがとう、私はその条項を完全に逃しました!次の編集で関数バージョンを配置します。
VisualMelon 14

2

CJam、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が修正されました。
オプティマイザー14年

これらを試してみてください:pastebin.com/WyRESLWE
jimmy23013

2

Python 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

J: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

Python 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.