थिएटर सीटिंग


12

कार्य

एक थिएटर में 10 पंक्तियाँ होती हैं, जिन्हें आगे से पीछे की ओर लेबल Aकिया Jजाता है, और प्रत्येक पंक्ति में 15 सीटें, बाएँ से दाएँ 1 से 15 तक होती हैं।

कार्यक्रम सर्वश्रेष्ठ सीटों का चयन करने के लिए निम्नलिखित नियमों का उपयोग करता है।

  • नियम 1: एक बुकिंग में सभी सीटें एक-दूसरे के बगल में एक ही पंक्ति में होनी चाहिए।
  • नियम 2: सीटों को जितना संभव हो उतना सामने के पास होना चाहिए, फिर जितना संभव हो उतना बाईं ओर के करीब (सबसे कम अक्षर, फिर सबसे कम संख्या)

एक फ़ंक्शन लिखें जो एक पूर्णांक इनपुट ( n) के रूप में वांछित टिकटों की संख्या लेता है , और लंबाई की सूची में उपलब्ध सर्वोत्तम सीटों का आउटपुट देता है n

आपका कार्यक्रम होना चाहिए:

  • आउटपुट -1अगर 1> इनपुट या इनपुट> 15 *
  • -1यदि सीटें उपलब्ध नहीं हैं तो आउटपुट *
  • एक फ़ंक्शन B(n)है जिसे उपयोगकर्ता इच्छित संख्या में सीटों के इनपुट के लिए उपयोग कर सकता है।

* यदि आप इसे आसान बनाते हैं तो आप किसी सूची में -1 को आउटपुट कर सकते हैं

उदाहरण

आई / ओ

कॉलिंग B(5)एक नई सरणी पर लौटना चाहिए [A1, A2, A3, A4, A5]
कॉलिंग B(2)के बाद कि उसके बाद लौट जाना [A6, A7]
कॉलिंग B(10)के बाद कि उसके बाद लौट जाना [B1, B2, ... B9, B10]
कॉलिंग B(-1)हमेशा वापस आ जाएगी-1

अन-गोल्फ सॉल्यूशन पायथन

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
क्या "दो आयामी सरणी में सीटों की सूची को हार्डकोड किया गया है" आवश्यक है? इसके बिना ऐसा करने के कई तरीके हैं; आवश्यकता वास्तव में समाधानों को प्रतिबंधित करती है।
जस्टिन

2
आप कहते हैं कि 2-डी सरणी हार्ड-कोडेड होनी चाहिए, लेकिन आपका पायथन उदाहरण भी इसे हार्ड-कोड नहीं करता है, यह रनटाइम पर एक नई सूची बनाने के लिए एक समझ का उपयोग करता है।
टोनी एलिस

6
यहां तक ​​कि "एक दो आयामी सरणी में सीटों की सूची" का उल्लेख क्यों करें? यह एक कार्यान्वयन विवरण की तरह लगता है और अगर कोई ऐसा प्रोग्राम बनाता है जो किसी सरणी का उपयोग किए बिना आवश्यक आउटपुट को संतुष्ट करता है, तो इसके साथ कोई समस्या नहीं होनी चाहिए।
ग्रेग हेविल

2
क्या होगा यदि इनपुट 0 है?
edc65

1
@ edc65 मैं हमेशा अपनी गैर-फिल्मी मूवी थियेटर संरक्षक को थिएटर के सबसे अच्छे स्थान पर बैठाता हूं, अगर जरूरत हो तो एक अन्य संरक्षक की गोद में। उन्होंने कभी गौर नहीं किया।
एडम डेविस

जवाबों:


4

जावास्क्रिप्ट - 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

जावास्क्रिप्ट ( ईएस 6 ) - 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 [[a] = b की बजाय c [b] [] a, = b] चालाक है, लेकिन n = ० के लिए विफल रहता है
edc65 २४'१४ को 25:२५

@ edc65 की अच्छी पकड़। मैंने अब केस को संभालने के लिए इसे एडजस्ट कर लिया हैn=0
nscore

बहुत बढ़िया। 'रिटर्न' से बचने के लिए याद रखना कुछ है - साझा करने के लिए धन्यवाद (+1)
edc65

@ edc65 धन्यवाद! मेरे विचार से वह दिलचस्प था। MT0 के हम दोनों को हरा दिया, हालांकि! : P
nderscore

3

हास्केल, 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)

हास्केल में एक समारोह बनाने के लिए कुछ समायोजन किए जाने थे: bएक जोड़ी लौटाता है: टिकट (यदि संभव हो), और थिएटर की नई स्थिति। tसभी टिकटों के बिना बिकने वाला प्रारंभिक थिएटर राज्य है। साथ ही, -1हास्केल के लिए वापसी अप्राकृतिक थी, इसलिए यदि अनुरोध के लिए कोई टिकट जारी नहीं किया जा सकता है, तो टिकट के लिए खाली सूची वापस कर दी जाती है।

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

एपीएल (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। (टी में कोई भी नॉनजेरो वैल्यू नहीं करेगा)
      • +: परिणाम लौटाएं, जो स्वरूपित निर्देशांक है (असाइनमेंट का परिणाम डिफ़ॉल्ट रूप से टैसिट है)
    • ⋄¯1: अन्यथा, वापस ¯1

3

जावास्क्रिप्ट (ई 6) 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

जावास्क्रिप्ट (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)

(के लिए धन्यवाद nderscore 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)

(धन्यवाद ncorecore )

स्पष्टीकरण:

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)
14'14

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

कॉफ़ीस्क्रिप्ट - 171 150 149

मुझे संदेह है कि रूबी या पर्ल लंबे समय से पहले इसे हरा देंगे।

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

समतुल्य जावास्क्रिप्ट / स्पष्टीकरण :

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

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

संयुक्त राष्ट्र के golfed

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

के, 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

सी ++ - 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 वर्णों तक पहुंच जाता है।
14:30

२३६ से अधिक गोल्फिंग: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;}
१४:३6

0

सी # - 268 बाइट्स

गोल्फ कोड:

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

मैंने गोल्डनड्रैगन के समाधान पर टिप्पणी करने के बजाय कुछ टिप्पणियां लिखी हैं, लेकिन मेरी प्रतिष्ठा इसकी अनुमति नहीं देती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.