Descrição do Desafio
Dominó é um jogo jogado com peças com dois valores: um à esquerda, outro à direita, por exemplo [2|4]
ou [4|5]
. Duas peças podem ser unidas se elas contiverem um valor comum. Os dois blocos acima podem ser unidos assim:
[2|4][4|5]
Vamos chamar uma sequência de n
blocos unidos de uma cadeia de comprimento n. Claro, telhas pode ser rodado, de modo que as telhas [1|2]
, [1|3]
e [5|3]
podem ser reorganizados em uma cadeia [2|1][1|3][3|5]
de comprimento 3.
Dada uma lista de pares de números inteiros, determine o comprimento da cadeia mais longa que pode ser formada usando esses blocos. Se a lista estiver vazia, a resposta correta é 0
(observe que você sempre pode formar uma cadeia de comprimento a 1
partir de uma lista não vazia de blocos).
Entrada / saída de amostra
[(0, -1), (1, -1), (0, 3), (3, 0), (3, 1), (-2, -1), (0, -1), (2, -2), (-1, 2), (3, -3)] -> 10
([-1|0][0|-1][-1|2][2|-2][-2|-1][-1|1][1|3][3|0][0|3][3|-3])
[(17, -7), (4, -9), (12, -3), (-17, -17), (14, -10), (-6, 17), (-16, 5), (-3, -16), (-16, 19), (12, -8)] -> 4
([5|-16][-16|-3][-3|12][12|-8])
[(1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1)] -> 7
([1|1][1|1][1|1][1|1][1|1][1|1][1|1])
[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9), (10, 11)] -> 1
(any chain of length 1)
[] -> 0
(no chain can be formed)
code-golf
combinatorics
path-finding
dominoes
shooqie
fonte
fonte
O(n!)
como quiserI guess it's P
Respostas:
Braquilog , 23 bytes
Experimente online!
Explicação
Portanto, em outras palavras, para entradas como
[[1:2]:[1:3]:[5:3]]
, tentamos reorganizá-la em uma cadeia válida e[[2:1]:[1:3]:[3:5]]
, em seguida, aplainamos / decapitamos / retire a faca para produzir[1:1:3:3:5:_]
(onde_
representa um desconhecido). A combinação~c
e:{…l2}a
efetivamente divide isso em grupos de 2 elementos, e garantimos que todos os grupos sejam iguais. À medida que aplainamos (dobrando o comprimento), removemos um elemento do início e adicionamos um no final (sem alteração) e agrupamos em pares (diminuindo pela metade), este terá o mesmo comprimento que a cadeia original de dominó.A instrução "decapitar" falhará se não houver dominó na entrada (na verdade, o IIRC
:pa
também falhará;a
não gosta de listas vazias); portanto, precisamos de um caso especial para 0. (Um grande motivo pelo qual temos a assimetria entreb
e~k
é tão que também não precisamos de um caso especial para 1.)fonte
Braquilog , 29 bytes
Experimente online!
Certamente isso é muito longo, mas tanto faz. Isso também é muito lento.
Explicação
A razão pela qual essa será a maior é porque
s - subset
gera pontos de escolha do maior ao menor subconjunto.fonte
Mathematica, 191 bytes
Pode ser jogado um pouco, tenho certeza. Mas basicamente o mesmo algoritmo da resposta Brachylog de Fatalize , com um teste ligeiramente diferente no final.
fonte
Differences/@Rest@Flatten@#~Partition~2
, em vez deDifferences/@Partition[Rest@Flatten@#,2]
(Infix
tem precedência superiorMap
)JavaScript (Firefox 30-57), 92 bytes
l
é o último valor ouundefined
para a chamada inicial.l-n
é, portanto, um valor falso se o dominó puder ser jogado.d
é o dominó em consideração.n
é o fim do dominó em consideração para encadeamento com o dominó anterior. A outra extremidade pode ser facilmente calculada comod[0]+d[1]-n
.0,
simplesmente lida com o gabinete básico de nenhum dominó jogável.fonte
Haskell ,
180 134131117 117 bytesExperimente online! A nova abordagem acabou sendo mais curta e mais eficiente. Em vez de todas as permutações possíveis, apenas todas as cadeias válidas são construídas.
Edit: A versão de 117 bytes é muito mais lenta novamente, mas ainda mais rápida que a força bruta.
Método antigo de força bruta:
Esta é uma implementação de força bruta que tenta todas as permutações possíveis (o número de permutações possíveis parece ser dado por A000165 , o " fatorial duplo dos números pares "). Experimente on-line mal consegue entradas de comprimento 7 (o que é impressionante, pois 7 corresponde a 645120 permutações).
Uso:
fonte
Python 2, 279 bytes
Golfe:
Experimente online!
A mesma coisa com alguns comentários:
Estou postando porque não vi nenhuma resposta em python ... alguém verá minha resposta e, com nojo, será forçado a postar algo muito mais curto e eficiente.
fonte
Clojure,
198183 bytesAtualização: Melhor manipulação de "máximo de sequência possivelmente vazia"
Versão anterior:
Chamando convenções e casos de teste:
F
retorna elementos da listaC
sem o elementoa
,M
retorna o máximo de ingerers de entrada ou 1.L
é a função principal, quando chamada com um único argumento, gera todas as peças iniciais possíveis e encontra o comprimento máximo para cada uma delas. Quando chamado com dois argumentos,l
é o primeiro elemento da sequência à qual a próxima peça deve corresponder eR
é o restante das peças.Gerar permutações e "escolher um elemento e dividir para descansar" foi bastante complicado de implementar de forma sucinta.
fonte