Uszereguj listę liczb całkowitych

21

Otrzymujesz niepustą listę dodatnich liczb całkowitych, np

[6 2 9 7 2 6 5 3 3 4]

Powinieneś uszeregować te liczby według ich wartości, ale jak to zwykle bywa w tabeli liderów, jeśli jest remis, wszystkie remisowane liczby mają tę samą rangę, a odpowiednia liczba rang jest pomijana. Oczekiwany wynik dla powyższej listy byłby zatem

[3 9 1 2 9 3 5 7 7 6]

Na przykład najwyższa wartość na wejściu wyniosła 9, więc staje się to 1(pierwsza ranga). Trzecią najwyższą wartością jest 6, więc oba 6stają się 3, a ranga 4jest całkowicie pomijana.

Zasady

Możesz użyć dowolnego wygodnego, jednoznacznego, płaskiego formatu listy wejściowej i wyjściowej. Pierwsza / najmniejsza ranga na wyjściu powinna zawsze wynosić 1 .

Możesz napisać program lub funkcję i użyć dowolnej z naszych standardowych metod otrzymywania danych wejściowych i dostarczania danych wyjściowych.

Możesz używać dowolnego języka programowania , ale pamiętaj, że te luki są domyślnie zabronione.

To jest , więc wygrywa najkrótsza ważna odpowiedź - mierzona w bajtach .

Przypadki testowe

[8] -> [1]
[1 15] -> [2 1]
[18 14 11] -> [1 2 3]
[11 16 14 8] -> [3 1 2 4]
[15 15 15 15 15] -> [1 1 1 1 1]
[10 2 5 4 15 5] -> [2 6 3 5 1 3]
[5 5 10 10 5 11 18] -> [5 5 3 3 5 2 1]
[2 4 9 4 17 9 17 16] -> [8 6 4 6 1 4 1 3]
[11 17 19 17 10 10 15 3 18] -> [6 3 1 3 7 7 5 9 2]
[2 11 4 8 3 3 12 20 4 18] -> [10 4 6 5 8 8 3 1 6 2]
[12 6 10 2 19 19 6 19 8 6 18] -> [5 8 6 11 1 1 8 1 7 8 4]
[5 6 14 19 13 5 19 9 19 9 9 19] -> [11 10 5 1 6 11 1 7 1 7 7 1]
[9 2 12 3 7 11 15 11 6 8 11 17 11] -> [8 13 3 12 10 4 2 4 11 9 4 1 4]
[3 5 15 7 18 5 3 9 11 2 18 1 10 19] -> [11 9 4 8 2 9 11 7 5 13 2 14 6 1]
[6 11 4 19 14 7 13 16 10 12 7 9 7 10 10] -> [14 6 15 1 3 11 4 2 7 5 11 10 11 7 7]
[11 20 11 1 20 16 11 11 4 8 9 7 11 14 10 14] -> [6 1 6 16 1 3 6 6 15 13 12 14 6 4 11 4]
[4 7 15 2 3 2 3 1 14 2 10 4 7 6 11 2 18] -> [9 6 2 13 11 13 11 17 3 13 5 9 6 8 4 13 1]
[5 1 17 7 1 9 3 6 9 7 6 3 2 18 14 4 18 16] -> [12 17 3 8 17 6 14 10 6 8 10 14 16 1 5 13 1 4]
[5 6 8 10 18 13 20 10 7 1 8 19 20 10 10 18 7 2 1] -> [16 15 11 7 4 6 1 7 13 18 11 3 1 7 7 4 13 17 18]
[12 17 8 2 9 7 15 6 19 5 13 16 14 20 10 11 18 4 3 1] -> [9 4 13 19 12 14 6 15 2 16 8 5 7 1 11 10 3 17 18 20]
Martin Ender
źródło
1
Blisko związane. Różnica polega na tym, że wyzwanie to gwarantuje sortowanie danych wejściowych, co oznacza, że ​​większość odpowiedzi opiera się na pewnej indexOffunkcji. Uważam, że w przypadku nieposortowanych danych wejściowych istnieje wiele alternatyw w wielu językach.
Martin Ender,
Przykro mi, ale uważam, że to zbyt blisko linku Lynn. Różnice są minimalne: wartości są obcinane, nie można zakładać, że już posortowano dane wejściowe, a połowa wyników ma zamienioną kolejność. Akceptowana odpowiedź na powiązane pytanie prawie działa. Przy minimalnym wysiłku ktoś może sprawić, że zadziała. W związku z tym uważam, że jest to powielone.
Ismael Miguel,
Nie zgadzam się, to oczywiście nie jest duplikat.
Timtech,
Zgadzam się z timtech, to wyzwanie jest prostsze, ale nie jest duplikatem.
tuskiomi

Odpowiedzi:

13

Obejście w programie Excel dla głupich reguł dotyczących wprowadzania myszy w programie Code Stack Stack Exchange: (WESRRMICGSE) 28 bajtów

rank(RC[1],r1c1:r1024:c1024)

Wprowadź listę jako csv ( 10,23,34,2,) do kompilatora po wejściu do źródła. bez cudzysłowów, bez nawiasów, przecinek końcowy.

WESRRMICGSE jest dokładnie jak programowanie w programie Excel, tyle że można pominąć początkowy znak „=”, aby zapisać bajt. Różnica w funkcjonowaniu wynika z faktu, że WESRRMICGSE albo przeciągnie formułę w dół, aby automatycznie skopiować kod i zapewni różne wyniki z pojedynczym wejściem całkowitym. podał listę jako dane wejściowe, ta lista przechodzi do kolumny B (kolumna danych wejściowych), a formuła automatycznie podaje lek w celu dopasowania do liczby danych wejściowych. (np. dane wejściowe 34, 21, 45 „przeciągnęłyby” formułę w dół o 2 komórki, w sumie 3 komórki z formułą).

Edycja: Nigdy nie spodziewałem się, że ta odpowiedź będzie popularna. Łał!

tuskiomi
źródło
21
Nazwa języka jest trochę nieznośna ...
Conor O'Brien
Jakie zasady stosujesz i jak dokładnie są głupie?
Luis Mendo,
3
@LuisMendo zasady zadeklarowane tutaj: meta.codegolf.stackexchange.com/questions/10199/ ... Myślę, że reguła jest głupia, ponieważ napisałem „tłumacza”, który omija dokładnie to, o czym mówią. Im bardziej język ten może być wykorzystywany w wyzwaniach, tym bardziej głupia staje się reguła. Na pewno dołączę to do linku.
tuskiomi
9

Python 2, 41 bajtów

lambda l:map(sorted(l+[l])[::-1].index,l)

Dla każdej wartości znajdź jej indeks na liście posortowanej według malejącej kolejności. Aby największa wartość dawała 1 zamiast 0, używamy dodatkowego elementu „nieskończoności” samej listy, ponieważ Python 2 traktuje listy jako większe niż liczby.

Bardziej bezpośrednie rozwiązanie ma 42 bajty i działa również w Pythonie 3.

lambda l:[1+sum(y<x for x in l)for y in l]

Dla każdego elementu liczy się liczba mniejszych elementów, dodając 1, aby przejść do 1-indeksowanego.

xnor
źródło
8

Galaretka , 5 bajtów

ṢṚiЀ

Wypróbuj online!

Jak to działa

ṢṚiЀ  Main link. Argument: A (array)

ṢṚ     Sort and reverse A.
  iЀ  Find the index of each n in A in the previous result.
Dennis
źródło
7

R, 24 25 20 bajtów

Korzysta ze standardowej funkcji rangowej z metodą powiązań „min” nad negowanym wektorem. catdodano, aby wyprowadzić go do STDOUT. Zapisano jedną dzięki @Guiseppe

cat(rank(-scan(),,"mi"))

Przykład

> cat(rank(-scan(),,"mi"))
1: 9 2 12 3 7 11 15 11 6 8 11 17 11
14: 
Read 13 items
8 13 3 12 10 4 2 4 11 9 4 1 4
> 
MickyT
źródło
Myślę, że musisz go owinąć cat, aby był to pełny program.
Alex A.,
@AlexA. Zastanawiałem się nad tym. Czy uczciwie byłoby powiedzieć, że jest to funkcja sama w sobie, a w takim przypadku byłoby rank(-a,,'min')dobrze, gdzie a jest wprowadzoną listą w postaci wektorowej?
MickyT,
W takim przypadku uznalibyśmy go za fragment, ponieważ zakłada się, że zmienna już istnieje w przestrzeni nazw. Aby było to prawidłowe przesłanie funkcji, będziesz potrzebować function(a)rank(-a,,'min').
Alex A.,
można skrócić "mi"raczej do niż "min".
Giuseppe
@AlexA. dlaczego trzeba go owinąć cat? Gdyby to przesłanie zostało function(a)rank(-a,,'mi')uznane za wystarczające, a wyniki programu są identyczne jakrank(-scan(),,'mi')
Mark
4

PowerShell v2 +, 43 41 bajtów

($a=$args)|%{@($a|sort -d).indexof($_)+1}

Opracowany niezależnie, ale widzę, że jest to ten sam algorytm, co rozwiązanie Python @ xnor , więc / shrug.

Pobiera dane wejściowe jako indywidualne argumenty wiersza polecenia (tj. Listę oddzieloną spacjami). Dane wyjściowe (formatowanie domyślne) to nowa linia między elementami.

Dla każdego elementu na liście wejściowej sortjest to lista wejściowa w -dkolejności malejącej, pobiera .indexOf()bieżący element i dodaje 1. Zwróć uwagę na rzutowaną tablicę jawną @(...), aby uwzględnić jednocyfrowe dane wejściowe. Wynikowe liczby są pozostawione w potoku, a dane wyjściowe są niejawne.

Zaoszczędź 2 bajty dzięki @Matt!

Przykład

PS C:\Tools\Scripts\golfing> .\rank-the-integers.ps1 6 2 9 7 2 6 5 3 3 4
3
9
1
2
9
3
5
7
7
6
AdmBorkBork
źródło
Czy jest jakiś powód sort -ddla ciebie nie działał? To jest dla mnie jednoznaczne.
Matt
@Matt Odd. Na moim Win8.1 ISE stwierdza to -Descendingi -Debugjest niejednoznaczny. Ale w prostej powłoce na Win8.1 oraz powłoce i ISE na Win10 działa dobrze. To nie byłby pierwszy raz , kiedy moja konkretna instalacja Win8.1 jest głupia ...: - / Dzięki za golfa!
AdmBorkBork,
Czy to też nie działało dla wszystkich przypadków testowych? $args|%{@($args|sort -d).indexof($_)+1}jest krótszy, ale nie miałem dobrego spojrzenia, czy to działa
Matt
@Matt To nie działa, ponieważ druga $argsfunkcja służy jako dane wejściowe dla bloku skryptu w pętli {...}, tak jak w przypadku użycia filterlub function.
AdmBorkBork,
3

Oktawa, 15 bajtów

@(x)sum(x<x')+1

Port mojej odpowiedzi MATL na Octave. Działa również w Matlab R2016b.

Kod definiuje anonimową funkcję. Aby go wywołać, przypisz go do zmiennej. Wypróbuj w Ideone .

Luis Mendo
źródło
3

JavaScript (ES6), 38 36 bajtów

a=>a.map(e=>a.map(d=>r+=e<d,r=1)&&r)

Edycja: Zapisano 2 bajty dzięki @ETHproductions.

Neil
źródło
.mapFTW ;-)a=>a.map(e=>a.map(d=>r+=e<d,r=1)&&r)
ETHproductions
3
@ETHproductions Dlaczego zawsze musisz zepsuć moją zabawę?
Neil,
2

Galaretka , 5 bajtów

<S‘ð€

TryItOnline!

W jaki sposób?

<S‘ð€ - Main link: listOfValues
   ð  - dyadic chain separation
    € - for each
<     - less than (vectorises) - yields a list of 1s and 0s
 S    - sum - yields number of values the current value is less than (those that beat it)
  ‘   - increment - the place of a value is the number that beat it plus 1.
Jonathan Allan
źródło
Jak to jest podobne do kodu J, który miałem przesłać? 1+(+/@:<)"0 1~
Dane
Wygląda podobnie (wykorzystuje redukcję do sumy?), Ale to nie powinno w żadnym wypadku powstrzymywać Cię przed publikowaniem kodu!
Jonathan Allan
Wydaje mi się, że bardziej zastanawiałem się, co robią „separacja łańcucha dyadycznego” i „dla każdego” w języku inspirowanym literą J.
Dane
Ach, cóż, z twojego wyjaśnienia, myślę, że twój kod jest bardziej >€µS‘lub bardziej podobny <@€µS‘( @odwraca argumenty do <operatora). J ~jest ukryty w łańcuchu po lewej stronie µ, który jest monadycznym (a nie diadadowym) rozdziałem i <wektoryzuje, jeśli argument (y) jest (są) listą (ami).
Jonathan Allan,
2

Perl 6 ,  42  26 bajtów

Znajdź pierwszy indeks :kna odwróconej [R,]posortowanej liście

{map {[R,](.sort).first(*==$^a,:k)+1},@$_}

Policz większe wartości i dodaj jedną

{map {1+.grep(*>$^a)},@$_}
Brad Gilbert b2gills
źródło
2

JavaScript, 87 49 bajtów

f=a=>a.slice().map(function(v){return a.sort(function(a,b){return b-a}).indexOf(v)+1 })

a=>[...a].map(v=>a.sort((a,b)=>b-a).indexOf(v)+1)

Dzięki Conor O'Brien i ETHproductions!

Oliver
źródło
1
Możesz użyć anonimowej funkcji na mapie, tj v=>a.sort((a,b)=>b-a).indexOf(v)+1.
Conor O'Brien,
W ogóle nie potrzebujesz .slice(), ponieważ .mapdziała na kopii tablicy.
ETHproductions
Zgodnie z naszą polityką witryny funkcja nie musi mieć nazwy, więc możesz również usunąć wiodące f=.
Conor O'Brien
@ETHproductions Jeśli usunę plaster, przekazuję [18,13,18]zwroty [1,1,2]zamiast[1, 3, 1]
Oliver,
Och, to dziwne ... Chyba dlatego, że a.sort()przechowuje posortowaną tablicę a. Ale możesz zmienić a.slice()na, [...a]aby zapisać kilka bajtów.
ETHproductions
2

Mathematica, 44 bajty 42 bajty 40 bajtów

xPosition[SortBy[x,-#&],#][[1,1]]&/@x

jest 3-bajtową postacią prywatnego użytku U+F4A1( strona z dokumentami Wolfram )

Edycja: Dzięki JHM za oszczędności bajtów.

ngenisis
źródło
1
Zawiedzie przypadku testowego {10,2,5,4,15,5}(wyjście powinno być {2,6,3,5,1,3}nie {2,5,3,4,1,3}. Należy pamiętać, że 4musi zostać pominięte, ponieważ istnieją dwa 5s na wejściu).
JungHwan Min
Odpowiednio poprawiony.
ngenisis,
1
-2 bajtów poprzez włączenie xi #(efektywnie pozbycie się w nawiasach) xPosition[SortBy[x,-#&],#][[1,1]]&/@x.
JungHwan Min
2

Pyke, 6 bajtów

FQS_@h

Wypróbuj tutaj!

F      - for i in input():
 QS    -     sorted(input())
   _   -    reversed(^)
    @  -   i.find(^)
     h -  ^+1 (not required if allowed to start from 0)
niebieski
źródło
2

J , 14 8 bajtów

1+1#.</~

W jaki sposób?

1+1#.</~ - Consumes and returns a list of integers
       ~ - Use the same list for both inputs
     </  - Create a table of less-than comparisons
  1#.    - Treat each row like digits of a base-one number, returning a list of integers
1+       - Increment the results

Poprzednie rozwiązanie

1+(+/@:<)"0 1~
Duńczyk
źródło
Witam, znalazłem krótszą wersję na 8 bajtów 1+1#.</~. Sumowanie wierszowe wykonuje się przy użyciu konwersji bazy 1. Inną alternatywą jest 1+\:~i.]także 8 bajtów.
mile
Miły! Czy chcesz opublikować własną odpowiedź? W przeciwnym razie uwzględnię ulepszenie podstawowe.
Dane
2
Nie, nic mi nie jest z sugerowaniem oszczędności bajtów. Zapraszam do korzystania z nich
mile
1

Haskell, 28 bajtów

f l=[1+sum[1|y<-l,y>x]|x<-l]

Tylko niektóre wyjaśnienia listy.

xnor
źródło
20 sekund za późno. Już miałem opublikować tę samą odpowiedź.
nimi
1

Cud , 28 bajtów

@(->@+1:0iO#0rev sort#I#1)#0

Stosowanie:

(@(->@+1:0iO#0rev sort#I#1)#0)[6 2 9 7 2 6 5 3 3 4]

Odwzoruj tablicę wejściową za pomocą funkcji, która dodaje 1 do pierwszego indeksu elementu w malejącej wersji danych wejściowych.

Mama Fun Roll
źródło
1

Mathematica, 37 bajtów

Min@Position[-Sort@-#,i]~Table~{i,#}&

Czysta funkcja, która uszereguje dane wejściowe zgodnie z regułami problemu. Dawny:

Min@Position[-Sort@-#, i]~Table~{i, #} &[{6, 2, 9, 7, 2, 6, 5, 3, 3, 4}]
(*{3, 9, 1, 2, 9, 3, 5, 7, 7, 6}*)
J. Antonio Perez
źródło
1

Meduza , 15 bajtów

p`&& ~i
  >/+`<

Wypróbuj online!

Wyjaśnienie

Wydaje się, że nie ma jeszcze dobrego sposobu na znalezienie indeksu wartości na liście w meduzach, więc wykorzystuje to podejście polegające na zliczaniu, ile wartości jest większych niż bieżąca, i zwiększaniu wyniku. W dużej mierze odbywa się to poprzez skonstruowanie jednoargumentowej funkcji, która oblicza tę wartość dla danego elementu.

     `<

Spowoduje to utworzenie wątkowej wersji operatora porównania, więc jeśli podasz tę liczbę całkowitą i listę, zwróci listę wyników porównania między tą liczbą całkowitą a każdym elementem na liście.

     ~i
     `<

To curry prawy argument poprzedniej funkcji z listą wejściową. Tak więc wynikiem jest jednoargumentowa funkcja, która przyjmuje liczbę całkowitą i daje listę wyników porównania z danymi wejściowymi programu.

   & ~i
   /+`<

Tutaj /+jest redukcja przez dodanie, co oznacza, że ​​jest to po prostu funkcja „sumuj tę listę”. &łączy to z poprzednią funkcją, więc mamy teraz jednoargumentową funkcję, która zlicza, ile wartości na wejściu jest większa niż ta liczba całkowita.

  && ~i
  >/+`<

Na tym również komponujemy funkcję przyrostową.

 `&& ~i
  >/+`<

Na koniec wątkujemy również tę funkcję, aby była automatycznie stosowana do każdej liczby całkowitej przekazywanej do niej listy. Ze względu na układ kodu izdarza się, że jest również traktowany jako dane wejściowe tej funkcji, dzięki czemu oblicza się pożądany wynik.

p`&& ~i
  >/+`<

Na koniec drukuje wynik.

Martin Ender
źródło
1

pieprzenie mózgu, 124 bajty

->,[>>>+>,]<[-<+]+[-->[<[<<<<]>>>+>[>[>>]<[[<<+<<]>+>[->>>>]]<+>>>]+[-<<+]->]<[<
<<<]>+.,>>[>[>->+>>]<<[-<<<<]>-]+[->+]+>>>>]

Sformatowany:

->
,[>>>+>,]
<[-<+]
+
[
  -->
  [
    <[<<<<]
    >>>+>
    [
      >[>>]
      <
      [
        [<<+<<]
        >+>[->>>>]
      ]
      <+> >>
    ]
    +[-<<+]
    ->
  ]
  <[<<<<]
  >+.,>>
  [
    >[>->+>>]
    <<[-<<<<]
    >-
  ]
  +[->+]
  +>>>>
]

Jest to przeznaczone do 8-bitowych implementacji typu brainfuck. Dane wejściowe i wyjściowe są za pomocą wartości bajtów .

Wypróbuj online.

Dla każdego elementu liczy się liczba elementów większa od niego, a następnie drukuje wynik plus jeden. Dokonuje się tego poprzez zwiększenie wszystkich elementów, aż bieżący element wyniesie zero, aktualizując wynik za każdym razem, gdy inny element stanie się zero przed bieżącym elementem.

Taśma jest podzielona na 4-komórkowe węzły,

b c 0 0

gdzie cjest elementem i bjest flagą nawigacyjną, która jest ujemna dla bieżącego elementu, w przeciwnym razie jedna.

Wynik i kopia bieżącego elementu są przechowywane po lewej stronie tablicy.

Mitch Schwartz
źródło
1

Java, 215 bajtów

public class G{public static void L(int[]A){int[]r=new int[A.length];for(int i=0;i<A.length;i++){int c=1;for(int j=0;j<A.length;j++){if(A[j]>A[i])c++;}r[i]=c;}for(int i=0;i<r.length;i++)System.out.print(r[i]+",");}}

Wyjaśnienie:

Bardzo oczywiste.

Zasadniczo dla każdej liczby całkowitej w tablicy sprawdza, ile jest większych, a następnie drukuje nową tablicę z rankingami.

Przepraszam, to nie jest zbyt zwięzłe, ale to moja pierwsza próba w jednym z nich i nie widziałem wpisu dla java. Jestem pewien, że można bardziej zagrać w golfa.

Można go uruchomić, odwołując się do metody statycznej i przekazując tablicę. Nie sądziłem, że konieczne będzie napisanie głównej funkcji, ale jeśli tak, zrobię to w przyszłości.

Henz
źródło
Czy możesz usunąć niektóre z tych białych znaków? Ponieważ tak naprawdę nie jest to gra w golfa. (tj. spacje w r = new)
Rɪᴋᴇʀ
@EasterlyIrk Tak, przepraszam, nie jestem przyzwyczajony do robienia tego. Myślę, że pozbyłem się niepotrzebnych białych znaków.
Henry
Czy możesz nazwać „rankNumbersGolf” czymś krótszym jak „G” czy coś takiego?
Rɪᴋᴇʀ
@EasterlyIrk Tak, dziękuję.
Henry
Nie radzę sobie dobrze z Javą, ale czy możesz usunąć niektóre spacje z trzech for (?
Rɪᴋᴇʀ
0

PHP, 101 bajtów

Musi być jakaś krótsza droga.

function f(&$a){for($r=1;$v++<max($a);$r+=$n,$n=0)foreach($a as$k=>$w)if($w===$v){$a[$k]="$r";$n++;}}

funkcja przyjmuje dane jako tablicę liczb całkowitych, zastępuje zmienną wejściową szeregami jako ciągi liczbowe.

Stosowanie: $a=[1,2,4,2,2,3];f($a);print_r($a);

Tytus
źródło
0

Rubinowy, 45 40 bajtów

->a{a.map{|x|a.sort.reverse.index(x)+1}}
Lee W.
źródło
Jak to się nazywa? Nie mogę go dopasować do przypadków testowych, wydaje się, że występuje błąd o równych stopniach. Na przykład [10, 2, 5, 4, 15, 5]daje mi wyjście, [2, 5, 3, 4, 1, 3]kiedy powinno być [2, 6, 3, 5, 1, 3]- myślę, że naprawię, że po prostu usuniesz .uniq- oszczędzając 5 bajtów!
Neil Slater,
Wydaje mi się, że źle odczytałem pytanie. Dzięki za wykrycie tego!
Lee W
0

Clojure, 48 44 bajtów

Aktualizacja: za pomocą forzamiastmap

#(for[i %](+(count(filter(partial < i)%))1))

Po prostu filtruje każdą wartość mniejszą niż bieżąca, liczy długość listy i zwiększa ją o jeden.

NikoNyrh
źródło
0

PHP, 84 bajty

function r($l){$s=$l;rsort($s);foreach($l as$n)$r[]=array_search($n,$s)+1;return$r;}

Użycie: Przekaż funkcję r tablicę liczb całkowitych, a zwróci odpowiednią tablicę liczb całkowitych uszeregowanych.

Zdanie testów tutaj.

Progrock
źródło
0

K (oK) , 11 bajtów

Rozwiązanie:

1+(x@>x)?x:

Wypróbuj online!

Przykłady:

1+(x@>x)?x:6 2 9 7 2 6 5 3 3 4
3 9 1 2 9 3 5 7 7 6
1+(x@>x)?x:5 6 14 19 13 5 19 9 19 9 9 19
11 10 5 1 6 11 1 7 1 7 7 1

Wyjaśnienie:

Sprawdź pozycję oryginalnej listy na liście posortowanej, a następnie dodaj jedną.

1+(x@>x)?x: / the solution
         x: / save input as x
  (  >x)    / return indices of x sorted in descending order
   x@       / apply these indices to x (thus sort x)
        ?   / lookup right in left
1+          / add one
streetster
źródło