Wyzwanie polega na napisaniu najkrótszej implementacji w celu znalezienia najdłuższego rosnącego podsekwencji .
Przykład : Niech S będzie sekwencją 1 5 7 1 8 4 3 5 [długość S = 8]
- Mamy 1 podsekwencję o długości 0 [uzna, że rośnie]
- 6 podsekwencji o długości 1 {1,5,7,8,4,3} [wszystkie uważa się za rosnące]
- (7 * 8) / 2 podsekwencje o długości 2 [ale usuniemy duplikaty], rosnąca podsekwencja ma mocną czerń.
{ 15,17 , 11, 18,14,13,57 , 51, 58 , 54,53,55,71, 78 , 74,73,75,84,83,85,43, 45,35 }
[zauważ, że interesują nas tylko ściśle rosnące podsekwencje]
[nie można zmienić kolejności elementów w sekwencji, więc w podanej sekwencji nie ma podsekwencji [37]]
- Mamy rosnące podsekwencje o długości 4, która wynosi 1578, ale nie ma podsekwencji o długości 5, więc rozważamy długość najdłużej rosnącej pod-sekwencji = 4.
Wejście :
a 1 a 2 ... a N (Sekwencja)
wszystkie liczby są dodatnimi liczbami całkowitymi mniejszymi niż 10 3
N <= 1000
Wyjście :
Jedna liczba całkowita oznaczająca długość najdłuższej wzrastającej pod-sekwencji sekwencji wejściowej.
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
Twój kod powinien zostać uruchomiony w odpowiednim czasie, przetestuj kod w tej sprawie przed przesłaniem go tutaj (również link zawiera moje 290-bajtowe rozwiązanie c ++ 11)
Możesz pobrać dane wejściowe z pliku / standardowego wejścia lub jako parametr funkcji i możesz wydrukować dane wyjściowe do pliku / standardowego wyjścia lub po prostu zwrócić wartość, jeśli napiszesz funkcję
function f(){...}
) czy funkcji wewnętrznej (tylko...
)? Jeśli policzymy funkcje zewnętrzne, czy dozwolone są funkcje anonimowe?Odpowiedzi:
CJam, 22 bajty
Wypróbuj online.
Przykład
Program drukuje
57
dla tego przypadku testowego po 0,25 sekundy.Jak to działa
Wziąłem ogólny pomysł z odpowiedzi @ Ray .
źródło
Python 3, 66
Zauważ, że wszystkie liczby są w zakresie [1, 999], możemy użyć tablicy,
b
aby zachować najdłuższą długość podsekwencji kończącą się każdą liczbą.b[x] = d
oznacza, że najdłuższa podsekwencja kończąca się nax
ma długośćd
. Dla każdej liczby z danych wejściowych aktualizujemy tablicę za pomocą,b[x] = max(b[:x]) + 1
a następnie wykonujemy zadanie, biorąc wmax(b)
końcu.Złożoność czasu jest
Na)O (mn) , gdziem
zawsze wynosi 1000 in
jest liczbą elementów wejściowych.Wow, wygląda na to, że już nie jest golfem :) Możesz to przetestować używając stdin / stdout, dodając wiersz:
źródło
for x in a: max(b)
wygląda prawie na O (n ^ 2).O(1000 n)
a 1000 to stała. Możesz również myśleć o tym jakO(m n)
.O(1)
;-)print
jest krótszy niżreturn
.Python - 113
źródło
a+=[i]*(a==[]or i>a[-1]);z=0
i drukowaniulen(a)
(bez nawiasów) możesz zapisać 4 znaki.Pyth , 26
293339Port rozwiązania @ ray. Przechodzi oficjalne testy. Teraz wykorzystuje wejście STDIN rozdzielone spacjami, a nie wywołanie funkcji.
Uruchom w następujący sposób:
Wyjaśnienie:
Czas nieograniczony:
Pyth , 18 lat
Uwaga techniczna: Podczas pisania tego golfa zauważyłem błąd w moim kompilatorze Pyth.
L
nie działał. Dlatego ostatnio zatwierdzono powyższe repozytorium git.źródło
Clojure, 94 znaków
Stosując podejście @ Ray do aktualizowania wyników w wektorze 1000 elementów:
Na żądanie, z instrukcją print (wydrukuje odpowiedź i zwróci zero). Dane wejściowe powinny być wektorem (g [1 2 3]) lub listą (g '(1 2 3)):
źródło
Haskell,
585756 znakówKorzysta z algorytmu, który widziałem raz w Internecie, ale nie mogę go znaleźć. Zajmuje to niezauważalnie dużo czasu w danym przypadku testowym na moim komputerze z GHCi (prawdopodobnie byłby nawet szybszy, gdyby został skompilowany).
źródło
GolfScript, 35 znaków
Implementacja działająca jako kompletny program z wejściem na STDIN (bez podanego numeru długości). Implementacja jest dość szybka, nawet przy dłuższych nakładach (spróbuj tutaj ).
Przykłady:
źródło
$
O (n log n), algorytm to O (n ^ 2 log n).Ruby, 67
To działa w 30 sekund na dużym wejściu, czy to liczy się jako terminowe? : p
To brutalna rekurencja, ale z pewną zapamiętywaniem.
źródło
C #,
17292 znakówNic specjalnego, ale zrobiłem to, więc pomyślałem, że równie dobrze mogę to zgłosić.
Dzięki Armin i Bob za ich ulepszenia!
źródło
=>
są niepotrzebne. Możesz także przenieśći=0
deklarację pozafor
pętlę doint c=2,m=2,i=0;for(;
. Możesz również upuścić szelki wokółfor
ciała, ponieważ masz tam tylko jedną instrukcję.c++;if(c>m)m=c;
może byćm=c++>m?m:c;
, i możesz ponownie upuścić szelki wokół tego.if(i>0)
czek,for
uruchamiając pętlę od 1. Możesz dalej skrócićint c=2,m=2,i=0;for(;i<j.Length;i++)if(i>0)
sugerowaną wcześniejint c=2,m=2,i=0;for(;i++<j.Length;)
. Tę całą sekcję można przekształcićint c=2,m=2,i=0;for(;i++<j.Length;){c=j[i]>j[i-1]?c+1:2;m=c>m?m:c;}
(używając innego trójskładnika, aby zastąpić ostatnią pozostałąif
- zasada kciuka jest taka, że trójskładniki są krótsze, jeśli twojeif
ciało jest po prostu zadaniem.m=c>m?m:c
powinna byćm=c>m?c:m
. A jeśli dodasz sugestię @ Armin, otrzymasz 92 bajty, prawie o połowę mniejsze!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 bajtów
Wypróbuj online!
Działa w O (n log n) , używając zmodyfikowanego sortowania cierpliwości, ponieważ potrzebna jest tylko długość, a nie faktyczna podsekwencja.
Wyjaśnienie
źródło
Bash + coreutils, 131 bajtów
To rozwiązanie strasznie zawodzi w wymaganiach dotyczących terminowości i nie jest nawet szczególnie krótkie, ale podobało mi się, że tego rodzaju rzeczy są przynajmniej teoretycznie możliwe w skrypcie powłoki, więc i tak publikuję. Działa to z indukującą wieczność złożonością czasową O (2 ^ n).
Dane wejściowe to lista rozdzielana przecinkami przekazywana jako pojedynczy argument wiersza poleceń:
Rozwijanie nawiasów służy do budowania listy wszystkich możliwych podsekwencji.
,:},{
, co daje ciąg podobny do1,:},{5,:},{7,:},{1,:},{8,:},{4,:},{3,:},{5
{1,:},{5,:},{7,:},{1,:},{8,:},{4,:},{3,:},{5,:}
. Jest to poprawne rozszerzenie nawiasu klamrowego, które poeval
edycji zecho
tworzy listę oddzieloną spacjami1,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
testujemy rosnącą kolejność, a jeśli tak, użyjwc -w
do wydrukowania długości listyźródło
Stax , 21 bajtów
Uruchom i debuguj
Ma to dwa przypadki testowe, z których jeden to przypadek 1000 elementów. Działa to w ciągu 24 sekund na moim komputerze. Wykorzystuje klasyczne podejście do programowania dynamicznego dla tego typu problemów.
źródło
J 34
Zauważ, że czytam również standardowe wejście.
Bez odczytu standardowego wejścia mięso ma 26 znaków.
Właśnie zauważyłem, że moje kopalnie działają wolno przy dużych nakładach, no cóż.
źródło
C ++ (gcc) , 129 bajtów
Wypróbuj online!
źródło
C # (.NET Core) , 155 bajtów
Użył tablicy do obliczenia najdłuższego rosnącego podsekwencji kończącego się na każdej pozycji w tablicy wejściowej (programowanie dynamiczne), a następnie zwrócił największą wartość. Na przykład obliczona tablica dla danych wejściowych
[1,5,7,1,8,4,3,5]
byłaby[1,2,3,1,4,2,2,3]
, a zwracana4
jest największa wartość .Wypróbuj online!
źródło
Wolfram Language (Mathematica) , 38 bajtów
Wypróbuj online!
Oczywiście jest wbudowana Mathematica do wyszukiwania najdłuższych uporządkowanych sekwencji. Jego nazwa jest bardzo długa: stanowi ponad połowę rozwiązania i nie zdziwię się, jeśli ktoś rozwiąże to rozwiązanie.
źródło