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!
fonte
Respostas:
APL (Dyalog) , 58 bytes
Leva a lista de cores (1-4) como argumento da direita e a lista de números como argumento da esquerda. O número de um Coringa é indicado, o
(⍳4)
que equivale(1 2 3 4)
a indicar que poderia ser qualquer um deles. Da mesma forma, sua cor é indicada(⍳13)
para indicar que poderia ser qualquer um dos números de 1 a 13.Experimente online!
Algoritmo
Existem três condições, das quais as duas últimas têm duas condições cada:
E TAMBÉM
um único número E
cores únicas
OU
para que a execução seja válida.
Ordem de leitura
3≤
3 é menor ou igual ao≢⍺
número de peças∧
es⍵
todos os números são iguais∧
e⍺≡∪⍺
as cores são únicas∨
ou1∊
1 está entre≢∘∪¨
o número de cores⊃,¨/
expandidas exclusivas⍺
∧
e∨/
existe pelo menos um∊
dentre todos os⊃,¨/⍵
números expandidos,⍷¨⊂
um que é encontrado em⍳13
1 a 13Explicação completa do código
{
…}
Função anônima onde⍺
é argumento à esquerda e⍵
argumento à direita3.2
⍳13
os números de 1 a 13(
…)⍷¨
Encontre as posições iniciais de cada uma das seguintes execuções:,¨/⍵
juntar cada elemento dos números (cria uma execução para cada valor do Joker)⊃
divulgar (porque/
reduz a classificação)∊
ε nlist (achatar)∨/
OU redução (ou seja, é verdade?)(
…)∧
E:3.1.
(
…)⍺
O resultado da aplicação da seguinte função na lista de cores:s←{
...}
s (para s ame), que é a seguinte função anônima (⍵
é o seu argumento):,¨/⍵
juntar cada elemento (cria uma execução para cada valor do Joker)⊃
divulgar (porque/
reduz a classificação)≢∘∪¨
o número de elementos exclusivos em cada lista1∊
é um membro? (ou seja, existem listas iguais?)(
…)∨
OU:2.2
∪⍺
as cores únicas⍺≡
são idênticas às cores (ou seja, são únicas)(
…)∧
E:2.1
s⍵
os números são todos iguais(
...)∧
E1
≢⍺
o número de cores (ou seja, o número de peças)3≤
três é menor ou igual a essefonte
Geléia ,
41403836 bytesExperimente online! (vem com um rodapé da suíte de teste)
Recebe a entrada como uma matriz de
(color, value)
peças comuns e0
de coringas. As cores são representadas como números inteiros (embora eu não tenha certeza se isso importa para o código atual).Saídas
1
(verdade) ou0
(falsas).Explicação
fonte
Python 2 ,
371 370 362 341 329325 bytesstr.split()
vez delist literal
len(x)-1
J O BK B R
paraJoker, Orange, Black, Blue, Red
literaisExperimente online!
fonte
BK
comb
a economia de 1 byte (TIO com casos de teste atualizados parab
.Javascript (ES6), 286 bytes
(Observe que os casos de teste acima contêm 2 casos de teste adicionais que não estão na pergunta: eles são verdadeiros e falsos, respectivamente: consulte a versão não destruída para facilitar a leitura).
Processo áspero:
Os curingas são indicados por ter um
0
como valor numérico (um número negativo também funcionaria); isso mantém a estrutura de entrada consistente (tem uma cor e um valor) e não depende de ter que verificar sec=="JOKER"
, economizando 7 bytes.É possível que alguns parênteses possam ser removidos, talvez não seja possível
q
como uma matriz (tentei e o valor ficou 0 ou causou demônios nasais ).Ungolfed:
Versão em que trabalhei para obter a lógica correta. Lambdas descartáveis foram alinhadas; aqui está a função correspondente:
fonte
C # (.NET Core) , 198 bytes
Toma as cores dos azulejos e os números neles como listas separadas de números inteiros. As especificidades desse mapeamento não importam, desde que cada cor tenha um número inteiro diferente e Jokers sejam representados como 0.
O formato para inserir números é bastante especial. O número que precisa ser inserido para um número
n
é 2 ^ n, enquanto o número usado para representar um curinga deve ser (2 ^ 14) -1. Isso habilita o bit a bit eu&x
avalia para u se o bloco x tem valor igual a u ou é um curinga.C # (.NET Core) , 200 bytes
Uma solução de 2 bytes a mais que não é eclética quanto à entrada. Acontece que o uso de um estojo especial para brincalhões no local em que eles eram difíceis de lidar não demorou muito mais do que a operação inteligente que eu tanto orgulho. Aqui estão Jokers (0,0), outros números são os esperados e as cores são representadas com 4 valores que são distintos entre si pela comparação padrão do C # (especificamente, o Linq
Distinct()
operação deve considerar valores para a mesma cor como 'não distintos' e valores para cores diferentes como 'distintos').Algo que pode ser útil para outros idiomas
u*=!u++^x*x
seria equivalenteu=u==x|x<1?u+1:0
em alguns idiomas; u ^ x é 0 se u == x e 0 vezes qualquer int é 0, então u ^ x * x seria 0 para u == x ou x == 0 se C # não fizesse operações bit a bit com precedência menor do que matemáticos. O C # também não pode interpretar ints como bools sem conversão explícita. Uma linguagem que tenta mais difícil de fazer tipos de trabalho pode converter os valores0
enot 0
parafalse
etrue
antes de aplicar!
a eles, porém, e em seguida, quando voltar para um int interpretar!false
como 1 e!true
como 0. Tudo o que disse, eu não posso garantir outra língua seria, na verdade, tirar proveito do restante do algoritmo, para que ele nem seja exibido.fonte
Scala,
491477 caracteres,491477 bytesEsse desafio foi divertido; obrigado.
Então,
f
na linha 4, há uma chamada recursiva em que tento substituir "JOKER" por todos os outros blocos. Consulte a seção para uma visão mais clara do código. Eu escolhi tomar como entrada uma sequência de 2 tuplas (Int, String) - chamadat
no meu código, veja tio - para que "JOKER" seja representado por uma 2-tupla (0, "JOKER").EDIT: 14 bytes salvos graças aos comentários, tomo OB b R para ORANGE BLACK BLUE RED.
Experimente Online!
EDIT: -2 bytes, excluídos inúteis em
(
torno das condições docase _ if
sfonte
O,B,b,R
vez deORANGE,BLUE,BLACK,RED
salvar bytes? Não tenho ideia de como Scala funciona, mas acho que você pode.var (O,B,b,R)=("ORANGE","BLACK","BLUE","RED")
e chama sãoO
B
b
R
, para um total de 49 bytes; ondevar c=Seq("ORANGE","BLACK","BLUE","RED")
e chamadasc(...)
totalizam 58 bytes. MAS o primeiro caso permitefor(u<-c)
no lugar defor(u<-Seq(O,B,b,R))
, então o custo não é -9, mas +2. Obrigado por tentar embora.var c=Seq("O","B","b","R")
e tomando esses caracteres como suas entradas, em vez de seqüências completas de cores. Como mencionado na postagem original, "As cores podem ser consideradas como ... Abreviações de sequência".