Este é um acompanhamento de matrizes de contagem que fazem conjuntos exclusivos . A diferença significativa é a definição de exclusividade.
Considere uma matriz A
de comprimento n
. A matriz contém apenas números inteiros positivos. Por exemplo A = (1,1,2,2)
. Vamos definir f(A)
como o conjunto de somas de todos os sub-arranjos contíguos não vazios de A
. Nesse caso f(A) = {1,2,3,4,5,6}
. As etapas a f(A)
serem produzidas são as seguintes:
Os sub-arranjos de A
são (1), (1), (2), (2), (1,1), (1,2), (2,2), (1,1,2), (1,2,2), (1,1,2,2)
. Suas respectivas somas são 1,1,2,2,2,3,4,4,5,6
. O conjunto que você obtém dessa lista é, portanto {1,2,3,4,5,6}
.
Chamamos uma matriz de A
única se não houver outra matriz B
do mesmo comprimento, de modo que f(A) = f(B)
, exceto a matriz A
invertida. Como exemplo, f((1,2,3)) = f((3,2,1)) = {1,2,3,5,6}
mas não há outra matriz de comprimento 3
que produz o mesmo conjunto de somas.
Tarefa
A tarefa, para um dado n
e, s
é contar o número de matrizes exclusivas desse comprimento. Você pode assumir que s
está entre 1
e 9
. Você só precisa contar matrizes onde os elementos são um número inteiro s
ou s+1
. Por exemplo, se s=1
as matrizes que você está contando contêm apenas 1
e 2
. No entanto, a definição de exclusividade refere-se a qualquer outra matriz do mesmo comprimento. Como exemplo concreto, não[1, 2, 2, 2]
é único, pois fornece o mesmo conjunto de somas que .[1, 1, 2, 3]
Você deve contar o reverso de uma matriz, bem como a própria matriz (desde que a matriz não seja um palíndromo, é claro).
Exemplos
s = 1
, as respostas para n = 2,3,4,5,6,7,8,9 são:
4, 3, 3, 4, 4, 5, 5, 6
Pois s = 1
, as matrizes únicas de comprimento 4 são
(1, 1, 1, 1)
(2, 1, 1, 2)
(2, 2, 2, 2)
s = 2
, as respostas para n = 2,3,4,5,6,7,8,9 são:
4, 8, 16, 32, 46, 69, 121, 177
Um exemplo de uma matriz que não é exclusiva s = 2
é:
(3, 2, 2, 3, 3, 3).
Isso tem o mesmo conjunto de somas que ambos: (3, 2, 2, 2, 4, 3)
e (3, 2, 2, 4, 2, 3)
.
s = 8
, as respostas para n = 2,3,4,5,6,7,8,9 são:
4, 8, 16, 32, 64, 120, 244, 472
Ponto
Para um dado n
, seu código deve gerar a resposta para todos os valores de s
from 1
a 9
. Sua pontuação é o valor mais alto n
para o qual isso termina em um minuto.
Teste
Vou precisar executar o seu código na minha máquina ubuntu, portanto, inclua as instruções mais detalhadas possíveis sobre como compilar e executar seu código.
Entre os melhores
- n = 13 por Christian Sievers em Haskell (42 segundos)
fonte
s
? O que isso representa?Respostas:
Haskell
A
orig
função cria todas as listas de comprimenton
com entradass
ous+1
, guarda-as se vierem antes do reverso, calcula sua subsums
- lista e as coloca em um mapa que também lembra o primeiro elemento da lista. Quando o mesmo conjunto de somas é encontrado mais de uma vez, o primeiro elemento é substituído porNothing
, então sabemos que não precisamos procurar outras maneiras de obter essas somas.A
construct
função procura por listas de determinado comprimento e determinado valor inicial que possuem um determinado conjunto de somas de sub-listas. Sua parte recursivaconstr
segue essencialmente a mesma lógica que essa , mas possui um argumento adicional que fornece a soma que as entradas restantes da lista precisam ter. Isso permite que você pare mais cedo, mesmo que os menores valores possíveis sejam grandes demais para obter essa soma, o que proporcionou uma enorme melhoria de desempenho. Grandes melhorias adicionais foram obtidas movendo esse teste para um local anterior (versão 2) e substituindo a lista de somas atuais por aVector
(versão 3 (quebrada) e 4 (com rigor adicional)). A versão mais recente faz o teste de associação ao conjunto com uma tabela de pesquisa e adiciona um pouco mais de rigor e paralelização.Quando
construct
encontrar uma lista que forneça as somas da sub-lista e seja menor que o contrário, ela poderá devolvê-la, mas não estamos realmente interessados nela. Seria quase o suficiente apenas retornar()
para indicar sua existência, mas precisamos saber se precisamos contar duas vezes (porque não é um palíndromo e nunca lidaremos com o contrário). Então, colocamos 1 ou 2 comoweight
na lista de resultados.A função
count
reúne essas partes. Para cada conjunto de somas da sub-lista (provenientes deorig
) exclusivo entre as listas que contêm apenass
es+1
, ele chamavalue
, que chamaconstruct
e, viauniqueval
, verifica se há apenas um resultado. Nesse caso, esse é o peso que precisamos contar, caso contrário, o conjunto de somas não era exclusivo e zero é retornado. Observe que, devido à preguiça,construct
irá parar quando encontrar dois resultados.A
main
função lida com IO e o loop des
1 a 9.Compilando e executando
No debian, isso precisa dos pacotes
ghc
,libghc-vector-dev
elibghc-parallel-dev
. Salve o programa em um arquivoprog.hs
e compile-o comghc -threaded -feager-blackholing -O2 -o prog prog.hs
. Execute com./prog <n> +RTS -N
where<n>
é o comprimento do array para o qual queremos contar os arrays exclusivos.fonte