Biorąc pod uwagę listę ściśle dodatnich liczb całkowitych, przejrzyj każdą odrębną liczbę i zamień wszystkie jej wystąpienia na kolejne indeksy (oparte na zero lub jeden) nowej serii.
Przykłady
[]
→ []
/[]
[42]
→ [0]
/[1]
[7,7,7]
→ [0,1,2]
/[1,2,3]
[10,20,30]
→ [0,0,0]
/[1,1,1]
[5,12,10,12,12,10]
→ [0,0,0,1,2,1]
/[1,1,1,2,3,2]
[2,7,1,8,2,8,1,8,2,8]
→ [0,0,0,0,1,1,1,2,2,3]
/[1,1,1,1,2,2,2,3,3,4]
[3,1,4,1,5,9,2,6,5,3,5,9]
→ [0,0,0,1,0,0,0,0,1,1,2,1]
/[1,1,1,2,1,1,1,1,2,2,3,2]
Odpowiedzi:
JavaScript (ES6), 26 bajtów
1-indeksowany.
Wypróbuj online!
Skomentował
źródło
-~
wcześniej - to absolutny klejnot.a
do przechowywania wartości, ale jest to wymagane do-
/~
indeksu, aby żaden bajt nie został zapisany.-~
jest w rzeczywistości powszechnie używaną alternatywą dla+1
(ponieważ ma inny priorytet) w wielu językachR , 27 bajtów
Wypróbuj online!
Objaśnienie:
ave(x,x,FUN=seq)
dzieli wektorx
na podektory, używając wartościx
jako kluczy grupujących. Następnieseq
wywoływana jest funkcja dla każdej grupy i każdy wynik jest ponownie układany w pierwotnej pozycji grupy.Lepiej zobacz przykład:
Uwaga :
seq(y)
funkcja zwraca sekwencję,1:length(y)
jeśliy
malength(y) > 1
, ale zwraca sekwencję,1:y[1]
jeśliy
zawiera tylko jeden element.Na szczęście nie stanowi to problemu, ponieważ w takim przypadku R - narzekając na wiele ostrzeżeń - wybiera tylko pierwszą wartość, która, nawiasem mówiąc, jest tym, czego chcemy :)
źródło
ave
wcześniej nie widziałem .MATL , 4 bajty
To rozwiązanie jest oparte na 1
Wypróbuj to w MATL Online !
Wyjaśnienie
Używa
[1,2,3,2]
jako przykładuźródło
APL (Dyalog Unicode) , 7 bajtów
Ogromne podziękowania dla H.PWiz, Adáma i dzaimy za ich pomoc w debugowaniu i poprawianiu tego.
Wypróbuj online!
Wyjaśnienie
10-bajtowa, niejawna wersja będzie łatwiejsza do wyjaśnienia w pierwszej kolejności
Milcząca wersja robi trzy rzeczy
⍵
użyte w,,\⍵
ponieważ,\
po prawej stronie może domyślnie domyślić się, że ma działać na podstawie właściwego argumentu.⍵=
, my zastąpić⍵
z⊢
, który stoi na prawym argumencie⍵
), możemy usunąć nawiasy klamrowe,{}
ponieważ funkcje ukryte ich nie używająźródło
AWK , 14
Wypróbuj online!
Powyżej robi indeksowanie w oparciu o jeden. Jeśli wolisz indeksowanie od zera, jest to dodatkowy bajt:
Wypróbuj online!
źródło
{print++a[$1]}
bez miejsca wydaje się działaćJ , 7 bajtów
Wypróbuj online!
1-indeksowany.
Wyjaśnienie:
K (oK) ,
1110 bajtów-1 bajt dzięki ngn!
Wypróbuj online!
źródło
='
->=
Python 2 , 48 bajtów
Wypróbuj online!
źródło
05AB1E , 4 bajty
Wypróbuj online! lub jako pakiet testowy
Wyjaśnienie
źródło
C # (interaktywny kompilator Visual C #) , 44 bajty
Wypróbuj online!
źródło
[7,7,7]
Powinieneś wyjść[0,1,2]
, a nie[0,0,0]
.Python 2 ,
4743 bajtówWypróbuj online!
Rekurencyjne rozwiązanie „oparte na jednym”.
źródło
Galaretka , 4 bajty
Wypróbuj online!
Dla każdego prefiksu listy wejściowej sam zlicza liczbę wystąpień ostatniego elementu.
źródło
;\ċ"
to także 4.R , 41 bajtów
Wypróbuj online!
Co dziwne, zwracanie indeksu zerowego jest krótsze w R.
źródło
Rubin, 35 bajtów
Niestety, jest dość przyziemny - zbuduj skrót, który przechowuje sumę dla każdego napotkanego do tej pory wpisu.
Inne zabawne opcje, które niestety nie były dość krótkie:
źródło
R ,
6243 bajty-19 bajtów dzięki Giuseppe, usuwając je i zapisując tabelę oraz tylko niewielkie zmiany w implementacji
Oryginalny
Nie mogę konkurować z wiedzą Giuseppe, więc moje poddanie jest nieco dłuższe niż jego, ale korzystając z mojej podstawowej wiedzy, czułem, że to rozwiązanie było dość pomysłowe.
r<-table(x)
zlicza liczbę wyświetleń każdej liczby i zapisuje ją w r, do wykorzystania w przyszłościnames()
pobiera wartości każdego unikalnego wpisu w tabeli i iterujemy te nazwy za pomocą pętli for.Pozostała część sprawdza, które wpisy są równe iteracjom, i przechowuje sekwencję wartości (od 1 do liczby wpisów iteracji)
Wypróbuj online!
źródło
which()
aby zapisać 7 bajtów.1:r[i]
podsunął mi pomysłtable()
całkowitego usunięcia :x=z=scan();for(i in x)z[y]=1:sum(y<-x==i);z
ma 43 bajty! To miłe podejście!Haskell , 44 bajty
Wypróbuj online!
Wyjaśnienie
Przechodzi przez listę od lewej do prawej, zachowując listę
x
odwiedzanych elementów, początkowo[]
:Dla każdego spotkania
y
zliczaj wszystkie równe elementy na liściex
.źródło
(#(0*));(x:r)#g=g x:r# \y->0^abs(y-x)+g y;e#g=e
Wypróbuj online!Perl 6 , 15 bajtów
Wypróbuj online!
Możesz przenieść
++
do przed%
indeksem opartym na jednym.Wyjaśnienie:
źródło
Haskell ,
4746 bajtówWypróbuj online!
Inne podejście niż odpowiedź BMO, która okazała się nieco dłuższa. (I uprzejmie pożycza swój ładny kombinezon testowy.)
Chodzi o to, aby iterować listę wejściową i śledzić liczbę wystąpień każdego elementu poprzez aktualizację funkcji
g
. Nie golfowany:Pojawiły się dwie interesujące możliwości gry w golfa. Po pierwsze dla wartości początkowej
g
funkcji stałej, która ignoruje argument i zwraca0
:A po drugie wyrażenie nad zmiennymi
x
iy
co daje1
w raziex
równościy
i0
inaczej:Wciąż mogą istnieć krótsze drogi. Czy ktoś ma pomysł?
źródło
0^(x-y)^2
.Java (JDK) , 76 bajtów
Wypróbuj online!
Kredyty
źródło
for(c=0,i=l;i-->0;)c+=a[l]==a[i]?1:0;
nafor(c=i=0;i<l;)c+=a[l]==a[i++]?1:0;
.Rubinowy , 34 bajty
Wypróbuj online!
źródło
->a{i=-1;a.map{|v|a[0..i+=1].count v}}
i nie pomyślałem o zbudowaniu nowej tablicy, lol. Dobra robota.bash,
3724 bajtówTIO
jeśli jest to ważne, istnieje również ta odmiana, zgodnie z sugestią DigitalTrauma
TIO
źródło
Perl 5, 11 bajtów
TIO
wyjaśnienia po komentarzu
$_
specjalna zmienna perla zawierająca linię prądu podczas zapętlania wejścia (-p
lub-n
przełączników)$h{$_}++
automatycznie uwiarygodnia mapę%h
i tworzy pozycję z kluczem$_
i przyrostami oraz podaje wartość przed przyrostem-p
przełącznika,-l
przełącznik usuwa koniec linii na wejściu i dodaje koniec linii na wyjściuźródło
Pari / GP , 32 bajty
Wypróbuj online!
źródło
Wolfram Language (Mathematica) , 33 bajty
Wypróbuj online!
źródło
Attache , 23 bajty
Wypróbuj online!
Wyjaśnienie
źródło
C (gcc) ,
6562 bajtówWypróbuj online!
-2 bajty dzięki tylko ASCII
To wydawało się zbyt proste, ale nie mogłem wydawać się krótszy z innym podejściem.
źródło
K (ngn / k) , 18 bajtów
Wypróbuj online!
STARE PODEJŚCIE
K (ngn / k) ,
27 2322 bajtówWypróbuj online!
to nie jest dość ... szybkie i nieprzyzwoite rozwiązanie, dopracuję to później, kiedy będę miał szansę wymyślić lepsze podejście
wyjaśnienie:
=x
zwraca dyktando, w którym klucze są elementami x, a wartości są ich indeksami (3 1 4 5 9 2 6!(0 9;1 3;,2;4 8 10;5 11;,6;,7)
)i:
przypisać dyktować doi
#:'
policzyć wartości dla każdego klucza (3 1 4 5 9 2 6!2 2 1 3 2 1 1
)!:'
wyliczyć każdą wartość (3 1 4 5 9 2 6!(0 1;0 1;,0;0 1 2;0 1;,0;,0)
),/.:
wyodrębnij wartości i spłaszcz listę (0 1 0 1 0 0 1 2 0 1 0 0
)x[,/.:i]:
wyodrębnij indeksy z i, spłaszcz i przypisz każdą wartość z listy po prawej stronie dla tych indeksówdenerwująco, lista jest aktualizowana, ale przypisanie zwraca wartość zerową, więc muszę zwrócić listę po średniku (
;x
)edycja: usunięto obce okrężnice
edit2: usunięto niepotrzebne przypisanie
źródło
Retina 0.8.2 , 30 bajtów
Wypróbuj online! Link zawiera przypadki testowe. 1-indeksowany. Objaśnienie: Pierwsza część wyrażenia regularnego pasuje kolejno do każdej liczby całkowitej na liście. Grupa lookbehind dopasowuje każde wystąpienie tej liczby całkowitej w tej linii do bieżącej liczby całkowitej włącznie. Liczba całkowita jest następnie zastępowana liczbą dopasowań.
źródło
Partia, 61 bajtów
1-indeksowany. Ponieważ podstawianie zmiennych następuje przed analizą,
set/a
polecenie kończy inkrementację nazwy zmiennej podanej przez konkatenację literyc
z liczbą całkowitą z listy (zmienne numeryczne domyślnie zero w pakiecie). Wynik jest następnie kopiowany do innej liczby całkowitej w celu ułatwienia wyjścia (dokładniej, oszczędza bajt).źródło
Tcl , 48 bajtów
Wypróbuj online!
źródło
Japt, 8 bajtów
Wypróbuj tutaj
źródło