Какое слово самое частое?
Учитывая предложение, ваша программа должна пройти через него, посчитав частоты каждого слова, а затем вывести наиболее используемое слово. Поскольку предложение не имеет фиксированной длины и может быть очень длинным, ваш код должен быть максимально коротким.
Правила / Требования
- Каждое представление должно быть либо полной программой, либо функцией. Если это функция, она должна быть запущена, для этого нужно только добавить вызов функции в конец программы. Все остальное (например, заголовки в 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, если вы используете другой, пожалуйста, укажите.
Когда задача закончится, победит программа с наименьшим количеством байтов (она называется code-golf ).
Материалы
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
# 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
Вот фрагмент стека, чтобы генерировать как регулярную таблицу лидеров, так и обзор победителей по языкам.
/* Configuration */
var QUESTION_ID = 79576; // Obtain this from the url
// It will be like https://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 53406; // This should be the user ID of the challenge author.
/* App */
var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page;
function answersUrl(index) {
return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}
function commentUrl(index, answers) {
return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}
function getAnswers() {
jQuery.ajax({
url: answersUrl(answer_page++),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
answers.push.apply(answers, data.items);
answers_hash = [];
answer_ids = [];
data.items.forEach(function(a) {
a.comments = [];
var id = +a.share_link.match(/\d+/);
answer_ids.push(id);
answers_hash[id] = a;
});
if (!data.has_more) more_answers = false;
comment_page = 1;
getComments();
}
});
}
function getComments() {
jQuery.ajax({
url: commentUrl(comment_page++, answer_ids),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(c) {
if (c.owner.user_id === OVERRIDE_USER)
answers_hash[c.post_id].comments.push(c);
});
if (data.has_more) getComments();
else if (more_answers) getAnswers();
else process();
}
});
}
getAnswers();
var SCORE_REG = /<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;
var OVERRIDE_REG = /^Override\s*header:\s*/i;
function getAuthorName(a) {
return a.owner.display_name;
}
function process() {
var valid = [];
answers.forEach(function(a) {
var body = a.body;
a.comments.forEach(function(c) {
if(OVERRIDE_REG.test(c.body))
body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>';
});
var match = body.match(SCORE_REG);
if (match)
valid.push({
user: getAuthorName(a),
size: +match[2],
language: match[1],
link: a.share_link,
});
});
valid.sort(function (a, b) {
var aB = a.size,
bB = b.size;
return aB - bB
});
var languages = {};
var place = 1;
var lastSize = null;
var lastPlace = 1;
valid.forEach(function (a) {
if (a.size != lastSize)
lastPlace = place;
lastSize = a.size;
++place;
var answer = jQuery("#answer-template").html();
answer = answer.replace("{{PLACE}}", lastPlace + ".")
.replace("{{NAME}}", a.user)
.replace("{{LANGUAGE}}", a.language)
.replace("{{SIZE}}", a.size)
.replace("{{LINK}}", a.link);
answer = jQuery(answer);
jQuery("#answers").append(answer);
var lang = a.language;
if (/<a/.test(lang)) lang = jQuery(lang).text();
languages[lang] = languages[lang] || {lang: a.language, user: a.user, size: a.size, link: a.link};
});
var langs = [];
for (var lang in languages)
if (languages.hasOwnProperty(lang))
langs.push(languages[lang]);
langs.sort(function (a, b) {
if (a.lang > b.lang) return 1;
if (a.lang < b.lang) return -1;
return 0;
});
for (var i = 0; i < langs.length; ++i)
{
var language = jQuery("#language-template").html();
var lang = langs[i];
language = language.replace("{{LANGUAGE}}", lang.lang)
.replace("{{NAME}}", lang.user)
.replace("{{SIZE}}", lang.size)
.replace("{{LINK}}", lang.link);
language = jQuery(language);
jQuery("#languages").append(language);
}
}
body { text-align: left !important}
#answer-list {
padding: 10px;
width: 290px;
float: left;
}
#language-list {
padding: 10px;
width: 290px;
float: left;
}
table thead {
font-weight: bold;
}
table td {
padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b">
<div id="answer-list">
<h2>Leaderboard</h2>
<table class="answer-list">
<thead>
<tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
</thead>
<tbody id="answers">
</tbody>
</table>
</div>
<div id="language-list">
<h2>Winners by Language</h2>
<table class="language-list">
<thead>
<tr><td>Language</td><td>User</td><td>Score</td></tr>
</thead>
<tbody id="languages">
</tbody>
</table>
</div>
<table style="display: none">
<tbody id="answer-template">
<tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
<table style="display: none">
<tbody id="language-template">
<tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
don't d'ont dont a a
? Это будетdont
?dont
. Если нет, тоa
. но большинство представлений делают, и поэтомуdont
правильный ответ.ipv6
допустим ли вывод для последнего контрольного примера?Ответы:
Пайк,
2625 байтПопробуй это здесь!
Или
2322 байта (неконкурирующие, добавить узел, где убивает стек, если ложь)Попробуй это здесь!
Или с пунктуацией, 23 байта (я думаю, что это конкурирует? Коммит был до редактирования)
Попробуй это здесь!
Или 12 байтов (определенно неконкурентных)
Попробуй это здесь!
источник
-
и'
(дефис и апостроф).Желе , 25 байт
Попробуйте онлайн! или проверьте все контрольные примеры .
источник
Pyth -
2330 байтДолжен быть лучший способ включить цифры и дефисы, но я просто хочу это исправить прямо сейчас.
Тестовый пакет .
источник
Октава,
11594 байтаУчитывает случай без наиболее часто встречающегося слова с помощью
try
. В этом случае он ничего не выводит и «делает перерыв», пока вы не поймаете исключение.Сохранено 21 (!) Байт благодаря предложению Луиса Мендо (используя третий вывод из,
mode
чтобы получить наиболее распространенное слово).Правила немного изменились с тех пор, как я опубликовал свой первоначальный ответ. Я посмотрю в регулярное выражение позже.
источник
mode
наc
возможно? Его третий вывод дает все связанные значения, если я правильно помню['\w\d]
потому что вы должны сохранить апострофы и цифры. Если только они не находятся между верхним и нижним регистром в ASCII, в этом случае игнорируйте меня, потому что у меня нет удобной таблицы.[~, ~, out] = mode([1 1 2 2 1 2 3 4 5 5])
даетout = {1 2}
Perl 6, 80 байт
Давайте разделим ответ на две части ...
given
является оператором управления (какif
илиfor
). В Perl 6 они разрешены как постфиксы. (a if 1
или как здесь,foo given 3
).given
помещает свою тему (правая сторона) в специальную переменную$_
для левой стороны.Сама "тема" в нижнем регистре (
lc
), разбивается по слову (words
), помещает значения в Bag (устанавливается с количеством вхождений), затем сортирует по значению (DESC). Так какsort
только знает, как работать со списками, здесьBag
преобразуется в aList
изPair
s.простой условный (
?? !!
используется в Perl 6 вместо? :
).Просто проверяет, что в списке более одного элемента.
Доступ к
$_
может быть сокращен ... Не указав переменную..a
это точно так же$_.a
. Таким образом, это фактически означает, что «оба верхних элемента имеют одинаковое количество вхождений». Если это так, то мы печатаем '' (пустую строку).В противном случае, мы выводим ключ верхнего элемента (счет):
.[0].key
.источник
value??!!
(я знаю, что это троичный оператор, это просто интересно)05AB1E , 30 байтов
Код:
Использует кодировку CP-1252 . Попробуйте онлайн! ,
источник
I
команду несколько раз, 05AB1E будет принимать столько, сколько нужно.JavaScript (ES6), 155 байт
Основано на ответе Python @ Blue.
источник
Python 3.5,
142137134112117110127 байт:( +17 байт, потому что, очевидно, даже если слова встречаются чаще, чем остальные, но они имеют одинаковую частоту, ничего не должно возвращаться. )
Теперь должны удовлетворить все условия. В этом представлении предполагается, что введено хотя бы 1 слово.
Попробуйте онлайн! (Ideone)
Кроме того, если вы хотите один, вот еще одна версия моей функции, лишенная каких-либо регулярных выражений стоимостью около 43 байтов, хотя это в любом случае неконкурентно, так что это не имеет большого значения. Я просто положил это здесь, черт возьми:
Попробуйте эту новую версию онлайн! (Ideone)
источник
That's
является сокращением,that is
тогда как наthats
самом деле это не слово.Рубин,
9492102 байтаДолжен идти быстро (ответ FGITW). Возвращает слово в верхнем регистре или,
nil
если нет наиболее часто встречающегося слова.Я думаю, что теперь обновлены до новых спецификаций. Тем не менее, мне удалось немного поиграть в гольф, поэтому количество байтов осталось прежним!
источник
Gotta go fast
?Pyth, 32 байта
Тестирование.
источник
JavaScript (ES6), 99 байт
источник
Sqlserver 2008, 250 байт
Попробуйте онлайн!
Sqlserver 2016, 174 байта
Невозможно обработать данные, как в этом примере (считая равные 3 словам):
источник
GROUP BY, LEFT JOIN, or PARTITION BY
любом случае, SQL Server имеет встроенную функцию SPLIT. Демоверсия Ungolfed не стесняйтесь сделать ее как можно короче.PostgreSQL,
246, 245 байтВыход:
Введите, если кому-то интересно:
Обычно я использовал бы,
MODE() WITHIN GROUP(...)
и это будет намного короче, но это нарушит:РЕДАКТИРОВАТЬ:
Обработка
'
:SqlFiddleDemo
Выход:
источник
R, 115 байт
Это функция, которая принимает строку и возвращает строку, если одно слово появляется чаще, чем другие, и в
NULL
противном случае. Чтобы вызвать его, присвойте его переменной.Ungolfed:
источник
Сетчатка, 97 байт
Правила постоянно меняются ...
Попробуйте онлайн!
Тестирование.
источник
a
что это будет самое распространенное слово)Python, 132 байта
Выше код предполагает, что ввод имеет как минимум два слова.
источник
\w
включает в себя подчеркивание.PHP, 223 байта
источник
Python 2, 218 байт
Предполагает более 2 слов. Избавление от пунктуации уничтожило меня ...
источник
',-
т.д.?sorted
кортежу вместо того, чтобы вручную индексировать массив?Матлаб (225)
,
Набор инструментов необходим для запуска этого.
Как это работает, одна из самых приятных привилегий regex заменяет в matlab на то, что он выполняет полевые токены, вызывая функции внешнего окружения, параметризованные токенами, пойманными во внутренней среде, поэтому любая последовательность
"Word_A Word_B .."
заменяется на целые числа,"A0 A1 A2 B0 B1 B2 ..."
где первое целое число равно числовая сигнатура ascii слова, второй - начальный индекс, третий - конечный индекс, последние два целых числа не дублируются во всей последовательности, поэтому я воспользовался этим преимуществом, чтобы переместить его в массив, а затем переключил режим поиска в результат в этом массиве, поэтому начальные / конечные индексы будут следовать.Редактировать: после изменения некоторых деталей, программа вызывается функцией по строковому параметру.
20 байтов сэкономлено благодаря @StewieGriffin, 30 байтов добавили упрек в общепринятые лазейки.
источник
05AB1E ,
222120 байтОбъяснение:
Примечание: Если вы хорошо справляетесь с завершающими символами новой строки в выходных данных, если вы ничего не должны выводить, удалите
?
в конце, чтобы сохранить байт.Примечание № 2: Программа не будет работать с одним словом, но я сомневаюсь, что это будет проблемой. Если вы хотите , чтобы это исправить, заменить
#
сð¡
для дополнительного байта.05AB1E использует CP-1252 в качестве кодировки, а не UTF-8.
Попробуйте онлайн!
источник
Perl,
60565554 байтаВключает +3 для
-p
Если слово не может быть просто числом, вы также можете бросить на
a
53 балла.источник
-anE
не считается? На другом ответе (+2 байта за-p
флаг) ...E
не в счет. Другой ответ обычно должен делать только +1 байт-p
, но его решение имеет,'
поэтому его нельзя рассматривать как расширение-e
или-E
. Таким образом, он должен на самом деле считать +3 (не +2), так как он должен считать пробел и дефис (но каждая дополнительная опция будет только +1).[\pL\d-]
Похоже, что это может быть сокращено до[\w-]
(если мы не заботимся о подчеркиваниях), но любая версия сообщитthat
вместоthat's
илиthats
для теста 4. В противном случае вам нужно добавить 4 байта для вставки\x27
в этот класс символов (если у вас нет лучшего способа добавления апостроф).PowerShell (v4), 117 байт
Первая часть достаточно проста:
$input
это ~ = стандартныйGroup
по частоте (~ = Python's collection.Counter),Sort
чтобы поставить наиболее часто встречающиеся слова в конце.Обработка, если нет наиболее частого слова:
Используйте
(0,1)[truthyvalue]
вложенный гольф- фильтр bool-as-array-index-index , вложенный, чтобы выбрать "", $ z или $ y в качестве вывода, а затем взять .Name.источник
Луа,
232199175 байтовисточник
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
Perl 5,
969284 + 2 (-p
флаг) = 86 байтС помощью:
источник
-p
флаг должен вызывать штраф в 3 байта. Правила примерно такие: каждый флаг командной строки составляет +1 байт, поскольку именно столько дополнительных байтов необходимо для расширения-e'code'
командной строки в свободном стиле. Так что обычно-p
это только +1 байт. Но здесь ваш код есть,'
поэтому он не может быть запущен просто из командной строки без экранирования. Так что никакие комбинации с-e
и и-
и пространство перед неp
являются дополнительными и должны учитываться тоже-p
флаг), если вы вызываете его в командной строке какperl -pe'…'
(доступно после удаления,'
как отмечено в первых комментариях)Python, 158 байт
Принимает свой вклад, как это:
Должен ли он соответствовать всем требованиям, хотя он не работает на пустых строках, нужно ли проверять их? Извините за задержку.
Советы / отзывы / чёрные магические советы по сохранению байтов всегда приветствуются
источник
That
как вхождения слова,that
поскольку первый начинается с заглавной буквы,T
а второй начинается со строчнойt
. Кроме того, это НЕ удаляет все другие формы пунктуации, кроме дефисов (-
) и, необязательно, апострофов ('
), и, как результат, это НЕ будет работать для четвертого контрольного примера, приведенного в вопросе.This sentence has no most frequent word.
) в качестве примера, ваша функция выводит[('This', 1)]
, когда она должна ничего не выводить. Я мог бы продолжить и обсудить другие проблемы, поэтому я бы порекомендовал исправить их как можно скорее.\w
включает в себя подчеркивание.Tcl 8,6, 196 байт
(Увы, я не могу понять, как получить его немного меньше, чем это ...)
объяснение
Он использует несколько неясных идиом Tcl, чтобы делать вещи.
[join [read stdin] " "]
- строка ввода → список слов, разделенных пробеламиlmap ...
- перебирать каждый элемент этого списка. (Корочеforeach
и фактически идентичны, так как результат отбрасывается.)[regsub ... [string tolower ...]]
- Преобразуйте строку в нижний регистр и удалите все символы, кроме символов слова и дефиса.[dict incr d ...]
- Создать / изменить словарь / слово → считать гистограмму.set y ...
- Сортировать значения словаря, взять наибольшее и вернуть все соответствующие ему пары (ключ, значение).if...
- Должно быть ровно два элемента: одна пара (ключ, значение), иначе нечего печатать.puts...
- Распечатайте ключ в паре ключ-значение, если есть. (Ни одно слово не имеет пробелов.)Вы можете играть с ним, используя CodeChef .
источник
Rexx,
109128122 байтовДовольно напечатано ...
источник
bash,
153146131154149137байтОперация:
объявить ассоциативный массив целых чисел 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)
Выход:
Ошибка: ИСПРАВЛЕНО У меня есть ошибка, которая не обнаруживается в этих тестовых случаях. Если вход
тогда мой код не должен ничего выводить.
У меня есть исправление, но, похоже, я столкнулся с ошибкой bash ... Я получаю очень странное поведение, поскольку M не объявлено как целое число: ++ F [$ 1] == M (после нескольких повторных слов) увеличивает оба F [$ 1 ] И м!!- моя ошибка.источник
Python 3,
7698100 байтПопробуйте онлайн
Выводит наиболее распространенное слово в нижнем регистре. Не включает апострофы, потому что «апострофы не обязательно должны быть включены».
statistics.mode
требует Python 3.4К сожалению, не
stderr
разрешен вывод , иначе он будет намного короче.источник
STDERR
, если эта программа не выдает никаких ошибок?i- test i-
R, 96 байт
19 байтов короче, чем существующий ответ R , с несколько другим подходом.
Читает из стандартного ввода, поэтому ввод автоматически разделяется пробелами. Мы преобразуем в нижний регистр и используем
gsub
для удаления все не алфавитно-цифровые (плюс-
и'
). Мы подсчитываем экземпляры каждого словаtable
и сохраняем результат вt
. Затем мы проверяем, существует ли более 1 максимума вt
(проверяя, существует ли более одного элемента, который равенmax(t)
. Если это так, мы возвращаем пустую строку''
. Если нет, мы возвращаем слово, соответствующее максимуму вt
.источник