Uma sequência de números inteiros é uma sequência se a diferença entre dois números consecutivos nessa sequência for -1 ou 1 e seu primeiro elemento for 0.
Mais precisamente: a1, a2, ..., an é uma sequência se:
For any k (1 ≤ k < n): |a[k] - a[k+1]|=1,
a[1]=0
Entrada
n
- número de elementos na sequências
- soma dos elementos na sequência
Resultado
- um conjunto / lista / matriz / etc de uma sequência de comprimento
n
com a soma dos elementoss
, se possível - um conjunto / lista / matriz / etc vazio, se não for possível
Exemplos
Para entrada 8 4
, a saída pode ser [0 1 2 1 0 -1 0 1]
ou [0 -1 0 1 0 1 2 1]
. Pode haver outras possibilidades.
Para entrada 3 5
, a saída está vazia []
, pois não pode ser feita.
Regras
Este é um código de golfe, a resposta mais curta em bytes ganha. As submissões devem ser um programa ou função. A entrada / saída pode ser fornecida de qualquer uma das maneiras padrão .
(l-1)*l/2
e-(l-1)*l/2
que têm a mesma paridade que(l-1)*l/2
.Respostas:
CJam,
56 47 4434 bytesMuitas possibilidades de aprimoramento aqui, mas aqui está a primeira tentativa:
Créditos a Dennis pela maneira eficiente de fazer a
{ ... }%
peça.Imprime a representação do array, se possível, caso contrário
""
Experimente online aqui
fonte
{}%
parte do seu código não se parece nada com o meu (que é apenas o código de @ PeterTaylor, substituindo pontos por sublinhados). Se eu contribuiu nada ao seu código, é o{}=
operador ..._{_W=)+}%\{_W=(+}%+
que estava primeiro fazendo duas cópias, adicionando 1 à primeira, subtraindo 1 da outra. Seu exemplo me fez descobrir como fazer isso em um único{ ... }%
bloco. Quanto a isso{ ... }=
, eu já o havia reduzido muito em minhas experiências, embora ainda não tenha sido publicado.3 5
a saída deve ser[]
e não""
[]p
no CJam apenas gera""
. Então é assim que a linguagem representa matrizes vazias.JavaScript (E6) 79
82Não há necessidade de força bruta ou enumeração de todas as tuplas.
Veja uma sequência de comprimento n como n -1 etapas, cada etapa sendo incrementada ou decrescente.
Observe que você só pode trocar um incremento por um decremento, a soma varia de 2; portanto, para qualquer comprimento determinado, a soma é sempre par ou sempre ímpar.
Tendo todos os incrementos, a sequência é 0, 1, 2, 3, ..., n-1 e sabemos que a soma é (n-1) * n / 2
Alterando o último passo, a soma muda em 2, então a o último passo pesa 2.
Alterando o próximo para o último passo, a soma muda em 4, então o último passo pesa 4. Isso ocorre porque o passo sucessivo se baseia na soma parcial até agora.
Alterando a etapa anterior, a soma muda em 6, então a última etapa pesa 6 (não 8, não são números binários).
...
Alterar o primeiro passo pesa (n-1) * 2
Algoritmo
Código ungolfed
Teste no console Firefox / FireBug
Resultado
fonte
GolfScript (
4139 bytes)Demonstração online
Agradecimentos a Dennis por 41-> 39.
fonte
,0=
para?
. Uma porta direta para CJam seria 5 bytes mais curta:L1,al~:S;({{_W=(+_)))+}%}*{:+S=}=p
{ ... }%
bloco. No meu código, eu tinha dois, estava tentando reduzi-lo para 1. Como foi o algoritmo real, acho que Peter e eu postamos o mesmo algoritmo quase ao mesmo tempo.Mathematica, 73 bytes
Solução simples de força bruta.
Estou gerando todas as opções de etapas. Então eu as transformo em listas acumuladas para obter as seqüências únicas. E então eu estou procurando o primeiro cuja soma é igual ao segundo parâmetro. Se não houver, o valor padrão é
{}
.fonte
Haskell, 56 bytes
Explicação:
1,-1
e comprimento n-1:replicateM n-1[-1,1]
Exemplo:
replicateM 2 [-1,1]
==[[-1,-1],[-1,1],[1,-1],[1,1]]
scanl
tem um desempenho ruim, mas faz o trabalho certo aqui.n
que a soma és
fonte
Control.Monad
apenas para usoreplicateM
que já é muito longo. que outra função monádica você pode usar para simularreplicateM
?head$
à sua solução.head
não retorna[]
para[] :: [[a]]
- e eu odeio erros.mapM(\x->[1,-1])[2..n]
vez desequence
ereplicate
.Python, 138
fonte
CJam,
655854 bytesPouco mais curto que minha solução Mathematica, mas a culpa é minha por ainda não usar o CJam corretamente:
É literalmente o mesmo algoritmo: obter todos os
n-1
-tuplos de{1, -1}
. Encontre o primeiro cuja acumulação é igual as
, acrescente a0
. Imprima uma matriz vazia se nenhuma for encontrada.fonte
CJam, 40
Outra abordagem no CJam.
fonte
Rubi (136)
fonte
J, 47 caracteres
Verifica cada sequência como muitas outras respostas. Tentará fazer uma solução O (n) mais curta.
fonte
APL 38
Exemplo:
Este, como muitos outros, apenas força bruta em todas as combinações para encontrar uma que combine, se não for encontrada, não retorna nada. Na verdade, ele tenta algumas combinações mais de uma vez para diminuir o código.
fonte