Какое слово самое частое?

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, если вы используете другой, пожалуйста, укажите.

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

Материалы

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# 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

Leaderboard

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

Джордж Гибсон
источник
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-байтовый ответ будет конкурировать, если сохранится единственная пунктуация -и '(дефис и апостроф).
Джордж Гибсон
Это сохраняет только пунктуацию, которая не находится в конце слова
Blue
О, хорошо (я не понимаю, Пайк). Я думаю, что это конкурирует тогда ...
Джордж Гибсон
1
@ GeorgeGibson Я почти уверен, что 23-байтовая версия не конкурирует - она ​​может иметь стандартные лазейки. Также я не ожидаю, что (m) люди поймут Pyke, я делаю это как свой собственный язык
Blue
Ладно. Я думаю, вы все равно выиграете, так что это не имеет значения.
Джордж Гибсон
11

Pyth - 23 30 байт

Должен быть лучший способ включить цифры и дефисы, но я просто хочу это исправить прямо сейчас.

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

Тестовый пакет .

Maltysen
источник
1
Пересмотренные правила требуют сохранения цифр и дефисов.
Деннис
@ GeorgeGibson исправлено.
Maltysen
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 байтов.
Конор О'Брайен
Я считаю, что ваше регулярное выражение должно быть, ['\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), помещает значения в Bag (устанавливается с количеством вхождений), затем сортирует по значению (DESC). Так как sortтолько знает, как работать со списками, здесь Bagпреобразуется в a Listиз Pairs.

$_>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:
cat
1
@cat исправил это - теперь должно быть совершенно нечитаемо
Ven
5
value??!!(я знаю, что это троичный оператор, это просто интересно)
кошка,
4

05AB1E , 30 байтов

Код:

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

Использует кодировку CP-1252 . Попробуйте онлайн! ,

Аднан
источник
хмм?
TessellatingHeckler
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.

Нил
источник
Ваша замена регулярных выражений выглядит так, как будто она отбрасывает числа и сломает контрольный пример IPv6, верно?
TessellatingHeckler
@TessellatingHeckler Определение слова изменилось, так как я первоначально прочитал вопрос, но я обновил свой ответ сейчас.
Нейл
4

Python 3.5, 142 137 134 112 117 110 127 байт:

( +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 слово.

Попробуйте онлайн! (Ideone)

Кроме того, если вы хотите один, вот еще одна версия моей функции, лишенная каких-либо регулярных выражений стоимостью около 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)]

Попробуйте эту новую версию онлайн! (Ideone)

Р. Кап
источник
Из комментариев к заданию «если есть два слова, которые встречаются чаще, чем остальные, но с одинаковой частотой», получается «ничего».
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
t-clausen.dk
источник
Мне не нравится переменный подход, потому что он обманывает :) Один ввод -> ничего или что-то, с подходом на основе множеств это должно быть длиннее, потому что вам нужно добавить дополнительные В GROUP BY, LEFT JOIN, or PARTITION BYлюбом случае, SQL Server имеет встроенную функцию SPLIT. Демоверсия Ungolfed не стесняйтесь сделать ее как можно короче.
lad2025
@ lad2025 большое спасибо, с 2016 года не знал ни одной функции. SPLIT_STRING, безусловно, давно назревшая функция. Я попытался раскрутить сценарий с помощью split, довел его до 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            ║
╚═══════════════════════════════════════════════════════════════════════════════════════════════╩═══════════════╝
lad2025
источник
не может быть ниже, чем у вас, sqlserver еще не имеет встроенной в split. Однако выбранная часть короче.
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противном случае. Чтобы вызвать его, присвойте его переменной.

Ungolfed:

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]+$

Попробуйте онлайн!

Тестирование.

Дрянная Монахиня
источник
2
Сбой для этого ввода.
Конор О'Брайен
@ CᴏɴᴏʀO'Bʀɪᴇɴ Спасибо, исправлено.
Дрянная Монахиня
1
И вы играли в гольф это 11 байтов ._. впечатляет
Конор О'Брайен
Также терпит неудачу за «Старомодный мужчина съел старомодный торт».
t-clausen.dk
Это тоже не выглядит правильно (ожидается, aчто это будет самое распространенное слово)
TessellatingHeckler
2

Python, 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]

Выше код предполагает, что ввод имеет как минимум два слова.

RootTwo
источник
Должен любить это регулярное выражение, хотя.
Синий
Это неверно Класс символов \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]:'')):'');
MonkeyZeus
источник
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''
синий
источник
Есть ли эта полоса и ',-т.д.?
Тим
@ Тим Нет, я справился с этой задачей до того, как правила были полностью разработаны. Изменится.
Голубой
Можете ли вы присвоить результат sortedкортежу вместо того, чтобы вручную индексировать массив?
Нил
@Neil, вы имеете в виду просто получить первый и второй элементы для сравнения вместо всего массива? Я не знаю, как это сделать
Blue
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
  • Набор инструментов необходим для запуска этого.

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

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


20 байтов сэкономлено благодаря @StewieGriffin, 30 байтов добавили упрек в общепринятые лазейки.

Abr001am
источник
Вы получите мое одобрение, когда вы (или кто-то еще) покажете, что это действительно работает, как для входных данных, которые имеют наиболее распространенное слово, так и для входных данных, которые не имеют. =) (К сожалению, я не могу это проверить)
Стьюи Гриффин,
@ StewieGriffin Я думаю, что программа плохо себя ведет с предложениями с равноправными словами, я это исправлю
Abr001am
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.

Попробуйте онлайн!

Okx
источник
1

Perl, 60 56 55 54 байта

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

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

Если слово не может быть просто числом, вы также можете бросить на a53 балла.

Тон Хоспел
источник
Дефис в -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 это ~ = стандартный
  • Regex заменяет ненужные символы ничем, сохраняйте символы новой строки, чтобы мы не перепутали два слова из конца строки и начала следующей строки в одно по ошибке. (Никто другой не обсуждал несколько строк, мог бы сыграть в гольф -2, если на входе всегда одна строка).
  • Regex разделяет Groupпо частоте (~ = Python's collection.Counter), Sortчтобы поставить наиболее часто встречающиеся слова в конце.
  • PowerShell не учитывает регистр по умолчанию для всего.

Обработка, если нет наиболее частого слова:

  • Возьмите последние два элемента [-2, -1] в $ y и $ z;
  • список N-элементов, где N> = 2, делает $ y и $ z последними двумя элементами
  • 1-элементный список делает $ y последним элементом, а $ z нулевым
  • пустой список делает их обоих нулевыми

Используйте (0,1)[truthyvalue]вложенный гольф- фильтр bool-as-array-index-index , вложенный, чтобы выбрать "", $ 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
TessellatingHeckler
источник
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

Python, 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 .

Dúthomhas
источник
182
Сергиол
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
Надеюсь, это фиксированный сейчас
AJA
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), тогда установите максимальное количество на данный момент равным счетчику частоты этого слова (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.

тогда мой код не должен ничего выводить.

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

philcolbourn
источник
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разрешен вывод , иначе он будет намного короче.

mbomb007
источник
Вам не разрешено печатать 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)))

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

rturnbull
источник