Соревнование:
Построить таблицу 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
) и создайте нам a word frequency chart
со следующими характеристиками:
- Отобразите диаграмму (см. Также пример ниже) для 22 наиболее распространенных слов (упорядоченных по убыванию частоты).
- Столбец
width
представляет количество вхождений (частоту) слова (пропорционально). Добавьте один пробел и напечатайте слово. - Убедитесь, что эти строки (плюс пробел-слово-пробел) всегда подходят :
bar
+[space]
+word
+[space]
должно быть всегда <=80
символов (убедитесь, что вы учитываете возможные различия длины строки и слова: например: второе наиболее распространенное слово может быть намного длиннее, чем первое пока не сильно отличается по частоте). Увеличьте ширину полосы в пределах этих ограничений и масштабируйте полосы соответственно (согласно частотам, которые они представляют).
Пример:
Текст для примера можно найти здесь ( Приключения Алисы в стране чудес, Льюис Кэрролл ).
Этот конкретный текст даст следующую диаграмму:
_________________________________________________________________________ | _________________________________________________________________________ | она | _______________________________________________________________ | ты | ____________________________________________________________ | сказал | ____________________________________________________ | Алиса | ______________________________________________ | был | __________________________________________ | который | ___________________________________ | так как | _______________________________ | ей | ____________________________ | с участием | ____________________________ | в | ___________________________ | s | ___________________________ | T | _________________________ | на | _________________________ | все | ______________________ | этот | ______________________ | для | ______________________ | было | _____________________ | но | ____________________ | быть | ____________________ | не | ___________________ | Oни | __________________ | так
К вашему сведению: это частоты, на которых построен график выше:
[(«она», 553), («ты», 481), («сказал», 462), («Алиса», 403), («был», 358), («тот ', 330), (' as ', 274), (' her ', 248), (' with ', 227), (' at ', 227), (' s ', 219), (' t ' , 218), ('on', 204), ('all', 200), ('this', 181), ('for', 179), ('had', 178), (' но «, 175), (« быть », 167), (« не », 166), (« они », 155), (« так », 152)]
Второй пример (чтобы проверить, реализовали ли вы полную спецификацию):
Замените каждый вхождение you
в связанном файле Алиса в стране чудес с superlongstringstring
:
________________________________________________________________ | ________________________________________________________________ | она | _______________________________________________________ | superlongstringstring | _____________________________________________________ | сказал | ______________________________________________ | Алиса | ________________________________________ | был | _____________________________________ | который | ______________________________ | так как | ___________________________ | ей | _________________________ | с участием | _________________________ | в | ________________________ | s | ________________________ | T | ______________________ | на | _____________________ | все | ___________________ | этот | ___________________ | для | ___________________ | было | __________________ | но | _________________ | быть | _________________ | не | ________________ | Oни | ________________ | так
Победитель:
Кратчайшее решение (по количеству символов, по языку). Радоваться, веселиться!
Редактировать : Таблица с подведением итогов (2012-02-15) (первоначально добавлено пользователем Nas Banov):
Язык Relaxed Строгий ========= ======= ====== GolfScript 130 143 Perl 185 Windows PowerShell 148 199 Mathematica 199 Рубин 185 205 Unix Toolchain 194 228 Python 183 243 Clojure 282 Скала 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).
источник
s
иt
представлены.Ответы:
LabVIEW 51 узел, 5 структур, 10 диаграмм
Научить слона танцевать чечетку никогда не бывает красиво. Я пропущу количество символов.
Программа течет слева направо:
источник
Рубин 1.9, 185 символов
(в значительной степени основано на других решениях Ruby)
Вместо использования каких-либо ключей командной строки, как в других решениях, вы можете просто передать имя файла в качестве аргумента. (то есть
ruby1.9 wordfrequency.rb Alice.txt
)Поскольку здесь я использую символьные литералы, это решение работает только в Ruby 1.9.
Редактировать: Заменены точки с запятой на разрывы строк для «читабельности». :П
Редактировать 2: Штеф указал, что я забыл конечный пробел - исправил это.
Редактировать 3: снова убрал завершающий пробел;)
источник
GolfScript,
177175173167164163144131130 символовМедленно - 3 минуты для образца текста (130)
Объяснение:
«Правильно» (надеюсь). (143)
Менее медленно - полминуты. (162)
Вывод видим в журналах ревизий.
источник
206
shell, grep, tr, grep, sort, uniq, sort, head, perl
хм, только что видел выше:sort -nr
->sort -n
а потомhead
->tail
=> 208 :)update2: эээ, конечно вышеупомянутое глупо, поскольку тогда это будет полностью изменено. Итак, 209.
update3: оптимизировано регулярное выражение исключения -> 206
для удовольствия, вот версия только для Perl (намного быстрее):
источник
Решение на основе набора Transact SQL (SQL Server 2005)
1063892873853827820783683647644630 символовСпасибо Гейбу за некоторые полезные предложения по уменьшению количества персонажей.
Примечание: добавлены разрывы строк, чтобы избежать прокрутки, требуется только последний разрыв строк.
Читаемая версия
Вывод
И с длинной строкой
источник
0.000
на «просто»0
, а затем использовать-C
вместо1.0/C
. И , сделавFLOAT
вREAL
сэкономите ход тоже. Но самое главное, что у вас многоAS
экземпляров, которые должны быть необязательными.SELECT [ ] FROM (SELECT $0 O, ' '+REPLICATE('_', MAX(C)*@F)+' ' [ ] FROM # UNION SELECT $1/C, '|'+REPLICATE('_',C*@F)+'| '+W FROM #)X ORDER BY O
?Рубин
207213211210207203201200 символовУлучшение Anurag, включая предложение от rfusca. Также убираются аргументы для сортировки и несколько других мелких игр в гольф.
Выполнить как:
Редактировать: положить 'вводит' обратно, должно быть там, чтобы избежать вывода кавычек.
Edit2: измененный файл-> IO
Edit3: удалено / i
Edit4: удалены круглые скобки (f * 1.0), пересчитано
Edit5: использовать добавление строки для первой строки; расширить
s
на месте.Edit6: Сделано м плавать, удалено 1,0. РЕДАКТИРОВАТЬ: не работает, меняет длину. РЕДАКТИРОВАТЬ: не хуже, чем до
Edit7: использовать
STDIN.read
.источник
Mathematica (
297284248244242199 символов) Чистый Функциональныйи закон Зипфа
Смотри, мама ... нет варов, нет рук, .. нет головы
Правка 1> определены некоторые сокращения (284 символа)
Некоторые объяснения
Вывод
альтернативный текст http://i49.tinypic.com/2n8mrer.jpg
Mathematica не очень подходит для игры в гольф, и это только из-за длинных описательных названий функций. Такие функции, как "RegularExpression []" или "StringSplit []" просто заставляют меня рыдать :(.
Закон Зипфа
Закон Ципфа гласит, что для текста на естественном языке график « Лог (ранг) против журнала (вхождения) » следует линейному зависимости.
Закон используется при разработке алгоритмов криптографии и сжатия данных. (Но это НЕ «Z» в алгоритме LZW).
В нашем тексте мы можем проверить это следующим
Результат (довольно хорошо линейный)
альтернативный текст http://i46.tinypic.com/33fcmdk.jpg
Редактировать 6> (242 символа)
Рефакторинг Regex (больше не используется функция Select).
Удаление 1 символа слова.
Более эффективное определение для функции "f".
Редактировать 7 → 199 символов
f
наTranspose
иSlot
(#1
/#2
) аргументами.f@x
вместо,f[x]
где это возможно)источник
|i|
избыточно в вашем регулярном выражении, потому что у вас уже есть.|
.C # -
510451436446434426422 символа (минимизировано)Не так коротко, но сейчас, наверное, правильно! Обратите внимание, что предыдущая версия не показывала первую строку столбцов, неправильно масштабировала столбцы, загружала файл вместо получения его из stdin и не включала в себя все необходимые подробности C #. Вы можете легко сбрить много ударов, если C # не нужно так много лишней хрени. Может быть, Powershell мог бы сделать лучше.
422 символа с встроенным лендивизором (что делает его в 22 раза медленнее) в приведенной ниже форме (новые строки используются для выбора пробелов):
источник
Perl,
237229209 символов(Обновлено снова бить версию Ruby , с большим количеством пакостей полей, замена
split/[^a-z/,lc
сlc=~/[a-z]+/g
, и устранение чек на пустую строку в другом месте. Они были вдохновлены версии Руби, поэтому кредит , где кредит должен.)Обновление: теперь с Perl 5.10! Замените
print
наsay
и используйте,~~
чтобы избежатьmap
. Это должно быть вызвано в командной строке какperl -E '<one-liner>' alice.txt
. Поскольку весь сценарий находится в одной строке, его написание в виде одной строки не должно представлять никаких трудностей :).Обратите внимание, что эта версия нормализуется для случая. Это не сокращает решение, так как удаление
,lc
(для нижнего регистра) требует добавленияA-Z
к разделенному регулярному выражению, так что это мытье.Если вы работаете в системе, где символ новой строки - это один символ, а не два, вы можете сократить его еще на два символа, используя вместо него буквальный символ новой строки
\n
. Тем не менее, я не написал вышеупомянутый пример таким образом, так как он "более ясен" (ха!) Таким образом.Вот в основном правильное, но не достаточно короткое решение perl:
Ниже приводится краткая информация о том, насколько она может быть читаемой. (392 символа).
источник
foreach
с можно записать какfor
с. Это на 8 символов ниже. Тогда у вас есть тоgrep{!($_~~@s)}map{lc=~/[a-z]+/g}<>
, что, я полагаю, может быть написано,grep{!(/$_/i~~@s)}<>=~/[a-z]+/g
чтобы пойти еще 4 вниз. Заменить" "
с$"
и вы вниз 1 больше ...sort{$c{$b}-$c{$a}}...
чтобы сохранить еще два. Вы также можете просто передать%c
вместоkeys %c
кsort
функции и более сохранить четыре.Windows PowerShell, 199 символов
(Последний разрыв строки не обязателен, но включен здесь для удобства чтения.)
(Текущий код и мои тестовые файлы доступны в моем репозитории SVN . Я надеюсь, что мои тестовые примеры обнаруживают наиболее распространенные ошибки (длина строки, проблемы с соответствием регулярному выражению и некоторые другие))
Предположения:
история
Расслабленная версия (137), так как сейчас она считается отдельно:
Различия в длинах столбцов одного символа по сравнению с другими решениями объясняются тем, что PowerShell использует округление вместо усечения при преобразовании чисел с плавающей точкой в целые числа. Поскольку задача требует только длины пропорционального стержня, это должно быть хорошо.
По сравнению с другими решениями я использовал немного другой подход в определении длины самого длинного бара, просто попробовав и взяв наибольшую длину, где ни одна строка не длиннее 80 символов.
Более старая объясненная версия может быть найдена здесь .
источник
-split("\b(?:the|and|of|to|a|i[tns]?|or)\b|[^a-z]")
? Меня устраивает."|$('_'*($w*$_.count/$x[0].count))| $($_.name) "
(или исключить последний пробел, так как это автоматически). И вы можете использовать,-split("(?:\b(?:the|and|of|to|a|i[tns]?|or)\b|[^a-z])+")
чтобы сэкономить еще несколько, не включая пробелы (или использовать[-2..-23]
).Рубин, 215,
216,218,221,224,236,237символовОбновление 1: Ура ! Это связь с JS челкой ' решения . Не могу придумать способ урезать больше :)
Обновление 2: играли в грязную игру в гольф. Изменено,
each
чтобыmap
сохранить 1 символ :)обновление 3: изменено
File.read
наIO.read
+2.Array.group_by
не был очень плодотворным, изменился наreduce
+6. Чувствительность к регистру не требуется после нижнего кожуха сdowncase
в регулярном выражении +1. Сортировка в порядке убывания легко выполняется путем отрицания значения +6. Общая экономия +15обновление 4:
[0]
а не.first
+3. (@ Shtééf)обновление 5: развернуть переменную
l
на месте, +1. Развернуть переменнуюs
на месте, +2. (@ Shtééf)обновление 6: использовать добавление строки вместо интерполяции для первой строки +2. (@ Shtééf)
Обновление 7: я прошел через много шумихи, чтобы обнаружить первую итерацию внутри цикла, используя переменные экземпляра. Все, что я получил, это +1, хотя, возможно, есть потенциал. Сохранение предыдущей версии, потому что я считаю, что это черная магия. (@ Shtééf)
Читаемая версия
Использовать:
Вывод:
источник
scan
, тем не менее, дало мне лучшую идею, поэтому я снова стал впереди :).Python 2.x, широтный подход =
227183 символаПринимая во внимание свободу реализации, я построил конкатенацию строк, которая содержит все слова, запрошенные для исключения (
the, and, of, to, a, i, it, in, or, is
) - плюс он также исключает два печально известных «слова»s
иt
из примера - и добавил бесплатно для исключенияan, for, he
. Я перепробовал все объединения этих слов против совокупности слов из Алисы, Библии короля Джеймса и файла Жаргона, чтобы увидеть, есть ли какие-либо слова, которые будут ошибочно исключены строкой. И вот как я закончил две строки исключения:itheandtoforinis
иandithetoforinis
.PS. заимствовано из других решений, чтобы сократить код.
декламация
Что касается слов, которые следует игнорировать, можно подумать, что они будут взяты из списка самых употребляемых слов в английском языке. Этот список зависит от используемого текстового корпуса . По одному из самых популярных списков ( http://en.wikipedia.org/wiki/Most_common_words_in_English , http://www.english-for-students.com/Frequently-Used-Words.html , http: // www. sporcle.com/games/common_english_words.php ), 10 лучших слов:
the be(am/are/is/was/were) to of and a in that have I
Лучшие 10 слов из текста Алисы в Стране Чудес
the and to a of it she i you said
10 лучших слов из файла Jargon (v4.4.7):
the a of to and in is that or for
Вопрос в том, почему
or
был включен в список игнорирования проблемы, где он ~ 30-й по популярности, тогда как словоthat
(8-е наиболее часто используемое) нет. и т. д. и т. д. Следовательно, я считаю, что список игнорирования должен предоставляться динамически (или может быть опущен).Альтернативной идеей было бы просто пропустить первые 10 слов из результата - что на самом деле сократило бы решение (элементарно - должно отображаться только с 11 по 32 записи).
Python 2.x, точечный подход =
277243 символаДиаграмма, нарисованная в приведенном выше коде, упрощена (используется только один символ для столбцов). Если кто-то хочет точно воспроизвести диаграмму из описания проблемы (которая не требовалась), этот код сделает это:
Я беру проблему с несколько случайным выбором исключаемых 10 слов
the, and, of, to, a, i, it, in, or, is
, чтобы они передавались в качестве параметров командной строки, например так:python WordFrequencyChart.py the and of to a i it in or is <"Alice's Adventures in Wonderland.txt"
Это 213 символов + 30, если мы учитываем «оригинальный» список игнорирования, переданный в командной строке = 243
PS. Второй код также выполняет «корректировку» для длин всех главных слов, поэтому ни одно из них не будет переполнено в вырожденном случае.
источник
\W
или использование\b
в регулярном выражении, потому что они, скорее всего, не соответствуют спецификации, то есть они не будут разбиваться на цифры или_
могут также не удалять стоп-слова из строк такой какthe_foo_or123bar
. Они могут не отображаться в тестовом тексте, но спецификация в этом случае достаточно ясна.sys.argv
хак и используя:re.findall(r'\b(?!(?:the|and|.|of|to|i[tns]|or)\b)\w+',sys.stdin.read().lower())
Haskell -
366351344337333 персонажа(
main
Добавлен один разрыв строки для удобства чтения, и в конце последней строки не требуется разрыв строки.)Как это работает лучше всего увидеть, прочитав аргумент в
interact
обратном направлении:map f
строчные буквы алфавита, заменяет все остальное пробелами.words
создает список слов, отбрасывая разделяющий пробел.filter (
notElemwords "the and of to a i it in or is")
отбрасывает все записи с запрещенными словами.group . sort
сортирует слова и группирует идентичные слова в списки.map h
сопоставляет каждый список идентичных слов с кортежем вида(-frequency, word)
.take 22 . sort
сортирует кортежи по убыванию частоты (первая запись кортежа) и сохраняет только первые 22 кортежа.b
сопоставляет кортежи с барами (см. ниже).a
добавляет первую строку подчеркивания, чтобы завершить самый верхний бар.unlines
объединяет все эти строки вместе с символами новой строки.Хитрый момент - получить правильную длину стержня. Я предположил, что только длина подчеркивания учитывается по отношению к длине стержня, поэтому
||
столбец будет нулевой длины. Функцияb
отображаетc x
болееx
, гдеx
список гистограмм. Весь список передаетсяc
, так что каждый вызовc
может вычислить коэффициент масштабирования для себя путем вызоваu
. Таким образом, я избегаю использования математических или рациональных чисел с плавающей точкой, чьи функции преобразования и импорта потребляют много символов.Обратите внимание на хитрость использования
-frequency
. Это устраняет необходимость в с момента сортировки ( по возрастанию) будет место слова с наибольшей частотой в первую очередь. Позже в функции умножаются два значения, что отменяет отрицание.reverse
sort
-frequency
u
-frequency
источник
div
самом деле не может двигаться ! Попробуйте - вывод неверный. Причина в том, что выполнениеdiv
перед*
теряет точность.JavaScript 1.8 (SpiderMonkey) - 354
К сожалению,
for([k,v]in z)
версия от Rhino, похоже, не хочет работать в SpiderMonkey, иreadFile()
это немного проще, чем использование,readline()
но переход на 1.8 позволяет нам использовать замыкания функций, чтобы вырезать еще несколько строк ....Добавление пробела для удобства чтения:
Использование:
js golf.js < input.txt
Вывод:
(базовая версия - неправильно обрабатывает ширину стержня)
JavaScript (Rhino) -
405395387377368343304 символаЯ думаю, что моя логика сортировки отключена, но .. Я не знаю.Brainfart исправлен.Минимизировано (злоупотребление
\n
интерпретируется как;
иногда):источник
i[tns]?
немного. Очень подлый..replace(/[^\w ]/g, e).split(/\s+/).map(
его можно заменить.replace(/\w+/g,
и использовать ту же функцию, что.map
и вы ... Также не уверен, поддерживает ли Rhinofunction(a,b)b.c-a.c
вместо вашей функции сортировки (spidermonkey делает), но это будет бритье{return }
...b.c-a.c
это лучше, чемa.c<b.c
кстати ... Редактирование версии Spidermonkey внизу с этими изменениями?:
базой для работы, хотя!PHP CLI версия (450 символов)
Это решение учитывает последнее требование, которое большинство пуристов предпочитают игнорировать. Это стоило 170 символов!
Использование:
php.exe <this.php> <file.txt>
уменьшенная:
Человек читаемый:
Вывод:
Когда есть длинное слово, столбцы настроены правильно:
источник
Python 3.1 -
245229 символовЯ думаю, что использование Counter - это вид мошенничества :) Я только что прочитал об этом около недели назад, так что это был прекрасный шанс увидеть, как это работает.
Распечатывает:
Часть кода была «заимствована» из решения AKX.
источник
open('!')
читает из стандартного ввода - какая версия / ОС это на? или вы должны назвать файл "!"?Perl,
205191189 символов / 205 символов (полностью реализовано)Некоторые части были вдохновлены более ранними представлениями perl / ruby, пара подобных идей была найдена независимо, другие являются оригинальными. Более короткая версия также включает в себя некоторые вещи, которые я видел / узнал из других материалов.
Оригинал:
Последняя версия до191 символов:Последняя версия до 189 символов:
Эта версия (205 символов) содержит строки со словами длиннее, чем то, что будет найдено позже.
источник
Perl:
203202201198195208203/231 символовАльтернативная, полная реализация, включая указанное поведение (глобальное сжатие штрихов) для патологического случая, в котором вторичное слово является одновременно популярным и достаточно длинным, чтобы его можно было объединить в более чем 80 символов ( эта реализация составляет 231 символ ):
В спецификации нигде не указывалось, что это должно идти в STDOUT, поэтому я использовал perl's warn () вместо print - четыре символа сохранены там. Использовал карту вместо foreach, но я чувствую, что в расколе может быть еще больше сбережений (join ()). Тем не менее, получил его до 203 - может спать на нем. По крайней мере, Perl теперь под счетчиком "shell, grep, tr, grep, sort, uniq, sort, head, perl" на данный момент;)
PS: Reddit говорит "Привет";)
Обновление: удалено join () в пользу присваивания и неявного скалярного преобразования join. До 202. Также обратите внимание, что я воспользовался необязательным правилом «игнорировать однобуквенные слова», чтобы сбрить 2 символа, поэтому имейте в виду, что подсчет частоты будет отражать это.
Обновление 2: поменялись местами назначения и неявное соединение для убийства $ /, чтобы получить файл одним залпом, используя в первую очередь <>. Тот же размер, но противнее. Поменялся местами, если (! $ Y) {} для $ y || {} &&, сохранил еще 1 символ => 201.
Обновление 3: забрал контроль над строчными буквами раньше (lc <>), переместив lc из блока карты - поменял оба регулярных выражения, чтобы больше не использовать параметр / i, поскольку он больше не нужен. Заменяемая явная условная конструкция x? Y: z для традиционного perlgolf || неявная условная конструкция - /^...$/i?1:$xndom$ } ++ для /^...$/||$x]$ } ++ Сохранено три символа! => 198, преодолел 200 барьер. Скоро спать ... возможно.
Обновление 4: лишение сна сделало меня безумным. Хорошо. Более безумный. Поняв, что для этого нужно только проанализировать нормальные текстовые файлы, я заставил его отказаться, если он достигнет нуля. Сохранены два символа. Заменили «длину» на 1 символ короче (и намного больше в гольфе) y /// c - вы меня слышите, GolfScript ?? Я иду за тобой!!! рыдать
Обновление 5: Депрессия сна заставила меня забыть о ограничении в 22 строки и последующем ограничении. Вернуться к 208 с теми, с которыми обрабатываются. Не так уж и плохо, 13 символов справиться с этим - не конец света. Поиграл с встроенным eval в регулярном выражении Perl, но не смог заставить его работать и сохранять символы ... лол. Обновлен пример, чтобы соответствовать текущему выводу.
Обновление 6: убраны ненужные скобки, защищающие (...) для, поскольку синтаксическая конфета ++ позволяет с радостью подтолкнуть ее к. Благодаря вкладу Часов. Оуэнс (напоминая мой усталый мозг), нашел решение для класса персонажей в [tns]. Вернитесь к 203.
Обновление 7: добавлена вторая часть работы, полная реализация спецификаций (включая полное поведение сглаживания столбцов для вторичных длинных слов вместо усечения, которое делает большинство людей, на основе оригинальной спецификации без патологического примера)
Примеры:
Альтернативная реализация в примере патологического случая:
источник
is|in|it|i
в негоi[snt]?
- и тогда больше не будет разницы с необязательным правилом. (Хм, я бы никогда не подумал рассказать парню из Perl, как делать Regex: D) - единственная проблема сейчас: мне нужно посмотреть, как я могу сократить три байта из моего собственного решения, чтобы снова быть лучше Perl: - |F #, 452 символа
Strightforward: получить последовательность
a
пар подсчета слов, найти лучший множитель подсчета слов на столбецk
, затем распечатать результаты.Пример (у меня другое количество частот, чем у вас, не знаю почему):
источник
float
с.|>
?Python 2.6, 347 символов
Вывод:
источник
bm=(76.-len(W[0][0]))/W[0][1]
так как вы используете bm только один раз (сделайте следующую строкуU=lambda n:"_"*int(n*(76.-len(W[0][0]))/W[0][1])
, сбрив 5 символов. Кроме того: зачем использовать 2-символьное имя переменной в игре в гольф? ;-)* sh (+ curl), частичное решение
Это неполно, но, черт возьми, вот половина частоты проблемы подсчета слов в 192 байтах:
источник
Gawk - 336 (первоначально 507) персонажей
(после исправления выходного форматирования; исправления сокращений; настройки; настройки снова; удаления совершенно ненужного шага сортировки; настройки еще раз; и еще раз (к сожалению, этот нарушил форматирование); настройки еще немного; принимая вызов Мэтта, я отчаянно настраиваю более того, нашел другое место, чтобы сэкономить несколько, но дал два назад, чтобы исправить ошибку длины стержня)
Хе хе! Я на мгновение опережаю [Matt's JavaScript] [1] решение встречного вызова! ;) и [Питон AKX] [2].
Кажется, что проблема вызывает язык, который реализует нативные ассоциативные массивы, поэтому, конечно, я выбрал один с ужасно несовершенным набором операторов. В частности, вы не можете контролировать порядок, в котором awk предлагает элементы хеш-карты, поэтому я многократно сканирую всю карту, чтобы найти самый многочисленный элемент в данный момент, распечатать его и удалить из массива.
Все это ужасно неэффективно, со всеми сделанными мною играми в гольф это тоже стало довольно ужасно.
уменьшенная:
разрывы строк только для ясности: они не нужны и не должны учитываться.
Вывод:
Удобочитаемый; 633 символа (первоначально 949):
источник
Общий LISP, 670 символов
Я новичок в LISP, и это попытка использовать хэш-таблицу для подсчета (поэтому, вероятно, не самый компактный метод).
может быть запущен, например, с
cat alice.txt | clisp -C golf.lisp
.В читабельном виде
источник
С (828)
Он выглядит как запутанный код и использует glib для строки, списка и хэша. Чар считается с
wc -m
говорит 828 . Он не учитывает одно-символьные слова. Чтобы рассчитать максимальную длину стержня, нужно рассмотреть самое длинное слово среди всех, а не только первое 22. Это отклонение от спецификации?Он не обрабатывает сбои и не освобождает использованную память.
источник
*v=*v*(77-lw)/m
, даст 929. ... но я думаю, что это может быть хорошо, если я не найду способ сделать это намного короче)int c
вmain
декларации иmain
неявноint
(как и любые нетипизированных аргументы, AFAIK):main(c){...}
. Вы могли бы также просто написать0
вместоNULL
.-Wall
включенным-std=c99
флагом или ... но я полагаю, что это бессмысленно для код-гольфа, верно?Without freeing memory stuff, it reaches 866 (removed some other unuseful space)
на что-то другое, чтобы не думать людям, что разница с версией со свободной памятью заключается в следующем: теперь в версии без свободной памяти много больше "улучшений".Perl, 185 символов
200 (немного ломаных)199197195193187185 знаков. Последние два перевода строки являются значительными. Соответствует спецификации.Первая строка загружает количество правильных слов в
%X
.Вторая строка вычисляет минимальный коэффициент масштабирования, чтобы все выходные строки были <= 80 символов.
Третья строка (содержит два символа новой строки) производит вывод.
источник
Ява -
886865756744742744752742714680 символовОбновления до первой версии 742 : улучшено регулярное выражение, удалены лишние параметризованные типы, удалены лишние пробелы.
Обновление 742> 744 символа : исправлен взлом фиксированной длины. Это зависит только от 1-го слова, а не от других слов (пока). Найдены несколько мест для сокращения кода (
и
\\s
в регулярном выражении заменены наArrayList
заменены наVector
). Сейчас я ищу короткий способ удалить зависимость Commons IO и чтение из stdin.Обновление 744> 752 символа : я убрал зависимость от общего достояния. Теперь он читает со стандартного ввода. Вставьте текст в стандартный ввод и нажмите,
Ctrl+Z
чтобы получить результат.Обновление 752> 742 символа : я удалил
public
пробел, сделал имя класса 1 символ вместо 2, и теперь он игнорирует однобуквенные слова.Обновление 742> 714 символов : Обновленные в соответствии с комментариями Карла: удалены избыточные присваивания (742> 730), заменены
m.containsKey(k)
наm.get(k)!=null
(730> 728), введенный substringing линии (728> 714).Обновление 714> 680 символов : обновлено в соответствии с комментариями Rotsor: улучшен расчет размера стержня для удаления ненужного заброса и улучшено
split()
удаление ненужногоreplaceAll()
.Более читаемая версия:
Вывод:
Это довольно отстойно, что Java не имеет
String#join()
и закрывает (пока).Редактировать от Rotsor:
Я сделал несколько изменений в вашем решении:
Сокращенный код длиной
688711684 символа:Быстрая версия (
720693 символа)Более читаемая версия:
Версия без улучшений поведения - 615 символов:
источник
IOUtils
вместо того, чтобы импортировать его? Насколько я понимаю, вы используете его только один раз в любом случае.b
String вместо StringBuffer. Однако я не хочу думать о том, каким будет представление (особенно если вы добавляете по одному персонажу за раз).Scala 2.8, 311
314320330332336341375символовв том числе корректировка длинных слов. Идеи заимствованы из других решений.
Теперь как скрипт (
a.scala
):Бежать с
Кстати, редактирование от 314 до 311 символов фактически удаляет только 1 символ. Кто-то раньше ошибся в подсчете (Windows CR?).
источник
Clojure 282 строгий
Несколько более разборчиво:
источник
Скала, 368 символов
Во-первых, разборчивая версия в 592 символа:
Вывод консоли выглядит следующим образом:
Мы можем сделать несколько агрессивных минификаций и сократить их до 415 символов:
Сеанс консоли выглядит так:
Я уверен, что эксперт Scala мог бы сделать еще лучше.
Обновление: в комментариях Томас дал еще более короткую версию, на 368 символов:
Разборчиво, на 375 символов:
источник
object A{def main(a:Array[String]){val t=(Map[String, Int]()/:(for(x<-io.Source.fromFile(a(0)).getLines;y<-"(?i)\\w+\\b(?<!\\bthe|and|of|to|a|i|it|in|or|is)".r findAllIn x) yield y.toLowerCase).toList)((c,x)=>c+(x->(c.getOrElse(x,0)+1))).toList.sortBy(_._2).reverse.take(22);val w=76-t.head._1.length;print(" "+"_"*w);t map (s=>"\n|"+"_"*(s._2*w/t.head._2)+"| "+s._1) foreach print}}
Ява - 896 символов
931 символ1233 символа сделаны нечитаемымиСимволы 1977 года "без сжатия"Обновление: я агрессивно уменьшил количество персонажей. Опускает однобуквенные слова в обновленной спецификации.
Я так завидую C # и LINQ.
"Удобочитаемый":
Выход Алисы:
Выход Дон Кихота (также из Гутенберга):
источник