Задача:
Создайте таблицу ASCII наиболее часто используемых слов в данном тексте.
Правила:
- Принимайте только
a-z
иA-Z
(буквенные символы) как часть слова. - Игнорировать корпус (
She
==she
для нашей цели). - Игнорируйте следующие слова (я знаю, это произвольно):
the, and, of, to, a, i, it, in, or, is
-
Уточнение: учитывая
don't
: это будет восприниматься как 2 разных «слова» в диапазонахa-z
иA-Z
: (don
иt
). -
При желании (сейчас уже слишком поздно формально изменять спецификации) вы можете удалить все однобуквенные «слова» (это потенциально может привести к сокращение списка игнорирования).
Проанализируйте данный text
(прочтите файл, указанный с помощью аргументов командной строки или переданный по конвейеру; предположим, us-ascii
) и создайте нам word frequency chart
со следующими характеристиками:
- Отобразите диаграмму (см. Также пример ниже) для 22 наиболее употребительных слов (в порядке убывания частоты).
- Полоса
width
представляет количество вхождений (частоту) слова (пропорционально). Добавьте один пробел и выведите слово. - Убедитесь, что эти полосы (плюс пробел-слово-пробел) всегда соответствуют :
bar
+[space]
+word
+[space]
всегда должны быть <=80
символы убедитесь, что вы учитываете возможные различия в длине полос и слов: например: второе наиболее распространенное слово может быть намного длиннее первого, но не сильно различается по частоте). Увеличьте до ширину полосы в пределах этих ограничений и соответствующим образом масштабируйте полосы (в соответствии с частотами, которые они представляют).
Пример:
Текст для примера можно найти здесь ( Приключения Алисы в стране чудес, Льюис Кэрролл ).
Этот конкретный текст даст следующую диаграмму:
_________________________________________________________________________ |_________________________________________________________________________| she |_______________________________________________________________| you |____________________________________________________________| said |____________________________________________________| alice |______________________________________________| was |__________________________________________| that |___________________________________| as |_______________________________| her |____________________________| with |____________________________| at |___________________________| s |___________________________| t |_________________________| on |_________________________| all |______________________| this |______________________| for |______________________| had |_____________________| but |____________________| be |____________________| not |___________________| they |__________________| so
Для вашего сведения: это частоты, на которых построена приведенная выше диаграмма:
[('she', 553), ('you', 481), ('said', 462), ('alice', 403), ('was', 358), ('that ', 330), ('as', 274), ('her', 248), ('with', 227), ('at', 227), ('s', 219), ('t' , 218), ('on', 204), ('all', 200), ('this', 181), ('for', 179), ('had', 178), (' but', 175), ('be', 167), ('not', 166), ('they', 155), ('so', 152)]
Второй пример (чтобы проверить, реализовали ли вы полную спецификацию):
Замените каждое появление you
в связанном файле Алиса в стране чудес на superlongstringstring
:
________________________________________________________________ |________________________________________________________________| she |_______________________________________________________| superlongstringstring |_____________________________________________________| said |______________________________________________| alice |________________________________________| was |_____________________________________| that |______________________________| as |___________________________| her |_________________________| with |_________________________| at |________________________| s |________________________| t |______________________| on |_____________________| all |___________________| this |___________________| for |___________________| had |__________________| but |_________________| be |_________________| not |________________| they |________________| so
Победитель:
Кратчайшее решение (по количеству символов для каждого языка). Удачи!
Изменить : Таблица, суммирующая результаты на текущий момент (2012-02-15) (первоначально добавлена пользователем Насом Бановым):
Language Relaxed Strict ========= ======= ====== GolfScript 130 143 Perl 185 Windows PowerShell 148 199 Mathematica 199 Ruby 185 205 Unix Toolchain 194 228 Python 183 243 Clojure 282 Scala 311 Haskell 333 Awk 336 R 298 Javascript 304 354 Groovy 321 Matlab 404 C# 422 Smalltalk 386 PHP 450 F# 452 TSQL 483 507
Числа представляют длину кратчайшего решения на определенном языке. «Строгое» относится к решению, которое полностью реализует спецификацию (рисует |____|
столбцов, закрывает первую полосу сверху строкой ____
, учитывает вероятность появления длинных слов с высокой частотой и т. Д.). «Расслабленный» означает, что были приняты некоторые вольности, чтобы сократить время до решения.
Включены только решения, длина которых меньше 500 символов. Список языков отсортирован по длине «строгого» решения. «Unix Toolchain» используется для обозначения различных решений, в которых используется традиционная оболочка * nix плюс сочетание инструментов (таких как grep, tr, sort, uniq, head, perl, awk).
Спецификация: как решить, какого размера делать стержни? Например. я думаю, что все полосы длиной в 1 пробел подойдут к спецификации?
Спецификация: я предполагаю, что мы можем предположить, что ни одно слово длиной более 80 символов не будет одним из самых частых (например, все слова имеют разумную длину).
@Brian: хорошие моменты, немного отредактирую (надеюсь), чтобы прояснить.
@Brian: кажется, что длина самого длинного столбца указана точно, а остальные должны масштабироваться, не так ли?
Что ж, «самая длинная полоса» + слово = 80 может не поместиться в 80 столбцов, если второе по частоте слово - гораздо более длинное слово. Я думаю, ищу «максимальное ограничение».
Нормализуем ли мы обсадную колонну? «Она» = «она»?
Вместо черного списка, например. «игнорировать пунктуацию» (в настоящее время учитываются дефисы, числа и т. д.), можем ли мы просто занести в белый список алфавиты (a-z, A-Z)?
@ Брайан, dmckee: это идея да; 1. масштабируйте полосы в соответствии с частотами, которые они представляют) и 2. максимизируйте ширину полосы в пределах ограничения (полоса + пробел + слово + пробел) <= 80. Надеюсь, теперь спецификация стала яснее ...
@ Брайан: было бы лучше, я немного обновлю спецификацию
@Brian: регистр можно игнорировать:
She
==she
ИМО делает это, как с точки зрения времени выполнения, так и использования памяти, кажется более интересной задачей, чем количество символов.
Рад видеть, что представлены мои любимые слова
s
иt
.@ Фрэнк, да, но тогда это был бы не кодовый гольф.
@indiv: смешно ;-) (хотя сейчас немного поздно менять спецификацию; уже 3 решения ;-)
@ChristopheD: измените его на "не считать слова длиной 1", это позаботится о 's' и 't', а также 'i' и 'a'. Кажется, 15 голосов до сих пор не согласны с тем, что уже слишком поздно
@indiv, @Nas Banov - глупый, слишком простой токенизатор читает "не" как {didn, t} и "she's" как {she, s} :)
Что должно произойти с конечным пробелом? В вашем примере выходных данных он есть в каждой строке, однако я прочитал ограничение на длину стержня, как будто оно должно быть включено только для целей расчета. Так следует ли выводить конечный пробел в каждой строке?
@Johannes Rössel: не стесняйтесь писать конечный пробел (в большинстве решений их нет), я немного отредактирую вопрос.
@indiv, @Nas Banov: обновлены спецификации, чтобы разрешить (необязательно) отбрасывание односимвольных слов.
@Johannes Rössel: я думаю, что логически конечное пространство не должно быть включено в вывод, потому что в противном случае следующая новая строка (в позиции 80) приведет к пропуску пустой строки / строки.
Действительно ли в спецификации должно быть сказано «делайте все строчными буквами», или этого достаточно, чтобы «она» и «она» отображались в том же контейнере, как вы сказали Брайану?
@Gabe: хороший момент (хотя результаты не должны отличаться), я немного обновлю спецификацию.
Спасибо. Я просто хотел убедиться, что не имеет значения, печатаю ли я «она» или «Она», при условии, что у него есть полоса правильной длины.
@LiraNuna: спасибо! Но в следующий раз я позабочусь о том, чтобы мои спецификации были более жесткими и недвусмысленными, прежде чем публиковать ;-)
Вам действительно следует предоставить тестовый пример, который решает проблему с длиной стержня ... Кажется, здесь довольно много ответов, которые не принимают это во внимание ...
@gnarf: около часа назад я добавил второй пример вывода (этого будет достаточно?). Мне жаль, что я не предоставил этот образец вывода, когда я разместил вопрос, хотя он уже был сформулирован в спецификации с самого начала. Через несколько дней я сделаю рейтинг ASCII (количество символов - язык - пользователь - реализована полная спецификация). Реализация этого масштабирования
bar+word
обычно требует около 50/60 дополнительных символов.@ChrisopheD - извините, пропустил часть
sed 's/\byou\b/superlongstring/gI' 11.txt
... :)Хм, забавная викторина: какие реализации правильно обрабатывают
"foo_the"
во входной строке? Согласно спецификации должно остаться толькоfoo
. Однако несколько реализаций разделения на основе регулярных выражений (включая мою) даютfoo
иthe
(я собираюсь исправить это, но это также может быть довольно распространенной ошибкой). [И да, здесь масштабирование полосы составляет ровно 50 дополнительных символов ;-)]Хм, я еще раз: что мы можем предположить о вводе (кроме ASCII и ни одного слова не длиннее 75 символов)? Сколько там хотя бы слов? Сколько отдельных слов существует хотя бы?
Вы действительно можете предположить, что слово не может быть длиннее 75 символов? Я бы только предположил, что ни одно слово в топ-22 не будет таким длинным, но вы можете представить строку из звездочек или О.
@Johannes Rössel: учитывая забавную викторину: foot_the должны стать двумя отдельными словами (foo и the) в духе четвертого пункта в спецификации. Я знаю, что он не идеален, но спецификации уже на высоте.
@Johannes Rössel, Гейб: вы действительно можете с уверенностью предположить, что ни одно слово во вводе не длиннее 75 символов (для этого кода-гольфа) и что существует как минимум 22 разных слова.
Где в спецификациях просят написать первую полосу (ту, что без слов). Многие решения реализуют это, чтобы оно выглядело как приведенный образец диаграммы, но, похоже, этого не спрашивают.
Кто-нибудь может сделать это в LOLCODE? Это выглядело бы действительно забавно.