Digamos que seu trabalho é pintar postes, e um cliente pede para você pintar um poste com 4 seções vermelhas e 3 seções amarelas. Você pode fazer isso com muita facilidade da seguinte maneira:
r y r y r y r
Com apenas listras amarelas e vermelhas. Agora, digamos que seu cliente solicite que você pinte um poste com 2 seções vermelhas, 2 seções amarelas e 1 seção verde . Existem algumas maneiras de pintar o seu poste
g y r y r
y g r y r
y r g y r
y r y g r
y r y r g
g r y r y
r g y r y
r y g r y
r y r g y
r y r y g
y r g r y
r y g y r
Mais precisamente, são 12 maneiras de pintar o poste. Isso explode mais cores e seções envolvidas
Agora, se o seu cliente disser que deseja 3 seções vermelhas e 1 seção amarela, não há como pintar um poste assim. Como não importa como você tenta organizar as seções, duas seções vermelhas tocarão e, quando duas seções vermelhas tocarem, elas se tornarão uma única seção vermelha.
E essa é praticamente a nossa única regra para pintar postes
Seções adjacentes podem não ser da mesma cor
Tarefa
Dada uma lista de cores e seções necessárias, imprima o número de maneiras possíveis de pintar um poste, conforme solicitado. Você pode representar cores de qualquer maneira razoável (números inteiros, caracteres, seqüências de caracteres), mas nunca receberá mais de 255 cores diferentes por vez. Se desejar, você pode optar por não atribuir nomes às cores e apenas fazer uma lista das contagens de seção, se isso for mais fácil.
Casos de teste
Eles são difíceis de calcular manualmente, principalmente à medida que aumentam. Se alguém tiver um caso de teste sugerido, eu o adicionarei.
[4,3] -> 1
[2,2,1] -> 12
[3,1] -> 0
[8,3,2] -> 0
[2,2,1,1]-> 84
fonte
[1, 1, 1, 1, 2, 2, 2]
? Eu suponho que sim.Respostas:
Mathematica, 37
4448.6062bytesTome entrada como uma lista de números inteiros
{1, 1, 1, 2, 2}
. Experimente na Wolfram Sandbox .Método de correspondência de padrões, obrigado @Não é uma árvore!
Split
divide uma lista única em sublistas de elementos consecutivos, por exemplo,{1, 1, 2, 3, 4, 4}
em{{1, 1}, {2}, {3}, {4, 4}}
{{_}..}
é, ou seja{{_}, {_}, {_}, ...}
,. O padrão corresponde a uma lista de sublistas unárias.Differences
método, 48 bytes:O código usa
Differences
para determinar se os elementos adjacentes são os mesmos.Passo a passo:
Permutations@#
gera todas as permutações da lista de entrada em uma lista N! * N.Differences/@
calcula a diferença entre N elementos e gera uma lista N! * (N-1).1##&@@@
calcula a multiplicação de todas as listas. Se uma lista contiver0
(dois elementos adjacentes são iguais), o resultado será0
, caso contrário, diferente de zero, para um N! Lista.Clip[]
age comoSign[]
, transformar a lista de (-inf, inf) para [-1, 1]Tr@Abs
transforma tudo-1
em1
e agora a lista de comprimento N! contém apenas0
(inválido) e1
(válido). Então, apenas somamos a lista.fonte
Permutations@#~Count~Except@{___,x_,x_,___}&
.Count[Split/@Permutations@#,{{_}..}]&
37 bytes!Geléia , 7 bytes
Experimente online!
Toma entrada como por exemplo
[1,1,1,1,2,2,2]
para[4,3]
. O[8,3,2]
testcase leva muito tempo para ser executado no TIO.Como funciona
fonte
Œ!QIẠ€S
? Experimente online!P
todo e qualquer átomo por sua simplicidade.P€
vez deẠ€
ainda funcionaria.05AB1E , 7 bytes
Experimente online!
-1 graças a nmjcman101 em outra resposta.
fonte
Mathematica, 50 bytes
Experimente em matemática ou na caixa de areia Wolfram !
Recebe informações como nos casos de teste - por exemplo,
{4,3}
significa "4 listras vermelhas, 3 listras amarelas".Esta é uma implementação ingênua de uma fórmula que encontrei aqui . "Ingênuo" significa "Eu não tenho idéia de como a matemática funciona, então, por favor, não me peça uma explicação ..."
fonte
Python 3.5 , 65 bytes
Experimente online!
fonte
Ruby 2.4, 47 bytes
A entrada é uma lista de caracteres: Para o caso de teste
[4,3]
, a entrada pode ser%w[a a a a b b b]
,"1111222".chars
ou algum outro método de formatação matriz que é válida em Ruby.Requer 2.4 para
Enumerator#uniq
(as versões anteriores apenas o disponibilizavam noArray
classe). Como tal, o link TIO adiciona 5 bytes para converter primeiro o enumerador de permutação em uma matrizto_a
, uma vez que não possui a função acima.Experimente online!
fonte
R, 72 bytes
Cria a função
É inserido no formulário de
[1,1,1,1,2,2,2]
acordo com o comentário do Erik the Outgolfer. Usacombinat
apermn
função para criar uma lista de todas as permutações eunique
obter todas as entradas distintas.sapply
aplica a seguinte função em todas as entradas:O que avalia como
Observe que isso
x
não é o mesmox
da entrada da grande função. Usar outro caractere nessa função enganaria,pryr::f
acreditando que a grande função precisa de outro argumento.De qualquer forma, quando dada uma permutação, esta função toma a diferença entre o vector:
2 1 3 4 2 1 -> -1 2 1 -2 -1
.!
converte zeroFALSE
e zeros emTRUE
, para que o vetor se torneFALSE FALSE FALSE FALSE FALSE
. Somando isso, para verificar se há algumTRUE
s (TRUE
implicariadiff=0
-> dois os mesmos números consecutivos). Podemos novamente inverter isso com!
para obter um valor booleano se há ou não valores consecutivos na permutação.A soma desses booleanos nos dá o número total de permutações onde esse não é o caso.
Não funciona para o
[8,3,2]
testcase porque requer um vetor de 46 GB para armazenar essas permutações.fonte
Gelatina , 11 bytes
Experimente online!
fonte
Python 2 ,
14089 bytesO formato de entrada é
'aaaabbb'
para o caso de teste[4,3]
.Experimente online!
fonte
Casca , 8 bytes
Experimente online! Recebe entrada no formato
"aaabb"
para[3,2]
. Tempos limite no caso de teste mais longo.Explicação
Nada extravagante aqui, apenas contando as permutações únicas em que todos os grupos de elementos adjacentes têm comprimento 1.
fonte
Ruby,
8476 bytesUma função lambda recursiva. Analisa cada cor possível e administra uma pesquisa em árvore recursiva, contando o número de vezes que usa todas as faixas.
Explicação (para versão antiga):
fonte
x=p
como a condição inicial?p
atua como um aliasnil
neste caso e deve satisfazer a verificação para a qual está sendo usado.MATL ,
118 bytesO formato de entrada é
[1 1 1 1 2 2 2]
para[4 3]
etc.Fica sem memória para o último caso de teste.
Experimente online!
Explicação
fonte