Jak opisano w tym pytaniu :
Dropsort, zaprojektowany przez Davida Morgana-Mar, jest przykładem „algorytmu sortowania” w czasie liniowym, który tworzy listę, która jest faktycznie posortowana, ale zawiera tylko niektóre oryginalne elementy. Każdy element, który nie jest co najmniej tak duży, jak maksymalna liczba elementów poprzedzających, jest po prostu usuwany z listy i odrzucany.
Aby użyć jednego ze swoich przypadków testowych, wejście z {1, 2, 5, 4, 3, 7}
wydajnością {1, 2, 5, 7}
, jak 4
i 3
oba spadły za to, że mniejsze niż poprzednio „posortowane” wartości 5
.
Nie chcemy algorytmów „sortujących”, chcemy, żeby były prawdziwą okazją. Dlatego chcę, abyś napisał program, który, biorąc pod uwagę listę liczb, wyświetla listę list DropSorted (aby być kompletnym algorytmem sortowania, musielibyśmy scalić te listy, ale wcześniej scalono dwie listy posortowane i prośba o zrobienie tego ponownie to prawie dwa pytania, więc to pytanie jest konkretnie krokiem „podziału” naszego kompletnego DropSortu).
Rozmieszczenie i zawartość naszych list jest jednak kluczowa. Dane wyjściowe programu muszą odpowiadać wynikom DropSort, a następnie DropSort odrzuconych wartości i tak dalej, dopóki nie będzie tylko listy posortowanych łańcuchów. Ponownie, pożyczając istniejący zestaw testów (i dodając dwa kolejne):
Input -> Output
{1, 2, 5, 4, 3, 7} -> {{1, 2, 5, 7}, {4}, {3}}
{10, -1, 12} -> {{10, 12}, {-1}}
{-7, -8, -5, 0, -1, 1} -> {{-7, -5, 0, 1}, {-8, -1}}
{9, 8, 7, 6, 5} -> {{9}, {8}, {7}, {6}, {5}}
{10, 13, 17, 21} -> {{10, 13, 17, 21}}
{10, 10, 10, 9, 10} -> {{10, 10, 10, 10}, {9}} //Note equivalent values aren't dropped
{5, 4, 3, 8, 7, 6} -> {{5, 8}, {4, 7}, {3, 6}}
{0, 2, 5, 4, 0, 7} -> {{0, 2, 5, 7}, {4}, {0}}
Możesz założyć, że dane wejściowe nie są puste.
To jest golf golfowy , więc obowiązują standardowe zasady!
[5, 4, 3, 8, 7, 6] -> [5, 8], [4,3,7,6]
?{3,4,5,3,4,5,3,4,5}
skutkować{{3,4,5,5,5},{3,4,4},{3}}
?Odpowiedzi:
MATL ,
15109 bajtów5 bajtów mniej przy użyciu pomysłu @beaker na łączne maksimum
Dane wejściowe to numeryczny wektor wiersza w formacie
[1, 2, 5, 4, 3, 7]
(przecinki są opcjonalne). Dane wyjściowe zawierają listy oddzielone znakiem nowej linii, a liczby na każdej liście są oddzielone spacjami.Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
Biorąc pod uwagę tablicę, kod wybiera z niej każdy wpis, który jest równy skumulowanemu maksimum do tego wpisu.
Na przykład dane
kod wybiera pierwszy, drugi, trzeci i szósty wpis:
Następnie proces powtarza się na podtablicy utworzonej przez pozostałe wpisy (w oryginalnej kolejności):
Należy to zrobić, dopóki podtablica pozostałych wpisów nie będzie pusta. Górną granicą wymaganej liczby iteracji jest rozmiar wejściowy. Ostatnie iteracje mogą nie być potrzebne. W takim przypadku działają one na pustej tablicy, wytwarzając dodatkowe puste tablice.
Na końcu stos zawiera wymagane tablice i prawdopodobnie kilka pustych tablic, które w ogóle nie są wyświetlane.
źródło
Haskell,
67 5958 bajtówObjaśnienie: Biorąc pod uwagę listę list (które są już posortowane) i wartość
x
,!
operator umieścix
na końcu pierwszej listy, której ostatni element jest mniejszy lub równyx
. Jeśli taka lista nie istnieje, lista[x]
jest umieszczana na końcu.Wypróbuj online.
źródło
Łuska , 10 bajtów
Wypróbuj online!
Jest to kombinacja mojej drugiej odpowiedzi Husk i odpowiedzi Xnora Haskella . Duplikat
ü<
wydaje się niezręczny, ale nie wiem, jak się go pozbyć ...Wyjaśnienie
Funkcja
ü<
tłumaczy sięnubBy(>)
w języku Haskell. Przechodzi przez listę od lewej do prawej, zachowując te elementy, dla których żaden wcześniej przechowywany element nie jest ściśle większy. Innymi słowy, wykonuje droport. Pozostałe elementy uzyskuje się, biorąc różnicę listy oryginalnej listy i wynikü<
.źródło
Haskell , 50 bajtów
Wypróbuj online!
źródło
\\
funkcji: (Łuska , 16 bajtów
Wypróbuj online!
Wyjaśnienie
Ten pierwszy wiersz jest funkcją główną, a drugi to funkcja pomocnicza wyższego rzędu (przyjmuje funkcję jako argument i zwraca nową funkcję). Jest dostępny przez indeks dolny
₁
. Chodzi o to, że₁≤
wykonuje droport i₁>
daje resztki elementów.W głównej funkcji
₁>
iterujemy funkcję resztek i stosujemy funkcję droport₁≤
do wyników.źródło
Python 3 ,
131 112 10395 bajtówWielkie dzięki @Mr. Xcoder dla oszałamiającej 19 bajtów !!
Wielkie dzięki @ovs za niesamowite 17 bajtów!
Wypróbuj online!
Wyjaśnienie:
źródło
if-else
Można opadł[m,d][i<m[-1]]+=[i]
.[m,d]
, ale jakoś to nie działało ....(len(d)>0)
jestbool(d)
, ponieważ puste listy są w Pythonie fałszywe. +1, fajne rozwiązanie!i,
jest po prostu skrótem(i,)
, który zawiera krotkęa
.a,*x = x or [0]
to rozszerzone rozpakowywanie python3 . Oto pomocny post SO na ten temat z kilkoma przykładami.Haskell ,
11310710292 bajtówWypróbuj online!
To jest naprawdę długie.
Wyjaśnienie
!
wykonuje sortowanie upuszczone na liście, a jednocześnie#
zbiera ozdoby.g
następnie stosuje się wielokrotnie,#
aż lista będzie pusta, zapisując wyniki na liście.źródło
head a
za!!0
oszczędza bajt.APL, 27 bajtów
Wyjaśnienie:
⍵≡⍬:⍬
: jeśli dane wejściowe są puste, zwróć pustą listęX←⍵≥⌈\⍵
: wszystkie liczby większe lub równe bieżącemu maksimum(⊂X/⍵)
: lista tych liczb,∇⍵/⍨~X
: następuje wynik działania tej funkcji na pozostałych liczbachźródło
{⍵≡⍬:⍬⋄(⊂⍵~r),∇r←⍵/⍨⍵<⌈\⍵}
. Morten martwi się brakiem odpowiedzi na jego e-maile. Wszystko w porządku?JavaScript (ES6), 64 bajty
Nie golfowany:
Pokaż fragment kodu
źródło
?!
to jakiś wymyślny nowy operator ...?!
(i,n,o=[])=>[i.filter(a=>(n||a)<=a?(n=a,1):!o.push([a])),...o]
Najwyraźniej wielkie umysły myślą podobnie. Niestety nie mogę się już pozbyć więcej bajtów ... Pamiętaj, że możesz usunąćf=
swój kod, a może mój kod może dać ci kilka pomysłów, jak jeszcze bardziej pograć w golfa.f=
z mojego kodu, ponieważ jest on rekurencyjny. Twoje jest ciekawym podejściem, ale wydaje się, że nie działa w przypadku kilku przypadków testowych. Na przykład zwraca[[5,8],[4],[3],[7],[6]]
w przypadku przedostatniej.R , 61 bajtów
Wypróbuj online!
Funkcja rekurencyjna.
sum(x|1)
jest skrótemlength(x)
, więc ta rekurencja będzie działać, dopóki niex
będzie pusta.cummax
przyjmuje skumulowane maksimumx
, które następnie porównuje sięx
ponownie. W ten sposób powstaje wektor boolowski o długościx
, w którym wszystkie PRAWDA odpowiadają posortowanym wartościom. Używamy tego, aby wziąć podzbiórx
iprint
to. Funkcja jest następnie wywoływana ponownie w pozostałej częścix
.źródło
Java 8,
182179177 bajtów-3 bajty dzięki @Nevay .
-2 bajty przy użyciu
Stack
zamiastVector
.Wyjaśnienie:
Wypróbuj tutaj.
źródło
try{}catch{}
zamiast sprawdzać przeciwko,l.size()
aby zaoszczędzić trochę?0
i usunąć nawiasy zewnętrznej pętli forl->{List r=new Vector(),t;for(int p,i,x;l.size()>0;)for(p=l.get(0),r.add(t=new Vector()),i=0;i<l.size();p=x)if((x=l.get(i++))>=p)t.add(l.remove(--i));return r;}
(-3 bajty).C #,
188203 bajtówLiczba bajtów obejmuje +18 dla:
Wypróbuj online!
źródło
C ++ 14,
118108 bajtówWykorzystanie algorytmu z odpowiedzi Haskell w0lf .
Jako nienazwana ogólna lambda. Pierwszy parametr jest pojemnikiem wartości do droportowania (podobnie
vector<int>
), a drugi parametr wymaga zgodnego pustego pojemnika pojemników (podobnievector<vector<int>>
) dla wartości zwracanej przez odniesienie.W pierwszej wersji programu była
R.clear;()
pierwsza instrukcja, dzięki czemu pojemnik z kontenerami nie musiał być pusty. Peter Cordes pomyślał, że to może być zgodne ze specyfikacją, więc do tego doszło 10 bajtów.Wypróbuj online!
Nie golfowany:
źródło
R.clear()
i wystarczy, że dzwoniący zacznie od pustego kontenera.Python 2 , 88 bajtów
-4 bajty dzięki Arnoldowi Palmerowi
Wypróbuj online!
Rozwiązanie podobne do haskell @ w0lf [odpowiedź] [1]
Rzadkie zastosowanie do
for-else
budowyIteruj przez posortowane listy
for l in r
(puste na początku).Jeśli element (z wejścia)
i
jest większy niż ostatni element listyl[-1]
, dodaj element do listyl+=[i]
, przerwij.Jeśli żadna lista nie została zaakceptowana, dodaj nową listę z tymi elementami
r+=[[i]]
źródło
R, Prace w toku (89, ale nieudane)
Trzymam tu trochę pracy, ponieważ cofnąłem się w kąt za pomocą
%in%
(nie powiela się na zduplikowanych wpisach, w szczególności w ostatnim przypadku testowym), i muszę teraz zrobić inne rzeczy, ale jest to tutaj, jeśli ktoś chce na tym oprzeć:Nie golfowany:
źródło
z=function(x)"if"(sum(x|1),{a=x[(i=x>=cummax(x))] c(list(a),z(x[!i]))},NULL)
działa]
ic
jest znakiem nowej linii (lub średnikiem)"if"
, ale jestem całkiem nowy w golfie R. Powinieneś napisać jako własną odpowiedź, a ja mogę zdjąć moją. Podoba mi się to, co zrobiłeś zi
indeksem, aby obejść ten%in%
problem.cummax
!JavaScript (ES6),
717068 bajtówCałkiem proste, po prostu iteruje tablicę, szuka pierwszej tablicy wewnętrznej, której ostatnią wartością jest
<=
następna wartość do upuszczenia, jeśli żadna nie istnieje, dołącz nową tablicę wewnętrzną z następną wartością do wyjścia, w przeciwnym razie dołącz następną wartość do pierwszej znaleziono wewnętrzną tablicę pasującą do warunku.Aktualizacje
Dzięki Neil uratował trzy bajty konwersja
(...,o)
do...&&o
i ponowne zorganizowanie oddzwanianie domap()
być bardziej zwarta.źródło
&&o
jest bajtem krótszym niż(,o)
.[...b].pop()
, ale myślę, że(o.find(b=>[...b].pop()<=n)||(n=[n],o)).push(n)
oszczędza ci bajt lub dwa.Japt , 29 bajtów
Przetestuj online!
źródło
C (gcc) ,
176175173 bajtówWypróbuj online!
Nieco czytelna wersja:
źródło
PHP,
911039685 bajtów(Edytowano, aby dodać 12 znaków,
print_r($r);
aby spełnić wymaganie danych wyjściowych)(Edytowano, aby usunąć 7 bajtów, gdy zezwala się na błędy PHP)
(Edytowano, aby usunąć 11 bajtów, gdy grasz zadanie dalej)
Dane wejściowe
$a
dają wynik$r
Ładny:
Pseudo-rekurencyjna zewnętrzna pętla inicjuje tablice keep
$b
i discard,$d
aby opróżnić, a następnie wykonuje podstawową pętlę sortowania drop, w końcu ustawiając odrzucenia jako nowe dane wejściowe i dodając Keep do wyniku$r
źródło
PHP ,
102 bajty, 98 bajtówWypróbuj online!
-4 bajty, dzięki @Umbrella
Wyjaśnienie
Ta funkcja przyjmuje listę wejściową jako tablicę.
$s
, która stanie się ostatecznie zwracaną listą, jest zadeklarowana jako statyczna. To rozszerza jego zakres na wszystkie wywołania tej funkcji, umożliwiając wywoływanie funkcji rekurencyjnie bez konieczności przekazywania tej listy wyników jako argumentu lub jej zwracania.Pętlę przez każdą wartość na liście.
Czy to mniej niż największy aktualny członek listy?
Tak, umieść go na liście w
$f
celu dalszego sortowania.Nie, umieść to na liście
$l
.Wciśnij listę
$l
na listę list.Jeśli jest coś na liście
$f
, wyślij go ponownie w celu dalszego sortowania.Zwróć listę list.
źródło
<?php function d($a){return$r;}
, które pominąłem, ponieważ serdecznie mnie zmiażdżyłeś. Poza tym właśnie zdałem sobie sprawę, że oboje zapomnieliśmy wyjść.$v<max($l)?$f[]=$v:$l[]=$v;
je${$v<max($l)?f:l}[]=$v;
- przynajmniej działa w moich testach.Szałwia, 102 bajty
Bardzo podobny do @Dead Possum za odpowiedź .
Dołącza każdemu członkowi
x
zw
pierwszego wykazu wa
{} listy list zx
większą niż jest to ostatni element.jeśli nie, dołącza
[x]
doa
.Naprawdę chciałbym, jeśli
exists
zwróconya
, jeśli nic nie zostało znalezione! Próbuję również zastosować pomysł @ lineaimm w jednym wierszu ...Pytanie: Gdybym usunął kod z funkcji, musiałbym przypisać
w
do wprowadzania danych, prawda? Czy to by oszczędzało bajty?źródło
Ocaml ,
6962 bajtówWyjaśnienie:
źródło
APL,
1008883797857567776 bajtów-0 bajtów dzięki Kritixi Lithos ...
Wypróbuj online!
Musi istnieć lepszy sposób na zrobienie tego ( jest ). Wszelkie wskazówki są bardzo mile widziane i mile widziane.
W jaki sposób?
(Uwaga, niektóre z tych wyjaśnień mogą być błędne, ponieważ zapomniałem, jak to działa)
źródło
{⍬≢⍴⍵}
może zostać(⍬≢⍴)
{(⍵/⍨~E),⊂⍵/⍨E←(⍬≡⍴)¨⍵}
? Wydaje się, że jest oddzielony od wszystkiego innego[[1,2,5,7],[4],3]
do wymaganego[[1,2,5,7],[4],[3]]
.(,¨)
Galaretka, 26 bajtów
Jest to ta sama metoda, co odpowiedź APL marinusa.
Wypróbuj online! .
źródło
JavaScript (Node.js) ,
125109106 bajtów-
1618 bajtów z Zacharý-1, usuwając
{
i}
zmieniając moduł inkrementujący, tak aby zawierał „ustaw jako ostatni na bieżący”Zasadniczo pyta, czy bieżący element jest większy niż ostatni element, dodaj do pierwszej listy. W przeciwnym razie dodaj do drugiego.
Okazało się podczas tego, że porównanie dowolnej liczby
NaN
zawsze będzie skutkowałofalse
. Ciekawy!Wyjaśnienie:
Wypróbuj online!
źródło
var
?x
.