Podsumowanie
Biorąc pod uwagę listę liczb całkowitych, zwróć indeks, na którym kończą się liczby całkowite podczas sortowania.
Na przykład, jeśli lista była [0,8,-1,5,8]
, powinieneś powrócić [1,3,0,2,4]
. Zauważ, że dwa 8
zachowują swoją kolejność względem siebie (sortowanie jest stabilne).
Innymi słowy: dla każdego elementu na liście zwróć liczbę elementów na liście, które są: Mniejsze niż wybrany element LUB (równe elementowi AND pojawia się przed wybranym elementem)
Indeksy muszą zaczynać się od 0 (nie 1) EDYCJA: biorąc pod uwagę duży zwrot, pozwolę na wskazania oparte na 1.
Przypadki testowe:
0 -> 0
23 -> 0
2,3 -> 0,1
3,2 -> 1,0
2,2 -> 0,1
8,10,4,-1,-1,8 -> 3,5,2,0,1,4
0,1,2,3,4,5,6,7 -> 0,1,2,3,4,5,6,7
7,6,5,4,3,2,1,0 -> 7,6,5,4,3,2,1,0
4,4,0,1,1,2,0,1 -> 6,7,0,2,3,5,1,4
1,1,1,1,1,1,1,1 -> 0,1,2,3,4,5,6,7
1,1,1,1,1,1,1,0 -> 1,2,3,4,5,6,7,0
code-golf
array-manipulation
sorting
Nathan Merrill
źródło
źródło
[0 1 ... n-1]
.8,10,4,-1,-1
przypadek testowy jest bardzo zwodniczy. Spróbuj tego4,4,0,1,1,2,0,1
pierwszego.Odpowiedzi:
APL, 2 bajty
Wbudowane „podwyższenie oceny” zastosowano dwukrotnie. Działa, jeśli indeksowanie rozpoczyna się od 0, co nie jest wartością domyślną dla wszystkich odmian APL. Wypróbuj tutaj!
Dlaczego to działa?
⍋x
zwraca listę indeksów, które byłyby stabilnie sortowanex
. Na przykład:ponieważ jeśli weźmiesz element
2
,6
wtedy3
… otrzymasz stabilnie posortowaną listę:Ale lista indeksów, która odpowiada na to pytanie, jest nieco inna: najpierw chcemy indeksu najmniejszego elementu, potem drugiego najmniejszego itd. - znowu, zachowując pierwotną kolejność.
Jeśli przyjrzymy się
⍋x
, chociaż widzimy, może dać nam tę listę łatwo: the pozycja z0
IN⍋x
mówi nam, gdzie najmniejszy element będzie kończyć się po sortowaniu, a pozycja o1
in⍋x
mówi nam, gdzie drugi najmniejszy element byłoby skończyć itd.Ale wiemy, że
⍋x
zawiera dokładnie liczby [0, 1… n − 1] . Jeśli ponownie go ocenimy , otrzymamy indeks0
in⍋x
, następnie indeks1
in⍋x
itp., Czyli dokładnie to, czym jesteśmy zainteresowani.Tak więc odpowiedź brzmi
⍋⍋x
.źródło
Galaretka, 2 bajty
Oceń dwa razy. 1-indeksowany. Wypróbuj online!
źródło
JavaScript ES6,
8782797470 bajtówNie lubisz używać obiektu, ale wydaje się, że jest to najkrótszy sposób śledzenia kopii
Wyjaśnienie
źródło
K ,
52 bajtyOceń
<
dwa razy ( ). JohnE zapisał trzy bajty, wskazując, że ukryte wyrażenia istnieją w K! Super fajne. Wypróbuj to.źródło
<<
. Wypróbuj tutaj .Haskell,
5048 bajtówPrzykład użycia:
m.m $ [4,4,0,1,1,2,0,1]
->[6,7,0,2,3,5,1,4]
.Stosuje się go
map snd.sort.zip x [0..]
dwukrotnie na wejściu, tj. Sparuj każdy element ez jego indeksem i ((e,i)
), posortuj, aby usunąć pierwsze elementy. Powtórz jeden raz.@Lynn wymyślił,
m=map snd.sort.(`zip`[0..])
który ma taką samą liczbę bajtów.źródło
Python 2,
6760 bajtówDzięki @xnor za grę w golfa z 7 bajtów!
Przetestuj na Ideone .
źródło
enumerate
można zrobić krótszy zzip
:l=input();x=zip(l,range(len(l)))
.PowerShell v2 +, 63 bajty
Pobiera dane wejściowe
$n
, przepływa przez pętlę nad każdym elementem|%{...}
. Z każdą iteracjąsort
$n
otrzymujemyIndexOf
nasz aktualny element$_
. Zlicza to, ile elementów jest mniejszych niż bieżący element. Dodajemy do tego kawałek$n
, który rozszerza każdą iterację pętli, elementów równych bieżącemu elementowi$_
i przyjmujemy.Count
to. Następnie odejmujemy,-1
aby nie liczyć naszego bieżącego elementu, a liczba ta pozostaje w kolejce. Wynik końcowy jest niejawny.Przykłady
źródło
CJam, 15 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
J, 5 bajtów
Ocena w górę (
/:
) dwa razy (^:2
). 0-indeksowane.Aby go wypróbować, typ
f =: /:^:2
, a następnief 4 4 0 1 1 2 0 1
do tryj.tk .źródło
/:@/:
z jednakową liczbą bajtów.MATL,
1094 bajtów4 bajty zapisane dzięki @Luis
To rozwiązanie wykorzystuje indeksowanie 1
Wypróbuj online
źródło
05AB1E, 12 bajtów
Wyjaśnił
Wypróbuj online
źródło
Python 2, 67 bajtów
xnor zapisał dwa bajty.
źródło
a=input();p=[]\nfor x in a:print sorted(a).index(x)+p.count(x);p+=x,
Haskell, 40 bajtów
Adnotuj każdy element za pomocą indeksu, a następnie przypisz każdy element do liczby mniejszych elementów, przerywając remis w indeksie. Bez sortowania.
źródło
Julia, 17 bajtów
1-indeksowany. Oceń
sortperm
dwa razy ( ). Wypróbuj tutaj.EDYCJA: Dennis zapisał cztery bajty, nadając operatorowi nazwy-y! Julia jest dziwna.
źródło
JavaScript (ES6), 52 bajty
Definiuje
g
jako funkcję gradacji, która zwraca tablicę indeksów, z której wszystkie elementy w sortowanej tablicy pochodziłyby z oryginalnej tablicy. Niestety, potrzebujemy wskaźników, do których trafią wszystkie elementy. Na szczęście okazuje się, że jest to odwzorowanie oceny z powrotem na pierwotną listę indeksów, co samo w sobie może być uważane za wynik sortowania oceny, co pozwala nam na ocenę oceny w celu osiągnięcia pożądanego wyniku.źródło
Pyth,
109 bajtów1 bajt dzięki Jakube.
Zestaw testowy.
Tam musi być krótsza droga ...
źródło
xL
zamiastsxR
. A może coś przeoczyłem?Rakieta, 117 bajtów
Jestem wiecznie rozczarowany brakiem wbudowanego do tego celu.
źródło
Rubin,
5453 bajtówWypróbuj online
-1 bajt od aktualizacji do @ Downgoat podejścia polegającego na użyciu skrótu do przechowywania wartości zamiast liczenia duplikatów za każdym razem.
źródło
Clojure, 83 bajty
Tworzę anonimową funkcję, która ocenia tablicę wejściową w górę i iteruje ją dwukrotnie na wejściu. Pierwsze połączenie zwróci ocenę. Drugie połączenie działa na ocenę i zwraca rangę.
źródło
Brachylog , 27 bajtów
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Wyjaśnienie
Jest to prosta implementacja następującej zależności: każda liczba całkowita wyniku odpowiadająca elementowi wejścia jest indeksem tego elementu w posortowanym wejściu.
źródło
Mathematica, 15 bajtów
źródło
Mathematica, 135 bajtów
źródło
Common Lisp, 117 bajtów
Zastosuj transformację Schwartziana dwa razy.
Test
źródło
JavaScript (przy użyciu zewnętrznej biblioteki) (105 bajtów)
Link do lib: https://github.com/mvegh1/Enumerable Objaśnienie kodu: Utwórz anonimową metodę, która akceptuje listę liczb całkowitych. _.From tworzy instancję biblioteki, która otacza tablicę specjalnymi metodami. Wybierz mapuje każdy element na nowy element, biorąc alue „v”, analizując go do łańcucha, a następnie łącząc indeks „i” tego elementu (rozwiązuje to przypadek zduplikowanej wartości). To jest przechowywane w zmiennej „a”. Następnie zwracamy wynik: Zamapuj każdy element w „a” na indeks tego elementu w posortowanej wersji (jako liczby całkowite) i rzutuj z powrotem na natywną tablicę JS
Zauważ, że zduplikowane liczby ujemne wydają się drukować w odwrotnej kolejności. Nie jestem pewien, czy to unieważnia to rozwiązanie? Technicznie 8,10,4, -1, -1,8 powinno wynosić 3,5,2,0,1,4 zgodnie z OP, ale mój kod drukuje 3,5,2,1,0,4, który moim zdaniem jest nadal technicznie ważne?
źródło
GNU Core Utils,
3933 bajtówTworzy dane wyjściowe na podstawie 1. Dodaj
-v0
po drugim,nl
aby uzyskać wyjście oparte na 0. (+4 bajty)Polecenia, których używamy:
nl
dodaje numery linii do każdej linii wejścia.sort -n -k 2
sortuje według kolumny 2 numerycznie.cut -f 1
pobiera pierwszą kolumnę rozdzielaną tabulatorami, odrzucając resztę.Dodatkowo
-s
można przekazać opcjęsort
żądania stabilnego sortowania, ale tutaj jej nie potrzebujemy. Jeśli dwa elementy są identyczne,sort
określi ich kolejność, wracając do innych kolumn, co w tym przypadku jest monotonicznie rosnącą wydajnościąnl
. Tak więc sortowanie będzie stabilne bez konieczności określania go na podstawie danych wejściowych.źródło
Java
149140 bajtówGrał w golfa
Dzięki @Kevin Cruissjen za golenie 9 bajtów.
źródło
int[] a
iint[] b
. Możesz wyjąćint
z pętli. A ponieważ używaszb.length
dwa razy na początku, możesz umieścić go w osobnym polu. Więc w sumie coś takiego:int[]a(int[]b){int l=b.length,o[]=new int[l],i,j;for(i=-1;++i<l;)for(j=-1;++i<b.length;)if(b[i]==Arrays.sort(b.clone())[j])o[i]=j;return o;}
( 140 bajtów ) Hmm, też wydaje się, że to nie działa ..Arrays.sort(...)
nic nie zwraca (tovoid
metoda), więc jak możesz to porównaćb[i]
? ..PHP, 88 bajtów
działa na argumentach wiersza poleceń; wypisuje 0-indeksowaną listę rozdzieloną podkreśleniem. Uruchom z
-nr
.awaria
źródło
MATLAB, 29 bajtów
Większość wbudowanych funkcji sortowania MATLAB zwróci opcjonalną drugą tablicę zawierającą posortowane indeksy.
j=
Mogą być usunięte, jeśli drukowanie indeksów jest dopuszczalne, zamiast ich powrocie.źródło
CJam , 19 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło