Tiyatro koltukları


12

Görev

Bir tiyatro etiketli 10 satır vardır Aiçin Jsoldan sağa 15 1 numaralı önden arkaya ve her satırda 15 sandalye.

Program en iyi koltukları seçmek için aşağıdaki kuralları kullanır.

  • Kural 1: Bir rezervasyondaki tüm koltukların yan yana, aynı sırada olması gerekir.
  • Kural 2: Koltuklar mümkün olduğunca öne, sonra sola olabildiğince yakın olmalıdır (en küçük harf, sonra en düşük sayı)

Tamsayı girişi ( n) olarak istenen bilet sayısını alan ve uzunluk listesinde mevcut olan en iyi koltukların çıktısını veren bir işlev yazın n.

Programınız:

  • Çıktı -11> Girdi veya Giriş> 15 * Eğer
  • -1Koltuklar mevcut değilse çıkış *
  • B(n)Kullanıcının istediği koltuk sayısını girmek için kullanabileceği bir işleve sahip olun.

* Eğer listeyi kolaylaştırırsa -1 çıktısını alabilirsiniz

Örnekler

I / O

Arayan B(5)yeni dizisinde dönmelidir [A1, A2, A3, A4, A5]
çağrılması B(2)o zaman dönmelidir sonra [A6, A7]
çağrılması B(10)o zaman dönmelidir sonra [B1, B2, ... B9, B10]
çağrılması B(-1)hep dönmelidir-1

Golfsiz Çözüm 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
"Sabit kodlanmış iki boyutlu bir dizideki koltuk listesi gerekli mi?" Bunu onsuz yapmanın çeşitli yolları vardır; gereklilik çözümleri gerçekten kısıtlar.
Justin

2
2-B dizisinin sabit kodlanması gerektiğini söylüyorsunuz, ancak Python örneğiniz bunu zor kodlamıyor bile, çalışma zamanında yeni bir liste oluşturmak için bir kavrama kullanıyor.
Tony Ellis

6
Neden iki boyutlu bir dizide yer alan bir koltuk listesinden bahsedelim? Bu bir uygulama detayı gibi görünür ve eğer birisi bir dizi kullanmadan gerekli çıktıyı karşılayan bir program yaratırsa, bununla ilgili bir sorun olmamalıdır.
Greg Hewgill

2
giriş 0 ise ne olur?
edc65

1
@ edc65 Varolmayan sinema salonu patronlarımın gerekirse tiyatronun en iyi yerinde, başka bir kullanıcının kucağında oturmasını sağlarım. Asla farketmediler.
Adam Davis

Yanıtlar:


4

JavaScript - 172

Fonksiyonun kendisi 172'dir:

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

Giriş:

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

Çıktı:

-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

Burada demo: http://jsfiddle.net/tBu5G/

@ Edc65'dan alınan bazı fikirler


c [] yerine c [B [a] = b], B [a] = b akıllıdır, ancak n = 0 için başarısız olur
edc65 24:14

@ edc65 güzel yakalamak. Şimdi davayı halletmek için ayarladımn=0
nderscore

Muhteşem. Bu, 'geri dönüşü' önlemek için hatırlanması gereken bir şey - paylaşım için teşekkürler (+1)
edc65

@ edc65 teşekkürler! İlginç olduğunu düşündüm. MT0 bize ikimiz de olsa yendi var! : 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'de bunu bir işlev haline getirmek için bazı ayarlamalar yapılması gerekiyordu: bbir çift döndürür: biletler (mümkünse) ve tiyatronun yeni durumu. ttüm tiyatroların satılmadığı ilk tiyatro devletidir. Ayrıca, geri dönüş -1Haskell için doğal değildi, bu nedenle bir istek için bilet düzenlenemezse, biletlerin boş listesi döndürülür.

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

Ölçek:

      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  

Açıklama:

  • T←10 15⍴0: Ttiyatro durumunu tutan 15'e 10 bir matristir (0 = serbest)
  • B←{... }: fonksiyon
    • (⍵∊⍳15): 1 ile 15 arasında bir tamsayılar kümesinin üyesiyse,
    • ∨/Z←,T⍷⍨⍵/0: ve arka arkaya sıfırlar Tiçeriyor (olası başlangıç ​​noktalarını kaydederek Z),
    • :: sonra:
      • (⊃Z/,⍳⍴T): olası başlangıç ​​koordinatlarını seçin ve birincisini alın,
      • ∘+¨1-⍨⍳1⍵: ⍵-1başlangıç ​​koordinatının sağına daha fazla konum ekleyin
      • P←: koordinatları P
      • {⎕A[⍺],⍕⍵}/¨: koordinatları biçimlendir
      • T[P]←: biçimlendirilmiş koordinatları yerlerinde saklayın T. (T'deki sıfır olmayan değerler yapar)
      • +: biçimlendirilmiş koordinatlar olan sonucu döndürür (atamanın sonucu varsayılan olarak zımni)
    • ⋄¯1: aksi takdirde geri dönün ¯1.

3

Javascript (E6) 991031111121

Gerçekten her bir satır için bir sayı kaydetmeniz gerekiyor

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}

Ölçek

'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 Taslak) - 96 95 91 Karakterler

Özyinelemeli bir çözüm:

Versiyon 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

Versiyon 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 karakter tasarrufu için ilham için nderscore'a teşekkürler )

Sürüm 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)

( Nderscore'a teşekkürler )

Açıklama:

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

Güzel çözüm. Benzer bir şey üzerinde çalışıyordum. İşte -1 bayt: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

Teşekkürler, ne yazık ki, J satırına rezervasyon yaptıramayacağınız, ancak ilk kontrolün reddedilmesinin 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)işe yaraması gerektiği için tam olarak çalışmaz.
MT0

Ah, iyi yakaladın.
nderscore

Ve aşağı 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)
inmeye

2

GolfScript, 103 82 bayt

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

Örnekler

$ 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

Nasıl çalışır

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

Yakında Ruby veya Perl'in bunu yeneceğinden şüpheleniyorum.

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

Eşdeğer JavaScript / Açıklama :

CoffeeScript'e aşina olmayanlar için.

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

Çevrimiçi deneyin .


1
Bu çözüm kuralı karşılamıyorAll seats in one booking must be in the same row, next to each other.
nderscore

0

Kobra - 309

Bu yapmalı , ama aslında birkaç saat boyunca bir derleyiciye ulaşamıyorum, bu yüzden gerekirse daha sonra güncelleyeceğim.

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

Kod golfü için ilk deneme.

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

Un-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

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

Şüphesiz burada yapılacak çok sayıda iyileştirme var


0

C ++ - 257

Ayrıca golf ilk girişim.

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 derleyicimle çalışmadığı için toS şu şekilde tanımlanır:

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

Ve küçük bir arayüz olarak

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
Sadece gereksiz boşlukları kaldırmak 243 karaktere indirir.
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;}
236'ya

0

C # - 268 Bayt

Golf kodu:

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

Kod çözülmemiş kod:

    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'un kendi çözümümü yapmak yerine çözümü hakkında bir yorumda bazı ek açıklamalar yazardım, ancak itibarım buna izin vermiyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.