Kod powinien pobierać tekst (nieobowiązkowe może być dowolny plik, standardowe wejście, ciąg znaków dla JavaScript itp.):
This is a text and a number: 31.
Dane wyjściowe powinny zawierać słowa z ich liczbą wystąpień, posortowane według liczby wystąpień w kolejności malejącej:
a:2
and:1
is:1
number:1
This:1
text:1
31:1
Zauważ, że 31 jest słowem, więc słowo jest dowolną alfanumeryczną, liczba nie działa jako separator, więc na przykład 0xAF
kwalifikuje się jako słowo. Separatory będą to wszystko, co nie jest alfanumeryczne, w tym .
(kropka) i -
(łącznik) w ten sposób i.e.
lub pick-me-up
dadzą 2 lub 3 słowa. Powinna być wielkość liter, This
i this
będzie dwa różne słowa, '
byłoby również separator tak wouldn
i t
będą 2 różne słowa z wouldn't
.
Napisz najkrótszy kod w wybranym języku.
Najkrótsza jak dotąd poprawna odpowiedź:
This
taka sama jakthis
itHIs
)?wouldn't
2 słowa (wouldn
it
)?This
i wielkie litery, ithis
rzeczywiście będą to dwa różne słowa, to samowouldn
it
.i.e.
to słowo, ale jeśli pozwolimy kropce wszystkie kropki na koniec fraz będzie pobierany, tak samo jak cytaty lub pojedyncze cytaty itp.Odpowiedzi:
grep i coreutils
4442Test:
Prowadzi do:
Aktualizacja
źródło
head
na końcu.grep -io \[A-Z0-9]*|sort|uniq -c|sort -nr
Java 8: 289
Co jest całkiem dobre, ponieważ java jest językiem bardzo nie golfowym.
Nie golfowany:
Uruchom z wiersza poleceń:
źródło
"[^\\W_]"
String.split(String regex)
metoda przyjmuje wzorzec pasujący do separatora, na którym ma się dzielić. Na przykład"aababba".split("b")
dałoby tablicę{"aa", "a", "", "a"}
. Moje wyrażenie regularne[^\\w\\d]
oznacza „znak ani w klasie znakowej, ani cyfrowej”.[^\\W_]
jest natomiast „znakiem, który nie jest ani znakiem podkreślenia, ani nie należy do klasy znaków niebędących wyrazami” i pasowałby do dowolnego znaku słownego oprócz znaku podkreślenia.\w
obejmuje\d
, więc\d
jest zbędny.\w
zawiera podkreślnik, który zgodnie z pytaniem należy uznać za separator. Tak więc poprawne wyrażenie regularne dla dzielenia powinno być"[\\W_]+"
.APL (57)
na przykład
Wyjaśnienie:
⎕D,⎕A,⎕UCS 96+⍳26
: cyfry, wielkie litery, małe litery(I←⍞)∊
: wczytaj dane wejściowe, zapisz wI
, zobacz, które są alfanumeryczneZ←I⊂⍨
: podzieloneI
na grupy znaków alfanumerycznych, zapisz wZ
+⌿∘.≡⍨Z
: dla każdego elementu wZ
zobacz, jak często występujeZ,⍪
: dopasuj każdy elementZ
parami z tym, ile razy występujeG←⊃∪↓
: wybierz tylko unikalne pary, zapisz wG
⍒,1↓⍉G
: uzyskaj posortowane wskaźniki dla zdarzeńG[
...;]
: zmiana kolejności wierszyG
według podanych indeksówźródło
⎕s
( help.dyalog.com/latest/Content/Language/System%20Functions/… ) i nowym kluczowym operatorem ( help.dyalog.com/latest/Content/Language/Primitive%20Operators/… ):g⌷⍨⊂⍒2⌷⍉g←{⍺,≢⍵}⌸('\w+'⎕s'\0')⍞
C #:
153c144c142 ° C111C115C118c114c113c(przez LINQPad w trybie „C # Instrukcje”, bez ciągu wejściowego)
Wersja 1: 142c
Nie golfowany:
Wyniki:
Wersja 2: 114c
(
[\w]
obejmuje_
, co jest niepoprawne !;[A-z]
obejmuje[ \ ] ^ _ `
; ustawianie[^_\W]+
)Nie golfowany:
Wyniki: (jako wersja 1)
źródło
@"[^_\W]"
R, 58 znaków
Stosowanie:
źródło
sort(table(gsub("[[:punct:]]","",scan(,""))),d=T)
. Niestety oba rozwiązania nie działają poprawniewouldn't
.perl6: 49 znaków
Połącz dane wejściowe w celu dopasowania elementów
\w+
, umieść wynikową listę słów w aBag
, poproś o ich pary i posortuj je według wartości ujemnej. (To*
jest gwiazda typu cokolwiek , tutaj się nie rozmnaża)wydajność:
źródło
.words
zamiast.comb(/\w+/)
:).words
nie rozebrać:
albo.
z wejścia wymagane :(_
nie powinny być zawarte w słowie pod opisem problemu.Python
10197Teraz działa z newline:
źródło
PHP - 84 bajty
Dane wejściowe są akceptowane jako argument wiersza poleceń, np .:
Dane wyjściowe dla przykładowego ciągu:
źródło
$argv[1]
_
nie powinno być zawarte w słowie.PowerShell (40)
$ s jest zmienną zawierającą łańcuch wejściowy.
źródło
[\W]
nie wystarcza - w moim teście pasuje do miejsca. I nie jest uporządkowane według malejącej liczby ...$s -split"[\W]"|group -ca|where{$_.Name -ne ""}|sort{-$_.Count}
zbliża cię (oczywiście z kosztami)$s -split"\W+"|group -ca |sort count -des
-split"\W+"
dopasowuje pusty ciąg między ostatnim.
a końcem ciągu; także\W+
mecze,_
które technicznie nie są dozwolonePerl 69
Dodano rekomendacje od @primo i @protist
źródło
ge
i nie trzeba wstawiać spacjifor
. Ponadto<=>
operator może zostać zastąpiony przez-
.-
zamiast<=>
jest geniuszem, nie jestem pewien, czy jest to wskazówka dla golfistów dla wątku Perla. Zaktualizuję to później, dzięki!\w
zawiera również liczby (perl -e 'print for"a 1 2 3 4 b"=~/\w/g'
drukujea1234b
), ale twój mechanizm iteracji słów zapisuje inny znak, więc zaktualizuję. Dziękuję Ci!PowerShell:
5755536257(bez ciągu wejściowego)
zwraca:
(z rekwizytami do @microbian dla grupy -ca)
źródło
EcmaScript 6
Wersja 1 (108 znaków)
Wersja 2 (102 znaki)
Wersja 3 (105 znaków)
Wersja 4 (94 znaki)
Wersja 5 (bez alertu; 87 znaków)
Wersja 6 (100 znaków)
Wydajność:
źródło
_[a]
i_[b]
do_.a
i_.b
. Również zmiana/\w+/g,_={}
na_=/\w+/g
przyniesie ten sam wynik._[a]
się_.a
, ponieważ próbuje uzyskać dostęp do nieruchomości"a"
z_
, a nie nieruchomościa
.Object.keys
staje się globalnym w ES6? Twoja odpowiedź wydaje się zakładać, że tak jest, ale nie pamiętam, aby było to zaplanowane na ES6.Groovy
7782zmieniono wyrażenie regularne z
[^\w]+
na[^\d\p{L}]+
, aby rozwiązać problem z podkreśleniembez pierwszego wiersza, 82 znaki
wydajność:
źródło
nu_ber
nie jest alfanumeryczny. To powinno być 2 słowanu_ber
zamiastnumber
?GNU awk + coreutils:
7169Chociaż
gawk asort
działa na tablicach asocjacyjnych, najwyraźniej nie zachowuje wartości indeksu, co wymaga zewnętrznegosort
GNU awk 4.x:
10093Nieco większe, ale czyste rozwiązanie gawk, używane
PROCINFO
do ustawienia domyślnej kolejności sortowania dla tablicy asocjacyjnej (wydaje się, że wymaga stosunkowo nowego gawk -> 4.x?)źródło
_
nie powinno być zawarte w słowie.JavaScript -
132126 znaków!(Najkrótszy kod JS)
Poprawiono wyrażenia regularne i niektóre zmiany.
Nie golfił
Stary -
156143141140132 znakówPo raz pierwszy zagrał w golfa. Doceniono opinie.
źródło
EcmaScript 6,
11510087 (bez monitu i ostrzeżenia)Dzięki @eithedog:
Z monitem i ostrzeżeniem (100):
Uruchom go w przeglądarce Firefox.
źródło
var
. Ponadto, można przesunąća={}
do środkaprompt
-prompt(a={})
. Możesz także upuścićObject.
i zmienićw=>a[w]=a[w]+1||1
naw=>a[w]=-~a[w]
a
z monitu na regexp pozwoli zaoszczędzić dwa kolejne znaki._
nie powinno być zawarte w słowie.Rubin
588265Testowe uruchomienie:
Edytuj 58-> 80: Ok, byłem daleko. Zapomniałem posortować słowa według zdarzeń. Ponadto
Array#uniq
nie jest urządzeniem wyliczającym, ale używa danego bloku do porównywania elementów, więc przekazanieputs
go nie odfiltrowało duplikatów (nie oznacza to, że powinniśmy).źródło
split(/\W+/)
zamiastscan
(niesprawdzony)?\W
wyklucza,_
więc trzeba było to naprawić, ale nadal zapisywało 2 znaki (potem dodałem 20, aby naprawić sortowanie, które zaniedbałem).reverse
(a=gets.split(/[_\W]+/)).uniq.map{|w|[w,a.count(w)]}.sort_by(&:last).reverse.map{|x|p x}
reverse
jest zbyt gadatliwy;) Przy okazji, zmiana pytania jest niesprawiedliwa.F # - 169
Degolfed:
Dane wyjściowe po wywołaniu z fsi:
Aktualizacja: Niektóre wyjaśnienia zgodnie z żądaniem w komentarzach.
Używa funkcji set do generowania tablicy znaków niealfanumerycznych na wejściu w celu przekazania do String.Split, a następnie używa funkcji sekwencji do odfiltrowywania pustych ciągów, generowania liczby słów i drukowania wyniku.
Kilka sztuczek golfowych: Dodaje pusty ciąg do argumentu funkcji s, aby wymusić wnioskowanie o typie argumentu jako ciąg zamiast jawnego deklarowania typu. Używa Seq.where zamiast Seq.filter do zapisania kilku znaków (są to synonimy). Miksuje potok przedni i zwykłą aplikację funkcji w celu zminimalizowania znaków. Używa curry i (op) składni do leczenia <> ~ - i <|| operatory jako zwykłe funkcje, aby uniknąć deklarowania lambda do filtrowania pustych ciągów, sortowania według malejącej liczby i drukowania krotek.
źródło
Python - 95 (teraz 87 dzięki @primo)
Przykładowe dane wejściowe:
Przykładowe dane wyjściowe:
Wszelkie sugestie dotyczące poprawy będą mile widziane
źródło
\w
mecze[a-zA-Z0-9_]
. Cały regex może zostać zastąpiony przezr'\w+'
. Ponadtox
zmienna nie jest potrzebna, wystarczy użyć jejraw_input()
jako drugiego parametru dofindall
.print
instrukcję (tj.print map(...
), W przeciwnym razie nie będzie to kompletny program.JavaScript
160144 (edytowany: w celu spełnienia wymagań)Unminified:
Rejestruje kolejno każde słowo w konsoli, przekazując następujący ciąg:
s="This is sam}}ple text 31to test the effectiveness of this code, you can clearly see that this is working-as-intended, but you didn't doubt it did you?.";
Wyjścia:
Nie mam serca do użycia
alert()
.źródło
you
powinno być pierwsze._
nie powinno być zawarte w słowie.++o[a]||1
=>-~o[a]
k [71 znaków]
Każdy inny znak oprócz znaków alfanumerycznych będzie traktowany jako separator.
przykład
przykład
źródło
JavaScript (135)
Unminified:
Zapętla każdą możliwą liczbę dopasowań w kolejności malejącej i wyprowadza słowa z taką liczbą wystąpień. Żeby być okropnym.
Uwagi: Alert skróciłby niektóre długości. Ściśle mówiąc alfanumeryczny powinien być
[^\W_]
źródło
Haskell (153 = kod 104 + import 49)
Całkiem prosta, całkowicie skomponowana funkcja ... nawet argument nie jest konieczny! To jest mój pierwszy golf, więc może spokojnie? :)
Wydajność:
źródło
q (50)
edycja: naprawiono przypadkowo pasujące ascii 58-64 i 91-96
źródło
q
ale czy jest[0-z]
oparty na wyrażeniach regularnych ASCII? Jeśli tak, to czy nie zawiera również znaków ASCII 58–64? Ponieważ one są: ; < = > ? @
.[A-z]
, które pasuje do ASCII 91-96, które są `[\] ^[^_\W]+
dla mojego, który powinien być „wyklucz znaki niebędące wyrazami i podkreślenie” , jeśli twoja składnia obsługuje\W
klasę ...Pure Bash (bez programów zewnętrznych), 164
Jest to dłuższe niż się spodziewałem, ale chciałem sprawdzić, czy konieczne liczenie i sortowanie (we właściwym kierunku) można wykonać wyłącznie za pomocą
bash
tablic (asocjacyjnych i niesocjacyjnych):Zapisz jako plik skryptu
chmod +x
i uruchom:źródło
AWK
Wykonuje pracę bez gawkish rozszerzenia:
Jeśli zamiast tego wypiszesz „count: word”, byłoby to nieco krótsze, ale chciałem naśladować dane wyjściowe z podanego przykładu ...
źródło
Tcl , 99 bajtów
Wypróbuj online!
źródło
Python 2.X (108 - Znaki)
Python 3.X (106 - Znaki)
źródło
Separators will be anything that is not alpha-numeric
- Dzielisz się tylko na białych znakach.Haskell - 137
źródło
Python 3 - 76
Wymóg podziału na znaki niealfanumeryczne niestety rozszerza kod o 19 znaków. Dane wyjściowe następujących elementów są wyświetlane poprawnie. Jeśli nie jesteś pewien, dodaj
.most_common()
po.Counter(...)
.Wejście / Wyjście
Biorąc pod uwagę wkład
This is a text and a number: 31.
otrzymujesz następujące dane wyjściowe:Próbowałem z innymi wartościami, takimi jak
w celu zapewnienia, kolejność wyjściowa nie zależy od wartości / wartości skrótu klucza. Ten przykład daje:
Ale jak powiedziałem,
print(i('collections').Counter(i('re').findall('\w+',input())).most_common())
wróci wyniki jako zdecydowanie uporządkowanej listy krotek.Python 3 - 57 (jeśli wystarczy miejsce do podziału: P)
źródło
_
nie powinno być zawarte w słowie.