Uma sequência mágica é uma sequência de números inteiros não negativos, de x[0..n-1]
modo que existem exatamente x[i]
instâncias dei
Por exemplo, 6,2,1,0,0,0,1,0,0,0 é uma sequência mágica, pois existem 6 0, 2 1 e assim por diante.
Escreva uma função que, quando dada n, produz todas as seqüências mágicas de comprimento n
O programa que pode produzir a saída correta para o valor mais alto de n em 10 segundos vence. (Todos os programas são bem-vindos, no entanto)
Por exemplo, o programa de Alice pode lidar com até n = 15 em 10 segundos, enquanto o programa de Bob pode lidar com até n = 20 no mesmo tempo. Bob vence.
Plataforma: Linux 2.7GHz @ 4 CPUs
number
fastest-code
sequence
Agnishom Chattopadhyay
fonte
fonte
n>5
com uma solução que não é da forma[n-4, 2, 1, ..., 0, 0, 1, 0, 0, 0]
? Procurein=20
e não encontrei um e me pergunto se estou cometendo um erro.Respostas:
Python, nº 10 8
Isso usa o fato, que vou provar, de que as únicas sequências mágicas de comprimento
n
são:[1, 2, 1, 0]
e[2, 0, 2, 0]
paran=4
[2, 1, 2, 0, 0]
paran=5
[n-4, 2, 1, 0, 0, ..., 0, 0, 1, 0, 0, 0]
paran>=7
Portanto,
n>=7
basta apenas retornar uma tupla enorme. Eu posso fazer isso aproximadamenten=10^8
no meu laptop, o que provavelmente é limitado pela memória; mais e congela. (Graças a trichoplax pela idéia de usar tuplas em vez de listas.) Ou, se alguém pode imprimir um dicionário de entradas diferentes de zero{0:n-4, 1:2, 2:1, (n-4):1}
, pode fazer isso por ginormousn
.Eu provo a singularidade de
n>=7
; os outros podem ser verificados por força bruta ou trabalho de casa.A soma das entradas de
l
é a contagem total de todos os números da lista, que é seu comprimenton
. A lista possuil[0]
zeros e, portanto,n-l[0]
entradas diferentes de zero. Mas, por definição,l[0]
deve ser diferente de zero ou temos uma contradição, e cada uma das outras entradas diferentes de zero é pelo menos 1. Isso já é responsável por uma soma dal[0] + (n-l[0]-1)*1 = n-1
soma total den
. Portanto, sem contarl[0]
, pode haver no máximo um 2 e nenhuma entrada maior que 2.Mas isso significa que as únicas entradas diferentes de zero são
l[0], l[1], l[2], and l[l[0]]
, cujos valores são no máximol[0]
e uma permutação de1,1,2
, o que fornece uma soma máxima del[0]+4
. Como essa soma én
, que é pelo menos 7, temosl[0]>=3
, e assiml[l[0]]=1
. Agora, há pelo menos um1
, o que significal[1]>=1
, mas sel[1]==1
é outro1
, ol[1]>=2
que implical[1]
é o único2
. Isso fornecel[2]=1
, e todas as entradas restantes são0
, portantol[0]=n-4
, o que completa a solução.fonte
Python 3, n≈40
Faz uma pesquisa abrangente de possíveis listas, preenchendo entradas da direita para a esquerda, interrompendo a pesquisa com um sufixo, se não for plausível, o que pode acontecer se:
n
(a soma da lista inteira deve sern
)i*l[i]
no sufixo exceden
(a soma da lista inteira deve sern
)Eu tinha prefixos originais testados da esquerda para a direita, mas isso foi mais devagar.
As saídas até
n=30
são:Exceto pelas três primeiras listas
[1, 2, 1, 0], [2, 0, 2, 0], [2, 1, 2, 0, 0]
, existe exatamente uma lista de cada comprimenton>6
e o formato[n-4, 2, 1, ..., 0, 0, 1, 0, 0, 0]
. Esse padrão persiste até pelo menosn=50
. Suspeito que isso se mantenha para sempre; nesse caso, é trivial produzir um grande número deles. Mesmo se não, um entendimento matemático sobre as possíveis soluções aceleraria bastante a pesquisa.fonte
n=0
. Eu senti falta de que estamos retornando o resultado para um singlen
, sem contar os resultadosn
. Isso me faz bemn=40
.Pitão - 15 bytes
Usa força bruta em todas as sequências possíveis de len
n
e, em seguida, filtra.Explicação completa em breve.
Experimente aqui online .
fonte
K, 26 bytes
Como a abordagem de Maltysen, força bruta. O coração do programa é um predicado que testa se um determinado vetor é "mágico":
Crie um vetor iota contanto que o vetor de entrada (
!#x
), conte as ocorrências de cada dígito ((+/x=)'
) e compare o resultado com o vetor de entrada (x~
). Se houver uma correspondência, você terá uma sequência mágica.Infelizmente, essa primeira facada parece bem lenta. Testar usando Kona no meu laptop leva cerca de 12 segundos para lidar com n = 7. Eu preciso pensar um pouco mais nisso.
fonte