Tempat Duduk Teater


12

Tugas

Sebuah teater memiliki 10 baris, berlabel Auntuk Jdari depan ke belakang, dan 15 kursi di setiap baris, nomor 1 sampai 15 dari kiri ke kanan.

Program ini menggunakan aturan berikut untuk memilih kursi terbaik.

  • Aturan 1: Semua kursi dalam satu pemesanan harus di baris yang sama, di sebelah satu sama lain.
  • Aturan 2: Kursi harus sedekat mungkin ke depan, lalu sedekat mungkin ke kiri (huruf terendah, lalu angka terendah)

Tulis fungsi yang mengambil jumlah tiket yang diinginkan sebagai input integer ( n), dan output kursi terbaik yang tersedia dalam daftar panjang n.

Program Anda harus:

  • Keluaran -1jika 1> Input atau Input> 15 *
  • Keluaran -1jika kursi tidak tersedia *
  • Memiliki fungsi B(n)yang dapat digunakan pengguna untuk memasukkan jumlah kursi yang diinginkan.

* Anda dapat menampilkan -1 dalam daftar jika membuatnya lebih mudah

Contohnya

I / O

Memanggil B(5)pada array baru harus kembali [A1, A2, A3, A4, A5]
Memanggil B(2)setelah itu kemudian kembali [A6, A7]
Memanggil B(10)setelah itu kemudian kembali [B1, B2, ... B9, B10]
Memanggil B(-1)harus selalu kembali-1

Batalkan Solusi 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
Apakah "Apakah hardcoded daftar kursi dalam susunan dua dimensi" perlu? Ada banyak cara untuk melakukan ini tanpa itu; persyaratan tersebut benar-benar membatasi solusi.
Justin

2
Anda mengatakan array 2-D harus hard-coded, tetapi contoh Python Anda bahkan tidak hard-code, menggunakan pemahaman untuk membuat daftar baru saat runtime.
Tony Ellis

6
Mengapa bahkan menyebutkan "daftar kursi dalam susunan dua dimensi"? Kedengarannya seperti detail implementasi dan jika seseorang membuat program yang memenuhi output yang dibutuhkan tanpa menggunakan array, seharusnya tidak ada masalah dengan itu.
Greg Hewgill

2
bagaimana jika inputnya 0?
edc65

1
@ edc65 Saya selalu membuat pengunjung bioskop saya yang tidak ada duduk di tempat terbaik di teater, di pangkuan pelindung lain jika perlu. Mereka tidak pernah memperhatikan.
Adam Davis

Jawaban:


4

JavaScript - 172

Fungsinya sendiri adalah 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;}

Memasukkan:

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

Keluaran:

-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 di sini: http://jsfiddle.net/tBu5G/

Beberapa ide diambil dari @ edc65


c [B [a] = b] bukannya c [], B [a] = b pintar, tetapi gagal untuk n = 0
edc65

@ edc65 tangkapan yang bagus. Saya sekarang telah menyesuaikannya untuk menangani kasus inin=0
nderscore

Luar biasa. Itu sesuatu yang harus diingat untuk menghindari 'kembali' - terima kasih telah berbagi (+1)
edc65

@ edc65 terima kasih! Saya pikir itu menarik. MT0 berhasil mengalahkan kita berdua! : 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)

Beberapa penyesuaian harus dilakukan untuk membuat fungsi ini di Haskell: bmengembalikan sepasang: tiket (jika mungkin), dan keadaan teater yang baru. tadalah kondisi teater awal, dengan semua tiket belum terjual. Juga, pengembalian -1itu tidak wajar untuk Haskell, jadi jika tidak ada tiket yang dapat dikeluarkan untuk permintaan, daftar kosong dikembalikan untuk tiket.

λ: 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}

Uji:

      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  

Penjelasan:

  • T←10 15⍴0: Tadalah matriks 15-kali-10 yang menahan status teater (0 = gratis)
  • B←{... }: fungsinya
    • (⍵∊⍳15): if adalah anggota himpunan bilangan bulat dari 1 hingga 15,
    • ∨/Z←,T⍷⍨⍵/0: dan Tberisi nol secara berurutan (menyimpan titik awal yang memungkinkan Z),
    • :: kemudian:
      • (⊃Z/,⍳⍴T): pilih koordinat mulai yang mungkin, dan ambil yang pertama,
      • ∘+¨1-⍨⍳1⍵: tambahkan ⍵-1lebih banyak posisi di sebelah kanan koordinat awal
      • P←: simpan koordinat dalam P
      • {⎕A[⍺],⍕⍵}/¨: memformat koordinat
      • T[P]←: menyimpan koordinat yang diformat di tempat mereka di T. (nilai nol di T akan dilakukan)
      • +: kembalikan hasil, yang merupakan koordinat yang diformat (hasil penugasan secara tacit secara default)
    • ⋄¯1: jika tidak, kembali ¯1.

3

Javascript (E6) 99 103 113 121

Sungguh Anda hanya perlu menyimpan nomor untuk setiap baris

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}

Uji

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

Tidak disatukan

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 (ECMAScript 6 Draft) - 96 95 91 Karakter

Solusi rekursif:

Versi 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

Versi 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)

(Terima kasih kepada nderscore untuk inspirasi untuk penghematan 1 karakter)

Versi 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)

(Terima kasih kepada nderscore )

Penjelasan:

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

Solusi yang bagus. Saya sedang mengerjakan sesuatu yang serupa. Inilah -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

Terima kasih, sayangnya tidak ada yang berhasil karena Anda tidak bisa memesan baris J tetapi meniadakan cek pertama untuk memberi 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)seharusnya berhasil.
MT0

Ah, tangkapan yang bagus.
nderscore

Dan itu terus turun ... (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

Contohnya

$ 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

Bagaimana itu bekerja

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

Saya curiga Ruby atau Perl akan mengalahkan ini sebelum lama.

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 / Penjelasan Setara :

Bagi mereka yang tidak terbiasa dengan 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;
}

Cobalah online .


1
Solusi ini tidak memenuhi aturanAll seats in one booking must be in the same row, next to each other.
nderscore

0

Cobra - 309

Ini seharusnya dilakukan, tetapi saya tidak bisa sampai ke kompiler selama beberapa jam, jadi saya akan memperbaruinya nanti jika diperlukan.

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

Usaha pertama dalam kode 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;}

Tidak bermain 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;
}

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]]}

Tidak diragukan lagi banyak perbaikan harus dilakukan di sini


0

C ++ - 257

Juga merupakan upaya pertama dalam bermain 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;
}

Karena to_string tidak berfungsi dengan kompiler saya, toS didefinisikan sebagai

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

Dan sebagai antarmuka kecil

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
Hanya menghapus spasi yang tidak perlu membawanya ke 243 karakter.
mulai

Lebih banyak bermain golf ke 236: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;}
mulai

0

C # - 268 Bytes

Kode golf:

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

Kode tidak dikunci:

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

Saya akan menulis beberapa anotasi ke dalam komentar tentang solusi GoldenDragon daripada membuat sendiri, tetapi reputasi saya tidak mengizinkannya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.