Die Herausforderung besteht darin, die kürzeste Implementierung zu schreiben , um die am längsten zunehmende Teilsequenz zu finden .
Beispiel : Sei S die Folge 1 5 7 1 8 4 3 5 [Länge von S = 8]
- Wir haben 1 Teilsequenz der Länge 0 [wird als ansteigend betrachtet]
- 6 Teilsequenzen der Länge 1 {1,5,7,8,4,3} [alle gelten als ansteigend]
- (7 * 8) / 2 Subsequenzen der Länge 2 [aber wir werden Duplikate entfernen], die zunehmenden Subsequenzen sind in starkem Schwarz.
{ 15,17 , 11, 18,14,13,57 , 51, 58 , 54,53,55,71, 78 , 74,73,75,84,83,85,43, 45,35 }
[Beachten Sie, dass wir nur an streng zunehmenden Teilsequenzen interessiert sind]
[Sie können die Reihenfolge der Elemente innerhalb der Sequenz nicht ändern , daher gibt es in der Beispielsequenz keine Teilsequenz [37].]
- Wir haben zunehmende Teilsequenzen der Länge 4, die 1578 beträgt, aber es gibt keine Teilsequenz der Länge 5, daher betrachten wir die Länge der am längsten zunehmenden Teilsequenz = 4.
Eingabe :
a 1 a 2 ... a N (Die Sequenz)
Alle Zahlen sind positive ganze Zahlen unter 10 3
N <= 1000
Ausgabe :
Eine ganze Zahl, die die Länge der am längsten ansteigenden Teilsequenz der Eingabesequenz angibt.
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
Ihr Code sollte rechtzeitig ausgeführt werden. Bitte testen Sie Ihren Code in diesem Fall, bevor Sie ihn hier einreichen (auch der Link enthält meine 290-Byte-C ++ 11-Lösung).
Sie können die Eingabe entweder aus einer Datei / stdin oder als Funktionsparameter übernehmen und die Ausgabe entweder in eine Datei / stdout drucken oder einfach den Wert zurückgeben, wenn Sie eine Funktion schreiben
Anzeigetafel
- Dennis CJam - 22
- isaacg Pyth - 26
- Howard GolfScript - 35
- stolzer Haskeller Haskell - 56
- Ray Python 3 - 66
- Histokrat Ruby - 67
- DLeh C # - 92
- YosemiteMark Clojure - 94
- faubiguy Python 3 - 113
function f(){...}
) oder der inneren Funktion (nur...
) zählen? Sind anonyme Funktionen zulässig, wenn wir äußere Funktionen zählen?Antworten:
CJam, 22 Bytes
Probieren Sie es online aus.
Beispiel
Das Programm druckt
57
für diesen Testfall nach 0,25 Sekunden.Wie es funktioniert
Ich habe die allgemeine Idee aus @ Rays Antwort übernommen .
quelle
Python 3, 66
Beachten Sie, dass alle Zahlen im Bereich [1, 999] liegen. Wir können ein Array verwenden
b
, um die längste Teilsequenzlänge beizubehalten, die mit jeder Zahl endet.b[x] = d
bedeutet, dass die längste Teilsequenz, die mit endet,x
Länge hatd
. Für jede Zahl aus der Eingabe aktualisieren wir das Array mitb[x] = max(b[:x]) + 1
und erledigen dann die Aufgabe, indem wirmax(b)
endlich nehmen.Die zeitliche Komplexität ist
Auf)O (mn) , wobeim
immer 1000 ist undn
die Anzahl der Eingabeelemente ist.Wow, sieht aus wie schon ungolfed :) Du kannst es mit stdin / stdout testen, indem du eine Zeile hinzufügst:
quelle
for x in a: max(b)
sieht ziemlich O (n ^ 2) aus.O(1000 n)
und 1000 ist eine Konstante. Sie können es auch so denkenO(m n)
.O(1)
;-)print
ist kürzer alsreturn
.Python - 113
quelle
a+=[i]*(a==[]or i>a[-1]);z=0
und dem Druckenlen(a)
(ohne Klammern) können Sie 4 Zeichen speichern.Pyth , 26
293339Port of @ ray Lösung. Besteht offizielle Tests. Verwendet jetzt einen durch Leerzeichen getrennten STDIN-Eingang, keinen Funktionsaufruf.
Führen Sie Folgendes aus:
Erläuterung:
Zeit unbegrenzt:
Pyth , 18
Technischer Hinweis: Beim Schreiben dieses Golfs ist ein Fehler in meinem Pyth-Complier aufgetreten.
L
funktionierte nicht. Aus diesem Grund wurde kürzlich ein Commit für das oben genannte Git-Repository durchgeführt.quelle
Clojure, 94 Zeichen
Verwenden des Ansatzes von @ Ray zum Aktualisieren der Ergebnisse in einem Vektor mit 1000 Elementen:
Auf Anfrage mit Druckanweisung (Antwort wird gedruckt und Null zurückgegeben). Die Eingabe sollte ein Vektor (g [1 2 3]) oder eine Liste (g '(1 2 3)) sein:
quelle
Haskell,
585756 ZeichenDies verwendet einen Algorithmus, den ich einmal im Internet gesehen habe, aber ich kann ihn nicht finden. Es dauert nicht merklich lange, bis der angegebene Testfall auf meinem Computer mit GHCi ausgeführt wird (wahrscheinlich wäre er sogar noch schneller, wenn er kompiliert würde).
quelle
GolfScript, 35 Zeichen
Eine Implementierung, die als vollständiges Programm mit Eingabe auf STDIN arbeitet (ohne die angegebene Längennummer). Die Implementierung ist auch bei längeren Eingaben relativ schnell (versuchen Sie es hier ).
Beispiele:
quelle
$
O (n log n) ist der Algorithmus O (n ^ 2 log n).Ruby, 67
Dies läuft bei der großen Eingabe in 30 Sekunden. Zählt das als rechtzeitige Methode? : p
Es ist eine brutale Rekursion, aber mit etwas Auswendiglernen.
quelle
C #,
17292 ZeichenNichts Besonderes, aber ich habe es getan, also dachte ich mir, ich könnte es genauso gut einreichen.
Vielen Dank an Armin und Bob für ihre Verbesserungen!
quelle
=>
sind unnötig. Sie können diei=0
Deklaration auch außerhalb derfor
Schleife nach verschiebenint c=2,m=2,i=0;for(;
. Sie können die Klammern auch um denfor
Körper legen , da Sie dort nur eine einzige Anweisung haben.c++;if(c>m)m=c;
kann seinm=c++>m?m:c;
, und Sie können wieder die Klammern um das fallen lassen.if(i>0)
Prüfung auch verwerfen , indem Sie diefor
Schleife bei 1 beginnen lassen. Sie können dieint c=2,m=2,i=0;for(;i<j.Length;i++)if(i>0)
zuvor vorgeschlagene Prüfung weiter verkürzenint c=2,m=2,i=0;for(;i++<j.Length;)
. Dieser gesamte Abschnitt könnte konvertiert werdenint c=2,m=2,i=0;for(;i++<j.Length;){c=j[i]>j[i-1]?c+1:2;m=c>m?m:c;}
(indem ein anderes Ternär verwendet wird, um das letzte verbleibende zu ersetzenif
- Faustregel ist, dass Ternäre kürzer sind, wenn Ihrif
Körper nur eine Aufgabe ist.m=c>m?m:c
sollten seinm=c>m?c:m
. Und wenn Sie den Vorschlag von @ Armin hinzufügen, erhalten Sie 92 Bytes, was die Größe fast halbiert!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
Probieren Sie es online aus!
Läuft in O (n log n) unter Verwendung einer modifizierten Geduldssortierung, da nur die Länge und nicht die tatsächliche Teilsequenz benötigt wird.
Erläuterung
quelle
Bash + Coreutils, 131 Bytes
Diese Lösung scheitert schrecklich an der rechtzeitigen Art und Weise und ist nicht einmal besonders kurz, aber ich fand es gut, dass so etwas zumindest theoretisch in Shell-Skripten möglich ist, also poste ich trotzdem. Dies läuft mit einer ewigkeitsinduzierenden Zeitkomplexität von O (2 ^ n) ab.
Die Eingabe ist eine durch Kommas getrennte Liste, die als einzelnes Befehlszeilenargument übergeben wird:
Die Klammererweiterung wird verwendet, um die Liste aller möglichen Teilsequenzen zu erstellen.
,:},{
, wodurch eine Zeichenfolge wie erzeugt wird1,:},{5,:},{7,:},{1,:},{8,:},{4,:},{3,:},{5
{1,:},{5,:},{7,:},{1,:},{8,:},{4,:},{3,:},{5,:}
. Dies ist eine gültige Bash-Klammer-Erweiterung, die, wenn sieeval
mit einemecho
bearbeitet wird, diese durch Leerzeichen getrennte Liste erzeugt1,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
testen dann , ob die Reihenfolge erhöht ist, undwc -w
drucken in diesem Fall die Länge der Listequelle
Stax , 21 Bytes
Führen Sie es aus und debuggen Sie es
Dies hat zwei Testfälle, von denen einer der 1000-Elemente-Fall ist. Es läuft in 24 Sekunden auf meinem Computer. Es verwendet den klassischen dynamischen Programmieransatz für diese Art von Problem.
quelle
J 34
Beachten Sie, dass ich auch die Standardeingabe lese.
Ohne Standardeingabe zu lesen, besteht das Fleisch aus 26 Zeichen.
Ich habe gerade bemerkt, dass meine für große Eingaben langsam läuft, na ja.
quelle
C ++ (gcc) , 129 Bytes
Probieren Sie es online aus!
quelle
C # (.NET Core) , 155 Byte
Verwendete ein Array, um die am längsten ansteigende Teilsequenz zu berechnen, die an jeder Position im Eingabearray endet (dynamische Programmierung), und gab dann den größten Wert zurück. Das berechnete Array für die Eingabe
[1,5,7,1,8,4,3,5]
wäre beispielsweise[1,2,3,1,4,2,2,3]
, und der größte Wert4
wird zurückgegeben.Probieren Sie es online aus!
quelle
Wolfram Language (Mathematica) , 38 Bytes
Probieren Sie es online aus!
Natürlich ist eine Mathematica integriert, um die am längsten geordneten Sequenzen zu finden. Sein Name ist sehr lang: Er macht mehr als die Hälfte der Lösung aus, und ich bin nicht überrascht, wenn jemand diese Lösung übertrifft.
quelle