Places de théâtre

12

Tâche

Un théâtre a 10 rangées, marquées Aà Jpartir de l' avant vers l' arrière, et les 15 sièges de chaque rangée, numérotés de 1 à 15 de gauche à droite.

Le programme utilise les règles suivantes pour choisir les meilleurs sièges.

  • Règle 1: Tous les sièges d'une réservation doivent être dans la même rangée, côte à côte.
  • Règle 2: Les sièges doivent être le plus près possible de l'avant, puis aussi près de la gauche que possible (lettre la plus basse, puis numéro le plus bas)

Écrivez une fonction qui prend le nombre de tickets voulu comme entrée entière ( n), et sort les meilleurs sièges disponibles dans une liste de longueur n.

Votre programme devrait:

  • Sortie -1si 1> Entrée ou Entrée> 15 *
  • Sortie -1si les sièges ne sont pas disponibles *
  • Avoir une fonction B(n)que l'utilisateur peut utiliser pour saisir le nombre de sièges souhaité.

* Vous pouvez afficher le -1 dans une liste si cela facilite

Exemples

E / S

L'appel B(5)sur un nouveau tableau doit renvoyer l' [A1, A2, A3, A4, A5]
appel B(2)après cela devrait alors retourner l' [A6, A7]
appel B(10)après cela devrait alors retourner l' [B1, B2, ... B9, B10]
appel B(-1)devrait toujours retourner-1

Solution non golfée 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
Harry Beadle
la source
1
"A-t-il codé en dur une liste de sièges dans un tableau à deux dimensions" est-il nécessaire? Il existe de nombreuses façons de faire cela sans cela; l'exigence limite vraiment les solutions.
Justin
2
Vous dites que le tableau 2D doit être codé en dur, mais votre exemple Python ne le code même pas en dur, il utilise une compréhension pour créer une nouvelle liste lors de l'exécution.
Tony Ellis
6
Pourquoi même mentionner "une liste de sièges dans un tableau à deux dimensions"? Cela ressemble à un détail d'implémentation et si quelqu'un crée un programme qui satisfait la sortie requise sans utiliser de tableau, cela ne devrait poser aucun problème.
Greg Hewgill
2
que faire si l'entrée est 0?
edc65
1
@ edc65 Je fais toujours asseoir mes clients inexistants dans les salles de cinéma au meilleur endroit du théâtre, sur les genoux d'un autre client si besoin est. Ils ne s'en rendent jamais compte.
Adam Davis

Réponses:

4

JavaScript - 172

La fonction elle-même est 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;}

Contribution:

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

Production:

-1
-1
[ 'A1', 'A2', 'A3', 'A4' ]
[ 'B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8', 'B9', 'B10', 'B11', 'B12', 'B13', 'B14', 'B15' ]
[ 'A5' ]
-1
Mat
la source
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

Démo ici: http://jsfiddle.net/tBu5G/

Quelques idées tirées de @ edc65

nderscore
la source
c [B [a] = b] au lieu de c [], B [a] = b est intelligent, mais échoue pour n = 0
edc65
@ edc65 belle prise. Je l'ai maintenant ajusté pour gérer le casn=0
nderscore
Impressionnant. C'est quelque chose à retenir pour éviter le «retour» - merci pour le partage (+1)
edc65
@ edc65 merci! Je pensais que c'était intéressant. MT0 nous a tous les deux battus! : 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)

Quelques ajustements ont dû être faits pour en faire une fonction dans Haskell: bretourne une paire: les billets (si possible), et le nouvel état du théâtre. test l'état du théâtre initial, avec tous les billets invendus. De plus, le retour -1n'était pas naturel pour Haskell, donc si aucun ticket ne peut être émis pour une demande, la liste vide est retournée pour les tickets.

λ: 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"]
MtnViewMark
la source
3

APL (75)

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

Tester:

      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  

Explication:

  • T←10 15⍴0: Test une matrice de 15 par 10 qui contient l'état du théâtre (0 = gratuit)
  • B←{... }: la fonction
    • (⍵∊⍳15): si est membre de l'ensemble des entiers de 1 à 15,
    • ∨/Z←,T⍷⍨⍵/0: et Tcontient des zéros de suite (en stockant les points de départ possibles dans Z),
    • :: puis:
      • (⊃Z/,⍳⍴T): sélectionnez les coordonnées de départ possibles et prenez la première,
      • ∘+¨1-⍨⍳1⍵: ajouter ⍵-1plus de positions à droite de la coordonnée de départ
      • P←: stocker les coordonnées dans P
      • {⎕A[⍺],⍕⍵}/¨: formater les coordonnées
      • T[P]←: stocke les coordonnées formatées à leur emplacement dans T. (toutes les valeurs non nulles dans T feront l'affaire)
      • +: retourne le résultat, qui est les coordonnées formatées (le résultat d'une affectation est tacite par défaut)
    • ⋄¯1: sinon, revenez ¯1.
marinus
la source
3

Javascript (E6) 99103113121

Vraiment, vous avez juste besoin de stocker un numéro pour chaque ligne

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}

Tester

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

Non golfé

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;
}
edc65
la source
3

JavaScript (ECMAScript 6 Draft) - 96 95 91 caractères

Une solution récursive:

Version 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

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

(Merci à nderscore pour l'inspiration pour la sauvegarde d'un caractère)

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

(Merci à nderscore )

Explication:

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.
  }
}
MT0
la source
Belle solution. Je travaillais sur quelque chose de similaire. Voici -1 octet: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
Merci, malheureusement, celui-ci ne fonctionne pas tout à fait car vous ne pouvez pas réserver la ligne J, mais annuler le premier chèque à donner 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)devrait fonctionner.
MT0
Ah, bonne prise.
nderscore
Et ça continue de baisser ... (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 octets

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

Exemples

$ 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

Comment ça fonctionne

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.
}
Dennis
la source
1

CoffeeScript - 171 150 149

Je soupçonne Ruby ou Perl de battre ça avant longtemps.

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 équivalent / explication :

Pour ceux qui ne connaissent pas 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;
}

Essayez-le en ligne .

Tony Ellis
la source
1
Cette solution ne satisfait pas à la règleAll seats in one booking must be in the same row, next to each other.
nderscore
0

Cobra - 309

Cela devrait le faire, mais je ne peux pas accéder à un compilateur pendant quelques heures, donc je le mettrai à jour plus tard si nécessaire.

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'])
Οurous
la source
0

C # - 289

Première tentative de golf par code.

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

Non 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;
}
Dragon d'or
la source
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]]}

Il y a sans aucun doute de nombreuses améliorations à apporter ici

tmartin
la source
0

C ++ - 257

Aussi une première tentative de 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;
}

Parce que to_string ne fonctionnait pas avec mon compilateur, toS est défini comme

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

Et comme une petite interface

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;
}
celie56
la source
1
La simple suppression des espaces inutiles le ramène à 243 caractères.
tomsmeding
Plus de golf à 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 octets

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

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

J'aurais écrit quelques annotations dans un commentaire sur la solution de GoldenDragon au lieu de faire la mienne, mais ma réputation ne le permet pas.

tsavinho
la source