Код должен принимать ввод текста (необязательно может быть любой файл, stdin, строка для JavaScript и т. Д.):
This is a text and a number: 31.
Выходные данные должны содержать слова с номерами вхождений, отсортированными по количеству вхождений в порядке убывания:
a:2
and:1
is:1
number:1
This:1
text:1
31:1
Обратите внимание, что 31 - это слово, поэтому слово - это что-либо буквенно-цифровое, число не действует как разделитель, например, 0xAF
квалифицируется как слово. Разделителями будут все, что не является буквенно-цифровым, включая .
(точка) и -
(дефис), таким образом, i.e.
или pick-me-up
приведет к 2 или 3 словам соответственно. Должен быть чувствителен к регистру This
и this
будет состоять из двух разных слов, '
также будет разделителем wouldn
и t
будет состоять из двух разных слов wouldn't
.
Напишите самый короткий код на выбранном вами языке.
Кратчайший правильный ответ до сих пор:
This
сthis
иtHIs
)?wouldn't
2 слова (wouldn
иt
)?This
и наthis
самом деле это два разных слова, то же самоеwouldn
иt
.i.e.
это слово, но если мы позволим поставить все точки в точках конец фразы будет взят, то же самое с кавычками или одиночными кавычками, и т. д.Ответы:
grep и coreutils
4442Тест:
Результаты в:
Обновить
источник
head
конце.grep -io \[A-Z0-9]*|sort|uniq -c|sort -nr
Ява 8: 289
Что довольно хорошо, так как Java - это язык, не относящийся к гольфу.
Ungolfed:
Запустите из командной строки:
источник
"[^\\W_]"
String.split(String regex)
метод использует шаблон, соответствующий разделителю, на который нужно разделить. Так, например,"aababba".split("b")
выдаст массив{"aa", "a", "", "a"}
. Мое регулярное выражение[^\\w\\d]
означает «символ ни в символах слова, ни в классах цифр».[^\\W_]
вместо этого - «символ, который не является ни подчеркиванием, ни находится в классе, состоящем из других слов» и будет соответствовать любому символу слова, кроме подчеркивания.\w
включает в себя\d
, так что\d
является излишним.\w
включает в себя подчеркивание, которое следует рассматривать как разделитель в соответствии с вопросом. Таким образом, правильное регулярное выражение для расщепления должно быть"[\\W_]+"
.APL (57)
например
Объяснение:
⎕D,⎕A,⎕UCS 96+⍳26
: цифры, заглавные буквы, строчные буквы(I←⍞)∊
: прочитать ввод, сохранить вI
, посмотреть, какие из них являются буквенно-цифровымиZ←I⊂⍨
: разделитьI
на группы буквенно-цифровых символов, сохранить вZ
+⌿∘.≡⍨Z
: для каждого элемента вZ
, посмотрите, как часто это происходитZ,⍪
: сопоставить каждый элементZ
попарно с тем, сколько раз он встречаетсяG←⊃∪↓
: выбрать только уникальные пары, хранить вG
⍒,1↓⍉G
: получить отсортированные индексы для вхожденийG[
...;]
: изменить порядок строкG
по заданным показателямисточник
⎕s
( help.dyalog.com/latest/Content/Language/System%20Functions/… ) и оператором нового ключа ( help.dyalog.com/latest/Content/Language/Primitive%20Operators/… ):g⌷⍨⊂⍒2⌷⍉g←{⍺,≢⍵}⌸('\w+'⎕s'\0')⍞
C #:
153c144C142C111с115с118с114с113с(через LINQPad в режиме «C # Statements», не включая строку ввода)
Версия 1: 142с
Ungolfed:
Полученные результаты:
Версия 2: 114с
(
[\w]
включает_
, что неверно ! ;[A-z]
включает[ \ ] ^ _ `
; останавливается на[^_\W]+
)Ungolfed:
Результаты: (как Версия 1)
источник
@"[^_\W]"
R, 58 символов
Использование:
источник
sort(table(gsub("[[:punct:]]","",scan(,""))),d=T)
. К сожалению, оба решения не работают правильно дляwouldn't
.perl6: 49 символов
Комбинируйте ввод для поиска соответствия
\w+
, помещайте полученный список слов в aBag
, запрашивайте их пары и сортируйте их по отрицательному значению. (The*
является Безотносительно звезда, это не умножение здесь)выход:
источник
.words
вместо.comb(/\w+/)
:).words
не удаляет входные данные:
или.
данные, как требуется :(_
не должно быть включено в слово под постановкой задачи.Python
10197Теперь работает с новой строкой:
источник
PHP - 84 байта
Ввод принимается в качестве аргумента командной строки, например:
Вывод для образца строки:
источник
$argv[1]
_
не должно быть включено в слово.PowerShell (40)
$ s - это переменная, которая содержит входную строку.
источник
[\W]
недостаточно хорош - он соответствует пробелу в моем тесте. И это не упорядочено по убыванию количества ...$s -split"[\W]"|group -ca|where{$_.Name -ne ""}|sort{-$_.Count}
приближает вас (конечно, с затратами)$s -split"\W+"|group -ca |sort count -des
-split"\W+"
соответствует пустой строке между последним.
и концом строки; также\W+
матчи,_
которые технически запрещеныPerl 69
Добавлены рекомендации от @primo и @protist
источник
ge
иfor
. Также<=>
оператор может быть заменен на-
.-
а<=>
не гений, не уверен, что это на советы по гольфу для Perl Thread. Я обновлю это позже, спасибо!\w
тоже включает числа (perl -e 'print for"a 1 2 3 4 b"=~/\w/g'
печатаетa1234b
), но твой механизм итерации слов сохраняет другой символ, поэтому я обновлю. Спасибо!Powershell:
5755536257(не включая входную строку)
возвращает:
(с реквизитами @microbian для группы -ca)
источник
EcmaScript 6
Версия 1 (108 символов)
Версия 2 (102 символа)
Версия 3 (105 символов)
Версия 4 (94 символа)
Версия 5 (без предупреждения; 87 символов)
Версия 6 (100 знаков)
Выход:
источник
_[a]
и_[b]
на_.a
и_.b
. Кроме того, изменения/\w+/g,_={}
в_=/\w+/g
будет производить тот же результат._[a]
чтобы быть ,_.a
потому что он пытается получить доступ к свойству"a"
из_
, а не собственностиa
.Object.keys
становится глобальным в ES6? Ваш ответ, кажется, предполагает это, но я не припоминаю, чтобы это было запланировано для ES6.Groovy
7782изменено регулярное выражение с
[^\w]+
на[^\d\p{L}]+
для решения проблемы с подчеркиваниембез первой строки, 82 символа
выход:
источник
nu_ber
не буквенно-цифровой. Это будет 2 словаnu_ber
вместоnumber
?GNU awk + coreutils:
7169Хотя
gawk asort
работает на ассоциативных массивах, он, очевидно, не сохраняет значения индекса, что требует внешнегоsort
GNU awk 4.x:
10093Несколько большее, но чистое решение gawk, используемое
PROCINFO
для установки порядка сортировки по умолчанию для ассоциативного массива (кажется, требует относительно недавнего gawk -> 4.x?)источник
_
не должно быть включено в слово.Javascript -
132126 символов!(Кратчайший код JS)
Улучшено регулярное выражение и некоторые правки.
Ungolfed
Старый -
156143141140132 символовДали первую попытку в гольф. Обратная связь приветствуется.
источник
EcmaScript 6,
11510087 (без подсказок и предупреждений)Благодаря @eithedog:
С подсказкой и предупреждением (100):
Запустите его в Firefox.
источник
var
. Кроме того , вы можете перемещатьсяa={}
внутриprompt
-prompt(a={})
. Вы также можете оставитьObject.
и изменитьw=>a[w]=a[w]+1||1
наw=>a[w]=-~a[w]
a
из приглашения в регулярное выражение сэкономит еще два символа._
не должно быть включено в слово.Руби
588265Тестовый забег:
Edit 58-> 80: Хорошо, я был далеко. Я забыл отсортировать слова по появлению. Также,
Array#uniq
не является перечислителем, но использует данный блок для сравнения элементов, поэтому передачаputs
его не отфильтровывает дубликаты (не то, что это говорит о том, что мы должны).источник
split(/\W+/)
вместоscan
(не проверено)?\W
исключает,_
так что это должно было быть исправлено, но он все еще сохранял 2 символа (затем я добавил 20, чтобы исправить сортировку, которой я пренебрегал).reverse
(a=gets.split(/[_\W]+/)).uniq.map{|w|[w,a.count(w)]}.sort_by(&:last).reverse.map{|x|p x}
reverse
слишком многословен;) Кстати, это несправедливо менять вопрос.F # - 169
Degolfed:
Вывод при вызове из ФСИ:
Обновление: некоторые пояснения в соответствии с просьбой в комментариях.
Использует функции set для генерации массива не буквенно-цифровых символов на входе для передачи в String.Split, затем использует функции последовательности для фильтрации пустых строк, генерации количества слов и печати результата.
Некоторые приемы игры в гольф: добавляет пустую строку к аргументу функции s, чтобы заставить вывод типа аргумента в виде строки, а не явно объявлять тип. Использует Seq.where вместо Seq.filter для сохранения нескольких символов (они являются синонимами). Смешивает прямую трубу и обычные функции приложения в попытке минимизировать символы. Использует каррирование и (op) синтаксис для обработки <> ~ - и <|| операторы как обычные функции, чтобы избежать объявления лямбда-фильтра для фильтрации пустых строк, сортировки по убыванию количества и печати кортежей.
источник
Python - 95 (сейчас 87 благодаря @primo)
Пример ввода:
Образец вывода:
Любое улучшение sugestion будет оценено
источник
\w
Матчи[a-zA-Z0-9_]
. Все ваши регулярные выражения могут быть заменены наr'\w+'
. Кроме того,x
переменная не нужна, просто используйтеraw_input()
в качестве второго параметра дляfindall
.print
утверждение (то естьprint map(...
), иначе это не полная программа.JavaScript
160144 (отредактировано: для удовлетворения требований)Unminified:
Регистрирует каждое слово в консоли по порядку, передавая следующую строку:
s="This is sam}}ple text 31to test the effectiveness of this code, you can clearly see that this is working-as-intended, but you didn't doubt it did you?.";
Выходы:
У меня нет сердца, чтобы использовать
alert()
.источник
you
должно быть первым._
не должно быть включено в слово.++o[a]||1
=>-~o[a]
к [71 символ]
Любой другой символ, кроме буквенно-цифровых символов, будет считаться разделителем.
пример
пример
источник
Javascript (135)
Unminified:
Перебирает каждое возможное количество совпадений в порядке убывания и выводит слова с таким количеством вхождений. Просто быть ужасным.
Примечания: оповещение уменьшило бы длину. Строго говоря, буквенно-цифровой должен быть
[^\W_]
источник
Haskell (153 = 104 кода + 49 импорт)
Довольно прямолинейная, полностью составленная функция ... никаких аргументов даже не требуется! Это мой первый гольф, так что иди спокойно, может быть? :)
Выход:
источник
q (50)
редактировать: исправлено случайное совпадение ascii 58-64 и 91-96
источник
q
но[0-z]
основано ли регулярное выражение на ASCII? Если это так, не будет ли он также включать символы ASCII 58-64? Потому что это так: ; < = > ? @
.[A-z]
, что соответствует ASCII 91-96, которые являются `[\] ^[^_\W]+
для себя, что должно быть «исключить несловарные символы и подчеркивание» , если ваш синтаксис поддерживает\W
класс ...Pure Bash (без внешних программ), 164
Это дольше, чем я надеялся, но я хотел посмотреть, можно ли провести необходимый подсчет и сортировку (в правильном направлении) исключительно с
bash
массивами (ассоциативными и неассоциативными):Сохраните как файл сценария
chmod +x
и запустите:источник
AWK
Делает работу без расширений:
Если вместо этого вывести «count: word», это будет немного короче, но я хотел бы подражать выводу данного примера ...
источник
Tcl , 99 байт
Попробуйте онлайн!
источник
Python 2.X (108 символов)
Python 3.X (106 символов)
источник
Separators will be anything that is not alpha-numeric
- Вы только разделены на пробелы.Haskell - 137
источник
Питон 3 - 76
Требование разделения на не алфавитно-цифровые символы, к сожалению, расширяет код на 19 символов. Вывод следующего показан правильно. Если вы не уверены, добавьте
.most_common()
после.Counter(...)
.В / Output
Учитывая вклад
This is a text and a number: 31.
вы получаете следующий вывод:Я пробовал это с другими значениями, такими как
чтобы убедиться, что порядок вывода не зависит от значения / хэша ключа. Этот пример производит:
Но, как я уже сказал,
print(i('collections').Counter(i('re').findall('\w+',input())).most_common())
вернул бы результаты как определенно упорядоченного списка кортежей.Python 3 - 57 (если пробела будет достаточно для разбиения: P)
источник
_
не должно быть включено в слово.