Zaimplementuj Lazy Drop Sort

26

To wyzwanie już opisuje droport. Jednak jestem trochę leniwy i naprawdę potrzebuję tylko mojej tablicy, aby była nieco bardziej posortowana niż wcześniej, nie trzeba jej sortować do końca .

W opcji Sortuj upuszczamy każdy element mniej niż jakikolwiek element przed nim. W Lazy Drop Sort upuszczamy każdy element mniej niż dokładnie go poprzedzający .

Oto przykład. Rozważ następującą tablicę:

8 6 9 9 7 2 3 8 1 3

Oznaczmy każdy element mniej niż poprzedni.

8 6 9 9 7 2 3 8 1 3
  ^     ^ ^     ^

Zwróć uwagę, że ani nie 3został oznaczony, ani ostatni 8. Wszystkie są większe niż pojedynczy element po lewej stronie.

Po ukończeniu algorytmu, usunięciu zaznaczonych elementów otrzymujemy:

8 9 9 3 8 3

To w zasadzie wygląda na bardziej uporządkowane. Trochę Jestem leniwy.

Twoim zadaniem, jak mogłeś już wywnioskować, jest wdrożenie tego algorytmu.

Dane wejściowe to tablica co najmniej 1 dodatniej liczby całkowitej od 1 do 9, więc możesz również wziąć ciąg cyfr.

To jest , wygrywa najmniej bajtów!

Dodatkowe przypadki testowe:

1
1

1 2 3
1 2 3

5 3 1
5

1 2 3 2 1
1 2 3

1 1 1 9 9 9 1 1 1 9 9 9 1 1 1
1 1 1 9 9 9 1 1 9 9 9 1 1

9 9
9 9

5 2 4 2 3
5 4 3
Pavel
źródło
Czy może to być funkcja, czy musi to być kompletny program?
rafa11111
@ rafa11111 Albo wszystko jest w porządku
Pavel
W przypadku, gdy jest to funkcja, czy tablica wejściowa może być zakodowana na stałe w głównym programie? I czy długość tablicy można przekazać jako dane wejściowe do funkcji?
rafa11111
@ rafa11111 Dane wejściowe nie mogą być zakodowane na stałe w samej funkcji. Nie ma znaczenia, w jaki sposób funkcja pobiera te dane wejściowe w programie testowym. Możesz wziąć długość tablicy tylko, jeśli używasz C / C ++ lub innego języka, w którym jest to jedyny sposób na określenie długości tablicy.
Pavel

Odpowiedzi:

6

Łuska , 4 bajty

m←ġ<

Wypróbuj online!

Wyjaśnienie

m←ġ<
  ġ<    Group the numbers into decreasing sequences
m←      Keep the first element of each sequence
Lew
źródło
15

JavaScript (ES6), 28 25 bajtów

Zaoszczędź 3 bajty dzięki @Shaggy

a=>a.filter(n=>~-a<(a=n))

Wypróbuj online!

Arnauld
źródło
2
n=>p<=nwyglądałby niesamowicie ;-)
ETHproductions
4
@ETHproductions Dla +4 bajtów (n=p)=>p<=(p=n)działa dobrze;)
Arnauld
ta odpowiedź oszałamia mnie, dlaczego to nie eksploduje, gdy próbujesz uzyskać dostęp ppo raz pierwszy, kiedy nie jest jeszcze zdefiniowane?
Brian H.
1
@Shaggy To wygląda bezpiecznie. Zaktualizuje się, gdy będę z powrotem przed komputerem. Dzięki!
Arnauld
2
@Pavel ajest początkowo ustawiony na tablicę wejściową i a-1spowodowałoby to NaN(chyba że zawiera jedną liczbę całkowitą, w którym to przypadku jest przymuszany do tej liczby całkowitej).
Arnauld
6

MATL , 9 8 bajtów

Oszczędność jednego bajtu dzięki Giuseppe.

0yd0<h~)

Wypróbuj online!


Wyjaśnienie:

0                 % Push a zero
 y                % Implicitly grab the input and duplicate it.
                  % Stack: [8 6 9 9 7 2 3 8 1 3], 0, [8 6 9 9 7 2 3 8 1 3]
  d               % The difference between each number of the last element:
                  % Stack: [8 6 9 9 7 2 3 8 1 3], 0, [-2, 3, 0, -2, -5, 1, 5, -7, 2]
   0<             % Which are negative?
                  % Stack: [8 6 9 9 7 2 3 8 1 3], 0, [1 0 0 1 1 0 0 1 0]
     h            % Concatenate. Stack: [8 6 9 9 7 2 3 8 1 3], [0 1 0 0 1 1 0 0 1 0] 
      ~           % Negate. Stack: [8 6 9 9 7 2 3 8 1 3], [1 0 1 1 0 0 1 1 0 1]
       )          % Index. Stack: [8 9 9 3 8 3]
Stewie Griffin
źródło
5

Perl 5 .10.0 + -nl, 16 bajtów

$f>$_||say;$f=$_

Wypróbuj online!

pustkowie
źródło
1
Tłumaczenie na Perla 6perl6 -ne '$/>$_||.say;$/=$_'
Brad Gilbert b2gills
@Brad perl6 to inny język (nie jest nawet kompatybilny wstecz) Opublikuj!
wastl
Napisałem taki, który był bardziej idiomatyczny Perl 6, ale był dłuższy. Jednym z powodów, dla których tu zamieszczam, jest popisanie się językiem i wyjaśnienie go. Publikowanie tego tłumaczenia pokazuje tylko, że jest to nieco bardziej pełna wersja Perla. Zasadniczo nie spełnia żadnego z powodów, dla których publikuję na tej stronie.
Brad Gilbert b2gills 24.03.18
5

Haskell, 29 bajtów

f s=[b|(a,b)<-zip(0:s)s,a<=b]

po prostu proste zrozumienie listy.

dumny haskeller
źródło
4

Japt , 8 7 bajtów

Zapisano 1 bajt dzięki @Oliver

k@>(U=X

Przetestuj online!

Alternatywy:

f@T§(T=X
k@ä>0 gY
i0 ò> mÅ c
ETHprodukcje
źródło
Wymyśliłem dokładnie to samo rozwiązanie :)
Kudłaty
4

Stax , 5 bajtów

âÿ╠╦░

Uruchom i debuguj to online

Rozpakowujemy, odkrywamy i komentujemy kod, otrzymujemy to.

Z   Push a zero under the input
f   Use the rest of the program as a filter on the input.  Output passing elements.
>   Current element is greater than previous?
_~  Push current element to the input stack; when the main stack is empty, pops fall back to this
!   Logical not; applies to the result of the greater-than

Uruchom ten

Kolejność instrukcji jest niezręczna, ale jest ku temu powód. Pakowanie kodu źródłowego Stax nie zawsze daje taki sam rozmiar danych wyjściowych dla tego samego rozmiaru danych wejściowych. Zasadniczo masz szansę zapisać bajt, jeśli ostatni znak źródła ma niższy kod znaków. Cóż, !ma jeden z najniższych kodów, jakie można uzyskać dla postaci drukowalnej. (W szczególności 33) Wiele 6-bajtowych programów stax ASCII nie może spakować mniejszych rozmiarów. Ale jeśli kończą się na !, to mogą. Dlatego powodem tego konkretnego porządkowania instrukcji jest zapewnienie, że logika nie skończy się na końcu programu.

rekurencyjny
źródło
4

J, 12 bajtów

#~1,2&(<:/\)

Wyjaśnienie:

#~1,2&(<:/\)    | Whole function, executed as a hook
       <:/      | Distribute <: (greater or equal) over an array
    2&(   \)    | Apply to each sub array of length 2
  1,            | Append a 1 to the front
#~              | Choose elements from the original array

Przykłady:

    2&(<:/\) 8 6 9 9 7 2 3 8 1 3
0 1 1 0 0 1 1 0 1
    1,2&(<:/\) 8 6 9 9 7 2 3 8 1 3
1 0 1 1 0 0 1 1 0 1
    (1 0 1 1 0 0 1 1 0 1) # 8 6 9 9 7 2 3 8 1 3
8 9 9 3 8 3
    f =: #~1,2&(<:/\)
    f 8 6 9 9 7 2 3 8 1 3
8 9 9 3 8 3

Wypróbuj online!

Bolce Bussiere
źródło
Fajne rozwiązanie! Dodałem link TIO do twojego kodu.
Galen Iwanow
4

Galaretka , 6 bajtów

>Ɲ0;¬×

I / O jest na ciągach.

Wypróbuj online!

Dennis
źródło
Jestem ciekawy, dlaczego operować na ciągach, a nie tablicach? Powiedziano mi, że Jelly jest kiepska w sznurkach.
Pavel
2
To jest. ×nie powinno działać na powtarzanie postaci, ale działa.
Dennis
4

Java 8, 66 55 48 bajtów

l->{for(int i=0;;)if(i>(i=l.next()))l.remove();}

-11 bajtów po napiwku @ OlivierGrégoire .
-7 dodatkowych bajtów dzięki @ OlivierGrégoire .

Wyjaśnienie:

Wypróbuj online.

l->{                     // Method with Integer-ListIterator parameter and no return-type
  for(int i=0;;)         //  Loop over all items
    if(i>(i=l.next()))   //   If the current item is larger than the next
      l.remove();}       //    Remove this next item
Kevin Cruijssen
źródło
Dlaczego wszyscy zaczynają używać, ~0kiedy jest to w zasadzie -1. Osobiście wybrałbym bardziej intuicyjne rozwiązanie, jeśli liczba bajtów jest tej samej długości (z wyjątkiem while(...)vs for(;...;), w którym to przypadku wolę for. Jednak dziękuję za kolejne -7 bajtów. :)
Kevin Cruijssen
To dlatego, że jestem zły z 2-dopełniaczem ... Jestem tak zły, że chciałem mieć na myśli Integer.MIN_VALUE(co jest 1<<31chyba wtedy ...) ;-)
Olivier Grégoire
4

Oktawa , 21 bajtów

@(x)x(~[0,diff(x)<0])

Wypróbuj online!

Wyjaśnienie:

Weź wektor xjako dane wejściowe i utwórz wektor [0, diff(x)<0], w którym diff(x)jest wektor z różnicą między wszystkimi sąsiadującymi elementami. Zachowaj tylko te, które są negatywne, porównując go do zera, dając nam listę wszystkich elementów, które chcemy upuścić.

Następnie wybieramy elementy z wektora wejściowego, które chcemy zachować.

Stewie Griffin
źródło
4

V , 25 bajtów

òjälá k$yl+@"òç-/d
ç /dw

Wypróbuj online!

Hexdump:

00000000: f26a e46c e120 6b24 796c 2b40 2218 f2e7  .j.l. k$yl+@"...
00000010: 2d2f 640a e720 2f64 77                   -/d.. /dw

Najgorszy język do pracy. Ale zrobiłem to z odwagą .

DJMcMayhem
źródło
6
Uwaga dodatkowa: mam nadzieję, że ojalá jest Hiszpanem .
Dennis
2
@dennis To świetnie. Do czego służy k$yl+@"òç-/dhiszpański?
DJMcMayhem
7
k$yl+@"òç-/dmożna by swobodnie przetłumaczyć jako Ouch, kto do diabła zostawił otwarte drzwi szafy?
Luis Mendo
3

Trójkątność , 71 bajtów

.....).....
....IEL....
...)rFD)...
..2+)IE)w..
.+h)2_stDO.
={M)IEm}...

Wypróbuj online!

Jak to działa?

) IEL) rFD) 2+) IE) w + h) 2_stDO = {M) IEm} - Pełny program.
) IE - Uzyskaj 0 wejście I i oceń je.
   L) r - I przesuń zakres [0 ... długość I).
      F {- Filtruj liczby całkowite w tym zakresie, które spełniają:
       D) 2+) IE) w + h) 2_stDO = - Ten warunek. Uruchamia każdy element E na osobnym
                                    układaj i odrzucaj te, które nie spełniają kryteriów.
       D) 2+ - Zduplikuj i dodaj 2 do drugiej kopii.
           ) IE - Pobierz ponownie.
              ) - Wciśnij 0 na stosie.
               w - Zawiń 0 na liście. [0]
                + - Przygotuj go do I.
                 h - głowa. Przytnij elementy po indeksie E + 2.
                  ) 2_ - Dosłowne -2.
                     st - Ogon.
                       DO = - Sprawdź, czy wynik jest niezmienny w stosunku do sortowania.
                           M) IEm} - Ostatnia część: indeksowanie do danych wejściowych.
                           M} - Dla każdego indeksu spełniającego warunki:
                            ) IEm - pobierz element I w tej pozycji.
Pan Xcoder
źródło
2
Z ciekawości (skoro jesteś twórcą Trójkąta): dlaczego nie zrobić czegoś podobnego do Hexagony / Cubically, gdzie fragment kodu jest automatycznie wypełniany kropkami bez opozycji? Czyliby ten program )IEL)rFD)2+)IE)w+h)2_stDO={M)IEm}rozszerzyłby się do twojej obecnej odpowiedzi?
Kevin Cruijssen
@KevinCruijssen Ponieważ tak naprawdę planowałem uczynić Trójkątność esolangiem 2D, ale zrezygnowałem z tego pomysłu, więc po prostu trzymałem się mojego poprzedniego szablonu. Myślę, że wkrótce wprowadzę kilka istotnych zmian, kiedy wypuszczę Triangularity v2. (Również fajnie jest grać w golfa w jego obecnej formie, ponieważ prosty 1-bajtowy zapis liniowy może zamiast tego zaoszczędzić 20: D ... Dotyczy to również z mocą wsteczną przy naprawianiu rzeczy: C)
Mr. Xcoder
Cóż, nawet jeśli planujesz wydać go jako esolang 2D, mój komentarz nadal jest (nieco). )IEL)rFD)2+)IE)w+h)2_stDO={M)IEm}byłby twoim kodem, rozwinąłby się do twojego obecnego szablonu, a następnie wykonał polecenia 2D na tym rozwiniętym szablonie. EDIT: .....).....\n....IEL....\n...)rFD)...\n..2+)IE)w..\n.+h)2_stDO.\n={M)IEm}...i .....).........IEL.......)rFD).....2+)IE)w...+h)2_stDO.={M)IEm}...i )IEL)rFD)2+)IE)w+h)2_stDO={M)IEm}by wszystkie trzy być dokładnie ten sam program.
Kevin Cruijssen
3

Wolfram Language (Mathematica) , 33 bajty

Pick[#,Arg[#-{0}~Join~Most@#],0]&

Wypróbuj online!

Jak to działa

Kod # - {0}~Join~Most@#zamienia tablicę {a,b,c,d,e,f}w {a,b-a,c-b,d-c,e-d,f-e}. Zastosowanie Argdo tego ustawia liczby ujemne Pii liczby nieujemne na 0.

Pick[#, ..., 0]&wybiera wpisy #gdzie ...ma 0: w naszym przypadku dokładnie te elementy, które dają nieujemną liczbę po odjęciu poprzedniego elementu. Innymi słowy, są to dokładnie te wpisy, które chcemy zachować podczas sortowania.

Misza Ławrow
źródło
3

Cud , 27 bajtów

-> ':1.!> 'sS#<=.cns2.++[0]

Przykład użycia:

(-> ':1.!> 'sS#<=.cns2.++[0])[8 6 9 9 7 2 3 8 1 3]

Wyjaśnienie

Wersja bez golfa:

(map get 1).(fltr sS <=).(cns 2).(++ [0])

Przygotuj 0, uzyskaj listę kolejnych par, przechowuj elementy listy, w których pierwsza liczba <= druga liczba, zdobądź drugą liczbę każdej pary.

Mama Fun Roll
źródło
3

Wolfram Language (Mathematica) , 20 bajtów

#&@@@Split[#,##>0&]&
(* or *)
Max/@Split[#,##>0&]&

Wypróbuj online!

Wyjaśnienie

Input = {8, 6, 9, 9, 7, 2, 3, 8, 1, 3}

Split[#,##>0&]

Grupuj kolejne elementy, które ściśle zmniejszają: {{8, 6}, {9}, {9, 7, 2}, {3}, {8, 1}, {3}}

#&@@@

Weź pierwszy element każdego: {8, 9, 9, 3, 8, 3}

JungHwan Min
źródło
##>0jest fantazyjne i tak dalej, ale tak naprawdę nic #>#2tu nie oszczędza ;) (co sprawiłoby, że twój program działałby z dowolnymi liczbami całkowitymi, ale nie jest to wymagane).
Martin Ender
3

SWI-Prolog, 44 bajty

[A,B|C]-[A|E]:-B<A,[B|C]-[B|E];[B|C]-E. L-L.

Zastosowanie: Wywołaj „ List -X”, gdzie List jest listą zamkniętą nawiasami, oddzieloną przecinkami, np. [1,4,5,1,11,6,7].

ashtraypettingzoo
źródło
1
Witamy na stronie! :)
DJMcMayhem
2

APL + WIN, 14 bajtów

Monity o wprowadzenie na ekranie wektora liczb całkowitych.

(1,1>2-/v)/v←⎕
Graham
źródło
2

05AB1E , 6 bajtów

ĆÁü›_Ï

Wypróbuj online!

Wyjaśnienie

Ć        # append the head of the list
 Á       # rotate right
  ü›     # apply pair-wise greater-than
    _    # logical negate each
     Ï   # keep elements of input that are true in this list
Emigna
źródło
2

Kotlin , 39 bajtów

a->a.filterIndexed{i,v->i<1||v>=a[i-1]}

Wypróbuj online!

Filtruj elementy, które są albo pierwszym elementem (indeks == 0, albo nawet krótszym indeksem <1) LUB bieżąca wartość jest większa lub równa poprzedniej pozycji (a [i-1]).

Makotosan
źródło
2

K4 , 10 bajtów

Rozwiązanie:

x_/|&<':x:

Przykład:

q)k)x_/|&<':x:8 6 9 9 7 2 3 8 1 3
8 9 9 3 8 3

Wyjaśnienie:

Znajdź indeksy, w których element jest mniejszy niż poprzedni, usuń te indeksy z danych wejściowych

x_/|&<':x: / the solution
        x: / store input as x
     <':   / less-than each-previous
    &      / indices where true
   |       / reverse
 _/        / drop-over
x          / the input
streetster
źródło
2

Attache , 24 bajty

{Mask[1'(Delta!_>=0),_]}

Wypróbuj online!

Wyjaśnienie

Maskwybiera wszystkie elementy z drugiego argumentu, które odpowiadają prawdziwym elementom w pierwszym argumencie. 1'(Delta!_>=0)oblicza wskaźniki odpowiadające elementom, które powinny znajdować się w końcowej tablicy.

Inne próby

28 bajtów (bez punktów): ~Mask#(1&`'##Delta#`>=#C[0])

32 bajty: {Mask[1'(&`<= =>Slices[_,2]),_]}

Conor O'Brien
źródło
2

C # (.NET Core) , 33 + 18 = 51 bajtów

x=>x.Where((a,n)=>n<1||x[n-1]<=a)

Wypróbuj online!

w zasadzie instrukcja jest tam, gdzie x jest pierwszą liczbą całkowitą w tablicy lub jest większa lub równa poprzedniej liczbie, zachowaj ją. W przeciwnym razie upuść.

Dennis.Verweij
źródło
1
Można zwracać IEnumerable. Nie ToArray()potrzebne
Pavel
@Pavel Musiałbym dodać dodatkowe odniesienie System.Collections, co zniweczyłoby wszystkie bajty zapisane na usunięcie pliku ToArray().
Dennis.Verweij
Nie, ponieważ w odpowiedzi nie będzie się odwoływać IEnumerable, wystarczy użyć jej jako typu zwrotu.
Pavel
@Pavel dobrze, dziękuję, czasem nie jestem pewien, kiedy policzyć bajty, czy nie ... przepraszam
Dennis.Verweij
1

Swift 4 , 56 55 bajtów

{var l=0;print($0.filter{($0>=l,l=$0).0})}as([Int])->()

Wypróbuj online!

Wyjaśnienie

{var l=0;           // Declare variable l
print($0.filter{(   // Print every element e in the input
  $0>=l,            //   where e >= l
  l=$0).0})         //   And set l to e
}as([Int])->()      // Set the input type to integer array
Herman L.
źródło
1

Galaretka , 9 bajtów

0;>ƝżµḢÐṂ

Wypróbuj online!

To wydaje się dość nieporęczne, nie byłoby zaskoczeniem, gdyby istniał lepszy sposób.

0;>ƝżµḢÐṂ
   Ɲ       For each adjacent pair in the input...
  >        ...is the first element greater than the second? (yields a list of 0/1)
0;         prepend a zero to this list (always keep the first element)
    ż      zip with the input
     µ     new monadic link
       ÐṂ  keep elements of the list with minimal value of... (Ðḟ would have worked here and been slightly more clear but I'll leave it as it is)
      Ḣ    ...their first element
dylnan
źródło
1

Brain-Flak , 136 , 120 bajtów

((())){{}([{}]({}))([({}<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}{{}(({})<>)(())(<>)}{}([][()])}{}{}<>{{}({}<>)<>}<>

Tutaj jest sformatowany i „czytelny” .

((()))
{
    {}

    ([{}]({}))

    ([({}<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}

    {
        {}(({})<>)(())(<>)
    }

    {}

    ([][()])

}{}{}<>

{
    {}
    ({}<>)<>
}<>

Wypróbuj online!

DJMcMayhem
źródło