Punktacja w Snookerze

16

Oglądałem mistrzostwa świata w snookerze i zastanawiałem się ..

Punktacja w Snookerze

W grze w snookera obowiązują również pewne zasady:

  • Kiedy na stole są czerwone kulki, podczas swojej tury musisz najpierw wbić czerwoną piłkę
  • Po wbiciu każdej czerwonej kuli musisz wbić kolorową (nie czerwoną) kulkę (wbita kulka jest następnie odkładana na stół)
  • Po tym, jak wszystkie czerwone kule są w górze (jest ich 15), możesz najpierw wybrać piłkę kolorową, a następnie zacząć od piłki o najniższym wyniku i przejść do piłki o najwyższym wyniku (nie są one zastępowane)
  • Brak doniczkowania w żadnym momencie kończy twoją turę.
  • Punkty na piłkę
    • Czerwona kula: 1 punkt
    • Żółta piłka: 2 punkty
    • Zielona kula: 3 punkty
    • Brązowa kula: 4 punkty
    • Niebieska kula: 5 punktów
    • Różowa kula: 6 punktów
    • Czarna kula: 7 punktów

Pytanie

Zaczynasz od stołu ze wszystkimi kulkami na stole - 15 czerwonych i jedna z każdej innej kolorowej piłki - i dostajesz wynik gracza w snookerze po pierwszej turze, jakie są sposoby, aby to osiągnąć wynik?

Dane wejściowe będą liczbą od 1 do 147. Możesz wybrać, czy jest to liczba całkowita, czy łańcuch. Dane wyjściowe powinny być różnymi kombinacjami liczby trafień każdej piłki.

Przypadki testowe:

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

Zasady:

  • Możesz wybrać, czy wypisujesz możliwości podzielone przez nowy wiersz, czy separator (/ ,; | \ lub nawet inne, których mi brakuje)

To jest codegolf, więc wygrywa najkrótszy kod.

Michthan
źródło
Czy mogę wyprowadzać dane jako listę tablic?
Leaky Nun
1
Jeśli chodzi o dane wyjściowe z tablicy: liczba kulek uporządkowanych według wyniku jest jednoznaczna, więc może "5r 3b 2g"może być wyprowadzony jako [5,0,2,0,3,0,0](o ile jest to spójne)?
Jonathan Allan,
2
Używasz bkoloru brązowego i blniebieskiego; więc bkna czarno? Możemy użyć n, ei k(ostatnie litery) dla tych trzech? Co powiesz dlerunana rozpoznanie wszystkich ośmiu kolorów (trzecia litera każdego)?
Jonathan Allan,
1
@Shaggy, Jeśli używasz oznaczenia koloru, takiego jak dleruna lub inny, nie. Jeśli po prostu użyjesz tablicy takiej jak [5 0 0 4 1 0 0], należy je posortować od najniższej do najwyższej.
Michthan,
1
Tylko dla celów ilustracyjnych, oto (niesamowity) przykład przełomu 147 przez Ronniego „The Rocket” O 'Sullivan.
Arnauld

Odpowiedzi:

6

Galaretka , 66 bajtów

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

Cóż, teraz jest zbyt wolny dla TIO!
... oto 2626 sposobów na wyprodukowanie dokładnie 100 w trybie offline.
... a tutaj jest wersja, która będzie działała tylko z SZEŚĆMI czerwonymi (maksymalna przerwa = 75)

Drukuje siatkę liczb, z których każda linia jest oddzieloną spacjami listą wartości kulki (np. Trzy czerwone i dwie zielone byłyby na linii 1 1 1 3 3).


W przypadku wersji zgrupowanej według wartości, która drukuje wiersze zliczeń wraz z pełnymi nazwami kulek, w 102 bajtach:

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

W jaki sposób?

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
źródło
Działa dobrze we wszystkich przypadkach, które próbowałem. Tylko w niektórych przypadkach ostatni kod podaje zera na początku.
Michthan,
Ach tak, powinny były zostać odfiltrowane ... Naprawione.
Jonathan Allan,
Twój wynik dla 53 jest jednoznaczny, jak powiedziałem wcześniej, ale wciąż wątpię, czy można go odczytać dla wszystkich ..
Michthan
Jest znacznie lepiej w trybie siatki. Jeśli w ciągu kilku najbliższych dni nie będzie żadnych krótszych odpowiedzi, przyjmuję odpowiedź!
Michthan
Hmm Dostaję kombinacje przerw w 2636 wieku. Więc ty albo ja mylimy się ...
Arnauld
4

JavaScript (ES7), 188 180 178 bajtów

Zwraca tablicę tablic (posortowaną od czerwonej do czarnej).

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)

Skomentował

Uwaga : Ta wersja nie zawiera ostatniej optymalizacji p(teraz zainicjowanej na 7), co utrudnia zrozumienie logiki.

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

Przykładowe dane wyjściowe

Poniżej przedstawiono wynik dla 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 ] ]

Próbny

Jest to zbyt wolne dla fragmentu. Zamiast tego możesz spróbować tutaj . (Możesz otrzymać jeden lub dwa niereagujące alerty skryptu , ale w końcu powinno się zakończyć).

Arnauld
źródło