Согласно этому сайту, общее правило, рекомендованное Руководством по стилю типографии правительства США, гласит :
Используйте заглавные буквы в названиях публикаций и документов, кроме a, an, the, by, by, for, in, on, up, and, as, но, or, and not.
Возможно, это не так, поскольку я не могу найти такую рекомендацию в Руководстве по стилю , но давайте все равно воспользуемся этим правилом.
Соревнование
Если задана строка ввода, состоящая из строчных слов, разделенных пробелами, выведите заглавную строку в соответствии со следующими правилами
- Первое и последнее слово пишется с большой буквы.
- Все остальные слова прописными буквами, за исключением , , , на , по , на , в , из , на , к , до , и , в качестве , но , или , и ни .
Входная строка будет содержать хотя бы одно слово, а каждое слово содержит хотя бы одну букву и только символы от a
до z
.
Это сложная задача для гольфа, поэтому старайтесь использовать как можно меньше байтов на выбранном вами языке. Вы можете написать полную программу или функцию для выполнения задачи.
Testcases
"the rule of thumb for title capitalization" -> "The Rule of Thumb for Title Capitalization"
"programming puzzles and code golf" -> "Programming Puzzles and Code Golf"
"the many uses of the letter a" -> "The Many Uses of the Letter A"
"title" -> "Title"
"and and and" -> "And and And"
"a an and as at but by for in nor of on or the to up" -> "A an and as at but by for in nor of on or the to Up"
"on computable numbers with an application to the entscheidungsproblem" -> "On Computable Numbers With an Application to the Entscheidungsproblem"
Ответы:
Python 2, 118 байт
Смотри, мама, нет регулярных выражений!
Входные данные должны быть заключены в кавычки. У выхода есть завершающий пробел и нет завершающего перевода строки (я полагаю, что все в порядке). Проверьте все контрольные примеры на Ideone .
объяснение
Давайте возьмем входные данные в
a or an
качестве нашего примера.Использование Python 2 в
`x`
ярлыкrepr
, мы оборачиваем ввод в одиночных кавычках:'a or an'
. Затем мы разделяем пробел и перебираем слова.Внутри петли мы берем
repr
снова . Для первых и последних слов это дает"'a"
и"an'"
. Другими словами, это дает'or'
. Мы хотим избежать использования заглавных букв, если они соответствуют последнему шаблону и находятся в списке коротких слов. Таким образом, мы можем представить список слов в виде строки"'a'an'...'up'"
и знать, чтоrepr
любое короткое слово будет подстрокой.`w` in "..."
дает логическое значение, которое мы можем рассматривать как0
или1
для целей индексации в списке[w.title(), w]
. Короче говоря, мы ставим регистр в название слова, если оно находится в начале, в конце или нет в списке коротких слов. Иначе мы оставим это в покое. К счастью,title()
все еще работает как ожидалось с вводом, как'a
.Наконец, мы убираем любые одиночные кавычки из слова и печатаем его через пробел.
источник
05AB1E ,
6861 байтСохранено 7 байтов благодаря Аднану
Попробуйте онлайн!
объяснение
“a€¤€€€›€‹€‡€†€‚€‰€„€¾€ƒ€œ€³€—š¯“
словарная строка в переводеa an the at by for in of on to up and as but or nor
.источник
a
вместо того, чтобы также€…
сохранять дополнительный байт, если с этим :) Спасибо!GNU sed
81 7473 байтаВключает +1 для -r
Первая строка заглавной буквы каждого слова. Вторая переключает все необходимые слова обратно в нижний регистр.
Попробуйте онлайн!
источник
Сетчатка,
6966 байтИспользуйте заглавные буквы первой буквы каждого слова, затем измените выбранные слова на строчные, если они не являются первым или последним словом. Там есть пробел в конце последней строки.
Попробуйте онлайн
Это также работает
.
вместо первого пробела.Есть много регулярных выражений с одинаковой длиной, но я не могу найти способ обрезать их больше ...
источник
+
хитрость, чтобы сократить его.)JavaScript (ES6),
141138135133 байтаСохранено 3 байта благодаря mbomb007
Контрольные примеры
Показать фрагмент кода
источник
Желе , 58 байт
TryItOnline! или запустите все тесты
Как?
Сжатая строка с пробелами, разделяющими слова, будет
47
байтами, а разделение1
- на48
байты.Две неразделенные сжатые строки слов длины
2
и3
(с «a» в конце единицы) будут соответственно40
байтами плюс,2
чтобы разделить каждую и1
объединить их для45
байтов.Одно базовое число 250, как описано ниже, представляет собой
32
байты, которые затем3
преобразуются в основание 263
для индексации в строчный алфавит и3
разделения его на неиспользуемый символ'z'
для41
байтов.Итак, поиск по словам не для заглавных букв:
“Ð/ṃƇ¬þṄẊƙ€,⁽ṙƬ®OṪJ"ɦ3×kf3Ṙç%ġu’
был сформирован так:
Возьмите эти слова и соедините их с разделителем:
s="a an the at by for in of on to up and as but or nor"
Следующая метка
'a'
как1
,'b'
как2
с разделителем как0
:Преобразуйте это в базовое
26
число (последняя использованная буква'y'
плюс цифра для разделителя, код Python для этого:n=sum(v*26**i for i,v in enumerate(x[::-1]))
Преобразуйте это в базовый
250
номер (используя список для цифр):Поиск символов в этих индексах в кодовой странице желе:
(примечание: поскольку фактическая реализация является биективной, если бы она
b
имела какие-либо0
цифры, сначала нужно было бы ее перенести)Остальные:
источник
PHP, 158 байт
10 байтов сохранено @Titus
Предыдущая версия PHP, 174 байта
источник
foreach(...)echo" "[!$k],(condition)?$v:ucfirst($v);
TI-Basic, 295 + 59 + 148 = 502 байта
Теперь вы можете заработать на своем калькуляторе. Отлично подходит для школы :)
Основная программа, 295 байт
По сути, хитрость в подборе слов, чтобы
A
не стало ничего, заключалась вa
том, чтобы заключить в них пробелы, например, заменить" A "
на" a "
. Это также автоматически делает так, чтобы первое и последнее слова оставались заглавными, потому что они не имеют пробела с обеих сторон и, таким образом, не соответствуют ни одному из слов. (Гений, правда? И супер длинный, потому что строчные буквы составляют два байта каждая ...)Подпрограмма (
prgmQ
), 59 байт:Подпрограмма (
prgmR
), 148 байт:PS
~
представляет токен0x81
и@
представляет токен0x7F
, узнайте больше здесь .источник
Java 7,
271259258 байтUngolfed & тестовый код:
Попробуй это здесь.
Выход:
источник
Groovy,
131129Два байта сохранены благодаря carusocomputing
источник
i->
и используйте,it
чтобы сохранить 2 байта.{it.split()*.with{a->a in "a an the at by for in of on to up and as but or nor".split()?a:a.capitalize()}.join(" ").capitalize()}
.capitalize()
занимают много байтов. Есть ли короткий способ, которым вы можете сделать псевдоним.capitalize()
?C #, 305 байт
Еще много возможностей для улучшения, но здесь вы идете:
источник
Рубин,
123117111102 байтаИзвините за все правки - это должно быть последним.
источник
Python, 177 байт
Поставляется в функциональном формате для сохранения байтов. Это не особенно конкурентный ответ, но тот, который не требует
repr()
илиregex
обманывает. Это также не зависит от версии; это работает с Python 2 или 3.Хотя, возможно, это очень нестандартное решение.
источник
PHP,
109142 байтаСлияние ответов пользователя 59178 и mbomb007 .
Прописные буквы первой буквы каждого слова, затем строчные буквы всех слов из списка, окруженные пробелами.
К сожалению, обратный вызов должен работать на полную комплектацию; это стоит 29 байт.
источник
a an and as at but by for in nor of on or the to up
Ракетка 353 байта
Ungolfed:
Тестирование:
Выход:
источник
Java 7,
431 317311 байтСпасибо @KevinCruijssen за 114 байтов.
Спасибо @RosLup за сохранение 6 байтов.
ungolfed
первый ответ выше 250 байт
источник
String f(String s){String v="",x,l[]=s.split(" "),b[]={"a","an","the","at","by","for","in","of","on","to","up","and","as","but","or","and","nor"};int i=0,f=0,z=0;for(String c:l){for(f=0;f<b.length;z=c.equals(b[f++])|z>0?1:0);x=(char)(c.charAt(0)-32)+c.substring(1);v+=z>0?i<1|i++==l.length-1?x:c:x)+" ";}return v;}
( 314 байт ) Я предлагаю взглянуть на то, что я изменил в качестве подсказок в следующий раз. :) PS: я выложил ответ с другим подходом ( 259 байт ).c.substring(0,1).toUpperCase()+c.substring(1,c.length())+" "
которые вы делали дважды, должны заставить вас задуматься о том, чтобы как-то использовать его снова. И объединенные инициализации, как вы сделали правильно сint
, но по какой-то причине не сString
. Кроме того, нет необходимости в дополнительном,boolean
когда вы можете сохранить какint
0 или 1, а затем проверить его>0
. И я бы старался избегать скобок иbreak
как можно больше; обычно есть хитрость, чтобы избавиться от них, какfor(f=0;f<b.length;z=c.equals(b[f++])|z>0?1:0);
я показал. :)String c(String s){String v="",x,l[]=s.split(" "),b[]={"a","an","the","at","by","for","in","of","on","to","up","and","as","but","or","and","nor"};int i=0,f=0,z=0;for(String c:l){for(f=0;f<b.length;z=c.equals(b[f++])|z>0?1:0);x=(char)(c.charAt(0)-32)+c.substring(1);v+=(z>0?i<1|i++>l.length-2?x:c:x)+" ";}return v;}
И не проблема. :) Я также многому научился, когда был новичком в код-гольфе. Я просто делаю список с каждым общим советом по Codegolf, который я изучаю, и иногда смотрю / обновляю его. Но мой код все еще часто используется другими игроками.PHP
117118112 байтИспользует поведение
ucwords()
и экранирует соответствующие слова, которые заключены в пробелы, а затем удаляет escape-символы.Я скопировал
(a[snt]?|and|[fn]or|up|by|but|the|to|in|o[rnf])
ответ из Jörg Hülsermann, но, поскольку подход совершенно другой, я публикую его как отдельный ответ.редактирование: ошибка, замеченная Титом, исправляющая его стоимость 1 байт. также: 6 байтов сохранено благодаря его полезному комментарию о strtr
источник
strtr
вместоstr_replace
. Или добавьте слова с помощью<>
dropthe str_replace
and drop и используйте вывод HTML.preg_filter
вместоpreg_replace
. Я не пробовал это с вашим решениемnice try for a start
. Замена одного из пробелов утверждением решает это (+4 байта).preg_filter
, потерпел неудачу вtitle
тесте, ничего не возвращаяЧистый
bash
- 253(внешние программы не называются) - необходим bash v4
нормальный вид с комментариями
выход
источник
Japt , 71 байт
Попробуйте онлайн!
Объяснение:
Одна из моих любимых функций Japt - сжатие строк, использующее библиотеку shoco .
Вы можете сжать строку, обернув ее в
Oc"{string}"
→Oc"a an the at by for in of on to up and as but or nor"
Затем распакуйте его с помощью кавычек или
Od"{compressed string}"
→Od"a e by f up d ¿t n"
источник
-S
Флаг был добавлен после того, как эта проблема была опубликована, поэтому ваше текущее решение не является конкурирующим. Тем не менее, я думаю, что вы можете сделать£...+XÅ}S
, что будет конкурировать за тот же счетчик байтов ( попробуйте онлайн! )Чистый
bash
-205192181 байтКак и ответ jm66
tc
принимает стандартный ввод.источник
На самом деле , 79 байтов
Попробуйте онлайн!
Объяснение:
источник
Пакетная, 323 байта
С комментариями:
источник