Bạn đang ở trong phòng lớn nhất?


29

Giới thiệu

Gần đây bạn đã chấp nhận lời mời làm việc tại một Công ty Phần mềm Khá Tốt. Bạn có nội dung đẹp với quy mô văn phòng của bạn, nhưng bạn có văn phòng lớn nhất không? Thật khó để nói từ việc chỉ nhìn vào văn phòng của đồng nghiệp khi bạn ghé qua. Cách duy nhất để tìm ra điều này là kiểm tra các bản thiết kế cho tòa nhà ...

Nhiệm vụ của bạn

Viết chương trình, tập lệnh hoặc chức năng lấy sơ đồ tầng cho tòa nhà của bạn và cho biết liệu văn phòng của bạn có lớn nhất hay không. Kế hoạch sàn là dễ đọc vì tòa nhà là một n bởi n vuông.

Đầu vào sẽ bao gồm các dòng giới hạn n + 1 \n . Dòng đầu tiên sẽ có số n trên đó. N dòng tiếp theo sẽ là sơ đồ tầng cho tòa nhà. Một ví dụ đơn giản đầu vào:

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

Các quy tắc cho sơ đồ tầng như sau:

  • .(ASCII 46) Sẽ được sử dụng để đại diện cho các bức tường. (Không gian [ASCII 32]) sẽ được sử dụng để thể hiện không gian mở.
  • Bạn được đại diện bởi một X(ASCII 88). Bạn đang ở trong văn phòng của bạn.
  • Sơ đồ tầng sẽ là n dòng, mỗi dòng có n ký tự.
  • Tòa nhà được bao quanh hoàn toàn bởi các bức tường ở tất cả các phía. Điều này ngụ ý rằng dòng đầu vào thứ 2 (dòng đầu tiên của sơ đồ tầng) và dòng đầu vào cuối cùng sẽ là tất cả .s. Nó cũng ngụ ý rằng các ký tự đầu tiên và cuối cùng của mỗi dòng sàn sẽ là .s.
  • Một kích thước văn phòng được định nghĩa là tổng của các không gian liền kề (tiếp giáp bằng cách di chuyển theo 4 hướng, N, S, E, W, mà không đi qua một bức tường).
  • Với mục đích kích thước văn phòng, X đại diện cho bạn được tính là một (không gian mở)
  • 4 <= n <= 80

Bạn nên xuất ra liệu văn phòng của bạn có lớn hơn tất cả các văn phòng khác hay không. Đầu ra có thể là bất cứ điều gì biểu thị rõ ràng Đúng hoặc Sai trong ngôn ngữ lập trình bạn chọn và tuân thủ các quy ước chuẩn về 0, null và rỗng biểu thị Sai. Đúng ngụ ý văn phòng của bạn là nghiêm túc nhất.

Đầu ra mẫu cho đầu vào trên:

1

Bởi vì văn phòng của bạn rộng 8 feet vuông, và văn phòng khác chỉ có 4 feet vuông.

Hướng dẫn I / O

  • Đầu vào có thể được đọc từ stdin và trả lời đầu ra cho thiết bị xuất chuẩn.

Hoặc là

  • Đầu vào có thể là một đối số chuỗi đơn cho một hàm và câu trả lời là giá trị trả về của hàm đó.

Câu hỏi thường gặp

  • Toàn bộ tòa nhà bao gồm các bức tường và văn phòng.
  • Tòa nhà chỉ có một tầng.
  • Có đảm bảo là X trong đầu vào, nhưng không được đảm bảo có bất kỳ khoảng trắng nào. Bạn có thể có một văn phòng 1x1 và phần còn lại của tòa nhà là những bức tường (Bạn có văn phòng lớn nhất! Hoan hô!).

Ví dụ khác

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

Ở đây có 3 văn phòng, văn phòng phía nam của bạn là hình chữ nhật, văn phòng phía tây bắc là một hình tam giác (ish) và văn phòng phía đông bắc bị biến dạng một cách kỳ lạ, nhưng lớn hơn văn phòng của bạn. Đầu ra phải là Sai.

Đây là một thách thức để viết mã ngắn nhất, vui vẻ !


Đặc tả vấn đề đẹp, nhưng bạn có thể thêm số lượng tối đa Xđược phép trong đầu vào. :)
Greg Hewgill

4
Chỉ có một X. X là "bạn" và biểu thị rằng phòng mà nó ở là của bạn.
turbulencetoo

Câu trả lời:


11

Ruby 2.0, 133 ký tự

Một sự hợp tác với @Ventero. Luôn luôn là một dấu hiệu tốt khi nó bắt đầu phá vỡ cú pháp highlighter!

Đây là một giải pháp lấp lũ đệ quy. Đọc từ STDIN và xuất ra 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/]

Xem nó chạy trên Ideone .


1
Rất đẹp! Tôi nghĩ rằng bạn có thể lưu thêm hai ký tự bằng cách sắp xếp lại các biểu tượng trong fmột lát : 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}. Và sửa lỗi cho tôi nếu tôi sai, nhưng có vẻ như nó không thực sự quan trọng nếu dòng đầu tiên chứa độ dài còn lại $_, điều này sẽ cho phép bạn rút ngắn phân tích cú pháp đầu vào thànhgets$e;n=$_.to_i
Ventero

1
Ah, thậm chí còn tốt hơn. :) Thêm một cải tiến so với lần chỉnh sửa cuối cùng của bạn : gets(p), cũng như pkhông có gì và trả về nilnếu được gọi mà không có đối số.
Ventero

1
Thật ra, tôi lấy lại những gì tôi đã nói trước đó. Sử dụng sắp xếp splat ban đầu của bạn, chúng tôi có thể sử dụng thực tế producttrả về máy thu để loại bỏ lhoàn toàn: f=->*a{a.product([~n,-1,1,n+1]){|p,d|a|=[p+d]if$_[p+d]<?.}!=a ?f[*a]:a.size}- thật không may, chúng tôi không thể chuyển đổi lhs và rhs của !=để loại bỏ khoảng trắng, vì nếu không cả hai bên đều trỏ đến mảng không được sửa đổi.
Ventero

1
Một cải tiến cuối cùng: Bằng cách lạm dụng String#scanARGV, việc tìm phòng lớn nhất có thể rút ngắn một chút: $_.scan(/ /){$*<<f[$.size]}; p $ *. Max <f [~ / X /] `
Ventero

1
Xin lỗi vì đã làm phiền bạn một lần nữa, nhưng tôi thực sự đã tìm thấy một cải tiến khác ... :) Bằng cách đặt nội tuyến bài tập nvào fmột cái gì đó giống như [~n=$_.to_i,...], sau đó bạn có thể kết hợp dòng thứ nhất và thứ ba thành gets(p).scan(...tổng cộng 134 ký tự.
Ventero

7

GolfScript (85 byte)

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

Bản demo trực tuyến

Điều này có ba phần:

  1. Một biến đổi đầu vào ban đầu tạo ra một mảng 2D sử dụng 0để biểu diễn một bức tường, N(tổng số ô) để biểu thị vị trí bắt đầu của tôi và một số khác biệt giữa các ô cho không gian mở khác.

    n/(~.*:N:^;{{5%[0.^(:^N]=}/]}%
    
  2. Một trận lụt.

    {{{.2$*!!{[\]$-1=.}*}*]}%zip}N*
    
  3. Việc đếm cuối cùng. Điều này sử dụng một biến thể trên đầu cho phần tử phổ biến nhất trong một mảng , thêm một bộ ngắt kết nối có khuynh hướng chống lại N.

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

Cảm ơn bạn đã gửi! Một bản dịch của CJam : qN/(~_*:T:U;{[{i5%[0_U(:UT] =}/]}%{{[{_2$*!!{[\]$W=_}*}*]}%z}T*:+0-:A{_T=A@-,2*+}$0=T=.
jimmy23013

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

Phiên bản cơ sở

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
}

Kiểm tra

Bảng điều khiển Javascript trong firefox

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

Cái thứ hai cũng 1cho tôi (trong Firefox 30.0)
Christoph Böhmwalder

@HackerCow Tôi không biết tại sao, nhưng nếu bạn cat & dán từ mã kiểm tra của tôi, các khoảng trắng sẽ bị nén. Mỗi dòng nên là 10 ký tự.
edc65

3

C #, 444 372 / (342 cảm ơn HackerCow) byte

Điểm số khá kém và đến bữa tiệc muộn, nhưng dường như làm việc. Kết quả 1 khi bạn có văn phòng lớn nhất, 0 khi bạn không có. Tôi đã không quá phức tạp với việc chơi golf. Hoạt động bằng cách xây dựng các bộ tách rời khỏi đầu vào (vòng lặp thứ nhất), kiểm tra kích thước của từng bộ (vòng lặp thứ hai) và sau đó tìm xem bộ của tôi có lớn nhất không (vòng thứ ba).

Hai phiên bản được cung cấp, một phiên bản có thể biên dịch được chấp nhận đầu vào từ dòng lệnh, phiên bản còn lại chỉ là một hàm mong đợi một chuỗi là đầu vào và trả về một kết quả int (và chỉ là bản sao được làm lại của đầu tiên) - nó không cần sử dụng bất kỳ mệnh đề hay tương tự nào, nên có thể đặt nó ở bất cứ đâu và nó sẽ hoạt động.

Chương trình 372byte :

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

Chức năng 342byte :

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;

Ít chơi gôn hơn:

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
Theo cách tôi hiểu, bạn không cần phải thực sự viết một chương trình làm việc, một chức năng là đủ. Vì vậy, nếu bạn bỏ tất cả các thứ trước Mainhàm và thay thế hàm bằng, giả sử int f(string s)bạn có thể sử dụng s.Split('\n')[0]thay vì Console.ReadLine()và trả lại 1hoặc 0. Điều này sẽ giúp bạn tiết kiệm rất nhiều
Christoph Böhmwalder

@HackerCow cảm ơn, tôi hoàn toàn bỏ lỡ điều khoản đó! Tôi sẽ đặt phiên bản chức năng trong lần chỉnh sửa tiếp theo.
VisualMelon

2

CJam, 106 byte

Một cách tiếp cận khác nhau để lấp lũ. Mặc dù, làm cho nó dài hơn ...

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

Hãy thử nó ở đây


Cảm ơn bạn đã gửi. Nhưng chương trình của bạn đưa ra một ngoại lệ với đầu vào này: pastebin.com/v989KhWq
jimmy23013

@ user23013 đã sửa.
Tối ưu hóa

Hãy thử những điều sau: pastebin.com/WyRESLwe
jimmy23013

2

Python 2 - 258 byte

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

sử dụng stdin cho đầu vào

Lưu ý: đầu tiên ifđược thụt lề bởi một khoảng trắng, các dòng thụt lề khác sử dụng một tab char hoặc một tab và một khoảng trắng.


1

J: 150 121 byte

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

Chỉnh sửa : idcomprất phức tạp và chậm chạp. Bây giờ nó hoạt động thay đổi bản đồ 4 lần, thay vì quét nó bằng cửa sổ 3x3 bằng cách sử dụng cut(;. ).

Đưa ra đối số của kế hoạch chi tiết dưới dạng chuỗi. Giải thích bên dưới:

    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 byte

Tôi không tập luyện

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]

Đây là một câu trả lời hàm, nhưng nó gây ô nhiễm không gian tên toàn cầu. Nếu điều này không được chấp nhận, nó có thể được sửa với giá 1 byte:

  • Thêm khoảng trắng vào đầu dòng 1 (+1)
  • Thay thế khoảng trắng ở đầu dòng 2 và 3 bằng ký tự tab (+0)
  • Di chuyển dòng 4 đến đầu (+0)

Tôi đã có một lời giải thích dài dòng được viết ra, nhưng dường như nó không được lưu đúng cách và tôi sẽ không làm điều đó một lần nữa lmao

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.