Pontuação de sinuca


16

Eu estava assistindo o campeonato mundial de sinuca e isso me fez pensar ..

Pontuação de sinuca

No jogo de sinuca, existem certas regras que você deve aderir também:

  • Quando houver bolas vermelhas na mesa, durante o seu turno, você deve primeiro colocar uma bola vermelha
  • Depois de envasar cada bola vermelha, você deve colocar uma bola colorida (não vermelha) (a bola colorida em vaso é substituída na mesa)
  • Depois que todas as bolas vermelhas estiverem levantadas (existem 15), você pode primeiro escolher uma bola colorida e depois começar com a bola com a menor pontuação e seguir até a bola com a maior pontuação (elas não são substituídas)
  • Não envasar em nenhum momento termina o seu turno.
  • Pontos por bola
    • Bola vermelha: 1 ponto
    • Bola amarela: 2 pontos
    • Bola verde: 3 pontos
    • Bola marrom: 4 pontos
    • Bola azul: 5 pontos
    • Bola rosa: 6 pontos
    • Bola preta: 7 pontos

A questão

Você começa com uma mesa com todas as bolas ainda - 15 vermelhas e uma de cada uma das outras bolas coloridas - e recebe a pontuação de um jogador na sinuca após o primeiro turno. Ponto?

A entrada será uma pontuação que vai de 1 a 147. Você pode escolher se é um número inteiro ou uma sequência. A saída deve ser as diferentes combinações de número de vezes que você colocou cada bola.

Casos de teste:

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

Regras:

  • Você pode escolher se deseja exibir as possibilidades divididas por uma nova linha ou um separador de algum tipo (/ ,; | \ ou até outros que estão faltando)

Isso é codegolf, então o código mais curto vence.


Posso imprimir como lista de matrizes?
Freira vazada

1
Em relação a uma saída de matriz: o número de bolas ordenadas por pontuação é inequívoco; portanto, "5r 3b 2g"pode ser que a saída seja [5,0,2,0,3,0,0](contanto que isso seja consistente)?
Jonathan Allan

2
Você usa bpara marrom e blazul; então bkpara preto? Poderíamos usar n, ee k(últimos letras) para estes três? Que tal dlerunaidentificar todas as oito cores (terceira letra de cada)?
Jonathan Allan

1
@ Shaggy, se você usar uma indicação de cor como dleruna ou outra, não. Se você apenas usar um array como [5 0 0 4 1 0 0], eles deverão ser classificados de baixo para alto.
Michthan

1
Apenas para fins ilustrativos, aqui está um exemplo (surpreendente) de uma pausa de Ronnie "The Rocket" O 'Sullivan.
Arnauld

Respostas:


6

Geléia , 66 bytes

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

Bem, agora é muito lento para o TIO!
... então aqui está uma pasta das 2636 maneiras de produzir exatamente 100 produzidas offline.
... e aqui está uma versão que será executada lá com apenas seis vermelhos (interrupção máxima = 75)

Imprime uma grade de números cada linha, sendo uma lista separada por espaços de valores de bola (por exemplo, três vermelhos e dois verdes estariam em uma leitura de linha 1 1 1 3 3).


Para uma versão agrupada por valores que imprime linhas de contagens, juntamente com os nomes completos das bolas, em 102 bytes:

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

Quão?

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

Funciona bem para todos os casos que tentei. Somente em alguns casos, o último código fornece zeros à esquerda.
precisa saber é o seguinte

Ah, sim, eles deveriam ter sido filtrados ... Corrigido.
Jonathan Allan

Sua saída para o 53 é inequívoca como eu disse antes, mas eu ainda estou duvidando se é legível para todos ..
Michthan

É muito melhor no caminho da grade. Se não houver respostas mais curtas nos próximos dias, aceitarei sua resposta!
Michthan

Hmm. Recebo 2636 combinações de quebra do século. Então, ou eu ou você está errado ...
Arnauld

4

JavaScript (ES7), 188 180 178 bytes

Retorna uma matriz de matrizes (classificadas de vermelho para preto).

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)

Comentado

Nota : Esta versão não inclui a última otimização ativada p(agora inicializada com 7), o que dificulta a compreensão da lógica.

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

Saída de exemplo

Abaixo está a saída para 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

Isso é muito lento para um snippet. Você pode tentar aqui aqui . (Você pode receber um ou dois alertas de script que não respondem , mas devem ser concluídos.)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.