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}
.
Tarefa
Dado um conjunto de somas S
fornecidas em ordem classificada, contendo apenas números inteiros positivos e um comprimento de matriz n
, sua tarefa é gerar pelo menos uma matriz X
como essa f(X) = S
.
Por exemplo, se S = {1,2,3,5,6}
e, em n = 3
seguida, uma saída válida é X = (1,2,3)
.
Se não houver essa matriz, X
seu código deve gerar qualquer valor constante.
Exemplos
Entrada n=4, S = (1, 3, 4, 5, 6, 8, 9, 10, 13)
:, saída possível:X = (3, 5, 1, 4)
Entrada n=6, S = (2, 3, 4, 5, 7, 8, 9, 10, 12, 14, 17, 22)
:, saída possível:X = (5, 3, 2, 2, 5, 5)
Entrada n=6, S = (2, 4, 6, 8, 10, 12, 16)
:, saída possível:X = (4, 2, 2, 2, 2, 4)
Entrada n=6, S = (1, 2, 3, 4, 6, 7, 8, 10, 14)
:, saída possível:X = (4, 2, 1, 1, 2, 4)
Entrada: n=10, S = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 18, 19, 20, 23, 24, 25)
, possível saída: X = (1, 1, 3, 1, 2, 1, 2, 5, 4, 5)
.
Entrada: n=15, S = (1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31)
, possível saída: X = (1, 2, 1, 3, 3, 1, 3, 3, 1, 3, 3, 1, 2, 1, 3)
.
Formato de entrada e saída
Seu código pode receber e fornecer resultados em qualquer formato de leitura facilmente humano que você achar conveniente. No entanto, mostre a saída do teste nos exemplos da pergunta.
Tempo de execução
Você deve poder executar o código até a conclusão para todos os exemplos na pergunta. Ele deve, em princípio, ser correto para n
até 15
, mas você não precisa provar que seria rápido o suficiente para todas as entradas.
fonte
Respostas:
Casca , 20 bytes
Experimente online!
Retorna uma solução ou uma lista vazia, se não existir. O último caso de teste (
n=15
) termina em 3,8 segundos no TIO.Explicação
O programa tem duas partes. Na primeira parte (
¡
e à direita), construímos uma lista infinita cujok
th é uma lista que contém todas ask
listas de comprimento cujas somas de fatia estãoS
. Fazemos isso de forma indutiva, começando pelas fatias de 1 elemento deS
, e em cada etapa precedendo cada elemento deS
cada lista e mantendo aqueles cujas somas de prefixo estãoS
. Na segunda parte (!
e à esquerda), pegamos on
th elemento da lista, que contémn
listas de comprimento . Destes, selecionamos o primeiro cujas somas de fatia realmente contêm todos os elementos deS
.No código, vamos primeiro substituir
o
eȯ
(que compõem duas e três funções em uma) por parênteses para maior clareza.Existem algumas partes que precisam de mais explicações. Neste programa, os sobrescritos se
⁰¹
referem ao primeiro argumentoS
. No entanto, seα
for uma função,α¹
significa "aplicarα
aS
", enquanto⁰α
significa "conectarS
ao segundo argumento deα
". A função¦
verifica se o primeiro argumento contém todos os elementos do segundo (contando multiplicidades), assimS
deve ser o segundo argumento.Na primeira parte, a função que
¡
usa pode ser interpretada comoS(f~Λ€∫)(×:)¹
. O combinadorS
se comporta comoSαβγ -> (αγ)(βγ)
, o que significa que podemos simplificá-lo(f~Λ€∫¹)(×:¹)
. A segunda parte ,,×:¹
é "misturar comS
anexando" e seu resultado é passado para a primeira parte. A primeira partef~Λ€∫¹
funciona assim. A funçãof
filtra uma lista por uma condição, que neste caso é~Λ€∫¹
. Ele recebe uma lista de listasL
, então temos~Λ€∫¹L
. O combinador~
se comporta como~αβγδε -> α(βδ)(γε)
: o primeiro argumento é passado paraβ
, o segundo paraγ
e os resultados são combinados comα
. Isso significa que nós temosΛ(€¹)(∫L)
. A última parte∫L
é apenas a soma acumulada deL
,€¹
é uma função que verifica a associaçãoS
eΛ
aceita uma condição (aqui€¹
) e uma lista (aqui∫L
) e verifica se todos os elementos a satisfazem. Simplificando, filtramos os resultados da mistura, independentemente de suas somas cumulativas estarem incluídasS
.fonte
Ruby , 135 bytes
Experimente online!
Use uma pesquisa pela primeira vez. n = 10 funciona no TIO, n = 15 leva mais de um minuto, mas funciona na minha máquina.
Ruby , 147 bytes
Experimente online!
Versão otimizada, funciona no TIO por n = 15 (~ 20 s)
Na verdade, este é o começo de uma abordagem de força não bruta. Espero que alguém trabalhe nisso e encontre uma solução completa.
Primeiras idéias:
O que nos leva à próxima otimização:
Ruby , 175 bytes
Experimente online!
~ 8,5 segundos no TIO. Não é ruim...
... e assim por diante (a ser implementado)
fonte
Haskell,
117111 bytes6 bytes salvos graças ao @nimi!
Experimente online!
f
r
i
n
s
Quando
n
é zero (jogado com golfen<1
) a lista deve estar pronta, portanto, verificamos se todos os valores foram vistos. Caso contrário, retornamos uma lista vazia para indicar nenhuma solução; caso contrário, retornamos uma lista singleton contendo uma lista vazia, na qual os elementos escolhidos serão anexados. Este caso também poderia ter sido tratado com as equações adicionaisSe
n
não for zero, retornamosEsta é a lista de (1) listas de onde vem o primeiro elemento (2)
s
e o restante (5) da chamada recursiva, sob a condição (4) em que todas as novas somas estãos
. As novas somas são computadas em (3) - observe quet
é extraído de uma lista de singleton, um truque feio para o golfe, como seria o idiomático Haskelllet t=y:map(y+)i
. A chamada recursiva (5) recebe como novor
conjunto o antigo, sem os elementos que aparecem entre as novas somast
.A função principal
&
chama a função auxiliar dizendo que ainda temos que ver todos os valores (r=s
) e que ainda não há somas (i=[]
).Por mais sete bytes, podemos restringir a computação para fornecer apenas o primeiro resultado (se houver), que é muito mais rápido e lida com todos os casos de teste em menos de 2 segundos.
Experimente online! (este é o primeiro resultado, apenas variação da versão antiga)
fonte
map
, eu só tentei<$>
, mas que parens extras necessários ... @Anush Eu não tenho idéia de uma solução em tempo polinomialLimpo , 177 bytes
Experimente online!
Leva cerca de 40 segundos na minha máquina para o
n=15
caso de teste, mas o tempo limite é excedido no TIO.Limpo , 297 bytes
Experimente online!
Este inclui algumas otimizações feitas pelo GB , bem como algumas próprias. Eu acho que alguns deles podem ser mais genéricos, então adicionarei uma explicação assim que estiver pronto.
Demora cerca de 10 segundos na minha máquina, 40 segundos no TIO.
fonte
@mention
você amanhã, quando chegarem, infelizmente não temos tempo hoje.Python 3 , 177 bytes
Experimente online!
(algumas novas linhas / espaços foram adicionados para evitar que os leitores precisem rolar o código)
Uma porta direta da minha resposta Jelly (com algumas modificações, consulte a seção "observação" abaixo)
Resultado da execução local:
Ouvi dizer que
itertools
é detalhado, mas minha melhorcombinations
implementação é ainda mais detalhada:Nota .
a[p//n:p%n+1]
leva cerca de duas vezes mais, mas economiza alguns bytes.combinations
retorno de um iterador, isso facilita a memória.fonte
Geléia , 35 bytes
Experimente online!
Executar localmente: (n = 15 leva mais de 1 GB de RAM)
(na verdade, eu executei a versão codificada em UTF8, que leva mais de 35 bytes, mas o resultado é o mesmo)
Esta solução usa curto-circuito para reduzir o tempo de execução.
Explicação
Observamos que as somas de todos os prefixos não vazios estão presentes na entrada e estão aumentando estritamente. Também podemos assumir que o elemento maior e o segundo maior é uma soma de prefixo.
Não testado (mas deve ter desempenho idêntico)
Gelatina , 32 bytes
Experimente online!
Versão mais ineficiente (sem curto-circuito):
Gelatina , 27 bytes
Experimente online!
Para o teste n = 15, são necessários até 2 GB de RAM e não terminam após ~ 37 minutos.
nota :
Ẇ§
pode ser substituído porÄÐƤẎ
. Pode ser mais eficiente.fonte
APL (NARS), caracteres 758, bytes 1516
A função G em G x (com a ajuda da função H) encontraria todas as permutações de x. A função d em xdy descobre se a matriz y gera após a matriz de exercícios x retornando um valor booleano. A função F em x F y retornaria a matriz r de comprimento x, de modo que ydr seja verdadeiro (= 1) Um pouco longo como implementação, mas é este que calcula todos os casos em teste menos tempo ... O último caso para n = 15 ele roda 20 segundos apenas ... eu tenho que dizer que isso não encontra muitas soluções, retorne apenas uma solução (finalmente parece que sim) em menos tempo (teste não explorado para entradas diferentes ...) 16 + 39 + 42 + 8 + 11 + 11 + 18 + 24 + 24 + 54 + 11 + 12 + 7 + 45 + 79 + 69 + 12 + 38 + 26 + 72 + 79 + 27 + 15 + 6 + 13 (758)
fonte