Jakie jest najczęstsze słowo?

26

Jakie jest najczęstsze słowo?

Biorąc pod uwagę zdanie, twój program musi przejść przez to, licząc częstotliwości każdego słowa, a następnie wypisać najczęściej używane słowo. Ponieważ zdanie nie ma stałej długości, a zatem może być bardzo długie, kod musi być możliwie jak najkrótszy.

Zasady / wymagania

  • Każde zgłoszenie powinno być pełnym programem lub funkcją. Jeśli jest to funkcja, musi być uruchomiona, wystarczy dodać wywołanie funkcji na dole programu. Wszystko inne (np. Nagłówki w C) musi zostać uwzględnione.
  • Musi być dostępny bezpłatny tłumacz / kompilator dla twojego języka.
  • Jeśli to możliwe, podaj link do strony, na której można przetestować Twój program.
  • Twój program nie może nic pisać STDERR.
  • Twój program powinien pobierać dane wejściowe z STDIN(lub najbliższej alternatywy w twoim języku).
  • Standardowe luki są zabronione.
  • Twój program musi być wielkości liter ( tHe, Thei theprzyczyniają się do zliczania the).
  • Jeśli nie ma najczęstszego słowa (patrz przypadek testowy nr 3), twój program nie powinien nic wypisywać.

Definicja „słowa”:

Otrzymujesz listę słów, dzieląc tekst wejściowy na spacje. Dane wejściowe nigdy nie będą zawierać innego rodzaju białych znaków niż zwykłe spacje (w szczególności żadnych znaków nowej linii). Jednak ostatnie słowa powinny zawierać tylko znaki alfanumeryczne (az, AZ, 0-9), łączniki (-) i apostrofy ('). Możesz to zrobić, usuwając wszystkie inne znaki lub zastępując je spacją przed wykonaniem podziału słowa. Aby zachować zgodność z poprzednimi wersjami reguł, nie trzeba dołączać apostrofów.

Przypadki testowe

The man walked down the road.
==> the

-----

Slowly, he ate the pie, savoring each delicious bite. He felt like he was truly happy.
==> he

-----

This sentence has no most frequent word.
==> 

-----

"That's... that's... that is just terrible!" he said.
==> that's / thats

-----

The old-fashioned man ate an old-fashioned cake.
==> old-fashioned

-----

IPv6 looks great, much better than IPv4, except for the fact that IPv6 has longer addresses.
==> IPv6

-----

This sentence with words has at most two equal most frequent words.
==>

Uwaga: Trzecie i siódme przypadki testowe nie mają danych wyjściowych, możesz wybrać jeden z czwartych.

Punktacja

Programy są oceniane według bajtów. Typowy zestaw znaków to UTF-8, jeśli używasz innego, podaj.

Po zakończeniu wyzwania wygrywa program z najmniejszą liczbą bajtów (nazywa się to ).

Zgłoszenia

Aby upewnić się, że Twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

# Perl, 43 + 2 (-p flag) = 45 bytes

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

Tabela liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

George Gibson
źródło
2
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Klamka
1
Więc biorąc pod uwagę twoją nową definicję słowa, jakie jest tutaj najczęstsze słowo don't d'ont dont a a? Czy by to dontbylo
DJMcMayhem
@DrGreenEggsandHamDJ Jeśli masz złożenia, który nie apostrof usunąć dont. Jeśli nie, a. ale większość zgłoszeń tak, i tak dontjest poprawna odpowiedź.
George Gibson,
1
Czy w danych wyjściowych rozróżniana jest wielkość liter? Czy ipv6prawidłowe dane wyjściowe dotyczą ostatniego przypadku testowego?
kirbyfan64sos
1
Przydałby się dodatkowy przypadek testowy: „To zdanie ze słowami ma co najwyżej dwa równe słowa najczęściej”. -> <nic>
philcolbourn

Odpowiedzi:

6

Pyke, 26 25 bajtów

l1dcD}jm/D3Sei/1qIi@j@
(;

Wypróbuj tutaj!

Lub 23 22 bajty (niekonkurencyjne, dodaj węzeł, w którym zabija stos, jeśli ma wartość false)

l1cD}jm/D3Sei/1q.Ii@j@

Wypróbuj tutaj!

Lub z interpunkcją, 23 bajty (myślę, że to konkuruje? Zatwierdzenie było przed edycją)

l1.cD}jm/D3Sei/1q.Ii@j@

Wypróbuj tutaj!

Lub 12 bajtów (zdecydowanie niekonkurujących)

l1.cj.#jR/)e

Wypróbuj tutaj!

l1           -     input.lower()
  .c         -    punc_split(^)
    j        -   j = ^
     .#   )  -  sort(V(i) for i in ^)
       jR/   -   j.count(i)
           e - ^[-1]
niebieski
źródło
Twoja 23 bajtowa odpowiedź byłaby konkurencyjna, gdyby jedyną zachowaną interpunkcją było -i '(łącznik i apostrof).
George Gibson,
Zachowuje tylko interpunkcję, która nie jest na końcu słowa
Blue
Och, OK (nie rozumiem Pyke). Myślę, że wtedy konkuruje ...
George Gibson
1
@GeorgeGibson Jestem pewien, że 23-bajtowa wersja nie konkuruje - może zawierać standardowe luki. Poza tym nie spodziewam się, że ktokolwiek zrozumie Pyke, robię to jako swój własny język
Blue
W porządku. Myślę, że i tak wygrywasz, więc to naprawdę nie ma znaczenia.
George Gibson,
11

Pyth - 23 30 bajtów

Musi istnieć lepszy sposób na dołączanie cyfr i łączników, ale chcę to teraz naprawić.

Kc@s+++GUTd\-rzZ)I!tJ.M/KZ{KhJ

Pakiet testowy .

Maltysen
źródło
1
Zmienione zasady wymagają zachowania cyfr i łączników.
Dennis,
@GeorgeGibson naprawiony.
Maltysen
6

Oktawa, 115 94 bajtów

[a,b,c]=unique(regexp(lower(input('')),'[A-z]*','match'));[~,~,d]=mode(c); try disp(a{d{:}})

Rozliczenie sprawy bez najczęstszych słów za pomocą try. W tym przypadku nic nie wyprowadza i „robi przerwę”, aż złapiesz wyjątek.

Zaoszczędzono 21 (!) Bajtów dzięki sugestii Luisa Mendo (użycie trzeciego wyjścia z, modeaby uzyskać najczęstsze słowo).


Zasady zmieniły się nieco od czasu opublikowania mojej oryginalnej odpowiedzi. Zajmę się regexem później.

Stewie Griffin
źródło
1
pobiłeś mnie do tego, pomyślę teraz o czymś innym.
Abr001am,
Nałożyć modena cmoże? Trzecie wyjście daje wszystkie powiązane wartości, jeśli dobrze pamiętam
Luis Mendo
Liczę 115 bajtów.
Conor O'Brien
Uważam, że waszym wyrażeniem regularnym powinno być ['\w\d]to, że musicie zachować apostrofy i cyfry. Chyba że w ASCII występują między wielkimi i małymi literami, w takim przypadku zignoruj ​​mnie, ponieważ nie mam pod ręką tabeli.
Pozew Fund Moniki w
1
@StewieGriffin [~, ~, out] = mode([1 1 2 2 1 2 3 4 5 5])dajeout = {1 2}
Luis Mendo
5

Perl 6, 80 bajtów

{$_>1&&.[0].value==.[1].value??""!!.[0].key given .lc.words.Bag.sort:{-.value}}

Podzielmy odpowiedź na dwie części ...

given .lc.words.Bag.sort:{-.value}

givenjest instrukcją sterującą (jak iflub for). W Perlu 6 są dozwolone jako postfiksy. ( a if 1lub jak tutaj foo given 3). givenumieszcza swój temat (prawa strona) w specjalnej zmiennej $_dla swojej lewej strony.

Sam „temat” smallcases ( lc), dzieli się według word ( words), umieszcza wartości w torbie (ustawionej z liczbą wystąpień), a następnie sortuje według wartości (DESC). Ponieważ sorttylko wie, jak działać na listach The Bagprzekształca się Listz Pairs tutaj.

$_>1&&.[0].value==.[1].value??""!!.[0].key

prosty warunkowy ( ?? !!są używane w Perlu 6 zamiast ? :).

$_ > 1

Sprawdza tylko, czy lista zawiera więcej niż jeden element.

.[0].value==.[1].value

Dostęp do $_można skrócić ... Nie podając zmiennej. .ajest dokładnie jak $_.a. Jest to zatem skuteczne „czy oba górne elementy mają taką samą liczbę wystąpień” - Jeśli tak, to wypisujemy „” (pusty ciąg znaków).

W przeciwnym razie możemy wydrukować klucz górny element'S (Hrabia) .[0].key.

Ven
źródło
7
To jest jak połowa angielskiego, połowa szumu linii. Niesamowity.
kot
1
to zabawne, jak wyglądają funkcje w stylu OO, które wyglądają jak po angielsku: P
Ven
2
Również okazuje się być mniej czytelny niż Perl 5, a jednocześnie zawiera więcej języka angielskiego niż Perl 5. D:
cat
1
@cat naprawił to - powinno być teraz całkowicie nieczytelne
Ven
5
value??!!(Wiem, że to potrójny operator, to po prostu zabawne)
kot
4

05AB1E , 30 bajtów

Kod:

lžj¨„ -«Ãð¡©Ùv®yQOˆ}®¯MQÏDg1Q×

Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .

Adnan
źródło
hmmm
TessellatingHeckler
3
@TessellatingHeckler To zajmuje tylko jeden wiersz danych wejściowych. O ile nie użyjesz tego Ipolecenia wielokrotnie , 05AB1E zajmie tylko tyle, ile będzie potrzebne.
George Gibson,
4

JavaScript (ES6), 155 bajtów

s=>(m=new Map,s.toLowerCase().replace(/[^- 0-9A-Z]/gi,'').split(/\ +/).map(w=>m.set(w,-~m.get(w))),[[a,b],[c,d]]=[...m].sort(([a,b],[c,d])=>d-b),b==d?'':a)

Na podstawie odpowiedzi Python na @ Blue.

Neil
źródło
Twoje wyrażenie regularne wygląda na to, że spada liczby i zepsuje przypadek testowy IPv6, prawda?
TessellatingHeckler
@TessellatingHeckler Definicja słowa zmieniła się, odkąd pierwotnie przeczytałem pytanie, ale zaktualizowałem teraz swoją odpowiedź.
Neil
4

Python 3.5, 142 137 134 112 117 110 127 bajtów:

( +17 bajtów, ponieważ najwyraźniej nawet jeśli słowa są częstsze niż reszta, ale mają tę samą częstotliwość, nic nie powinno być zwracane ).

def g(u):import re;q=re.findall(r"\b['\-\w]+\b",u.lower());Q=q.count;D=[*map(Q,{*q})];return['',max(q,key=Q)][1in map(D.count,D)]

Powinien teraz spełniać wszystkie warunki. To założenie zakłada, że ​​wprowadzono co najmniej 1 słowo.

Wypróbuj online! (Ideone)

Ponadto, jeśli chcesz, oto inna wersja mojej funkcji pozbawiona jakichkolwiek wyrażeń regularnych kosztem około 43 bajtów, choć ta i tak nie jest konkurencyjna, więc nie ma to tak naprawdę znaczenia. Po prostu dodam to tutaj, do cholery:

def g(u):import re;q=''.join([i for i in u.lower()if i in[*map(chr,range(97,123)),*"'- "]]).split();Q=q.count;D=[*map(Q,{*q})];return['',max(q,key=Q)][1in map(D.count,D)]

Wypróbuj nową wersję online! (Ideone)

R. Kap
źródło
Z komentarza dotyczącego wyzwania „jeśli są dwa słowa, które są częstsze niż reszta, ale z tą samą częstotliwością”, wynikiem jest „nic”.
RootTwo
@RootTwo Naprawiono! :)
R. Kap
@TessellatingHeckler Są to jednak inne słowa. That'sjest skurczem, podczas that isgdy thatstak naprawdę nie jest słowem.
R. Kap
@TessellatingHeckler Czy możesz dać mi dowód tego komentarza? Ponieważ przeglądam wszystkie komentarze do wpisu i nie widzę takiego komentarza.
R. Kap
4

Ruby, 94 92 102 bajtów

Muszę iść szybko (odpowiedź FGITW). Zwraca słowo wielkimi literami lub niljeśli nie ma najczęstszego słowa.

Teraz zaktualizowane do nowych specyfikacji, tak myślę. Jednak udało mi się trochę pograć w golfa, więc liczba bajtów jest taka sama!

->s{w=s.upcase.tr("_'",'').scan /[-\w]+/;q=->x{w.count x};(w-[d=w.max_by(&q)]).all?{|e|q[e]<q[d]}?d:p}
Wartość tuszu
źródło
5
Gotta go fast?
kot
@cat tak, bo tym razem byłem FGITW
Value Ink
3

Pyth, 32 bajty

p?tlJeM.MhZrS@Ls++\-GUTcrz0d8ksJ

Zestaw testowy.

Leaky Nun
źródło
3

JavaScript (ES6), 99 bajtów

F=s=>(f={},w=c='',s.toLowerCase().replace(/[\w-']+/g,m=>(f[m]=o=++f[m]||1)-c?o>c?(w=m,c=o):0:w=''),w)
#input { width: 100%; }
<textarea id="input" oninput="output.innerHTML=F(this.value)"></textarea>
<div id="output"></div>

George Reith
źródło
3

Sqlserver 2008, 250 bajtów

DECLARE @ varchar(max) = 'That''s... that''s... that is just terrible!" he said.';

WITH c as(SELECT
@ p,@ x
UNION ALL
SELECT LEFT(x,k-1),STUFF(x,1,k,'')FROM
c CROSS APPLY(SELECT patindex('%[^a-z''-]%',x+'!')k)k
WHERE''<x)SELECT max(p)FROM(SELECT top 1with ties p
FROM c WHERE p>''GROUP BY p
ORDER BY count(*)DESC
)j HAVING count(*)=1

Wypróbuj online!

Sqlserver 2016, 174 bajty

Nie można obsłużyć danych takich jak ten przykład (liczenie równa się 3 słowom):

DECLARE @ varchar(max) = 'That''s... that''s... that is just terrible!" he said. = = ='

SELECT max(v)FROM(SELECT TOP 1WITH TIES value v
FROM STRING_SPLIT(REPLACE(REPLACE(REPLACE(@,'"',''),',',''),'.',''),' ')GROUP
BY value ORDER BY count(*)DESC)x HAVING count(*)=1
t-clausen.dk
źródło
Nie podoba mi się podejście zmienne, ponieważ jest to rodzaj oszustwa :) Jedno wejście -> nic lub coś, przy podejściu opartym na zestawie musi ono być dłuższe, ponieważ musisz dodać dodatkowe W GROUP BY, LEFT JOIN, or PARTITION BYkażdym razie SQL Server ma wbudowaną funkcję SPLIT. Niegolfowane demo może być tak krótkie, jak to możliwe.
lad2025
@ lad2025 dziękuję bardzo, nie znałem żadnych funkcji z 2016 roku. SPLIT_STRING z pewnością jest już dawno spóźniona. Próbowałem golfa skryptu przy użyciu split, zmniejszyłem go do 174, jednak nie będzie w stanie odfiltrować tekstu typu „= = =”
t-clausen.dk
3

PostgreSQL, 246 , 245 bajtów

WITH z AS(SELECT DISTINCT*,COUNT(*)OVER(PARTITION BY t,m)c FROM i,regexp_split_to_table(translate(lower(t),'.,"''',''),E'\\s+')m)
SELECT t,CASE WHEN COUNT(*)>1 THEN '' ELSE MAX(m)END
FROM z WHERE(t,c)IN(SELECT t,MAX(c)FROM z GROUP BY t)
GROUP BY t  

Wydajność:

wprowadź opis zdjęcia tutaj

Wprowadź, jeśli ktoś jest zainteresowany:

CREATE TABLE i(t TEXT);

INSERT INTO i(t)
VALUES ('The man walked down the road.'), ('Slowly, he ate the pie, savoring each delicious bite. He felt like he was truly happy.'),
       ('This sentence has no most frequent word.'), ('"That''s... that''s... that is just terrible!" he said. '), ('The old-fashioned man ate an old-fashioned cake.'), 
       ('IPv6 looks great, much better than IPv4, except for the fact that IPv6 has longer addresses.'), ('a   a            a b b b c');


Normalnie skorzystałbym MODE() WITHIN GROUP(...)i będzie znacznie krótszy, ale będzie to naruszać:

Jeśli nie ma najczęstszego słowa (patrz przypadek testowy nr 3), twój program nie powinien nic wypisywać.


EDYTOWAĆ:

Obsługa ':

WITH z AS(SELECT DISTINCT*,COUNT(*)OVER(PARTITION BY t,m)c FROM i,regexp_split_to_table(translate(lower(t),'.,"!',''),E'\\s+')m)
SELECT t,CASE WHEN COUNT(*)>1 THEN '' ELSE MAX(m)END
FROM z WHERE(t,c)IN(SELECT t,MAX(c)FROM z GROUP BY t)
GROUP BY t  

SqlFiddleDemo

Wydajność:

╔═══════════════════════════════════════════════════════════════════════════════════════════════╦═══════════════╗
║                                              t                                                ║      max      ║
╠═══════════════════════════════════════════════════════════════════════════════════════════════╬═══════════════╣
║ a a a b b b c                                                                                 ║               ║
║ The old-fashioned man ate an old-fashioned cake.                                              ║ old-fashioned ║
║ IPv6 looks great, much better than IPv4, except for the fact that IPv6 has longer addresses.  ║ ipv6          ║
║ This sentence has no most frequent word.                                                      ║               ║
║ "That's... that's... that is just terrible!" he said.                                         ║ that's        ║
║ The man walked down the road.                                                                 ║ the           ║
║ Slowly, he ate the pie, savoring each delicious bite. He felt like he was truly happy.        ║ he            ║
╚═══════════════════════════════════════════════════════════════════════════════════════════════╩═══════════════╝
lad2025
źródło
nie mógł być tak niski jak ty, sqlserver nie ma jeszcze wbudowanego podziału. Jednak wybrana część jest krótsza.
t-clausen.dk
@GeorgeGibson Pewnie, naprawiono + dodano demo na żywo.
lad2025
@ lad2025 Za wspólnym porozumieniem na czacie to, co zrobiłeś, nie jest już konieczne, możesz wrócić.
George Gibson,
@GeorgeGibson Tak, edycja będzie znacznie bardziej przejrzysta. Demo na żywo działa teraz, kiedy napisałem odpowiedź sqlfiddle nie odpowiadał.
lad2025
2

R, 115 bajtów

function(s)if(sum(z<-(y=table(tolower((x=strsplit(s,"[^\\w']",,T)[[1]])[x>""])))==max(y))<2)names(which(z))else NULL

Jest to funkcja, która akceptuje ciąg znaków i zwraca ciąg znaków, jeśli pojedyncze słowo pojawia się częściej niż inne i NULLinaczej. Aby go wywołać, przypisz go do zmiennej.

Nie golfowany:

f <- function(s) {
    # Create a vector of words by splitting the input on characters other
    # than word characters and apostrophes
    v <- (x <- strsplit(s, "[^\\w']", perl = TRUE))[x > ""]

    # Count the occurrences of each lowercased word
    y <- table(tolower(v))

    # Create a logical vector such that elements of `y` which occur most
    # often are `TRUE` and the rest are fase
    z <- y == max(y)

    # If a single word occurs most often, return it, otherwise `NULL`
    if (sum(z) < 2) {
        names(which(z))
    } else {
        NULL
    }
}
Alex A.
źródło
2

Siatkówka, 97 bajtów

Zasady ciągle się zmieniają ...

T`L`l
[^-\w ]

O`[-\w]+
([-\w]+)( \1\b)*
$#2;$1
O#`[-\w;]+
.*\b(\d+);[-\w]+ \1;[-\w]+$

!`[-\w]+$

Wypróbuj online!

Zestaw testowy.

Leaky Nun
źródło
@ CᴏɴᴏʀO'Bʀɪᴇɴ Dzięki, naprawiono.
Leaky Nun
1
I grałeś w golfa 11 bajtów ._. imponujące
Conor O'Brien
Niepowodzi także w przypadku „Staromodny mężczyzna zjadł staromodne ciasto”.
t-clausen.dk
To też nie wygląda dobrze (spodziewane asię, że będzie to najczęstsze słowo)
TessellatingHeckler
2

Python, 132 bajty

import collections as C,re
def g(s):(a,i),(b,j)=C.Counter(re.sub('[^\w\s-]','',s.lower()).split()).most_common(2);return[a,''][i==j]

Powyższy kod zakłada, że ​​wejście zawiera co najmniej dwa słowa.

RootTwo
źródło
Kocham to wyrażenie regularne, tho.
Niebieski
To jest niepoprawne. Klasa postaci \wzawiera podkreślenia.
mbomb007
1

PHP, 223 bajty

$a=array_count_values(array_map(function($s){return preg_replace('/[^A-Za-z0-9]/','',$s);},explode(' ',strtolower($argv[1]))));arsort($a);$c=count($a);$k=array_keys($a);echo($c>0?($c==1?$k[0]:($a[$k[0]]!=$a[$k[1]]?$k[0]:'')):'');
MonkeyZeus
źródło
1

Python 2, 218 bajtów

Zakłada więcej niż 2 słowa. Pozbycie się interpunkcji zniszczyło mnie ...

import string as z
def m(s):a=[w.lower()for w in s.translate(z.maketrans('',''),z.punctuation).split()];a=sorted({w:a.count(w)for w in set(a)}.items(),key=lambda b:b[1],reverse=1);return a[0][0]if a[0][1]>a[1][1]else''
niebieski
źródło
Czy ten pasek ',-itp.?
Tim
@Tim Nie, podjąłem to wyzwanie, zanim reguły zostały w pełni rozwinięte. Ulegnie zmianie.
Niebieski
Czy możesz przypisać wynik sorteddo krotki zamiast ręcznie indeksować tablicę?
Neil
@ Czy masz na myśli tylko pierwszy i drugi element do porównania zamiast całej tablicy? Nie wiem, jak to zrobić
Blue
1

Matlab (225)

  • Zmienione zasady: /

.

      function c=f(a),t=@(x)feval(@(y)y(y>32),num2str(lower(x)-0));f=@(x)num2str(nnz(x)+1);e=str2num(regexprep(a,'([\w''-]+)',' ${t($1)} ${f($`)} ${f([$`,$1])}'));[u,r,d]=mode(e);try c=find(e==d{:});c=a((e(c(1)+1)):(e(c(1)+2)));end
  • Do uruchomienia tego niezbędny jest Przybornik.

  • Jak to działa, jeden z najpiękniejszych przywilejów wyrażenia regularnego zastępuje w matlabie, to wykonuje tokeny w terenie, wywołując funkcje środowiska zewnętrznego sparametryzowane przez tokeny wychwycone w środowisku wewnętrznym, więc każda sekwencja "Word_A Word_B .."jest zastępowana liczbami całkowitymi, "A0 A1 A2 B0 B1 B2 ..."gdzie pierwsza liczba całkowita jest sygnatura numerica ascii słowa, druga to indeks początkowy, trzecia to indeks końcowy, te dwie ostatnie liczby całkowite nie powtarzają się w całej sekwencji, więc skorzystałem z tej możliwości, aby przetransponować ją do tablicy, a następnie przełączyć ją na tryb wynik w tej tablicy, więc indeksy początkowe / końcowe będą w konsekwencji następować.

  • Edycja: po zmianie niektórych szczegółów program jest nazywany funkcją przez parametr ciągu.


20 bajtów zaoszczędzonych dzięki @StewieGriffin, 30 bajtów dodało wyrzuty do wspólnie uzgodnionych luk.

Abr001am
źródło
Otrzymasz moje poparcie, gdy ty (lub ktoś inny) pokaże, że to faktycznie działa, zarówno dla danych wejściowych, które mają najczęstsze słowo, jak i dla danych wejściowych, które nie działają. =) (Nie mogę tego niestety przetestować)
Stewie Griffin
@StewieGriffin, myślę, że program źle zachowuje się w zdaniach ze słowami o równej częstotliwości, naprawię to
Abr001am
1

05AB1E , 22 21 20 bajtów

žK„- JÃl#{D.MDgiJëõ?

Wyjaśnienie:

žK                     # Push [a-zA-Z0-9]
  „-                   # Push 2-char string containing a hyphen and a space
     J                 # Join the stack into a single element
      Ã                # Removes all characters from implicit input except those specified above
       l               # Converts to lowercase
        #              # Split string by spaces
         {             # Sorts array
          D            # Duplicates
           .M          # Finds most common element
             Dg        # Gets length of string without popping
                 iJ    # If length == 1, then convert the array to a string (otherwise the output would be ['example'] instead of example
                   ëõ? # Else push an empty string.

Uwaga: Jeśli nie masz nic ?przeciwko kończeniu znaków nowej linii w wyjściu, gdy nie powinieneś nic wypisywać, usuń koniec, aby zapisać bajt.

Uwaga 2: Program nie będzie działał z jednym słowem, ale wątpię, by to był problem. Jeśli chcesz, aby to naprawić, wymienić #się ð¡za dodatkową bajt.

05AB1E używa CP-1252 jako zestawu znaków, a nie UTF-8.

Wypróbuj online!

Okx
źródło
1

Perl, 60 56 55 54 bajtów

Obejmuje +3 za -p

#!/usr/bin/perl -p
s/[\pL\d'-]+/$;[$a{lc$&}++]++or$\=$&/eg}{$\x=2>pop@

Jeśli słowo nie może być tylko cyfrą, możesz także upuścić wartość a53.

Ton Hospel
źródło
Czy łącznik w -anEnie jest liczony? Robi to z drugą odpowiedzią (+2 bajty na -pflagę) ...
George Gibson
@GeorgeGibson Nie patrz meta.codegolf.stackexchange.com/questions/273/... . Łącznik, przestrzeń i Enie liczą się. Druga odpowiedź zwykle wymaga tylko +1 bajtów -p, ale jego rozwiązanie ma, 'więc nie można jej traktować jako rozszerzenia -elub -E. Powinien więc liczyć +3 (nie +2), ponieważ powinien liczyć spację i łącznik (ale każda dodatkowa opcja to tylko +1).
Ton Hospel,
@TomHospel Och, racja.
George Gibson,
Czy jest to uważane za ważne, biorąc pod uwagę zasadę apostrofu? [\pL\d-]wygląda na to, że można go zmniejszyć [\w-](chyba, że ​​zależy nam na podkreśleniach), ale każda wersja zgłosi się thatzamiast that'slub thatsdo testu 4. W przeciwnym razie musisz dodać 4 bajty, aby wstawić \x27do tej klasy znaków (chyba że masz lepszy sposób dodawania apostrof).
Adam Katz
@AdamKatz Definicja „słowa” zmieniła się dość mocno, gdy była uruchomiona i nigdy w pełni nie przyjęłam ostatniej wersji. Ale aby cię uszczęśliwić, stworzyłem stałą (i krótszą) wersję :-). I tak, zależy mi na podkreśleniach
Ton Hospel
0

PowerShell (v4), 117 bajtów

$y,$z=@($input-replace'[^a-z0-9 \n-]'-split'\s'|group|sort Count)[-2,-1]
($y,($z,'')[$y.Count-eq$z.Count])[!!$z].Name

Pierwsza część jest dość łatwa:

  • $input to ~ = standardowe
  • Regex zamienia niepotrzebne znaki na nic, zachowaj nowe wiersze, aby nie pomyłkowo pomieszać dwóch słów z końca linii i początku następnej linii. (Nikt inny nie omawiał wielu linii, mógłby grać w golfa -2, jeśli dane wejściowe są zawsze pojedynczymi liniami).
  • Podział wyrażeń regularnych Groupwedług częstotliwości (~ = kolekcja Pythona. Licznik), Sortaby umieścić najczęstsze słowa na końcu.
  • Program PowerShell domyślnie nie rozróżnia wielkości liter we wszystkim.

Obsługa, jeśli nie ma najczęstszego słowa:

  • Weź dwa ostatnie elementy [-2, -1] na $ y i $ z;
  • lista elementów N, gdzie N> = 2, czyni $ y i $ z dwoma ostatnimi elementami
  • lista 1 elementów powoduje, że $ y jest ostatnim elementem, a $ z jest zerowy
  • Pusta lista powoduje, że oba są puste

Użyj golfa bool-as-array-index fake-ternary-operator golf (0,1)[truthyvalue], zagnieżdżony, aby wybrać „”, $ z lub $ y jako wynik, a następnie weź nazwę .Name.

PS D:\> "The man walked down the road."|.\test.ps1
The

PS D:\> "Slowly, he ate the pie, savoring each delicious bite. He felt like he was truly happy."|.\test.ps1
he

PS D:\> "`"That's... that's... that is just terrible!`" he said."|.\test.ps1
Thats

PS D:\> "The old-fashioned man ate an old-fashioned cake."|.\test.ps1
old-fashioned

PS D:\> "IPv6 looks great, much better than IPv4, except for the fact that IPv6 has longer addresses."|.\test.ps1
IPv6
TessellatingHeckler
źródło
0

Lua, 232 199 175 bajtów

w,m,o={},0;io.read():lower():gsub("[^-%w%s]",""):gsub("[%w-]+",function(x)w[x]=(w[x]or 0)+1 end)for k,v in pairs(w)do if m==v then o=''end if(v>m)then m,o=v,k end end print(o)
Paplać
źródło
1
if not w[x]then w[x]=0 end w[x]=w[x]+1 end->w[x]=(w[x]or0)+1
Leaky Nun
if m==v then o=''end->o=m==v and '' or o
Leaky Nun
0

Perl 5, 96 92 84 + 2 ( -pflaga) = 86 bajtów

++$h{+lc}for/\w(?:\S*\w)?/g}{$m>$e[1]||$e[1]>$m&&(($_,$m)=@e)||($_="")while@e=each%h

Za pomocą:

> echo "The man walked down the road." | perl -p script.pl
Denis Ibaev
źródło
Twoja -pflaga powinna powołać się na karę 3 bajtów. Reguły są z grubsza: każda flaga wiersza polecenia ma +1 bajt, ponieważ tyle dodatkowych bajtów potrzebujesz, aby rozszerzyć -e'code'linię poleceń w wolnym stylu. Zwykle -pjest to tylko +1 bajt. Ale tutaj masz kod, 'więc nie można go uruchomić po prostu z wiersza poleceń bez ucieczki. Więc nie łącząc z -ea -a przestrzeń przed psą ekstra i musi być liczony zbyt
Ton Hospel
@TonHospel Naprawiono.
Denis Ibaev,
W rzeczywistości jest to 84 + 1 ( -pflaga), jeśli wywołujesz go w wierszu poleceń jako perl -pe'…'(udostępnionym przez usunięcie tego, 'co zaznaczono w pierwszych komentarzach)
Adam Katz
0

Python, 158 bajtów

def g(s):import collections as c,re;l=c.Counter(re.sub('[^\w\s-]',"",s.lower()).split());w,f=l.most_common(1)[0];return[w,""][all(f==i[1]for i in l.items())]

Pobiera swój wkład w następujący sposób:

g("Bird is the word")

Czy należy spełnić wszystkie wymagania, chociaż nie powiedzie się to przy pustych ciągach, czy należy je sprawdzić? Przepraszam za opóźnienie.

Porady / opinie / porady czarnej magii dotyczące oszczędzania bajtów są zawsze mile widziane

Nie chciałbyś wiedzieć
źródło
Cześć, witamy w PPCG! Mamy zdobyć kod golf wyzwania przez liczbę bajtów w odpowiedzi. Poszedłem do przodu i zredagowałem to dla ciebie z poprawnymi informacjami.
Rɪᴋᴇʀ
2
Witamy w PPCG! Niestety Twoje zgłoszenie nie spełnia wszystkich wymagań tego wyzwania, ponieważ po pierwsze NIE jest w nim rozróżniana wielkość liter. Na przykład NIE będzie liczyć wystąpień tego słowa Thatjako wystąpień tego słowa, thatponieważ pierwsze zaczyna się Tod dużej litery, a drugie zaczyna się od małej t. Ponadto NIE usuwa to wszystkich innych znaków interpunkcyjnych oprócz łączników ( -) i, opcjonalnie, apostrofów ( '), w wyniku czego NIE zadziałałoby to w przypadku czwartego przypadku testowego podanego w pytaniu.
R. Kap
1
Ponadto, to NIE wyprowadza niczego, jeśli nie ma najczęstszego słowa. Na przykład, używając trzeciego przypadku testowego ( This sentence has no most frequent word.) jako przykładu, twoja funkcja generuje wynik [('This', 1)], kiedy zamiast tego nie wypisuje nic. Mógłbym mówić o kolejnych problemach, więc polecam naprawienie ich jak najszybciej.
R. Kap
Zrobię to wkrótce, gdy będę miał czas
nie chciałbyś wiedzieć
To jest niepoprawne. Klasa postaci \wzawiera podkreślenia.
mbomb007
0

Tcl 8.6, 196 bajtów

lmap s [join [read stdin] \ ] {dict incr d [regsub -all {[^\w-]} [string tol $s] {}]}
set y [dict fi $d v [lindex [lsort [dict v $d]] end]]
if {[llength $y]!=2} {set y {}}
puts "==> [lindex $y 0]"

(Niestety, nie mogę wymyślić, jak to zrobić, aby był mniejszy niż to ...)

Wyjaśnienie

Używa kilku niejasnych idiomów Tcl do robienia rzeczy.

  • [join [read stdin] " "] - łańcuch wejściowy → lista słów oddzielonych spacjami
  • lmap ... - iterować po każdym elemencie tej listy. (Krótszy niż foreachi faktycznie identyczny, ponieważ wynik jest odrzucany).
  • [regsub ... [string tolower ...]] - Przekształć ciąg na małe litery i usuń wszystkie znaki oprócz znaków słów i łącznika.
  • [dict incr d ...] - Utwórz / zmodyfikuj słownik / słowo → licznik histogramu.
  • set y ... - Posortuj wartości słownika, wybierz największą i zwróć wszystkie odpowiadające jej pary (klucz, wartość).
  • if... - Muszą być dokładnie dwa elementy: jedna para (klucz, wartość), w przeciwnym razie nie ma nic do wydrukowania.
  • puts... - Wydrukuj klucz z pary klucz-wartość, jeśli istnieje. (Żadne słowo nie ma spacji.)

Możesz grać z nim za pomocą CodeChef .

Dúthomhas
źródło
182
sergiol
0

Rexx, 109 128 122 bajtów

pull s;g.=0;m=0;do i=1 to words(s);w=word(s,i);g.w=g.w+1;if g.w>=m then do;m=g.w;g.m=g.m+1;r=w;end;end;if g.m=1 then say r

Dość drukowane ...

pull s
g.=0
m=0
do i=1 to words(s)
  w=word(s,i)
  g.w=g.w+1
  if g.w>=m
  then do
    m=g.w
    g.m=g.m+1
    r=w
  end
end
if g.m=1 then say r
aja
źródło
Nie sądzę, że to obsługuje wszystkie przypadki najczęściej występujących słów - patrz (nowy) ostatni przypadek testowy - popełniłem podobny błąd.
philcolbourn
Mamy nadzieję, że to naprawić go teraz
AJA
0

bash, 153 146 131 154 149 137 bajtów

declare -iA F
f(){ (((T=++F[$1])==M))&&I=;((T>M))&&M=$T&&I=$1;}
read L
L=${L,,}
L=${L//[^- a-z0-9]}
printf -vA "f %s;" $L
eval $A;echo $I

Operacja:

deklaruj tablicę asocjacyjną F liczb całkowitych (deklaruj -iA F)

f jest funkcją, która przy danym parametrze słownym $ 1 zwiększa liczbę częstotliwości dla tego słowa (T = ++ F [$ 1]) i porównuje do maksymalnej liczby dotychczas (M).

Jeśli jest równy, mamy remis, więc nie będziemy uważać tego słowa za najczęściej (I =)

Jeśli do tej pory było więcej niż maksymalna liczba (M), ustaw jak dotąd maksymalną liczbę na liczbę tego słowa (M = $ T) i zapamiętaj to słowo (I = 1 $)

Funkcja zakończenia f

Czytaj wiersz (czytaj L) Twórz małe litery (L = $ {L ,,}) Usuń dowolny znak oprócz az, 0-9, myślnik (-) i spacji (L = $ {L // [^ - a-z0- 9]}) Utwórz sekwencję instrukcji bash, która wywołuje f dla każdego słowa (printf -vA "f% s;" $ L). Jest to zapisywane w zmiennej A. eval A i wydrukuj wynik (eval $ a; echo $ I)

Wydajność:

This quick brown fox jumps over this lazy dog.
-->this
This sentence with the words has at most two equal most frequent the words.
-->
The man walked down the road.
-->the
This sentence has no most frequent word.
-->
Slowly, he ate the pie, savoring each delicious bite. He felt like he was truly happy.
-->he
"That's... that's... that is just terrible!" he said.
-->thats
The old-fashioned man ate an old-fashioned cake.
-->old-fashioned
IPv6 looks great, much better than IPv4, except for the fact that IPv6 has longer addresses.
-->ipv6

Błąd: NAPRAWIONO Mam błąd, który nie jest ujawniany w tych przypadkach testowych. Jeśli wejście jest

This sentence with words has at most two equal most frequent words.

wtedy mój kod nie powinien nic wyświetlać.

Mam poprawkę, ale wydaje mi się, że trafiłem w błąd bash ... Otrzymuję bardzo dziwne zachowanie, jeśli M nie jest deklarowane jako liczba całkowita: ++ F [1 $] == M (po kilku powtórzonych słowach) zwiększa oba F [1 $ ] oraz m!! - mój błąd.

philcolbourn
źródło
0

Python 3, 76 98 100 bajtów

import re,statistics as S
try:print(S.mode(re.split("([a-z0-9-]+)",input().lower())[1::2]))
except:1

Wypróbuj online

Zwraca najczęściej używane słowo jako małe litery. Nie obejmuje apostrofów, ponieważ „apostrofy nie muszą być uwzględnione”.

statistics.mode wymaga Python 3.4

Niestety, żadne wyjście do nie stderrjest dozwolone, bo byłoby znacznie krótsze.

mbomb007
źródło
Nie możesz drukować na STDERR, chyba że ten program nie generuje żadnych błędów?
Okx,
Twój nowy program nie obsługuje łączników! Próbowałem wejściai- test i-
Okx
Naprawiono to wszystko. Wciąż krótki.
mbomb007
0

R, 96 bajtów

19 bajtów krótszych niż istniejąca odpowiedź R , z nieco innym podejściem.

t=table(gsub("[^a-z0-9'-]","",tolower(scan(,''))))
`if`(sum(t==max(t))-1,'',names(which.max(t)))

Odczytuje ze standardowego wejścia, więc dane wejściowe są automatycznie oddzielane spacjami. Konwertujemy na małe litery i używamy gsubdo usunięcia wszystkich znaków nie alfanumerycznych (plus -i '). Liczymy wystąpienia każdego słowa za pomocą tablei zapisujemy wynik w t. Następnie sprawdzamy, czy jest więcej niż 1 maksimum w t(sprawdzając, czy istnieje więcej niż jeden element, który jest równy max(t). Jeśli tak, zwracamy pusty ciąg ''. Jeśli nie, zwracamy słowo odpowiadające maksimum w t.

rturnbull
źródło