Punteggio dello snooker


16

Stavo guardando il campionato mondiale di biliardo e mi ha fatto pensare ...

Punteggio dello snooker

Nel gioco dello snooker ci sono alcune regole che devi rispettare anche:

  • Quando ci sono palle rosse sul tavolo, durante il tuo turno devi prima lanciare una palla rossa
  • Dopo aver invaso ogni palla rossa, devi lanciare una palla colorata (non rossa) (la palla colorata in vaso viene quindi sostituita sul tavolo)
  • Dopo che tutte le palline rosse sono alte (ce ne sono 15) puoi prima scegliere una pallina colorata e poi iniziare con la pallina con il punteggio più basso e salire fino alla pallina con il punteggio più alto (non vengono sostituite)
  • Non invasare in nessun punto termina il tuo turno.
  • Punti per palla
    • Palla rossa: 1 punto
    • Palla gialla: 2 punti
    • Palla verde: 3 punti
    • Palla marrone: 4 punti
    • Palla blu: 5 punti
    • Palla rosa: 6 punti
    • Palla nera: 7 punti

La domanda

Inizi con un tavolo con tutte le palle ancora su di esso - 15 rosse e una delle altre palle colorate - e ti viene dato il punteggio di un giocatore di biliardo dopo il loro primo turno, quali sono i modi in cui avrebbero potuto raggiungere questo obiettivo Punto?

L'input sarà un punteggio che va da 1 a 147. Puoi scegliere se è un numero intero o una stringa. L'output dovrebbe essere la diversa combinazione del numero di volte in cui hai inserito ogni palla.

Casi test:

Input: 4
Output: 
1r 1g
2r 1y
Input: 25
Output:
4r 3b
5r 2b 1br 1y
5r 2b 2g
...
9r 8y

Regole:

  • Puoi scegliere se generare le possibilità divise per una nuova riga o un separatore di qualche tipo (/ ,; | \ o anche altri che mi mancano)

Questo è codegolf, quindi vince il codice più corto.


Posso eseguire l'output come elenco di array?
Leaky Nun,

1
Per quanto riguarda l'output di un array: il numero di palline ordinate per punteggio è inequivocabile, quindi forse "5r 3b 2g"potrebbe essere emesso come [5,0,2,0,3,0,0](purché sia ​​coerente)?
Jonathan Allan,

2
Usi bper il marrone e blper il blu; quindi bkper il nero? Potremmo usare n, ee k(ultime lettere) per questi tre? Che ne dici dlerunadi identificare tutti e otto i colori (terza lettera di ciascuno)?
Jonathan Allan,

1
@Shaggy, se si utilizza un'indicazione di colore come Dleruna o un altro, no. Se usi semplicemente un array come [5 0 0 4 1 0 0], dovrebbero essere ordinati dal più basso al più alto.
Michthan,

1
A solo scopo illustrativo, ecco un (fantastico) esempio di una pausa di 147 di Ronnie "The Rocket" O 'Sullivan.
Arnauld,

Risposte:


6

Gelatina , 66 byte

L⁼30µÐfµ7Ḋ;\¤;€Ṣ€µ€;/
ċ1<⁴µÐfµ;Ç
7Ḋœċ⁴Ḷ¤;/L€;$€;@þ2B¤;/ḟ€0ÇS⁼¥Ðf⁸G

Bene, è troppo lento per TIO ora!
... quindi ecco un insieme di 2636 modi per realizzare esattamente 100 prodotti offline.
... e qui c'è una versione che verrà eseguita lì con soli SIX rossi (interruzione massima = 75)

Stampa una griglia di numeri ogni riga essendo un elenco separato da spazi di valori di palla (ad es. Tre rossi e due verdi sarebbero su una riga 1 1 1 3 3).


Per una versione raggruppata per valore che stampa linee di conteggi insieme ai nomi completi delle sfere, a 102 byte:

ŒrÑ€
Ṫ;ị“¡^³ṗ⁼¬wḌ⁼ø÷OẏK¦ẆP»Ḳ¤$K
L⁼30µÐfµ7Ḋ;\¤;€Ṣ€µ€;/
ċ1<⁴µÐfµ;Ç
7Ḋœċ⁴Ḷ¤;/L€;$€;@þ2B¤;/ḟ€0ÇS⁼¥Ðf⁸Ñ€K€Y

Come?

L⁼30µÐfµ7Ḋ;\¤;€Ṣ€µ€;/ - Link 1, create post-red-ball games: list of all pre-yellow-ball-games
    µÐf               - filter keep if:
L⁼30                  -   length equals 30 (games that get on to the yellow)
       µ         µ€   - for €ach sequence leading to the yellow:
            ¤         -   nilad followed by link(s) as a nilad:
        7Ḋ            -     7 dequeued  = [2,3,4,5,6,7]
          ;\          -     ;\ cumulative reduce with concatenation  = [[2],[2,3],[2,3,4],...]
             ;€       - concatenate the sequence with €ach of those
               Ṣ€     - sort each one
                   ;/ - reduce with concatenation (flatten by one)

ċ1<⁴µÐfµ;Ç - Link 2, filter bogus entries created and append post-yellow-ball games: list of pre-yellow-ball games (along with the bogus ones with 16 reds potted)
    µÐf    - filter keep if:
ċ1         -   count ones
   ⁴       -   literal 16
  <        -   less than?
       µ   - monadic chain separation
         Ç - call the last link (1) as a monad
        ;  - concatenate

7Ḋœċ⁴Ḷ¤;/L€;$€;@þ2B¤;/ḟ€0ÇS⁼¥Ðf⁸G - Main link: score
7Ḋ                                - 7 dequeued = [2,3,4,5,6,7]
      ¤                           - nilad followed by link(s) as a nilad:
     ⁴                            -   literal 16
    Ḷ                             -   lowered range = [0,1,2,...,15]
  œċ                              - combinations with replacement (every possible colour-ball selection that goes with the red pots)
       ;/                         - reduce with concatenation (flatten by one)
            $€                    - last two links as a monad for €ach:
         L€                       -   length of €ach (number of coloured balls potted)
           ;                      -   concatenate
                   ¤              - nilad followed by link(s) as a nilad:
                 2B               -   2 in binary = [1,0]
                þ                 - outer product with:
              ;@                  -   concatenation with reversed @rguments
                    ;/            - reduce with concatenation (flatten by one)
                      ḟ€0         - filter discard zeros from €ach
                         Ç        - call the last link (2) as a monad
                             Ðf   - filter keep:
                            ¥  ⁸  -   last two links as a dyad, with score on the right
                          S⁼      -     sum(ball values) is equal to score?
                                G - format as a grid
                                  - implicit print

Funziona bene per tutti i casi che ho provato. Solo in alcuni casi l'ultimo codice fornisce gli zeri iniziali.
Michthan,

Ah sì, avrebbero dovuto essere filtrati ... Risolto.
Jonathan Allan,

La tua uscita per il 53 è inequivocabile come ho detto prima, ma
dubito

È molto meglio in griglia. Se non ci saranno risposte più brevi nei prossimi giorni, accetterò la tua risposta!
Michthan,

Hmm. Ottengo combinazioni di pausa del 2636 secolo. Quindi tu o io abbiamo torto ...
Arnauld

4

JavaScript (ES7), 188 180 178 byte

Restituisce una matrice di matrici (ordinate dal rosso al nero).

n=>[...Array(17**6)].map((_,x)=>[2,3,4,5,6,p=7].map(v=>(k=a[++j]=x%17|0,x/=17,t+=k,p+=!!(y=y&&k),s-=k*v),y=s=n,a=[j=t=0])&&(s==15|s>=t)&s<16&s<t+2&t<9+p&&(a[0]=s,a)).filter(a=>a)

Commentate

Nota : questa versione non include l'ultima ottimizzazione attivata p(ora inizializzata su 7) che rende la logica più difficile da comprendere.

n =>                              // given a target score n:
  [...Array(17**6)].map((_, x) => // for each x in [0 .. 17^6 - 1]:
    [2, 3, 4, 5, 6, 7].map(v =>   //   for each v in [2 .. 7] (yellow to black):
      ( k = a[++j] = x % 17 | 0,  //     k = a[j] = number of colored balls of value v
        x /= 17,                  //     update x to extract the next value
        t += k,                   //     update t = total number of colored balls
        p += !!(                  //     update p = number of consecutive colors that were
          y = y && k              //     potted at least once, using y = flag that is zeroed
        ),                        //     as soon as a color is not potted at all
        s -= k * v ),             //     subtract k * v from the current score s
      y = s = n,                  //     initialize y and s
      a = [j = t = p = 0]         //     initialize a, j (pointer in a), t and p
    )                             //   at this point, s is the alleged number of red balls
    &&                            //   this combination is valid if we have:
      (s == 15 | s >= t) &        //     - 15 red balls or more red balls than colored ones
      s < 16 &                    //     - no more than 15 red balls
      s < t + 2 &                 //     - at most one more red ball than colored ones
      t < 16 + p                  //     - no more than 15 + p colored balls
    &&                            //   if valid:
      (a[0] = s, a)               //     update the combination with red balls and return it
  ).filter(a => a)                // end of outer map(): filter out invalid entries

Esempio di output

Di seguito è riportato l'output per n = 140:

//  R   Y  G  Br Bl P  Bk 
[ [ 15, 1, 1, 1, 1, 8, 9  ],
  [ 15, 1, 1, 1, 2, 6, 10 ],
  [ 15, 1, 1, 1, 3, 4, 11 ],
  [ 15, 1, 1, 2, 1, 5, 11 ],
  [ 15, 1, 1, 1, 4, 2, 12 ],
  [ 15, 1, 1, 2, 2, 3, 12 ],
  [ 15, 1, 2, 1, 1, 4, 12 ],
  [ 15, 1, 1, 2, 3, 1, 13 ],
  [ 15, 1, 1, 3, 1, 2, 13 ],
  [ 15, 1, 2, 1, 2, 2, 13 ],
  [ 15, 2, 1, 1, 1, 3, 13 ],
  [ 15, 1, 2, 2, 1, 1, 14 ],
  [ 15, 2, 1, 1, 2, 1, 14 ],
  [ 15, 1, 1, 1, 1, 1, 15 ] ]

dimostrazione

È troppo lento per uno snippet. Puoi provarlo qui invece. (Potresti ricevere uno o due avvisi di script che non rispondono , ma alla fine dovrebbe essere completato.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.