Nota: Isso está relacionado a uma variação do jogo Rummikub
Antecedentes e Regras
Rummikub é um jogo baseado em blocos. Existem quatro cores: vermelho, laranja, azul e preto. Para cada cor, existem 13 peças (rotuladas de 1 a 13) e também 2 Coringas que são independentes de cor, portanto, existem 54 peças no total. Nesta variação de Rummikub, cada jogador recebe 14 peças e deve obter mais uma peça e largar outra a cada rodada, de modo que a contagem de peças seja constante. Os jogadores não vêem as peças um do outro. O objetivo é agrupar as peças, de modo que todas as peças pertençam a pelo menos um grupo (veja abaixo). Quando um jogador tem todas as peças agrupadas, eles largam o tabuleiro e revelam suas peças. Os outros então verificam se todas as combinações são válidas e, se forem, o jogador vence a rodada.
Como os ladrilhos podem ser agrupados?
Existem apenas dois tipos de grupos:
Grupos multicoloridos :
- Eles consistem em 3 ou 4 peças.
- Eles contêm apenas peças com o mesmo número nelas.
- Todos os azulejos são de cores diferentes.
- Exemplo:
RED 9, BLUE 9, BLACK 9
.
Grupos monocromáticos :
- Eles consistem em pelo menos 3 peças.
- Eles não podem conter mais de 13 peças.
- Eles contêm apenas peças com números consecutivos diferentes, em ordem crescente.
- Todas as peças têm a mesma cor.
- Os ladrilhos marcados com
1
podem não ser lugares depois dos ladrilhos rotulados13
. - Exemplo:
RED 5, RED 6, RED 7
.
Espere, o que os curingas fazem?
Os curingas podem substituir qualquer peça do jogo. Por exemplo, nosso primeiro exemplo pode se tornar JOKER, BLUE 9, BLACK 9
, RED 9, JOKER, BLACK 9
ou RED 9, BLUE 9, JOKER
. O mesmo se aplica ao nosso outro exemplo. No entanto, não se pode colocar dois Coringas no mesmo grupo, então coisas como JOKER, ORANGE 8, JOKER
são proibidas.
Tarefa
Dado um grupo de blocos Rummikub, determine se é válido. Você tem a garantia de que nenhum bloco duplicado aparecerá, exceto os 2 curingas e que os blocos recebidos como entrada são válidos (por exemplo, itens como 60
não aparecerão).
Entrada / Saída
Você pode receber e fornecer a saída por qualquer método padrão.
Alguns formatos de entrada válidos: lista de strings, lista de tuplas, listas aninhadas, strings ou qualquer outra coisa que você achar adequado. As cores podem ser tomadas como Strings (por exemplo:) "Blue","Red", etc.
, como abreviações de String (por favor, diferencie os azulejos azuis e pretos) ou como números inteiros correspondentes a uma cor. Quando se trata de Jokers, você deve mencionar a maneira como seu programa os recebe como entrada. Se você escolher Strings, poderá ter algo parecido RED 9, JOKER, ...
, se você escolher tuplas que poderá ter (9,"RED"), ("JOKER")
ou algo equivalente. Se ajudar, você pode receber uma cor para esse Coringa (o que não deve afetar a saída do seu programa). Por exemplo, você pode ter ("JOKER","RED")
ou ("JOKER","BLUE")
, mas isso não deve influenciar a saída de forma alguma.
Em relação à saída, aplicam-se regras padrão para um problema de decisão .
Exemplos trabalhados
Vamos dar um exemplo, que, com sorte, facilitaria o entendimento. Dado um grupo da seguinte forma, em que cada tupla representa um bloco:
[(9, "VERMELHO"), (9, "LARANJA"), ("JOKER"), (9, "PRETO")]
Isso deve retornar um valor verdadeiro, porque a entrada é válida. Nesse caso, o Coringa substitui (9, "BLUE")
e eles formam um grupo multicolorido.
Se você receber o seguinte grupo:
[(9, "AZUL"), (9, "LARANJA"), (9, "VERMELHO"), (9, "PRETO"), ("JOKER")]
Seria inválido e, portanto, o programa deve retornar um valor falso, porque não resta mais nada para o coringa substituir, porque o número máximo de cartões em um grupo multicolorido é 4.
Casos de teste adicionais
São para um conjunto de testes estendido que cobre quase todas as situações possíveis:
Entrada -> Saída [(1, "AZUL"), (2, "AZUL"), (3, "AZUL"), (4, "AZUL"), (5, "AZUL"), (6, "AZUL")] - > verdade [(6, "AZUL"), (6, "VERMELHO"), (6, "PRETO)] -> verdade [(5, "PRETO"), (6, "PRETO"), (7, "PRETO"), (8, "PRETO"), (9, "PRETO"), (10, "PRETO"), ( "JOKER"), (12, "BLACK")] -> verdade [("JOKER"), (3, "AZUL"), (3, "VERMELHO")] -> verdade [(8, "PRETO"), (2, "VERMELHO"), (13, "AZUL")] -> falsidade [(4, "VERMELHO"), (3, "VERMELHO"), (5, "VERMELHO")] -> falsidade [(5, "PRETO"), (6, "PRETO)] -> falsidade [("JOKER"), (5, "RED"), ("JOKER")] -> falsy [(4, "VERMELHO"), (5, "VERMELHO"), (6, AZUL ")] -> falsidade [(4, "VERMELHO"), ("JOKER"), (5, "VERMELHO")] -> falsy [(12, "PRETO"), (13, "PRETO), (1," PRETO ")] -> falsy
Isso é código-golfe , então o código mais curto em bytes em todos os idiomas vence!