Le défi est d'écrire l' implémentation la plus courte pour trouver la sous- séquence croissante la plus longue .
Exemple : Soit S la séquence 1 5 7 1 8 4 3 5 [longueur de S = 8]
- Nous avons 1 sous-séquence de longueur 0 [la considérera croissante]
- 6 sous-séquences de longueur 1 {1,5,7,8,4,3} [toutes sont considérées comme en augmentation]
- (7 * 8) / 2 sous-séquences de longueur 2 [mais nous allons supprimer les doublons], les sous-séquences croissantes sont en noir fort.
{ 15,17 , 11, 18,14,13,57 , 51, 58 , 54,53,55,71, 78 , 74,73,75,84,83,85,43, 45,35 }
[notez que nous ne nous intéressons qu'aux sous-séquences strictement croissantes]
[vous ne pouvez pas changer l'ordre des éléments à l'intérieur de la séquence, il n'y a donc pas de sous-séquence [37] dans l'exemple de séquence]
- Nous avons des sous-séquences croissantes de longueur 4 qui est 1578, mais il n'y a pas de sous-séquence de longueur 5, donc nous considérons la longueur de la sous-séquence croissante la plus longue = 4.
Entrée :
a 1 a 2 ... a N (la séquence)
tous les nombres sont des entiers positifs inférieurs à 10 3
N <= 1000
Sortie :
Un entier indiquant la longueur de la sous-séquence croissante la plus longue de la séquence d'entrée.
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
Votre code doit s'exécuter en temps opportun, veuillez tester votre code sur ce cas avant de le soumettre ici (également le lien contient ma solution c ++ 11 de 290 octets)
Vous pouvez soit prendre l'entrée d'un fichier / stdin ou en tant que paramètre de fonction et vous pouvez soit imprimer la sortie dans un fichier / stdout ou simplement retourner la valeur si vous écrivez une fonction
Tableau des scores
- Dennis CJam - 22
- isaacg Pyth - 26
- Howard GolfScript - 35
- fier haskeller Haskell - 56
- Ray Python 3-66
- rubis histocrate - 67
- DLeh C # - 92
- YosemiteMark Clojure - 94
- faubiguy Python 3 - 113
function f(){...}
) ou de la fonction interne (juste...
)? Si nous comptons les fonctions externes, les fonctions anonymes sont-elles autorisées?Réponses:
CJam, 22 octets
Essayez-le en ligne.
Exemple
Le programme imprime
57
pour ce scénario de test après 0,25 seconde.Comment ça fonctionne
J'ai pris l'idée générale de la réponse de @ Ray .
la source
Python 3, 66
Notez que tous les nombres sont dans la plage [1, 999], nous pouvons utiliser un tableau
b
pour conserver la longueur de sous-séquence la plus longue se terminant par chaque numéro.b[x] = d
signifie que la sous-séquence la plus longue se terminant parx
a une longueurd
. Pour chaque numéro de l'entrée, nous mettons à jour le tableau à l'aideb[x] = max(b[:x]) + 1
puis nous avons fait le travail en prenantmax(b)
finalement.La complexité temporelle est
Sur)O (mn) , oùm
est toujours 1000 etn
est le nombre d'éléments d'entrée.Wow, on dirait déjà non golfé :) Vous pouvez le tester en utilisant stdin / stdout en ajoutant une ligne:
la source
for x in a: max(b)
ressemble à peu près O (n ^ 2).O(1000 n)
et 1000 est une constante. Vous pouvez aussi le penser commeO(m n)
.O(1)
;-)print
est plus court quereturn
.Python - 113
la source
a+=[i]*(a==[]or i>a[-1]);z=0
et l'impressionlen(a)
(sans crochets), vous pouvez enregistrer 4 caractères.Pyth , 26
293339Port de la solution de @ ray. Réussit les tests officiels. Utilise maintenant une entrée STDIN séparée par des espaces, pas un appel de fonction.
Exécutez comme suit:
Explication:
Temps illimité:
Pyth , 18
Note technique: J'ai remarqué un bug dans mon complieur Pyth lors de l'écriture de ce golf.
L
ne fonctionnait pas. C'est pourquoi il y a eu un commit récent dans le dépôt git ci-dessus.la source
Clojure, 94 caractères
En utilisant l'approche de @ Ray de mise à jour des résultats dans un vecteur de 1000 éléments:
Par demande, avec instruction d'impression (imprime la réponse et renvoie zéro). L'entrée doit être un vecteur (g [1 2 3]) ou une liste (g '(1 2 3)):
la source
Haskell,
585756 caractèresCela utilise un algorithme que j'ai vu une fois sur Internet, mais je ne le trouve pas. Cela prend un temps imperceptible sur le cas de test donné sur mon ordinateur avec GHCi (ce serait probablement encore plus rapide s'il était compilé).
la source
GolfScript, 35 caractères
Une implémentation fonctionnant comme un programme complet avec entrée sur STDIN (sans le numéro de longueur donné). L'implémentation est relativement rapide, même pour des entrées plus longues (essayez ici ).
Exemples:
la source
$
O (n log n), l'algorithme est O (n ^ 2 log n).Rubis, 67
Cela s'exécute en 30 secondes sur la grande entrée, cela compte-t-il en temps opportun? : p
C'est une récursivité brute, mais avec une certaine mémorisation.
la source
C #,
17292 caractèresRien de spécial, mais je l'ai fait alors j'ai pensé que je pourrais aussi bien le soumettre.
Merci Armin et Bob pour leurs améliorations!
la source
=>
sont pas nécessaires. Vous pouvez également déplacer lai=0
déclaration hors de lafor
boucle versint c=2,m=2,i=0;for(;
. Vous pouvez également déposer les accolades autour dufor
corps, car vous ne disposez que d'une seule déclaration.c++;if(c>m)m=c;
peut l'êtrem=c++>m?m:c;
, et vous pouvez à nouveau laisser tomber les accolades autour de cela.if(i>0)
vérification en faisantfor
démarrer la boucle à 1. Vous pouvez raccourcir davantage laint c=2,m=2,i=0;for(;i<j.Length;i++)if(i>0)
suggestion précédenteint c=2,m=2,i=0;for(;i++<j.Length;)
. Cette section entière pourrait être convertie enint c=2,m=2,i=0;for(;i++<j.Length;){c=j[i]>j[i-1]?c+1:2;m=c>m?m:c;}
(en utilisant un autre ternaire pour remplacer le dernier restantif
- la règle générale est que les ternaires sont plus courts si votreif
corps est simplement une affectation.m=c>m?m:c
devrait êtrem=c>m?c:m
. Et si vous ajoutez la suggestion de @ Armin, vous obtenez 92 octets, soit presque la moitié de la taille!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 octets
Essayez-le en ligne!
Fonctionne en O (n log n) , en utilisant un tri de patience modifié car seule la longueur, et non la sous-séquence réelle, est nécessaire.
Explication
la source
Bash + coreutils, 131 octets
Cette solution échoue horriblement sur l' exigence de manière opportune , et n'est même pas particulièrement courte, mais j'ai aimé que ce genre de chose soit au moins théoriquement possible dans le script shell, donc je poste quand même. Cela fonctionne avec une complexité temporelle induisant l'éternité de O (2 ^ n).
L'entrée est une liste séparée par des virgules passée comme un seul argument de ligne de commande:
L'expansion d'accolade est utilisée pour construire la liste de toutes les sous-séquences possibles.
,:},{
, ce qui produit une chaîne comme1,:},{5,:},{7,:},{1,:},{8,:},{4,:},{3,:},{5
{1,:},{5,:},{7,:},{1,:},{8,:},{4,:},{3,:},{5,:}
. Ceci est une extension d'accolade bash valide, qui lorsqu'elle esteval
éditée avec unecho
produit cette liste séparée par des espaces1,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
testons ensuite l' ordre croissant, et si oui, utilisonswc -w
pour imprimer la longueur de la listela source
Stax , 21 octets
Exécuter et déboguer
Celui-ci comporte deux cas de test, dont l'un est le cas à 1000 éléments. Il s'exécute en 24 secondes sur ma machine. Il utilise l'approche de programmation dynamique classique pour ce type de problème.
la source
J 34
Notez que je lis également l'entrée standard.
Sans lire l'entrée standard, la viande est de 26 caractères.
Je viens de remarquer que le mien tourne lentement pour une grande entrée, eh bien.
la source
C ++ (gcc) , 129 octets
Essayez-le en ligne!
la source
C # (.NET Core) , 155 octets
A utilisé un tableau pour calculer la sous-séquence croissante la plus longue se terminant à chaque position dans le tableau d'entrée (programmation dynamique), puis a renvoyé la plus grande valeur. Par exemple, le tableau calculé pour l'entrée
[1,5,7,1,8,4,3,5]
serait[1,2,3,1,4,2,2,3]
et la plus grande valeur4
est renvoyée.Essayez-le en ligne!
la source
Wolfram Language (Mathematica) , 38 octets
Essayez-le en ligne!
Il y a bien sûr un Mathematica intégré pour trouver les séquences ordonnées les plus longues. Son nom est très long: il représente plus de la moitié de la solution, et je ne serai pas surpris si quelqu'un sur-joue cette solution.
la source