Nhà hát Chỗ ngồi


12

Bài tập

Một nhà hát có 10 dòng, dán nhãn Ađể Jtừ trước ra sau, và 15 ghế trong mỗi hàng, được đánh số từ 1 tới 15 từ trái sang phải.

Chương trình sử dụng các quy tắc sau để chọn chỗ ngồi tốt nhất.

  • Quy tắc 1: Tất cả các ghế trong một lần đặt phải ở cùng một hàng, cạnh nhau.
  • Quy tắc 2: Các ghế phải càng gần mặt trước càng tốt, sau đó càng gần bên trái càng tốt (chữ cái thấp nhất, sau đó là số thấp nhất)

Viết hàm lấy số lượng vé muốn làm đầu vào số nguyên ( n) và xuất ra số ghế tốt nhất có sẵn trong danh sách độ dài n.

Chương trình của bạn nên:

  • Đầu ra -1nếu 1> Đầu vào hoặc Đầu vào> 15 *
  • Đầu ra -1nếu ghế không có sẵn *
  • Có chức năng B(n)mà người dùng có thể sử dụng để nhập số lượng ghế mong muốn.

* Bạn có thể xuất -1 trong danh sách nếu việc này dễ dàng hơn

Ví dụ

Tôi / O

Gọi B(5)trên một mảng mới sẽ trả về [A1, A2, A3, A4, A5]
Gọi B(2)sau đó sẽ trả về [A6, A7]
Gọi B(10)sau đó sẽ trả lại [B1, B2, ... B9, B10]
Gọi B(-1)luôn luôn trả về-1

Giải pháp không chơi gôn Python

Theatre = [ [False] * 16 ] * 11

def B(n):
    if 0 <= n <= 15:         
        for i in range(10):
            for j in range(15-n+1):
                try:
                    if not Theatre[i][j]:
                        if not Theatre[i][j + n]:
                            row = i
                            start = j
                            List = []
                            for q in range(n):
                                List.append(chr(row + 65) + str(start + q + 1))
                                Theatre[row][start + q] = True
                            return List
                except:
                    break
    return -1

1
Có phải "Đã mã hóa danh sách chỗ ngồi trong một mảng hai chiều" không? Có rất nhiều cách để làm điều này mà không cần điều đó; yêu cầu thực sự hạn chế các giải pháp.
Justin

2
Bạn nói rằng mảng 2-D phải được mã hóa cứng, nhưng ví dụ Python của bạn thậm chí không mã hóa nó, nó sử dụng một sự hiểu biết để tạo một danh sách mới khi chạy.
Tony Ellis

6
Tại sao thậm chí đề cập đến "một danh sách các ghế trong một mảng hai chiều"? Nghe có vẻ giống như một chi tiết triển khai và nếu ai đó tạo ra một chương trình thỏa mãn đầu ra cần thiết mà không cần sử dụng một mảng, thì sẽ không có vấn đề gì với điều đó.
Greg Hewgill

2
Nếu đầu vào bằng 0 thì sao?
edc65

1
@ edc65 Tôi luôn làm cho những người bảo trợ rạp chiếu phim không tồn tại của tôi ngồi ở vị trí tốt nhất của nhà hát, trên đùi của một người bảo trợ khác nếu cần. Họ không bao giờ để ý.
Adam Davis

Câu trả lời:


4

JavaScript - 172

Chức năng chính nó là 172:

//build persistent seats
m=[];
for(i=10;i--;){m[i]={r:String.fromCharCode(i+65),s:[]};for(j=0;j<15;j++)m[i].s.push(j+1);}

function b(z){for(i=0;i<m.length;i++)for(j=0,u=m[i].s.length;o=[],j<u;j++)if(u>=z&z>0){for(m[i].s=m[i].s.slice(z),p=m[i].s[0]||16;o[--z]=m[i].r+--p,z;);return o;}return-1;}

Đầu vào:

console.log(b(-1));
console.log(b(0));
console.log(b(4));
console.log(b(15));
console.log(b(1));
console.log(b(20));

Đầu ra:

-1
-1
[ 'A1', 'A2', 'A3', 'A4' ]
[ 'B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8', 'B9', 'B10', 'B11', 'B12', 'B13', 'B14', 'B15' ]
[ 'A5' ]
-1

4

Javascript ( ES6 ) - 130 127 107 101 98

B=n=>(a=>{for(;n>0&a<9;)if((b=~~B[++a]+n)<16)for(B[a]=b;n--;)c[n]='ABCDEFGHIJ'[a]+b--})(c=[-1])||c

Demo tại đây: http://jsfiddle.net/tBu5G/

Một số ý tưởng được lấy từ @ edc65


c [B [a] = b] thay vì c [], B [a] = b là thông minh, nhưng không thành công cho n = 0
edc65

@ edc65 bắt đẹp. Bây giờ tôi đã điều chỉnh nó để xử lý vụ việcn=0
nderscore

Tuyệt vời. Đó là điều cần nhớ để tránh 'trở về' - cảm ơn vì đã chia sẻ (+1)
edc65

@ edc65 cảm ơn! Tôi tưởng là nó thú vị. MT0 đã khiến chúng tôi đánh bại cả hai! : P
nderscore

3

Haskell, 129

t=[[a:show s|s<-[1..15]]|a<-['A'..'J']]
b n=(n%).span((<n).length)
_%(h,[])=([],h)
n%(j,(r:s))=let(t,u)=splitAt n r in(t,j++u:s)

Một số điều chỉnh đã được thực hiện để biến điều này thành chức năng trong Haskell: btrả về một cặp: vé (nếu có thể) và trạng thái mới của nhà hát. tlà trạng thái nhà hát ban đầu, với tất cả các vé chưa được bán. Ngoài ra, việc trả lại -1là không tự nhiên đối với Haskell, vì vậy nếu không có vé nào có thể được phát hành cho một yêu cầu, danh sách trống sẽ được trả lại cho các vé.

λ: let (k1,t1) = b 5 t
λ: k1
["A1","A2","A3","A4","A5"]

λ: let (k2,t2) = b 2 t1
λ: k2
["A6","A7"]

λ: let (k3,t3) = b 10 t2
λ: k3
["B1","B2","B3","B4","B5","B6","B7","B8","B9","B10"]

λ: let (k4,t4) = b (-1) t3
λ: k4
[]

λ: let (k5,t5) = b 2 t4
λ: k5
["A8","A9"]

3

APL (75)

T←10 15⍴0⋄B←{(⍵∊⍳15)∧∨/Z←,T⍷⍨⍵/0:+T[P]←{⎕A[⍺],⍕⍵}/¨P←(⊃Z/,⍳⍴T)∘+¨1-⍨⍳1⍵⋄¯1}

Kiểm tra:

      B 5
  A1    A2    A3    A4    A5  
      B 2
  A6    A7  
      B 10
  B1    B2    B3    B4    B5    B6    B7    B8    B9    B10  
      B ¯1
¯1
      B 3
  A8    A9    A10  

Giải trình:

  • T←10 15⍴0: Tlà ma trận 15 nhân 10 giữ trạng thái rạp hát (0 = miễn phí)
  • B←{... }: chức năng
    • (⍵∊⍳15): if là thành viên của bộ số nguyên từ 1 đến 15,
    • ∨/Z←,T⍷⍨⍵/0: và Tchứa các số 0 liên tiếp (lưu trữ các điểm bắt đầu có thể trongZ ),
    • :: sau đó:
      • (⊃Z/,⍳⍴T): chọn tọa độ bắt đầu có thể và lấy tọa độ đầu tiên,
      • ∘+¨1-⍨⍳1⍵: thêm ⍵-1nhiều vị trí ở bên phải tọa độ bắt đầu
      • P←: lưu trữ tọa độ trong P
      • {⎕A[⍺],⍕⍵}/¨: định dạng tọa độ
      • T[P]←: lưu trữ các tọa độ được định dạng tại vị trí của chúng trong T. (mọi giá trị khác 0 trong T sẽ làm)
      • +: trả về kết quả, là tọa độ được định dạng (kết quả của phép gán được mặc định theo mặc định)
    • ⋄¯1: nếu không, trở lại ¯1.

3

Javascript (E6) 99 103 113 121

Thực sự bạn chỉ cần lưu trữ một số cho mỗi hàng

B=n=>{for(r=i=[-1];n>0&i++<9;)if((a=~~B[i]+n)<16)for(B[i]=a;n--;)r[n]='ABCDEFGHIJ'[i]+a--;return r}

Kiểm tra

'5:'+B(5)+'\n2:'+B(2)+'\n10:'+B(10)+'\n0:'+B(0)+'\n1:'+B(-1))+'\n3:'+B(3)

Ung dung

B = n => {
  for (r = i = [-1]; n > 0 & i++ < 9;)
    if ((a = ~~B[i] + n) < 16)
      for (B[i] = a; n--; ) r[n] = 'ABCDEFGHIJ'[i] + a--;
  return r;
}

3

JavaScript (Bản thảo ECMAScript 6) - 96 95 91 Ký tự

Một giải pháp đệ quy:

Phiên bản 1

B=(n,r=0)=>n>0&&(k=~~B[r])+n<16?[...Array(n)].map(_=>'ABCDEFGHIJ'[r]+(B[r]=++k)):r<9?B(n,r+1):-1

Phiên bản 2:

B=(n,r=0)=>n<1|r>9?-1:(k=B[r]|0)+n<16?[...Array(n)].map(_=>'ABCDEFGHIJ'[r]+(B[r]=++k)):B(n,r+1)

(Cảm ơn nderscore vì đã truyền cảm hứng cho việc tiết kiệm 1 ký tự)

Phiên bản 3:

B=(n,r=0)=>n<1|r>9?-1:(B[r]^=0)+n<16?[...Array(n)].map(_=>'ABCDEFGHIJ'[r]+ ++B[r]):B(n,r+1)

(Cảm ơn nderscore )

Giải trình:

B = function(n,r=0)          // Create a function B with arguments:
                             // - n is the number of seats to book
                             // - r is the row number (defaults to 0)
{
  var k = ~~B[r];            // get the number of seats already booked in row r
  if (  n > 0                // ensure that n is a valid booking
     && k+n<16 )             // check that there are enough seats remaining in row r
  {
    var P = new Array(n);    // Create an array with length n with no elements initialised
    var Q = [...P];          // Use P to create an array with every element
                             // initialised to undefined
    var R = 'ABCDEFGHIJ'[r]; // get the row ID.
    B[r] = k + n;            // Increment the number of seats booked in row r by n.
    var S = Q.map(
      function(){
        return R + (++k);    // Map each value of Q to the row ID concatenated with
                             // the seat number.
      }
    );
    return S;                // Return the array of seats.
  }
  else if ( r < 9 )          // If there are more rows to check
  {
    return B(n,r+1);         // Check the next row.
  }
  else                       // Else (if n is invalid or we've run out of rows)
  {
    return -1;               // Return -1.
  }
}

Giải pháp tốt đẹp. Tôi đã làm việc trên một cái gì đó tương tự. Đây là -1 byte:B=(n,r=0)=>n>0&r<9?(k=B[r]|0)+n<16?[...Array(n)].map(_=>'ABCDEFGHIJ'[r]+(B[r]=++k)):B(n,r+1):-1
nderscore

Cảm ơn, thật không may là một cái không hoạt động tốt vì bạn không thể đặt hàng J nhưng phủ nhận kiểm tra đầu tiên để cung cấp B=(n,r=0)=>n<1|r>9?-1:(k=B[r]|0)+n<16?[...Array(n)].map(_=>'ABCDEFGHIJ'[r]+(B[r]=++k)):B(n,r+1)sẽ hoạt động.
MT0

Ah, bắt tốt.
nderscore

Và nó tiếp tục giảm ... (91)B=(n,r=0)=>n<1|r>9?-1:(B[r]^=0)+n<16?[...Array(n)].map(_=>'ABCDEFGHIJ'[r]+ ++B[r]):B(n,r+1)
nderscore

2

GolfScript, 103 82 byte

226,1>15/[0]*:T{:&0>{T[{),&~)>:|T\/,2=}?]{T|-:T;|{(.[15/65+]\15%)`+}%}-1if}-1if}:B

Ví dụ

$ cat theatre.gs
226,1>15/[0]*:T
{:&0>{T[{),&~)>:|T\/,2=}?]{T|-:T;|{(.[15/65+]\15%)`+}%}-1if}-1if}:B

5  B p  # Execute B(5), stringify and print.
2  B p
15 B p
17 B p
0  B p

{}:puts # Disable automatic output.
$
$ golfscript theatre.gs
["A1" "A2" "A3" "A4" "A5"]
["A6" "A7"]
["B1" "B2" "B3" "B4" "B5" "B6" "B7" "B8" "B9" "B10" "B11" "B12" "B13" "B14" "B15"]
-1
-1

Làm thế nào nó hoạt động

226,1>           # Push the array [ 1 … 225 ].
15/[0]*          # Split in chunks of 15 elements and join separating by zeros.
:T               # Save result in T.
{                #
  :&0>           # Save the function's argument in & and check if it's positive.
  {              # If it is:
    T[{          # For each seat S in T:
      ),         # Push [ 0 … S ].
      &~)>       # Reduce two [ S-(&-1) … S ].
      :|         # Save the result in |.
      T\/        # Split T around |.
      ,2=        # If there are two chunks, the seats are available.
    }?]          # Find the first S that satisfies the above condition.
    {            # If there was a match:
      T|-:T;     # Remove the seats in | from T.
      |{         # For each seat S in |:
        (.       # Push S+1 S+1.
        [15/65+] # Compute (S+1)/15+65; the ASCII character corresponding to the row.
        \15%)`+  # Compute (S+1)%15+1, stringify and concatenate. 
      }%         #
    }            #
    -1if         # If there was no match, push -1 instead.
  }              #
  -1if           # If the argument was non-positive, push -1 instead.
}

1

CoffeeScript - 171 150 149

Tôi nghi ngờ Ruby hoặc Perl sẽ đánh bại điều này sớm.

c=0;l=64;k=1
f=(n)->
 if n<0 or n>15 or 150-c<n
  return-1
 a=[]
 for i in[1..n]
  if c%15==0
   ++l;k=1
  ++c;a.push String.fromCharCode(l)+k;++k
 a

JavaScript / Giải thích tương đương :

Đối với những người không quen thuộc với CoffeeScript.

var seats  = 0; //Occupied seats.
var letter = 64; //ASCII code for row letter.
var index  = 1;  //Index of seat in row.

function seats( count )
{
    if( count < 0 || count > 15 || ( 150 - seats ) < count )
        return -1;

    var assignedSeats = [];

    for( var i = 1; i <= count; ++i )
    {
        if( ( seats % 15 ) === 0 )
        {
            ++letter;
            index = 1;
        }

        ++seats; //Occupy a seat.
        assignedSeats.push( String.fromCharCode( letter ) + index );
        ++index;
    }

    return assignedSeats;
}

Hãy thử trực tuyến .


1
Giải pháp này không thỏa mãn quy tắcAll seats in one booking must be in the same row, next to each other.
nderscore

0

Rắn hổ mang - 309

Điều này sẽ làm điều đó, nhưng tôi thực sự không thể đến một trình biên dịch trong vài giờ, vì vậy tôi sẽ cập nhật nó sau nếu cần.

class P
    var s=List<of List<of String>>()
    def main
        for l in 'ABCDEFGHIJ'
            t=[]
            for n in 1:16,t.insert(0,l.toString+n.toString)
            .s.add(t)
    def b(n) as List<of String>
        t=[]
        for r in .s.count,if .s[r].count>=n
            for i in n,t.add(.s[r].pop)
            break
        return if(n>0 and t<>[],t,['-1'])

0

C # - 289

Nỗ lực đầu tiên tại mã golf.

int[]s=new int[10];string[]B(int n){string[]x=new string[]{"-1"};if(n<1||n>15)return x;int m=(int)Math.Pow(2, n)-1;for(int i=0;i<10;++i){for(int j=0;j<15-n;++j){if((s[i] &m)==0){s[i]|=m;string[]r=new string[n];for(int k=0;k<n;++k)r[k]=(""+(char)(i+65)+(j+k+1));return r;}m<<=1;}}return x;}

Không chơi gôn

int[] s = new int[10];
string[] B(int n)
{
    string[] x = new string[] { "-1" };
    if (n < 1 || n > 15) return x;
    int m = (int)Math.Pow(2, n) - 1;
    for (int i = 0; i < 10; ++i)
    {
        for (int j = 0; j < 15 - n; ++j)
        {
            if ((s[i] & m) == 0)
            {
                s[i] |= m;
                string[] r = new string[n];
                for (int k = 0; k < n; ++k)
                    r[k] = ("" + (char)(i + 65) + (j+k+1));
                return r;
            }
            m <<= 1;
        }
    }
    return x;
}

0

K, 140

d:10#,15#0b
B:{if[(x<0)|x>15;:-1];$[^r:*&&/'~:^a:{(*&&/'{x(!1+(#x)-y)+\:!y}[d x;y])+!y}[;x]'!#d;-1;[.[`d;(r;a r);~:];(10#.Q.A)[r],/:$1+a r]]}

Chắc chắn có rất nhiều cải tiến được thực hiện ở đây


0

C ++ - 257

Cũng là một nỗ lực đầu tiên tại golf.

static vector< int > t (10, 0);

vector<string> b(int n){
    vector<string> o;
    int i=0,j;
    for(;i<10&&16>n&&n>0;i++){
        if(15-t[i]<n) continue;
        char l='A'+i;
        for(j=t[i];j<n+t[i];j++){
           o.push_back(l + toS(j + 1));
        }
        t[i]+=n;
        n=0;
    }
    if(o.empty()) o.push_back("-1");
    return o;
}

Vì to_opes không hoạt động với trình biên dịch của tôi, toS được định nghĩa là

string toS(int i){
    return static_cast<ostringstream*>( &(ostringstream() << i) )->str();
}

Và như một giao diện nhỏ

int main(){
int input = 0;
bool done = false;
while (!done){
    cout << "how many seats would you like? (0 to exit)\n";
    cin >> input;
    vector<string> selection = b(input);
    for (auto s : selection){
        cout << s << ' ';
    }
    cout << endl;
    if (input == 0) break;
}
return 0;
}

1
Chỉ cần loại bỏ khoảng trắng không cần thiết sẽ đưa nó xuống 243 ký tự.
tomsmeding

vector<int> t(10,0);vector<string> b(int n){vector<string> o;for(int i=0,j;i<10&&16>n&&n>0;i++){if(15-t[i]<n)continue;char l='A'+i;for(j=0;j<n;j++)o.push_back(l+to_string(j+t[i]+1));t[i]+=n;n=0;}if(o.empty())o.push_back("-1");return o;}
Chơi

0

C # - 268 byte

Mã đánh gôn:

int[]s=new int[10];string[]B(int n){string[]x={"-1"};if(n<1||n>15)return x;int m=(int)Math.Pow(2,n)-1;for(int i=0;++i<10;){for(int j=0;++j<15-n;){if((s[i]&m)==0){s[i]|=m;var r=new string[n];for(int k=0;++k<n;)r[k]=(""+(char)(i+65)+(j+k+1));return r;}m<<=1;}}return x;}

Mã bị đánh cắp:

    int[] s = new int[10];
    string[] B(int n)
    {
        string[] x = { "-1" };
        if (n < 1 || n > 15) return x;
        int m = (int)Math.Pow(2, n) - 1;
        for (int i = 0; ++i < 10;)
        {
            for (int j = 0; ++j < 15 - n;)
            {
                if ((s[i] & m) == 0)
                {
                    s[i] |= m;
                    var r = new string[n];
                    for (int k = 0; ++k < n;)
                        r[k] = ("" + (char)(i + 65) + (j + k + 1));
                    return r;
                }
                m <<= 1;
            }
        }
        return x;
    }

Tôi đã có thể viết một số chú thích vào một nhận xét về giải pháp của GoldenDragon thay vì tự tạo, nhưng danh tiếng của tôi không cho phép điều đó.

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.