Краткое и приятное описание задачи: на
основе ETAOIN SHRDLU ваша задача - написать самую короткую программу или функцию на любом языке, которая выводит 26 букв английского алфавита в зависимости от их частоты во входных данных.
Действительно длинная, сухая и тщательная спецификация:
- Ваша программа / функция получит в качестве входных данных строку текста, которая будет содержать одну или несколько заглавных и / или строчных букв, а также может содержать знаки препинания, цифры, символы и другие не алфавитные символы.
- Программа / функция должна выводить только 26 букв в верхнем регистре английского алфавита, в том числе те, которые не отображаются на входе, упорядоченные от наиболее частых к наименее частым в зависимости от того, сколько раз они появляются на входе.
- Редактировать: частота рассчитывается без учета регистра, но выходные данные должны быть в верхнем регистре.
- Если две или более буквы имеют одинаковую частоту, они могут быть в любом порядке.
Другие выходные данные, такие как пробелы, не допускаются.- Редактировать 01.07.2014: На основании отзывов я изменяю это правило. Единственный другой вывод, который допустим, это необязательный начальный и / или завершающий пробел, такой как конечный перевод строки. Другие выходные данные не допускаются.
- Неопределенное поведение допускается для ввода, который не содержит никаких букв.
Победитель будет выбран через 7 дней, так что наберите эти пальцы!
Пример ввода:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent vitae erat velit. Mauris gravida euismod libero ut tincidunt. Phasellus elit dui, consectetur et egestas in, aliquam vitae diam. Donec eget varius ante. Vestibulum cursus diam aliquet, egestas orci quis, placerat dolor. Proin vel nisi lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam erat volutpat. Etiam libero tortor, ornare id dui eget, posuere dignissim libero. Pellentesque commodo consequat volutpat. Integer hendrerit sapien libero, vel viverra augue facilisis sit amet. Quisque consectetur eget nisl quis dignissim. Ut lacinia pretium quam a placerat.
Morbi sed interdum risus, nec pretium lectus. Morbi imperdiet est id accumsan molestie. Duis sed fermentum nisl. Nunc vitae augue mattis, dictum lectus vel, accumsan nisl. Sed ultricies adipiscing rhoncus. Vivamus eu lacus a enim venenatis eleifend. Praesent consectetur tortor non eleifend ultricies. Mauris et odio posuere, auctor erat at, fringilla est. Proin in vestibulum erat. Maecenas congue commodo ante vel varius. Sed tempus mi ut metus gravida, nec dictum libero dapibus. Morbi quis viverra elit. Ut pharetra neque eget lacus tincidunt dictum. Fusce scelerisque viverra tellus et pretium.
Fusce varius adipiscing odio. Nulla imperdiet faucibus sem, at rhoncus ipsum adipiscing vitae. Phasellus imperdiet congue lacus et mollis. Nullam egestas mauris magna, et mollis lectus varius ut. Sed sollicitudin adipiscing dolor, vel elementum elit laoreet molestie. Aliquam nec nulla vel sem ultrices ullamcorper. Nullam nec felis magna. Duis sodales orci non justo aliquam tempus. Integer mi diam, tempor sed vulputate et, varius et nunc. Vestibulum sodales ipsum id mi pharetra, ut convallis mi accumsan. Sed dictum volutpat vestibulum.
Quisque ac dolor sagittis, aliquam libero at, euismod enim. Nulla ullamcorper posuere nulla vitae varius. Nam at dolor non libero elementum pellentesque in in lorem. Fusce porttitor turpis in quam placerat varius. Donec lorem orci, condimentum eu sapien sit amet, aliquet commodo magna. Quisque sed lectus sit amet arcu euismod accumsan et non nunc. Phasellus placerat congue metus, feugiat posuere leo dictum quis. Sed ultricies feugiat eros dignissim bibendum.
Mauris scelerisque consectetur libero eget varius. Aenean neque nunc, ullamcorper vitae orci in, auctor ornare sapien. Nam lacinia molestie imperdiet. Nam vitae mattis nibh. Vestibulum consequat tellus ac nisi sagittis pulvinar. Nullam mollis ornare quam, et venenatis leo porttitor sit amet. Nulla urna neque, dignissim non orci ut, volutpat ultrices erat. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque vestibulum tellus nec eros faucibus porta.
Пример вывода:
EITUSALNROMCDPVGQBFHJKWXYZ
Примечание: между KWXYZ
этими входами есть 5 связей .
Редактировать:
Конкурс окончен! Спасибо всем, кто принимал участие. А теперь для победителя (ей!): Ответы Дениса CJam и Исаака Pyth пришли с колоссальными 19 символами. (Извините, но я не собираюсь принимать ни один из ответов, потому что я думаю, что это было бы несправедливо по отношению к другому.) Редактировать: Принимая совет Денниса, я отмечу его ответ как принятый, потому что он первым достичь 19 символов. Поощрительные премии идут на третье место Golfscript ответ Илмари Karonen в в 22 символов, а также 75-полукокса Python ответ undergroundmonorail в том , что получили наибольшее upvotes. Еще раз спасибо всем, кто принял участие!
Ответы:
CJam,
2119 байтовПопробуйте онлайн.
пример
(без новой строки)
Как это работает
Чем больше вхождений, тем больше символов удаляется, поэтому наиболее часто встречающиеся символы появляются в начале массива.
источник
Python 2 или 3 -
7775 байтовУ меня был ответ до того, как я получил информацию от STDIN, но я понял, что это технически неверно. Я использовал
input()
метод, который получает только одну строку, но входные данные из примера подразумевают, что он должен обрабатывать несколько строк одновременно. Чтобы соответствовать спецификации, я превратил свой ответ в функцию, которая принимает строковый аргумент. К моему удивлению, это было на два байта меньше! Мне не пришло в голову, чтоprint(...)
иinput()
были дольше, чемf=lambda s:
иs
.Это также делает ответ совместимым как с Python 2, так и с Python 3. Первоначально это был только Python 3, потому что он использовал
input()
(который был названraw_input()
в 2). Теперь, когда это функция, она работает в обоих.Разъяснения
источник
count
это не переменная или что-то еще, это буквальная функция. Какой бы крутой ни была возможность умножить возвращаемое значение функции,-1
вставив-
перед собой, это не то, что есть в Python.Баш, 65 байт
пример
Как это работает
источник
{A..Z}
. Все локали LC_COLLATE работают, потому что OpenBSD имеет только LC_COLLATE = C.Pyth 1.0.2 , 19
20Попробуйте это здесь: http://ideone.com/fork/YlWpEJ
Узнайте больше о Pyth здесь: http://esolangs.org/wiki/Pyth
Пример:
дает:
Объяснение:
=ZUw
: Преобразовать ввод в верхний регистр и сохранить в Z.sV
: Печать суммы на оборотеm;d
: Последние записиS
: Отсортировано по первой записи в порядке возрастанияm[cZkk)
: Списки [количество k в Z, k]UG
: Для k заглавными буквами.Грубый эквивалент Python:
Это не вход, я просто подумал, что людям может понравиться это увидеть. В Pyth 1.0.4 следующая программа представляет собой решение в 10 символов:
Объяснение:
JUw
: Преобразовать ввод в верхний регистр и сохранить в J.o
: (Печать) Сортировать по_cJN
: -1 * (количество N в J)UG
: Над буквами N в верхнем регистре.Это не является юридическим решением, потому что некоторые изменения с Pyth 1.0.2 до 1.0.4, включая добавление функции
o
sort by, были ответом на эту проблему.источник
Z
чтобы обратиться к ней позже? Неужели простое помещение выражения forZ
на его место вызовет многократное чтение ввода?Javascript ( ES6 )
119117Редактировать: (-2) Устранена необходимость
toUpperCase
использования регистронезависимого RegEx вsplit
вызове.Альтернатива (той же длины): сжатая сортировка и подсчет символов в одну функцию.
Как функция:
105104Редактировать: (-1) Упорядочить сортировку и подсчет символов в одну функцию.
источник
GolfScript, 22 символа
Попробуйте онлайн.
Объяснение:
:?
назначает входную строку для символа?
. (Я использую символ пунктуации, чтобы следующий номер91
не анализировался как часть имени символа.)91,
создает список чисел от 0 до 90 (код ASCIIZ
).+
добавляет этот список к входной строке, тем самым преобразуя его из массива кодов ASCII в строку (и удобно также удаляя входную строку из стека).-26>
принимает последние 26 символов этой строки, создавая строку, содержащую буквы ASCII в верхнем регистре отA
toZ
.{ }$
Применяет блок кода для всех символов во входной строке, и сортирует эти символы в соответствии с результатом..
дублирует символ и32+
преобразует копию из прописных в строчные.]
Собирает эти два символа в массив,?\-
принимает входную строку , хранящуюся в?
и удаляет все вхождения символов в массиве из него, и,
подсчитывает длину оставшейся строки, которая будет ключом сортировки. С помощью этой клавиши символы будут отсортированы в порядке возрастания и, следовательно, в порядке убывания по количеству появлений.источник
91,+-26>
.22
, а не25
:)Haskell, 110 байт
Пример использования:
источник
(/=c)
и избавиться от0-
?Ruby 2.0, 53 символа
РЕДАКТИРОВАТЬ : Исправлено для правильной работы с многострочными строками, спасибо @ durron597!
Создает вызываемую функцию,
f
которую можно использовать следующим образом:Печатает на STDOUT:
источник
EITASUROLNCMPDVQGBHFKJWXYZ
для примера в вопросеgets
возвращает строку за раз. Это можно исправить, изменив значениеgets
на,gets$n
но изменив его на функцию на 1 символ короче.Perl,
5446 байтОБНОВЛЕНИЕ: после дальнейшей оптимизации его можно сжать до 46 байт: (thx dennis для
-n
/{}
hack; китайский perl goth для<=>
->-
hack)Это должно быть запущено с бегом с
perl -nE
Оригинальное решение (не требует специальных параметров Perl):
Проверено в Perl 5.8.3, 5.14.2
Если вы получаете предупреждение, отдельно
eg
иfor
с пробелом (+1 символ), если вы не возражаетепример использования:
ОБЪЯСНЕНИЕ: Для каждого символа (
.
) каждой строки ввода (for<>
) примените подстановочный «шаблон», который фактически оценивается как выражение (e
флагs///
), который увеличивает символ upcased (uc
) (.
/$&
короче, чем более очевидный(.)
/$1
) считать в (неинициализированном) хеше (%h
). Затем хэш буквенной частоты используется в функции сравнения сортировки, чтобы распечатать алфавит в верхнем регистре в правильном порядке.источник
perl -ne 's/./$h{uc$&}++/eg}{print sort{$h{$b}<=>$h{$a}}A..Z'
-n
иEND{}
, но они всегда были длиннее ... не стесняйтесь обновлять ответ, если хотите-n
оборачиваетсяwhile(<>){...}
вокруг кода. Я избегаю редактирования кода других пользователей. Слишком легко ошибиться, некоторые вещи работают только на некоторых компьютерах и т. Д.}{
«инъекции», а не только о хорошо известном-n
варианте. Не было бы ожидать , что код строки на самом деле технически это обернуто в то время как код цикла строки перед выполнением, а не только что - то работает вроде как если бы он был завернут ..$h{$b}<=>$h{$a}
на$h{$b}-$h{$a}
R, 123 байта
Код улучшен благодаря предложениям @RichieCotton.
Выход:
источник
C ++,
185183179177 байтКонечно, не ожидается победы (может ли C ++ когда-нибудь победить?), Но, тем не менее, это забавное упражнение.
Объяснение:
источник
VBScript
181109Обновлен, чтобы использовать совершенно другой алгоритм. Превосходит JavaScript!
Милая:
Golfed:
источник
J
4135 байтДемо-версия:
Объяснение:
Ключ заключается в добавлении левого массива так, чтобы все буквы были доступны и уже были в порядке. Забавным следствием использования существительного в качестве третьего зубца на развилке является то, что он работает как глагол, а также как фраза.
источник
Groovy -
1301231151129892Согласно совету @ cfrick (дважды!):
Небольшой тест (бессовестно украденный у @jpjacobs):
И предложенный тест также проходит
источник
f={('A'..'Z').collectEntries{c->[c,it.toUpperCase().findAll(c).size()]}.sort{-it.value}.keySet().join()}
для 104it.grep(~/(?i)$c/)
вместоit.toUpperCase().grep(c)
toUpperCase
чертовски беспокоило меня.SAS - 217 (я думаю)
Входные данные должны быть помещены в строку после оператора cards4 или в соответствующие перфокарты для вашей системы. Я думаю, что этот подход экономит несколько символов против попыток процитировать ввод.
Я знаю, что это не соответствует полной спецификации, так как он возвращает только символы, которые появляются во входной строке. Возможно, мне придется немного переосмыслить это.
источник
AppleScript, 278
Я заметил, что
"a" = "A"
это правда в AppleScript. Я могу использовать это в коде гольф, но остальная часть сценария слишком многословна. Я использовал AppleScript 1.8.3.Это определяет функцию
f
. Если вы добавитеf("a string")
внизу сценария и запустите его в редакторе сценариев, он покажет результат.Отформатировано и прокомментировано:
источник
VBScript
157156 байтИзменить: изменил msgbox (p) на msgbox p
Более читабельно:
Гольф: (155 символов + 1 возврат каретки)
У меня это было на 171 ранее с кодом, который я нашел более интересным, но метод сортировки comforblydrei короче и требует len (s), что делает «for» короче, чем «while» для первого цикла. (зевок)
источник
for t=0
должно бытьfor t=1
, иначе вы всегда печатаете весь алфавит.J -
3835 символовФункция, принимающая ввод справа в виде строки. Не победитель, но было весело писать.
Разъяснение:
toupper
это глагол в стандартной библиотеке, который содержит строку Это тогда становится правильным аргументом глагола, в то время как левый аргумент является алфавитом: кодовые точки ASCII от 65 до 90.[
и,e.~#])
выбирает (#
) те буквы в правом arg (]
), которые являются элементами (e.~
) left, а затем prepends (,
) left arg ([
). Мы сохраняем только заглавные буквы и добавляем одну копию алфавита в конец, чтобы мы могли их всех поймать.#/.~@
затем дает частоты каждого символа. Так получилось, что это дано в алфавитном порядке, поэтому сразу после этого мы можем уменьшить (\:
) алфавит (левый аргумент[
).Быстрый ленивый пример ниже. Вы можете попробовать его для себя в tryj.tk .
источник
T-SQL 178
По сути, это мое решение на VBScript, но реализованное на SQL.
Это злоупотребление выводом XML для конкатенации столбца. В практическом использовании, это может быть присоединено к внешней таблице для эмуляции
GROUP_CONCAT
функций в MySQL и других.Объявление
@
переменной:Код:
источник
Perl, 78 байт
Результат для примера в вопросе:
Ungolfed:
источник
echo -e 'x\ny\n\nz\n'
вывода, который должен возвращатьXYZABCDEFGHIJKLMNOPQRSTUVW
, но даетXYABCDEFGHIJKLMNOPQRSTUVWZ
вместо этого. Угадай почему .. :)PHP - 105 байт
Вот hexdump, причина специальных символов:
И чуть менее гольф версия:
Пример:
источник
preg_filter()
?echo join(array_keys($f));
может сохранить один байтC # в LINQPad - 203 байта
Я принял другой подход к ответу Логан Дам. Сначала я убедился, что каждый символ во входной строке отсортирован по внешнему виду и существует только один раз в выходной строке. После этого я добавил каждый пропущенный символ из алфавита в строку вывода.
К сожалению, это не победило бы ответ Логана Дэма, если бы я сделал в Visual Studio.
Более читаемая версия:
источник
C # (и LINQ)
255226210 байтИспользуя совет Патрика Хайзинга, синтаксис запроса теперь короче:
Объяснение:
Синтаксис эквивалентного метода (217):
Исходное сообщение:
источник
P
вместоProgram
иstring[]a
вместоstring[] args
иc=>...
вместо(c)=>...
.using
операторов вы также можете поместить свой класс вSystem.Linq
пространство имен и удалить оба с помощью операторов. Затем вы можете сохранить некоторые символы, и он все равно будет работать нормально.namespace
он длиннее,using
и два дополнительных{}
s будут стоить мне дороже.namespace System.Linq{}
явно короче, чемusing System;using System.Linq;
просто смотреть на него. Идея состоит в том, чтобы полностью опустить обаusing
.C ++
701322232 байтаПервая версия 701 байт (идиоматическое использование STL)
Расширенная чистая версия:
Идея состоит в том, чтобы продемонстрировать «правильную» C ++ программу без каких-либо взломов. Не обращайте внимания на шаблон и тот факт, что это компилируется только на VC ++
Пояснение:
Мы заполняем от A до Z в строку с помощью iota () , это гарантирует, что при подсчете вхождений каждый символ появляется, даже если его нет на входе.
transform () копирует символ за символом из стандартного ввода и помещает его в конец s после вызова toupper () для каждого
Количество каждого символа уменьшается на карте (поддерживая отрицательные значения, мы можем иметь сортировку по убыванию без дополнительного кода)
Записи карты подсчетов копируются в набор пар, заменяя (char, count) на (count, char). Поскольку наборы упорядочены, мы сортируем их по убыванию частоты
Наконец, мы копируем содержимое набора в стандартный формат , используя transform и select2nd (), чтобы выбрать только второй член пары.
Код довольно читабелен. Решение на C ++ 11 выглядело бы намного красивее, поскольку мы можем использовать лямбда-выражения
Версия C ++ 11 - нет необходимости в лямбдах, но авто и диапазон на основе делают вещи очень чистыми (если подумать, вы можете сделать очень похожее с обычным C ++ 98)
Расширенная версия:
Следующая итерация (зачем читать из stdin, когда у нас есть argv):
Расширенная версия:
источник
Желе , 9 байт (не конкурирует)
объяснение
Это читается как «сортировка заглавного алфавита по количеству вхождений во вводе заглавными буквами, обратный», что является довольно буквальным переводом задачи: P
Попробуйте онлайн!
Эта задача была связана с Jelly HyperTraining, где мы решили эту задачу. Я отправил это, потому что я был первым, чтобы достигнуть 10 байтов.
-1 байт благодаря Эрику Аутгольферу (учитель JHT)
источник
ØAŒuċ¥@ÞU
C ++ 377
Реализует qsort, используя количество букв в массиве n для сортировки алфавита в массиве A. Запуск через командную строку:
golf.exe < in.txt
источник
C 117 (119) байтов
95
с223
, при стоимости 1 дополнительных байт.char c;
на justc;
и++c
наc=c+1%255
.источник
PowerShell - 139 символов
Во-первых, я не эксперт PowerShell. Уверен, что есть короче, чем это. Но был доволен этим и решил поделиться.
Как это работает:
источник
Цейлон , 98 байт
источник
APL,
2620 символов⎕a[⍒+/⎕a∘.=('\w'⎕r'\u0')⍞]
⎕a[⍒+/⎕a∘.=1(819⌶)⍞]
-6 спасибо Адаму.
источник
('\w'⎕r'\u0')
→1(819⌶)