ที่นั่งโรงละคร


12

งาน

โรงละครมี 10 แถวป้ายAไปJจากด้านหน้าไปด้านหลังและ 15 ที่นั่งในแต่ละแถวเลข 1 ถึง 15 จากซ้ายไปขวา

โปรแกรมใช้กฎต่อไปนี้เพื่อเลือกที่นั่งที่ดีที่สุด

  • กฎข้อที่ 1: ที่นั่งทั้งหมดในการจองหนึ่งรายการจะต้องอยู่ในแถวเดียวกันติดกัน
  • กฎข้อที่ 2: ที่นั่งจะต้องอยู่ใกล้กับด้านหน้าที่สุดเท่าที่จะเป็นไปได้และใกล้ชิดทางด้านซ้ายเท่าที่จะทำได้ (ตัวอักษรตัวเล็กที่สุดแล้วตามด้วยหมายเลขต่ำสุด)

เขียนฟังก์ชั่นซึ่งจะมีจำนวนบัตรที่ต้องการเป็นจำนวนเต็มการป้อนข้อมูล (ที่n) nและผลที่นั่งที่ดีที่สุดที่มีอยู่ในรายชื่อของความยาว

โปรแกรมของคุณควร:

  • เอาต์พุต-1ถ้า 1> อินพุตหรืออินพุต> 15 *
  • ส่งออก-1หากไม่มีที่นั่ง *
  • มีฟังก์ชั่นB(n)ที่ผู้ใช้สามารถใช้เพื่อป้อนจำนวนที่นั่งที่ต้องการ

* คุณสามารถส่งออก -1 ในรายการถ้ามันง่ายขึ้น

ตัวอย่าง

I / O

การโทรหาB(5)อาร์เรย์ใหม่ควรส่งคืนการ[A1, A2, A3, A4, A5]
โทรB(2)หลังจากนั้นควรส่งคืนการ[A6, A7]
โทรB(10)หลังจากนั้นควรส่งคืนการ[B1, B2, ... B9, B10]
โทรB(-1)ควรส่งคืนเสมอ-1

งูหลาม Un-golfed Solution

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
"จำเป็นต้องมีรายการที่นั่งในอาร์เรย์สองมิติ" หรือไม่? มีหลายวิธีที่จะทำสิ่งนี้โดยปราศจากสิ่งนั้น ข้อกำหนดนั้น จำกัด การแก้ปัญหาจริงๆ
Justin

2
คุณบอกว่าอาเรย์ 2 มิตินั้นต้องเป็นฮาร์ดโค้ด แต่ตัวอย่างไพ ธ อนของคุณไม่ได้ยากโค้ดมันใช้ความเข้าใจในการสร้างรายการใหม่ที่รันไทม์
Tony Ellis

6
ทำไมถึงพูดถึง "รายชื่อที่นั่งในอาเรย์สองมิติ"? ฟังดูเหมือนรายละเอียดการนำไปใช้งานและถ้าใครบางคนสร้างโปรแกรมที่ตอบสนองเอาต์พุตที่ต้องการโดยไม่ต้องใช้อาเรย์ก็ไม่น่าจะมีปัญหาอะไร
Greg Hewgill

2
เกิดอะไรขึ้นถ้าอินพุตเป็น 0
edc65

1
@ edc65 ฉันมักจะให้ผู้อุปถัมภ์โรงภาพยนตร์ที่ไม่มีตัวตนของฉันนั่งในจุดที่ดีที่สุดของโรงภาพยนตร์บนตักของผู้อุปถัมภ์อีกคนหากจำเป็น พวกเขาไม่เคยสังเกต
Adam Davis

คำตอบ:


4

JavaScript - 172

ฟังก์ชั่นตัวเองคือ 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;}

การป้อนข้อมูล:

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

เอาท์พุท:

-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

ตัวอย่างที่นี่: http://jsfiddle.net/tBu5G/

แนวคิดบางอย่างนำมาจาก @ edc65


c [B [a] = b] แทน c [], B [a] = b เป็นคนฉลาด แต่ล้มเหลวสำหรับ n = 0
edc65

@ edc65 จับได้ดี ตอนนี้ฉันได้ปรับมันเพื่อจัดการเคสn=0
ขีดล่าง

น่ากลัว นั่นเป็นสิ่งที่ต้องจำไว้ว่าให้หลีกเลี่ยง 'คืน' - ขอบคุณสำหรับการแบ่งปัน (+1)
edc65

@ edc65 ขอบคุณ! ฉันคิดว่ามันน่าสนใจ MT0 ทำให้เราทั้งคู่เอาชนะได้! : 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)

ต้องทำการปรับเปลี่ยนบางอย่างเพื่อทำให้ฟังก์ชั่นนี้ใน Haskell: bส่งคืนคู่: ตั๋ว (ถ้าเป็นไปได้) และสถานะใหม่ของโรงละคร tเป็นรัฐโรงละครเริ่มต้นที่มีตั๋วทั้งหมดยังขายไม่ออก การกลับมา-1นั้นไม่เป็นธรรมชาติสำหรับ Haskell ดังนั้นหากไม่มีการออกตั๋วสำหรับการร้องขอรายการที่ว่างเปล่าจะถูกส่งคืนสำหรับตั๋ว

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

ทดสอบ:

      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  

คำอธิบาย:

  • T←10 15⍴0: Tเป็นเมทริกซ์ 15 คูณ 10 ที่เก็บสถานะโรงละคร (0 = ฟรี)
  • B←{... }: ฟังก์ชั่น
    • (⍵∊⍳15): ถ้าเป็นสมาชิกของชุดจำนวนเต็มตั้งแต่ 1 ถึง 15
    • ∨/Z←,T⍷⍨⍵/0: และTมีเลขศูนย์ในแถว (เก็บจุดเริ่มต้นที่เป็นไปได้ในZ)
    • :: จากนั้น:
      • (⊃Z/,⍳⍴T): เลือกพิกัดเริ่มที่เป็นไปได้และเลือกค่าแรก
      • ∘+¨1-⍨⍳1⍵: เพิ่ม⍵-1ตำแหน่งเพิ่มเติมทางด้านขวาของพิกัดเริ่มต้น
      • P←: เก็บพิกัดใน P
      • {⎕A[⍺],⍕⍵}/¨: จัดรูปแบบพิกัด
      • T[P]←: จัดเก็บพิกัดที่จัดรูปแบบไว้ในที่ของTมัน (ค่าใด ๆ ที่ไม่ใช่ศูนย์ใน T จะทำ)
      • +: ส่งคืนผลลัพธ์ซึ่งเป็นพิกัดที่จัดรูปแบบแล้ว (ผลลัพธ์ของการกำหนดค่าโดยปริยายคือค่าเริ่มต้น)
    • ⋄¯1¯1ฉะนั้นผลตอบแทน

3

Javascript (E6) 99 103 113 121

จริงๆคุณเพียงแค่ต้องเก็บหมายเลขสำหรับแต่ละแถว

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}

ทดสอบ

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

Ungolfed

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) - 96 95 91 ตัวอักษร

โซลูชันแบบเรียกซ้ำ:

รุ่น 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

รุ่น 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)

(ขอบคุณขีดล่างสำหรับแรงบันดาลใจสำหรับการประหยัดตัวละคร 1 ตัว)

รุ่น 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)

(ขอบคุณที่ขีดล่าง )

คำอธิบาย:

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

ทางออกที่ดี ฉันกำลังทำงานกับสิ่งที่คล้ายกัน นี่คือ -1 ไบต์: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
ขีดล่าง

ขอบคุณโชคไม่ดีที่หนึ่งไม่ได้ค่อนข้างทำงานในขณะที่คุณไม่สามารถจองแถว J แต่กวนตรวจสอบก่อนที่จะให้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)ควรจะทำงาน
MT0

อ่าจับได้ดี
nderscore

และมันจะลดลง ... (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 ไบต์

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

ตัวอย่าง

$ 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

มันทำงานอย่างไร

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

ฉันสงสัยว่า Ruby หรือ Perl จะเอาชนะเรื่องนี้ไม่นาน

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 / คำอธิบายที่เท่าเทียมกัน:

สำหรับผู้ที่ไม่คุ้นเคยกับ 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;
}

ลองมันออนไลน์


1
วิธีนี้ไม่เป็นไปตามกฎAll seats in one booking must be in the same row, next to each other.
ขีดล่าง

0

คอบร้า - 309

สิ่งนี้ควรทำ แต่ฉันไม่สามารถไปคอมไพเลอร์ได้สักสองสามชั่วโมงดังนั้นฉันจะอัปเดตในภายหลังหากจำเป็น

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

ความพยายามครั้งแรกที่การเล่นกอล์ฟรหัส

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

ยกเลิกแข็งแรงเล่นกอล์ฟ

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

มีการปรับปรุงมากมายที่ต้องทำที่นี่อย่างแน่นอน


0

C ++ - 257

ยังเป็นครั้งแรกที่เล่นกอล์ฟ

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

เนื่องจาก to_string ไม่ทำงานกับคอมไพเลอร์ของฉัน toS จึงถูกกำหนดเป็น

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

และเป็นอินเทอร์เฟซเล็กน้อย

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
เพียงแค่ลบช่องว่างที่ไม่จำเป็นลงไปถึง 243 ตัวอักษร
tomsmeding

การเล่นกอล์ฟมากขึ้นถึง 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;}
tomsmeding

0

C # - 268 ไบต์

รหัส Golfed:

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

รหัสไม่ได้รับการตอบกลับ:

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

ฉันจะเขียนคำอธิบายประกอบลงในความคิดเห็นเกี่ยวกับโซลูชันของ GoldenDragon แทนที่จะทำเอง แต่ชื่อเสียงของฉันไม่อนุญาต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.