Яке найчастіше слово?


26

Яке найчастіше слово?

Давши речення, ваша програма повинна пройти через нього, підраховуючи частоти кожного слова, а потім вивести найбільш вживане слово. Оскільки речення не має фіксованої довжини і може бути дуже довгим, ваш код повинен бути якомога коротшим.

Правила / Вимоги

  • Кожне подання повинно бути або повною програмою, або функцією. Якщо це функція, її потрібно запускати, лише додаючи виклик функції в нижній частині програми. Все інше (наприклад, заголовки в C), має бути включено.
  • Має бути безкоштовний перекладач / укладач для вашої мови.
  • Якщо це можливо, надайте посилання на сайт, де можна перевірити вашу програму.
  • Ваша програма не повинна нічого писати на STDERR.
  • Ваша програма повинна взяти вклад із STDIN(або найближчої альтернативи вашій мові).
  • Стандартні лазівки заборонені.
  • Ваша програма повинна бути нечутливі до регістру ( tHe, Theі theвносять свій внесок в кол - ву the).
  • Якщо немає найчастішого слова (див. Тестовий випадок №3), ваша програма нічого не повинна виводити.

Визначення слова (слово):

Список слів ви отримуєте, розділивши введений текст на пробіли. Вхід ніколи не буде містити іншого типу пробілів, ніж звичайні пробіли (зокрема, немає нових рядків). Однак заключні слова повинні містити лише буквено-цифрові знаки (az, AZ, 0-9), дефіси (-) та апострофи ('). Ви можете зробити це, видаливши всі інші символи або замінивши їх пробілом, перш ніж робити слово розбиття. Щоб залишатися сумісними з попередніми версіями правил, апострофи не потрібно включати.

Випробування

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.
==>

Примітка. Третій та сьомий тестові випадки не мають виходу, ви можете вибрати або четвертий.

Оцінка балів

Програми оцінюються відповідно до байтів. Звичайний набір символів - UTF-8, якщо ви використовуєте інший, будь ласка, вкажіть.

Коли виклик закінчиться, виграє програма з найменшими байтами (це називається ).

Подання

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# Language Name, N bytes

де Nрозмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:

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

Якщо ви хочете включити у свій заголовок декілька чисел (наприклад, тому що ваш результат становить суму двох файлів або ви хочете окремо вказати штрафні санкції для перекладача), переконайтесь, що фактичний результат - це останнє число у заголовку:

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

Ви також можете зробити ім'я мови посиланням, яке потім з’явиться у фрагменті таблиць лідерів:

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

Таблиця лідерів

Ось фрагмент стека для створення як звичайного табло, так і огляду переможців за мовою.


2
Коментарі не для розширеного обговорення; ця розмова переміщена до чату .
Дверна ручка

1
Отже, з огляду на ваше нове визначення слова «, яке найпоширеніше слово тут don't d'ont dont a a? Було б dont?
DJMcMayhem

@DrGreenEggsandHamDJ Якщо у вас є уявлення , що призводить до видалення апострофів dont. Якщо ні, то a. але більшість подань це робить, і dontце правильна відповідь.
Джордж Гібсон

1
Чи відрізняється вихідний регістр? Тож чи ipv6дійсний вихід для останнього тестового випадку?
kirbyfan64sos

1
Додатковий тестовий випадок може бути корисним: "У цьому реченні зі словами є щонайменше два рівних найчастіших слова". -> <нічого>
philcolbourn

Відповіді:


6

Пайк, 26 25 байт

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

Спробуйте тут!

Або 23 22 байти (не конкуруючи, додайте вузол, де вбивається стек, якщо невірно)

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

Спробуйте тут!

Або з пунктуацією, 23 байти (я думаю, що це змагається? Комісія була до редагування)

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

Спробуйте тут!

Або 12 байт (безумовно неконкуренто)

l1.cj.#jR/)e

Спробуйте тут!

l1           -     input.lower()
  .c         -    punc_split(^)
    j        -   j = ^
     .#   )  -  sort(V(i) for i in ^)
       jR/   -   j.count(i)
           e - ^[-1]

Ваша відповідь на 23 байти змагалася б, якби єдиним збереженим розділовим знаком було -і '(дефіс та апостроф).
Джордж Гібсон

Він зберігає лише розділові знаки, яких немає в кінці слова
Синій

О, гаразд (я не розумію Пайку). Я здогадуюсь тоді змагається…
Джордж Гібсон

1
@GeorgeGibson Я майже впевнений, що 23-байтна версія не конкурує - вона може потрапити під стандартні лазівки. Також я не очікую, що (м) хтось зрозуміє Pyke, я роблю це моєю рідною мовою
Blue

Тоді добре. Я думаю, ти все одно виграєш у будь-якому разі, тому це насправді не має значення.
Джордж Гібсон


11

Pyth - 23 30 байт

Має бути кращий спосіб включити цифри та дефіси, але я просто хочу це виправити зараз.

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

Тестовий сюїт .


1
Переглянуті правила вимагають збереження цифр та дефісів.
Денніс

Виправлено @GeorgeGibson
Мальтісен

6

Октава, 115 94 байт

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

Рахунок у справі, що не має найчастішого слова, використовуючи try. У цьому випадку він нічого не дає, і "робить перерву", поки ви не знайдете виняток.

Збережено 21 (!) Байт завдяки пропозиції Луїса Мендо (використовуючи третій результат, modeщоб отримати найпоширеніше слово).


Правила досить сильно змінилися з моменту публікації оригінальної відповіді. Пізніше я загляну в регулярний вираз.


1
ти побив мене до цього, зараз подумаю про щось інше.
Abr001am

Нанести modeна cможливо? Третій результат дає всі зв'язані значення, якщо я пригадую правильно
Луїс Мендо

Я рахую 115 байт.
Conor O'Brien

Я вважаю, що ваше регулярне вираження має бути ['\w\d]тим, що вам потрібно зберегти апострофи та цифри. Якщо це не між великим і нижнім регістром в ASCII, в такому випадку ігноруйте мене, тому що я не маю зручної таблиці.
Фонд позову Моніки

1
@StewieGriffin [~, ~, out] = mode([1 1 2 2 1 2 3 4 5 5])даєout = {1 2}
Луїс Мендо

5

Perl 6, 80 байт

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

Давайте розділимо відповідь на дві частини ...

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

givenє контрольним твердженням (як ifабо for). У Perl 6 вони дозволені як постфікси. ( a if 1, або як тут foo given 3). givenставить свою тему (праворуч) у спеціальну змінну $_для лівої частини.

Самі нижчі регістри " lc)" розбиваються на слово ( words), вводять значення в мішок (встановлюється з кількістю випадків), після чого сортують за значенням (DESC). Так як sortтільки вміє працювати зі списками, то Bagперетворюється в Listпро Pairз тут.

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

простий умовний ( ?? !!використовуються замість Perl 6 замість ? :).

$_ > 1

Просто перевіряє, що в списку є більше одного елемента.

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

Доступ до цього $_можна скоротити ... Не вказуючи змінну. .aточно так само $_.a. Таким чином, це ефективно "чи обидва верхні елементи мають однакову кількість випадків" - Якщо так, тоді ми друкуємо '' (порожня рядок).

В іншому випадку, ми виводимо ключ верхнього елементу (рахунок): .[0].key.


7
Це як половина англійської, половина шумної лінії. Дивовижний.
кіт

1
це смішно, як це функції стилю OO, які виглядають англійською мовою: P
Ven

2
Також вдається бути менш читабельним, ніж Perl 5, але містить більше англійської ніж Perl 5. D:
кіт

1
@cat виправив це - має бути абсолютно нечитабельним зараз
Ven

5
value??!!(я знаю, що це потрійний оператор, це просто цікаво)
кіт

4

05AB1E , 30 байт

Код:

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

Використовує кодування CP-1252 . Спробуйте в Інтернеті! .



3
@TessellatingHeckler Це займає лише один рядок введення. Якщо ви кілька разів не використовуєте Iкоманду, 05AB1E займе лише стільки, скільки потрібно.
Джордж Гібсон

4

JavaScript (ES6), 155 байт

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)

На основі відповіді Python @ Blue.


Ваша заміна regex виглядає так, що вона знижує цифри і порушить тестовий випадок IPv6, чи правильно?
TessellatingHeckler

@TessellatingHeckler Визначення слова змінилося, оскільки я спочатку прочитав питання, але я оновив свою відповідь зараз.
Ніл

4

Python 3.5, 142 137 134 112 117 110 127 bytes:

( +17 байт, тому що, мабуть, навіть якщо слова є частішими за інші, але вони мають однакову частоту, все одно нічого не слід повертати. )

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)]

Тепер має задовольняти всі умови. Це подання передбачає, що вводиться щонайменше 1 слово.

Спробуйте в Інтернеті! (Ідеон)

Крім того, якщо ви хочете його, ось ще одна версія моєї функції, позбавлена ​​будь-яких регулярних виразів за ціною близько 43 байт, хоча ця все одно є неконкурентоспроможною, тому це насправді не має значення. Я просто поклав його сюди на чорт:

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)]

Спробуйте цю нову версію в Інтернеті! (Ідеон)


З коментарів виклику "якщо є два слова, які частіші за інші, але з однаковою частотою", вихід "нічого".
RootTwo

@RootTwo Виправлено! :)
Р. Кап

@TessellatingHeckler Хоча це різні слова. That'sце скорочення, that isтоді thatsяк насправді це не слово.
Р. Кап

@TessellatingHeckler Чи можете ви дати мені підтвердження цього коментаря? Тому що я переглядаю всі коментарі до публікації і не бачу такого коментаря.
Р. Кап

4

Рубі, 94 92 102 байт

Треба швидко йти (відповідь FGITW). Повертає слово в усіх великих літерах, або nilякщо немає найчастішого слова.

Тепер я оновлений до нових специфікацій, я думаю. Однак я встиг трохи покататися на гольфі, щоб кількість байтів була однаковою!

->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}

5
Gotta go fast?
кіт

@cat так, адже я цього разу був FGITW
Value Ink


3

JavaScript (ES6), 99 байт

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>


3

Sqlserver 2008, 250 байт

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

Спробуйте в Інтернеті!

Sqlserver 2016, 174 байти

Неможливо обробити такі дані, як цей приклад (підрахунок дорівнює 3 словам):

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

Мені не подобається змінний підхід, тому що це свого роду обман :) Один вхід -> нічого або щось подібне, при наборі на основі набору це повинно бути довше, тому що вам потрібно додати додаткові додаткові функції GROUP BY, LEFT JOIN, or PARTITION BYSQL Server, вбудовані в функцію SPLIT. Демократичні демонстрації сміливо роблять це якомога коротше.
lad2025

@ lad2025 дякую багато, не знав жодних функцій з 2016 року. SPLIT_STRING, безумовно, давно прострочена функція. Я спробував розіграти сценарій, використовуючи спліт, отримав його до 174, проте він не зможе відфільтрувати текст на зразок "= = ="
t-clausen.dk

3

PostgreSQL, 246 , 245 байт

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  

Вихід:

введіть тут опис зображення

Введіть, якщо когось цікавить:

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');


Зазвичай я б використовував, MODE() WITHIN GROUP(...)і це буде набагато коротше, але це порушить:

Якщо немає найчастішого слова (див. Тестовий випадок №3), ваша програма нічого не повинна виводити.


Редагувати:

Поводження ':

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

Вихід:

╔═══════════════════════════════════════════════════════════════════════════════════════════════╦═══════════════╗
║                                              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            ║
╚═══════════════════════════════════════════════════════════════════════════════════════════════╩═══════════════╝

не вдалося досягти такого низького рівня, як ви, sqlserver ще не має розбитого розбиття. Однак частина вибору коротша.
t-clausen.dk

@GeorgeGibson Звичайно, виправлено + додано демо-версію.
lad2025

@ lad2025 За загальною згодою у чаті, те, що ви робили, більше не потрібно, сміливо повертайтеся назад.
Джордж Гібсон

@GeorgeGibson Так, редагування буде набагато зрозумілішим. Демо-версія працює зараз, коли я писав відповідь, sqlfiddle не відповідала.
lad2025

2

R, 115 байт

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

Це функція, яка приймає рядок і повертає рядок, якщо одне слово з’являється частіше, ніж інші, NULLінакше. Щоб викликати його, призначте його змінній.

Безголівки:

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
    }
}

2

Сітківка, 97 байт

Правила постійно змінюються ...

T`L`l
[^-\w ]

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

!`[-\w]+$

Спробуйте в Інтернеті!

Тестовий набір.



@ CᴏɴᴏʀO'Bʀɪᴇɴ Дякую, виправлено.
Leaky Nun

1
А ви пограли в нього 11 байт ._. вражаючий
Conor O'Brien

Також не вдається для "Старомодний чоловік з'їв старомодний торт".
t-clausen.dk

Це не здається правильним (очікуючи, що aце буде найпоширеніше слово)
TessellingHeckler

2

Пітон, 132 байти

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]

Наведений вище код передбачає, що вхід має щонайменше два слова.


Мені подобається цей регекс, тхо.
Синій

Це неправильно. Клас символів \wвключає підкреслення.
mbomb007

1

PHP, 223 байти

$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]:'')):'');

1

Python 2, 218 байт

Припускає більше 2 слів. Позбавлення від пунктуації знищило мене ...

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''

Ця смужка ',-тощо?
Тім

@Tim Ні, я робив цей виклик ще до того, як правила були повністю розроблені. Зміниться.
Синій

Чи можете ви призначити результат sortedкортежу, а не індексувати в масив вручну?
Ніл

@Neil ви маєте на увазі просто отримати перший та другий елементи для порівняння замість всього масиву? Я не знаю, як це зробити
Блакитний

1

Матлаб (225)

  • Правила, пов'язані з ланцюжком: /

.

      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
  • Панель інструментів необхідна для цього.

  • Як це працює, одна з найприємніших привілеїв регулярного вираження замінює в matlab це поле, яке виконує маркери, викликаючи зовнішньо-екологічні функції, параметризовані лексемами, що потрапляють у внутрішнє середовище, тому будь-яка послідовність "Word_A Word_B .."замінюється цілими числами, "A0 A1 A2 B0 B1 B2 ..."де перше ціле число підпис слова numerica ascii слова, друге - початковий індекс, третє - індекс закінчення, ці два цілі числа не редублюються у всій послідовності, тому я скористався цією перевагою, щоб перенести його до масиву, а потім у режимі пошуку та пошуку приводять до цього масиву, тому початкові / кінцеві індекси будуть, отже, слідувати.

  • Редагувати: після зміни деяких деталей програма називається функцією за допомогою рядкового параметра.


20 байтів збережено завдяки @StewieGriffin, 30 байт додали докори в загальнозмінені лазівки.


Ви отримаєте мою пропозицію, коли ви (чи хтось інший) покажете, що це насправді працює, як для входів, які мають найпоширеніші слова, так і для вхідних даних, які цього не роблять. =) (Я, на жаль, не можу протестувати)
Стюі Гріффін

@StewieGriffin Я думаю, що програма погано поводиться із реченнями з
рівночастотними

1

05AB1E , 22 21 20 байт

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

Пояснення:

ž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.

Примітка. Якщо ви добре вписуєте нові рядки у висновку, коли вам нічого не потрібно виводити, видаліть ? в кінці, щоб зберегти байт.

Примітка №2. Програма не працюватиме одним словом, але я сумніваюся, що це буде проблемою. Якщо ви хочете це виправити, замініть #наð¡ для додаткового байта.

05AB1E використовує CP-1252 в якості шаблону, а не UTF-8.

Спробуйте в Інтернеті!


1

Perl, 60 56 55 54 байт

Включає +3 для -p

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

Якщо слово не може бути лише числом, ви можете також скинути значення aна рахунок 53.


Чи дефіс у -anEне рахується? Це стосується іншої відповіді (+2 байти для -pпрапора) ...
Джордж Гібсон

@GeorgeGibson Ні, см meta.codegolf.stackexchange.com/questions/273 / ... . Дефіс, простір і значення Eне рахуються. Інша відповідь, як правило, повинна робити лише 1 байт для -p, але його рішення 'так, що його не можна розглядати як розширення -eабо -E. Тож він насправді повинен рахувати +3 (не +2), оскільки він повинен рахувати пробіл та дефіс (але кожен додатковий варіант буде лише +1).
Тон Євангелія

@TomHospel О, так.
Джордж Гібсон

Чи вважається це дійсним з огляду на правило апострофа? [\pL\d-]схоже , що це може бути зморщеним вниз [\w-](якщо ми не дбаємо про підкресленні) , але або версія повідомить thatзамість that'sабо thatsдля тесту 4. В іншому випадку, вам потрібно додати 4 байта для вставки \x27в цьому класі символів (якщо у вас є кращий спосіб додавання апостроф).
Адам Кац

@AdamKatz Визначення "слово" досить змінилося під час роботи, і я ніколи не прийняв останню версію. Але для того, щоб бути щасливим, я створив фіксовану (і коротшу) версію :-). І так, мені
цікаво

0

PowerShell (v4), 117 байт

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

Перша частина досить проста:

  • $input є ~ = stdin
  • Regex замінює нерелевантні символи нічим, зберігайте нові рядки, щоб ми не збивали два слова з кінця рядка та початку наступного рядка в одне помилково. (Ніхто інший не обговорював декілька ліній, міг би гольф -2, якщо вхід завжди один рядок).
  • Regex розбивається Groupза частотою (~ = колекції Python.Counter), Sortщоб в кінці поставити найчастіші слова.
  • За замовчуванням PowerShell є нечутливим до всього.

Поводження, якщо немає найчастішого слова:

  • Візьміть два останні пункти [-2, -1] в $ y і $ z;
  • список N-елементів, де N> = 2, складає $ y і $ z останні два елементи
  • 1-елементний список робить $ y останнім елементом, а $ z - null
  • Порожній список робить їх обома недійсними

Використовуйте бут-as-array-index fake-ternary-operator golf (0,1)[truthyvalue], вкладений, щоб вибрати "", $ z або $ y як вихід, а потім візьміть .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

0

Луа, 232 199 175 байт

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)

1
if not w[x]then w[x]=0 end w[x]=w[x]+1 end->w[x]=(w[x]or0)+1
Лина монашка

if m==v then o=''end->o=m==v and '' or o
Лина монашка

0

Perl 5, 96 92 84 + 2 ( -pпрапор) = 86 байт

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

Використання:

> echo "The man walked down the road." | perl -p script.pl

Ваш -pпрапор повинен застосувати штраф до 3 байт. Правила приблизно: кожен прапор командного рядка - +1 байт, оскільки саме стільки зайвих байтів потрібно, щоб розширити вільний -e'code'стиль командного рядка. Тож зазвичай -pце лише 1 байт. Але тут ваш код є 'таким, що його неможливо запустити просто з командного рядка, не виходячи з нього. Тож жодне поєднання з -eта, -а також пробіл перед pдодатковим не потрібно, і його теж потрібно рахувати
Тон Євангелія

Виправлено @TonHospel.
Денис Ібаєв

Це насправді 84 + 1 ( -pпрапор), якщо ви викликаєте його в командному рядку як perl -pe'…'(доступне, видаливши, 'як зазначено в перших коментарях)
Адам Кац

0

Пітон, 158 байт

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())]

Свій прийом приймає так:

g("Bird is the word")

Чи повинно відповідати всім вимогам, хоча це не виходить із порожніх рядків, чи потрібно це перевірити? Вибачте за затримку.

Поради / відгуки / поради щодо чорної магії для збереження байтів завжди вітаються


Привіт, і ласкаво просимо до PPCG! Ми оцінюємо завдання коду-гольфу за кількістю байтів у відповіді. Я пішов вперед і відредагував це для вас з правильною інформацією.
Rɪᴋᴇʀ

2
Ласкаво просимо до PPCG! На жаль, ваше подання не відповідає всім вимогам цього виклику, оскільки, перш за все, це НЕ є нечутливим. Наприклад, він НЕ вважатиме входження слова словом Thatяк входження слова, thatоскільки перший починається з великої літери, Tа другий починається з малої літери t. Крім того, це НЕ усуває всі інші форми пунктуації, крім дефісів ( -), і, необов'язково, апострофи ( '), і, як наслідок, це НЕ працює для четвертого тестового випадку, наведеного у питанні.
Р. Кап

1
Крім того, це НЕ видає нічого, якщо немає найчастішого слова. Наприклад, використовуючи третій тестовий випадок ( This sentence has no most frequent word.) в якості прикладу, ваша функція виводить [('This', 1)], коли замість цього нічого не виводиться. Я можу продовжувати роботу над іншими питаннями, тому рекомендую виправити їх, як тільки зможете.
Р. Кап

Зробимо незабаром, коли я встигну
чи не хотів би ти знати

Це неправильно. Клас символів \wвключає підкреслення.
mbomb007

0

Tcl 8,6, 196 байт

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]"

(На жаль, я не можу зрозуміти, як отримати його менше, ніж це ...)

Пояснення

Він використовує кілька незрозумілих ідіом Tcl, щоб робити речі.

  • [join [read stdin] " "] - рядок введення → список розділених пробілами слів
  • lmap ... - повторіть кожен елемент цього списку. (Коротше foreachта фактично однакові, оскільки результат відкидається.)
  • [regsub ... [string tolower ...]] - Перетворіть рядок у малі і обрисуйте всі символи, крім символів слова та дефісу.
  • [dict incr d ...] - Створення / модифікація словника / слова → підрахунок гістограми.
  • set y ... - Сортуйте значення словника, візьміть найбільше і поверніть всі (ключ, значення) пар, що відповідають йому.
  • if... - Повинно бути рівно два елементи: одна пара (ключ, значення), ще немає чого друкувати.
  • puts... - Роздрукуйте ключ у парі значень ключів, якщо така є. (Жодне слово не має пробілів.)

Ви можете грати з ним за допомогою CodeChef .



0

Rexx, 109 128 122 байт

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

Досить надруковані ...

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

Я не думаю, що це стосується всіх випадків пов'язаних найчастіших слів - див. (Новий) останній тестовий випадок - я зробив подібну помилку.
philcolbourn

Сподіваємось, це все виправлено
ая

0

bash, 153 146 131 154 149 137 байт

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

Операція:

оголосити асоціативний масив F цілих чисел (оголосити -iA F)

f - функція, яка, задаючи параметр слова $ 1, збільшує кількість частот для цього слова (T = ++ F [$ 1]) і порівнює до теперішнього часу максимальне число (M).

Якщо рівні, у нас є краватка, тому ми не вважатимемо це слово найчастішим (I =)

Якщо більше, ніж макс. Кількість поки що (М), то встановіть максимальне число поки що для частотного підрахунку цього слова (M = $ T) і запам'ятайте це слово (I = $ 1)

Кінцева функція f

Прочитайте рядок (читайте L) Зробіть малі літери (L = $ {L ,,}) Видаліть будь-який символ, крім az, 0-9, тире (-) та пробілу (L = $ {L // [^ - a-z0- 9]}) Складіть послідовність bash-операторів, що викликає f для кожного слова (printf -vA "f% s;" $ L). Це зберігається у змінній A. eval A та друкує результат (eval $ a; echo $ I)

Вихід:

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

Помилка: виправлена ​​У мене помилка, яка не виявлена ​​в цих тестових випадках. Якщо введення є

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

тоді мій код нічого не повинен виводити.

У мене є виправлення, але, здається, я потрапив у баш-помилку ... Я дуже незвичайна поведінка: M не оголошується цілим числом: ++ F [$ 1] == M (після декількох повторних слів) збільшується як F [$ 1 ] і М !! - моя помилка.


0

Python 3, 76 98 100 байт

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

Спробуйте в Інтернеті

Виводить найпоширеніше слово як малі. Не включає апострофи, оскільки "апострофи не потрібно включати".

statistics.mode вимагає Python 3.4

На жаль, вихід stderrне дозволений, або він буде набагато коротшим.


Вам не дозволяється друкувати STDERR, якщо ця програма не видає помилок?
Okx

Ваша нова програма не підтримує дефісів! Я спробував вхідi- test i-
Okx

Все виправлено. Ще короткий.
mbomb007

0

R, 96 байт

На 19 байт коротше, ніж на відповідь R , дещо інший підхід.

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

Читається від stdin, тому введення автоматично розділяється пробілами. Ми перетворюємо в малі регістри і використовуємо gsubдля видалення всіх не алфавітно-цифрових знаків (плюс -і '). Ми підраховуємо екземпляри кожного слова tableі зберігаємо результат t. Далі ми перевіряємо, чи є більше 1 максимуму t(побачивши, чи є більше одного елемента, який дорівнює max(t). Якщо так, повертаємо порожню рядок ''. Якщо ні, повертаємо слово, що відповідає максимуму в t.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.