Snooker-Wertung

16

Ich habe mir die Snooker-Weltmeisterschaft angeschaut und mich gewundert ..

Snooker-Wertung

Im Snooker-Spiel gibt es bestimmte Regeln, die Sie ebenfalls einhalten müssen:

  • Wenn sich rote Bälle auf dem Tisch befinden, müssen Sie in Ihrem Zug zuerst einen roten Ball werfen
  • Nachdem Sie jede rote Kugel eingetopft haben, müssen Sie eine farbige (nicht rote) Kugel eintopfen (die eingetopfte farbige Kugel wird dann wieder auf den Tisch gelegt).
  • Nachdem alle roten Kugeln aufgebraucht sind (es gibt 15), können Sie zuerst eine farbige Kugel auswählen und dann mit der Kugel mit der niedrigsten Punktzahl beginnen und sich bis zur Kugel mit der höchsten Punktzahl vorarbeiten (diese wird nicht ersetzt).
  • Wenn Sie zu keinem Zeitpunkt eintopfen, ist Ihr Zug beendet.
  • Punkte pro Ball
    • Rote Kugel: 1 Punkt
    • Gelbe Kugel: 2 Punkte
    • Grüner Ball: 3 Punkte
    • Braune Kugel: 4 Punkte
    • Blaue Kugel: 5 Punkte
    • Rosa Ball: 6 Punkte
    • Schwarzer Ball: 7 Punkte

Die Frage

Sie beginnen mit einem Tisch mit allen noch darauf befindlichen Bällen - 15 roten und jeweils einem der anderen farbigen Bälle - und erhalten nach ihrem ersten Zug die Punktzahl eines Spielers im Snooker. Wie hätten sie dies erreichen können? Ergebnis?

Die Eingabe erfolgt als Punktzahl zwischen 1 und 147. Sie können wählen, ob es sich um eine Ganzzahl oder eine Zeichenfolge handelt. Die Ausgabe sollte die unterschiedliche Anzahl von Kombinationen sein, mit denen Sie jede Kugel eingetopft haben.

Testfälle:

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

Regeln:

  • Sie können wählen, ob Sie die durch eine neue Zeile oder ein Trennzeichen geteilten Möglichkeiten ausgeben möchten (/ ,; | \ oder sogar andere, die mir fehlen).

Das ist Codegolf, also gewinnt der kürzeste Code.

Michthan
quelle
Kann ich als Liste von Arrays ausgeben?
Undichte Nonne
1
In Bezug auf eine Array-Ausgabe: Die Anzahl der Bälle, die nach Punktzahl sortiert sind, ist eindeutig. Könnte "5r 3b 2g"also ausgegeben werden als [5,0,2,0,3,0,0](solange dies konsistent ist)?
Jonathan Allan
2
Sie verwenden bfür Braun und blfür Blau; also bkfür schwarz? Können wir verwenden n, eund k(letzter Buchstaben) für diese drei? Wie wäre dlerunaes, alle acht Farben zu identifizieren (jeweils 3. Buchstabe)?
Jonathan Allan
1
@ Shaggy, Wenn Sie eine Farbangabe wie dleruna oder eine andere verwenden, nein. Wenn Sie nur ein Array wie [5 0 0 4 1 0 0] verwenden, sollten sie von niedrig nach hoch sortiert werden.
Michthan
1
Nur zur Veranschaulichung ist hier ein (erstaunliches) Beispiel für eine Pause von Ronnie "The Rocket" O 'Sullivan.
Arnauld

Antworten:

6

Jelly , 66 Bytes

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

Nun, für TIO ist es jetzt zu langsam!
... also hier ist eine Auswahl der 2636 Möglichkeiten, um genau 100 offline zu produzieren.
... und hier ist eine Version, die dort mit nur sechs Rottönen läuft (maximale Pause = 75)

Gibt ein Zahlenraster aus, wobei jede Zeile eine durch Leerzeichen getrennte Liste von Kugelwerten darstellt (z. B. drei rote und zwei grüne in einer Zeile 1 1 1 3 3).


Für eine Version mit Wertegruppen, die Zählzeilen zusammen mit den vollständigen Namen der Bälle mit 102 Bytes ausgibt:

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

Wie?

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
Jonathan Allan
quelle
Es funktioniert gut für alle Fälle, die ich versucht habe. Nur in einigen Fällen gibt der letzte Code führende Nullen.
Michthan
Ah ja, sie hätten herausgefiltert werden sollen ... Behoben.
Jonathan Allan
Ihre Ausgabe für die 53 ist eindeutig, wie ich bereits sagte, aber ich
bezweifle
Im Raster ist es viel besser. Wenn es in den nächsten Tagen keine kürzeren Antworten gibt, nehme ich Ihre Antwort an!
Michthan
Hmm. Ich bekomme 2636 Pausen-Kombinationen. Entweder Sie oder ich liegen falsch ...
Arnauld
4

JavaScript (ES7), 188 180 178 Bytes

Gibt ein Array von Arrays zurück (von rot nach schwarz sortiert).

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)

Kommentiert

Hinweis : Diese Version enthält nicht die letzte Optimierung von p(jetzt auf 7 initialisiert), was das Verständnis der Logik erschwert.

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

Beispielausgabe

Unten ist die Ausgabe für 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 ] ]

Demo

Dies ist zu langsam für einen Ausschnitt. Sie können es stattdessen hier versuchen . (Möglicherweise erhalten Sie ein oder zwei nicht reagierende Skriptwarnungen, die jedoch möglicherweise abgeschlossen werden sollten.)

Arnauld
quelle