O desafio é escrever a implementação mais curta para encontrar a subsequência crescente mais longa .
Exemplo : Seja S a sequência 1 5 7 1 8 4 3 5 [comprimento de S = 8]
- Temos 1 sub-sequência de comprimento 0 [considerará crescente]
- 6 sub-seqüências de comprimento 1 {1,5,7,8,4,3} [todas elas são consideradas crescentes]
- (7 * 8) / 2 sub-sequências de comprimento 2 [mas removeremos duplicatas], as sub-sequências crescentes estão em preto forte.
{ 15,17 , 11, 18,14,13,57 , 51, 58 , 54,53,55,71, 78 , 74,73,75,84,83,85,43, 45,35 }
[observe que apenas estamos interessados em sub sequências estritamente crescentes]
[você não pode alterar a ordem dos elementos dentro da sequência, portanto não há sub-sequência [37] na sequência de exemplo]
- Temos sub-sequências crescentes de comprimento 4, que são 1578, mas não há sub-sequência de comprimento 5, portanto, consideramos o comprimento da sub-sequência crescente mais longa = 4.
Entrada :
a 1 a 2 ... a N (A sequência)
todos os números são números inteiros positivos menores que 10 3
N <= 1000
Saída :
Um número inteiro que denota o comprimento da subseqüência crescente mais longa da sequência de entrada.
sample input(1)
1 2 4 2 5
sample output(1)
4
sample input(2)
1 5 7 1 8 4 3 5
sample output(2)
4
Seu código deve ser executado em tempo hábil . Teste-o neste caso antes de enviá-lo aqui (também o link contém minha solução c ++ 11 de 290 bytes)
Você pode pegar a entrada de um arquivo / stdin ou como um parâmetro de função e pode imprimir a saída em um arquivo / stdout ou simplesmente retornar o valor se escrever uma função
Placar
- Dennis CJam - 22
- isaacg Pyth - 26
- Howard GolfScript - 35
- orgulhoso haskeller Haskell - 56
- Ray Python 3-66
- histocrata Ruby - 67
- DLeh C # - 92
- YosemiteMark Clojure - 94
- faubiguy Python 3 - 113
function f(){...}
) ou da função interna (apenas...
)? Se contamos funções externas, são permitidas funções anônimas?Respostas:
CJam, 22 bytes
Experimente online.
Exemplo
O programa imprime
57
para este caso de teste após 0,25 segundos.Como funciona
Peguei a ideia geral da resposta de @ Ray .
fonte
Python 3, 66
Observe que todos os números estão no intervalo [1, 999], podemos usar uma matriz
b
para manter o maior comprimento de subsequência que termina com cada número.b[x] = d
significa que a subsequência mais longa que termina comx
tem comprimentod
. Para cada número da entrada, atualizamos o array usandob[x] = max(b[:x]) + 1
e, em seguida, concluímos o trabalho,max(b)
finalmente.A complexidade do tempo é
Em)O (mn) , ondem
é sempre 1000 en
é o número de elementos de entrada.Uau, parece que já foi destruído :) Você pode testá-lo usando stdin / stdout adicionando uma linha:
fonte
for x in a: max(b)
parece praticamente O (n ^ 2).O(1000 n)
e 1000 é uma constante. Você também pode pensar assimO(m n)
.O(1)
;-)print
é mais curto quereturn
.Python - 113
fonte
a+=[i]*(a==[]or i>a[-1]);z=0
e a impressãolen(a)
(sem colchetes), você pode salvar 4 caracteres.Pyth , 26
293339Solução de porta da @ ray. Passa nos testes oficiais. Agora usa entrada STDIN separada por espaço, não chamada de função.
Execute da seguinte maneira:
Explicação:
Tempo ilimitado:
Pyth , 18
Nota técnica: notei um bug no meu Pyth complier enquanto escrevia este golfe.
L
não estava funcionando. É por isso que há um commit recente no repositório git acima.fonte
Clojure, 94 caracteres
Usando a abordagem de atualização de @ Ray em um vetor de 1000 itens:
Por solicitação, com declaração de impressão (imprimirá resposta e retornará nulo). A entrada deve ser um vetor (g [1 2 3]) ou uma lista (g '(1 2 3)):
fonte
Haskell,
585756 caracteresIsso usa um algoritmo que vi uma vez na internet, mas não consigo encontrá-lo. Leva um tempo imperceptível no caso de teste fornecido no meu computador com GHCi (provavelmente seria ainda mais rápido se fosse compilado).
fonte
GolfScript, 35 caracteres
Uma implementação que funciona como um programa completo com entrada no STDIN (sem o número especificado). A implementação é razoavelmente rápida, mesmo para entradas mais longas (tente aqui ).
Exemplos:
fonte
$
seja O (n log n), o algoritmo é O (n ^ 2 log n).Ruby, 67
Isso é executado em 30 segundos na entrada grande, isso conta como uma maneira oportuna? : p
É uma recursão bruta, mas com alguma memorização.
fonte
C #,
17292 caracteresNada de especial, mas eu fiz isso e achei que poderia enviá-lo.
Obrigado Armin e Bob por suas melhorias!
fonte
=>
são desnecessários. Você também pode mover ai=0
declaração para fora dofor
loop, paraint c=2,m=2,i=0;for(;
. Você também pode soltar os aparelhos ao redor dofor
corpo, já que você só tem uma única declaração lá.c++;if(c>m)m=c;
pode serm=c++>m?m:c;
, e você pode novamente soltar o aparelho ao redor disso.if(i>0)
verificação fazendo ofor
loop iniciar em 1. Você pode reduzir ainda mais oint c=2,m=2,i=0;for(;i<j.Length;i++)if(i>0)
sugerido anteriormenteint c=2,m=2,i=0;for(;i++<j.Length;)
. Toda essa seção poderia ser convertida emint c=2,m=2,i=0;for(;i++<j.Length;){c=j[i]>j[i-1]?c+1:2;m=c>m?m:c;}
(usando outro ternário para substituir o último remanescenteif
- regra de ouro é ternários são mais curtos se o seuif
corpo é simplesmente uma atribuição.m=c>m?m:c
deve serm=c>m?c:m
. E se você adicionar a sugestão do @ Armin, obterá 92 bytes, quase pela metade do tamanho!int a(int[] j){int c=2,m=2,i=0;for(;i++<j.Length;){c=j[i]>j[i-1]?c+1:2;m=c>m?c:m;}return m;}
J , 19 bytes
Experimente online!
É executado em O (n log n) , usando uma classificação de paciência modificada, pois somente o comprimento, e não a subsequência real, é necessário.
Explicação
fonte
Bash + coreutils, 131 bytes
Essa solução falha horrivelmente no requisito de maneira oportuna e não é nem um pouco curta, mas eu gostei que esse tipo de coisa seja pelo menos teoricamente possível no shell script, então estou postando assim mesmo. Isso é executado com uma complexidade de tempo indutora de eternidade de O (2 ^ n).
Entrada é uma lista separada por vírgula passada como um único argumento de linha de comando:
A expansão entre chaves é usada para criar a lista de todas as subsequências possíveis.
,:},{
, que produz uma sequência como1,:},{5,:},{7,:},{1,:},{8,:},{4,:},{3,:},{5
{1,:},{5,:},{7,:},{1,:},{8,:},{4,:},{3,:},{5,:}
. Essa é uma expansão de bash brace válida que, quandoeval
editada com,echo
produz essa lista separada por espaço1,5,7,1,8,4,3,5 1,5,7,1,8,4,3,: 1,5,7,1,8,4,:,5 1,5,7,1,8,4,:,: ...
sort -C
testamos a ordem crescente e, em caso afirmativo, usamoswc -w
para imprimir o comprimento da listafonte
Stax , 21 bytes
Execute e depure
Isso tem dois casos de teste, um dos quais é o caso de 1000 elementos. Ele executa esse em 24 segundos na minha máquina. Ele usa a abordagem clássica de programação dinâmica para esse tipo de problema.
fonte
J 34
Note que eu também li entradas padrão.
Sem ler a entrada padrão, a carne tem 26 caracteres.
Só notei que o meu corre devagar para grandes entradas, tudo bem.
fonte
C ++ (gcc) , 129 bytes
Experimente online!
fonte
C # (.NET Core) , 155 bytes
Usou uma matriz para calcular a subsequência crescente mais longa que termina em cada posição na matriz de entrada (programação dinâmica) e, em seguida, retornou o maior valor. Por exemplo, a matriz computada para entrada
[1,5,7,1,8,4,3,5]
seria[1,2,3,1,4,2,2,3]
e o maior valor4
será retornado.Experimente online!
fonte
Wolfram Language (Mathematica) , 38 bytes
Experimente online!
Obviamente, existe um Mathematica embutido para encontrar sequências ordenadas mais longas. Seu nome é muito longo: compõe mais da metade da solução, e não ficarei surpreso se alguém vencer essa solução.
fonte