Tryb (najczęstszy element) listy


26

Napisz fragment kodu, aby obliczyć tryb (najczęstszą liczbę) listy dodatnich liczb całkowitych.

Na przykład tryb

d = [4,3,1,0,6,1,6,4,4,0,3,1,7,7,3,4,1,1,2,8]

jest 1, ponieważ występuje maksymalnie 5 razy.

Możesz założyć, że lista jest przechowywana w zmiennej takiej jak di ma unikalny tryb.

np .: Python, 49

max(((i,d.count(i))for i in set(d)), key=lambda x:x[1])

To jest , więc wygrywa najkrótsze rozwiązanie w bajtach.

Odpowiedzi:


5

K5, 6 bajtów

*>#:'=

Pierwszy ( *) z malejących elementów ( >) zliczenia każdego ( #:') z grupy ( =). Krok po kroku:

  i
4 3 1 0 6 1 6 4 4 0 3 1 7 7 3 4 1 1 2 8

  =i
4 3 1 0 6 7 2 8!(0 7 8 15
 1 10 14
 2 5 11 16 17
 3 9
 4 6
 12 13
 ,18
 ,19)

  #:'=i
4 3 1 0 6 7 2 8!4 3 5 2 2 2 1 1

  >#:'=i
1 4 3 7 6 0 8 2

  *>#:'=i
1

spróbuj w swojej przeglądarce !


29

Python 2 - 18

max(d,key=d.count)

Ponieważ wydaje się, że twoja odpowiedź na python nie jest drukowana, spodziewam się, że tego właśnie chcesz.

Dodaj 6 bajtów printnormalnie.


idealnie, pomyśl @globby musi widzieć przyszłość :)
garg10may

12
Wspaniałą rzeczą w tym jest to, że nie jest nawet golfowy, to po prostu Python. Jedyną rzeczą, która została zagrana w golfa, jest przestrzeń pomiędzy d,i key=.
wchargin

5
@WChargin: Ech, Pythonic miałby unikać kwadratowego środowiska wykonawczego za pomocą defaultdict(int)lub Counter. Coś jak Counter(d).most_common()[0].
użytkownik2357112 obsługuje Monikę

25

Matlab / Octave, 7 5 bajtów

Nic dziwnego, że jest wbudowana funkcja wyszukiwania trybów. Jako funkcja anonimowa:

@mode

Zwraca to najczęściej występujący element w wektorze wejściowym, a krawaty przechodzą do mniejszej wartości.

Zaoszczędzono 2 bajty dzięki Dennisowi!


3
+1, wyraźnie odpowiednie narzędzie do pracy. Ponieważ jest to funkcja wbudowana, co się stanie, jeśli będzie więcej niż jedna liczba najwyższej częstotliwości?
Level River St

2
@steveverrill Zgodnie z dokumentacją (typ help mode): „Jeśli dwie lub więcej wartości mają tę samą częstotliwość,„ tryb ”zwraca najmniejszą.”
wchargin

1
Funkcje nienazwane wydają się być dozwolone (odpowiedź jest jedna), więc możesz to skrócić @mode.
Dennis

@Dennis Thanks! Chociaż przyznam, że to dziwne uczucie, gdy edytuję swoją pierwszą odpowiedź na stronie.
Alex A.

16

Pyth - 6

eo/QNQ

Wypróbuj online.

Oczekuje wkładu na standardowe wejście [4,3,1,0,6,1,6,4,4,0,3,1,7,7,3,4,1,1,2,8]. Więzy są rozwiązywane przez ostatnie wystąpienie, ponieważ Python wykonuje stabilne sortowanie.

Sortuje listę według liczby na liście, a następnie drukuje ostatni numer listy.

Qmożna zastąpić, djeśli zainicjowano, daby zawierała wartość przed np=d[4 3 1 0 6 4 4 0 1 7 7 3 4 1 1 2 8)

Pseudo-kod Python-esque:

Q=eval(input());print(sorted(Q,key=Q.count)[-1])

Pełne objaśnienie:

            : Q=eval(input()) (implicit)
e           : ... [-1]
 o   Q      : orderby(lambda N: ...,Q)
  /QN       : count(Q,N)

Pyth za orderbyprzebiega dokładnie tak samo jak Pythona sortedz orderby„s pierwszy argument bycia keyargument.


11

Mathematica, 25 bajtów

Last@SortBy[d,d~Count~#&]

lub

#&@@SortBy[d,-d~Count~#&]

Podobnie jak w przypadku wyzwania, oczekuje się, że lista będzie przechowywana d.

lub ... 15 bajtów

Oczywiście Mathematica nie byłaby Mathematica, gdyby nie miała wbudowanego:

#&@@Commonest@d

Commonestzwraca listę wszystkich najczęstszych elementów (w przypadku remisu) i #&@@gra w golfa First@.


kolejna sprawa dla mthmca
Michael Stern,

9

Ruby, 22 bajty

d.max_by{|i|d.count i}

Zasadniczo część mojej odpowiedzi Mathematica, z wyjątkiem tego, że Ruby ma bezpośredni, max_bywięc nie muszę sortować najpierw.


1
Miałem zamiar zasugerować, d.max_by d.method:countale to około miliona (aka nawet dwóch) bajtów dłużej. Warto jednak zauważyć, że jest to możliwe.
Pozew Fund Moniki w

9

R, 33 25 bajtów

Dzięki @Hugh za skrócenie pomocy:

names(sort(-table(d))[1])

Oryginalny:

v=table(d);names(v[which.max(v)])

Oblicza to częstotliwość każdego elementu w wektorze d, a następnie zwraca nazwę kolumny zawierającej największą wartość. Zwrócona wartość jest w rzeczywistości ciągiem znaków zawierającym liczbę. Nigdzie nie było powiedziane, że to nie w porządku, więc ...

Wszelkie sugestie dotyczące skrócenia tego są mile widziane!


2
names(sort(-table(d))[1])
Hugh

9

CJam, 11 10 bajtów

A{A\-,}$0=

Zakłada tablicę w zmiennej o nazwie A. Jest to w zasadzie sortowanie tablicy na podstawie występowania każdej liczby w tablicy, a następnie wybór ostatniego elementu tablicy.

Przykładowe użycie

[1 2 3 4 4 2 6 6 6 6]:A;A{aA\/,}$W=

Wydajność

6

1 bajt zapisany dzięki Dennisowi!

Wypróbuj online tutaj


A{A\-,}$0=jest o jeden bajt krótszy.
Dennis

1
Od wersji 0.6.5 jest to wykonalne w 8 bajtach:Ae`$e_W=
Martin Ender

@MartinEnder Umm ... nope . Wiedziałem, że najpierw musisz posortować.
Erik the Outgolfer,

@ErikGolfer ー リ ッ ク ゴ ル フ ァ ー ー ups, masz rację, potrzebuje 9 bajtów:$e`$e_W=
Martin Ender

8

PowerShell 19

($d|group)[0].Count

(zakłada się, że tablica jest już włączona $d)


8

J - 12 znaków

Funkcja anonimowa. Sortuje listę od najbardziej do najmniej popularnych, biorąc pierwszy element.

(0{~.\:#/.~)
  • 0{ Po pierwsze
  • ~. Unikalne przedmioty
  • \: Downsortowane przez
  • #/.~ Częstotliwości

Wypróbuj sam.


To naprawdę 10 bajtów - funkcję można przypisać bez parens.
Conor O'Brien

6

JavaScript (ES6) 51

Tylko wyrażenie jednowierszowe przy użyciu wstępnie załadowanej zmiennej d. Posortuj tablicę według częstotliwości, a następnie uzyskaj pierwszy element.
Paskudny efekt uboczny, oryginalny układ został zmieniony

d.sort((a,b)=>d.map(w=>t+=(w==b)-(w==a),t=0)&&t)[0]

Jak zwykle użycie .map zamiast .reduce, ponieważ ogólnie jest o 1 char. Krótszy. Z .reduce to prawie czyste rozwiązanie bez gry w golfa.

d.sort((a,b)=>d.reduce((t,w)=>t+(w==b)-(w==a),0))[0]

Wreszcie rozwiązanie wykorzystujące funkcję, nie zmieniające oryginalnej tablicy i bez globałów (62 bajty):

F=d=>[...d].sort((a,b)=>d.reduce((t,w)=>t+(w==b)-(w==a),0))[0]

Testuj w konsoli FireFox / FireBug

d=[4,3,1,0,6,1,6,4,4,0,3,1,7,7,3,4,1,1,2,8]
d.sort((a,b)=>x.map(w=>t+=(w==b)-(w==a),t=0)&&t)[0]

Wyjście 1

Tablica d staje się:

[1, 1, 1, 1, 1, 4, 4, 4, 4, 3, 3, 3, 0, 6, 6, 0, 7, 7, 2, 8]

5

Python - 32

max((x.count(i),i)for i in x)[1]

Szczerze mówiąc, nie widzę rozwiązania 18 postaci w przyszłości.

EDYCJA: Poprawiłem się i jestem pod wrażeniem.


4

JavaScript, ES6, 71 bajtów

Trochę długi, można dużo golfa.

f=a=>(c=b=[],a.map(x=>b[x]?b[x]++:b[x]=1),b.map((x,i)=>c[x]=i),c.pop())

To tworzy funkcję, fktórą można wywołać jak f([1,1,1,2,1,2,3,4,1,5])i powróci 1.

Wypróbuj na najnowszej konsoli Firefox.


Nie na temat, ale właśnie zdałem sobie sprawę, jak ważna jest twoja nazwa użytkownika dla PCG.SE. : P
nyuszika7h,

@ nyuszika7h heh. Chociaż miałem tę nazwę użytkownika na długo zanim jeszcze wiedziałem, że istnieje PPCG.
Optymalizator

f=a=>(c=b=[],a.map(x=>b[x]++-1?0:b[x]=1),b.map((x,i)=>c[x]=i),c.pop())jest o 1 bajt krótszy.
Bálint

4

05AB1E , 3 bajty

(niekonkurencyjny - pytanie poprzedza język)

.MJ

Wyjaśnienie:

.M  # Gets the most frequent element in the [implicit] input
  J # Converts to a string, needed as the program would output "[1]" instead of "1" without this.

Jeśli chcesz przechowywać tablicę w zmiennej zamiast używać danych wejściowych, po prostu wepchnij tablicę do stosu na początku programu.

Wypróbuj online!


3

C # - 49

Naprawdę nie mogę konkurować przy użyciu C #, ale cóż:

Zakładając, że djest to tablica

d.GroupBy(i=>i).OrderBy(a=>a.Count()).Last().Key;


3

bash - 29 27 znaków

sort|uniq -c|sort -nr|sed q

Użyj tego:

sort|uniq -c|sort -nr|sed q
4
3
1
0
6
1
6
4
4
0
3
1
7
7
3
4
1
1
2
8
[ctrl-D]
5 1

tzn. „1” jest trybem i pojawia się pięć razy.


sort|uniq -c|sort -nr|sed qratuje kilka postaci
Digital Trauma


@pgy - dziękuję - zaktualizowałem!

3

GolfScript, 10 bajtów

a{a\-,}$0=

Z tej odpowiedzi napisałem do Wskazówki dotyczące gry w golfa w GolfScript . Oczekuje danych wejściowych w tablicy o nazwie a, zwraca wynik na stosie. (Aby odczytać dane wejściowe z tablicy na stosie, poprzedzaj :11 bajtów; aby odczytać dane wejściowe ze standardowego wejścia (w formacie [1 2 1 3 7]), również poprzedzaj ~12 bajtów).

Ten kod działa poprzez iterację tablicy wejściowej, odejmowanie każdego elementu od oryginalnej tablicy i zliczanie liczby pozostałych elementów. Jest to następnie używane jako klucz do sortowania oryginalnej tablicy i zwracany jest pierwszy element posortowanej tablicy.

Demo online.

Ps. Dziękuję Peterowi Taylorowi za wskazanie mi tego wyzwania .


3

Dyalog APL, 12 znaków

d[⊃⍒+/∘.=⍨d]

∘.=⍨djest taki sam jak d∘.=drefleksyjny produkt zewnętrzny =. Tworzy macierz boolowską porównując każdą parę elementów w d.

+/ sumuje tę macierz wzdłuż jednej z osi i tworzy wektor.

ocenia wektor, tzn. sortuje go według wskaźników. (Jak sugerują glify, ocenia w kolejności malejącej i oceniałby w kolejności rosnącej).

pobiera pierwszy indeks z oceny - indeks największego elementu d.

d[...] zwraca ten element.


+/∘.=⍨dliczy się dla każdego elementu d. ⊢∘≢⌸dliczy się dla każdego elementu ∪d, więc wskaźniki nie odpowiadają tym z d. Kontrprzykład: d←1 1 2 2 2. Aby to działało: (∪d)[⊃⍒⊢∘≢⌸d]lub (⊃⍒⊢∘≢⌸d)⊃∪d.
ngn

3

Perl 6 , 21 bajtów

.Bag.invert.max.value

Przykład:

$_ = < 4 3 1 0 6 1 6 4 4 0 3 1 7 7 3 4 1 1 2 8 >».Int;

say .Bag.invert.max.value; # implicitly calls $_.Bag…

Jeśli jest remis, wydrukuje większy z tych, które związały.


.BagMetoda na liście lub tablicy tworzy ilościowo hash, który wiąże się z całkowitą rachubę, ile razy dana wartość została zaobserwowana w tej wartości.

bag(4(4), 3(3), 1(5), 0(2), 6(2), 7(2), 2, 8)

.invertMetoda tworzy listę par w worku z kluczem i wartością zamienione. (Powodem, dla którego to nazywamy, jest następna metoda robienia tego, co chcemy).

4 => 4,  3 => 3,  5 => 1,  2 => 0,  2 => 6,  2 => 7,  1 => 2,  1 => 8

.maxMetoda na listę par zwraca największą Pair porównujące klucze pierwszy oraz w przypadku remisu porównanie wartości.
(Jest tak, ponieważ w ten sposób multi infix:<cmp>(Pair:D \a, Pair:D \b)określa się, która jest większa)

5 => 1

.valueMetoda zwraca wartość od pary. (Byłby to klucz, którego szukaliśmy, gdyby nie .invertwcześniejsza rozmowa)

1

Jeśli chcesz zwrócić wszystkie wartości powiązane w przypadku remisu:

say @list.Bag.classify(*.value).max.value».key

.classifyMetoda zwraca listę par, gdzie klawisze są z wywołaniem lambda cokolwiek  *.valuez każdej z par.

1 => [2 => 1, 8 => 1],
2 => [0 => 2, 6 => 2, 7 => 2],
3 => [3 => 3],
4 => [4 => 4],
5 => [1 => 5]

Następnie dzwonimy, .maxaby uzyskać największą parę.

"5" => [1 => 5]

Zadzwoń, by .valueotrzymać oryginalne pary z torby (w tym przypadku tylko jedną)

1 => 5

Następnie używamy metody >>.keydo wywołania .keymetody na każdej parze na liście, dzięki czemu otrzymujemy listę wartości, które były najczęściej oglądane.

1

2

Java 8: 184 bajty

Stream.of(A).collect(Collectors.groupingBy(i -> i, Collectors.counting())).entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())).findFirst().get().getKey();

Wejście A musi być typu Integer[]. Uwaga java.util.*i java.util.stream.*należy je zaimportować, jednak w duchu oneliner są one pominięte.


oddawanie głosu z powodu ...?
PoweredByRice

Wiem, że minęły ponad dwa lata, ale możesz usunąć spacje w (i->i,Collectors.counting()).
Kevin Cruijssen

2

Narzędzia Bash + unix, 62 bajty

Oczekuje tablicy w STDIN. Format wejściowy się nie liczy, o ile liczby są liczbami całkowitymi nieujemnymi.

grep -o [0-9]\*|sort|uniq -c|sort -n|awk 'END{print $2}'

Edytowano: znak ucieczki w argumencie grep. Teraz można go bezpiecznie uruchomić w niepustych katalogach. Dzięki manatwork.


1
Najlepiej, jeśli działa w pustym katalogu. W przeciwnym razie [0-9]*może zostać rozszerzone do pasujących nazw plików.
manatwork

Alternatywnie, umieść 'argument wokół grep.
Paŭlo Ebermann

2

Perl, 27 bajtów

$Q[$a{$_}++]=$_ for@F;pop@Q

Zwraca ostatnią najczęstszą wartość w przypadku remisu.


2

PHP, 53 50 bajtów

<?=array_flip($c=array_count_values($d))[max($c)];

Uruchom tak:

echo '<?php $d=$argv;?><?=array_flip($c=array_count_values($d))[max($c)]; echo"\n";' | php -- 4 3 1 0 6 1 6 4 4 0 3 1 7 7 3 4 1 1 2 8

Poprawki

  • Zapisano 3 bajty, wykorzystując swobodę zakładania, że ​​dane wejściowe są przypisane do zmiennej d

2

Java 8, 83 bajtów

d.stream().max((x,y)->Collections.frequency(d,x)-Collections.frequency(d,y)).get();

dmusi być Collection<Integer>.


Jeśli Collectionsmożna je zaimportować statycznie:
59 bajtów

d.stream().max((x,y)->frequency(d,x)-frequency(d,y)).get();

2

Haskell 78

import Data.List
import Data.Ord
g=head.maximumBy(comparing length).group.sort

Jeśli import zostanie zignorowany, będzie to 45 .


1
Możesz zapisać 4 bajty, używając stylu bez punktów, i 2 bajty, używając maximumByzamiast last.sortBy. Nowy kod stałby się g=head.maximumBy(comparing length).group.sort.
Hjulle

1.) Funkcje anonimowe są dozwolone, więc możesz upuścić g=. 2.) Możesz zastąpić, maximumBy(comparing length)przez snd.maximum.map((,)=<<length)co nie trzeba importować Ord, w sumie 62 bajty: Wypróbuj online!
Laikoni


2

Brachylog , 5 bajtów

ọtᵒth

Wypróbuj online!

To nie jest tak naprawdę fragment, ale nie jestem pewien, co by było ...

         The output is
    h    the first element of
   t     the last element of
ọ        a list of [value, number of occurrences] pairs corresponding to
         the input,
  ᵒ      sorted ascending by
 t       their last elements (the numbers of occurrences).

Nie udaje się przy ujemnym wejściu
garg10may

@ garg10may Użyj podkreślnika zamiast myślnika, powinno działać w ten sposób
Niepowiązany ciąg

2

Clojure, 32 bajty

#(apply max-key(frequencies %)%)

(frequencies %)zwraca mapę skrótu, której można użyć jako funkcji. Podany klucz zwraca odpowiednią wartość :)

Równa długość:

#(last(sort-by(frequencies %)%))


1

C ++ 119

int *a=std::max_element(x,x+n);int z=0,b=0,c=0;for(int i=0;i<=*a;i++){c=std::count(x,x+n,i);if(c>b){b=c;z=i;}}return z;

Pełny kod i test:

#include <iostream>
#include <algorithm>
#include <vector>

int m(int *x,int n)
{
int *a=std::max_element(x,x+n);int z=0,b=0,c=0;for(int i=0;i<=*a;i++){c=std::count(x,x+n,i);if(c>b){b=c;z=i;}}return z;
}

int main()
{
int d[] = {4,3,1,0,6,1,6,4,4,0,3,1,7,7,3,4,1,1,2,8};
std::cout<<m(d,20);
return 0;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.