Прописать первую букву каждого слова ввода


34

Это относительно быстро, но я уверен, что вам понравится.

Codegolf - программа, которая примет ввод в виде предложения, а затем предоставит вывод с первой буквой, заглавной в каждом слове.

Правила:

  1. Представления могут быть не в форме функции. Так что нет:

    function x(y){z=some_kind_of_magic(y);return z;} как ваш окончательный ответ ... Ваш код должен показать, что он принимает ввод и обеспечивает вывод.

  2. Код должен сохранять любые другие заглавные буквы, которые есть у ввода. Так

    eCommerce and eBusiness are cool, don't you agree, Richard III?
    

    будет отображаться как

    ECommerce And EBusiness Are Cool, Don't You Agree, Richard III?
    
  3. Некоторые из вас могут подумать: "Легко, я просто использую регулярные выражения!" и поэтому использование нативного регулярного выражения на выбранном вами языке игры в гольф повлечет за собой штраф в 30 символов, который будет применен к вашему окончательному количеству кодов. Зло смеется

  4. «Слово» в этом случае - это все, что разделено пробелом. Поэтому palate cleanserесть два слова, тогда pigeon-toedкак считается одно слово. if_you_love_her_then_you_should_put_a_ring_on_itсчитается одним словом. Если слово начинается с неалфавитного символа, слово сохраняется, поэтому _thisпосле рендеринга остается как _this. (Престижность Мартину Буттнеру за указание на этот контрольный пример).

    • 4b. Нет гарантии, что слова во входной фразе будут разделены одним пробелом.
  5. Test Case, (пожалуйста, используйте для проверки вашего кода):

    Входные данные:

    eCommerce rocks. crazyCamelCase stuff. _those  pigeon-toed shennanigans. Fiery trailblazing 345 thirty-two Roger. The quick brown fox jumped over the lazy dogs. Clancy Brown would have been cool as Lex Luthor. good_bye
    

    Выход:

    ECommerce Rocks. CrazyCamelCase Stuff. _those  Pigeon-toed Shennanigans. Fiery Trailblazing 345 Thirty-two Roger. The Quick Brown Fox Jumped Over The Lazy Dogs. Clancy Brown Would Have Been Cool As Lex Luthor. Good_bye
    
  6. Это код гольф, самый короткий код выигрывает ...

Удачи...


1
Как насчет пробелов в конце строки? Должны ли мы их сохранить? Можем ли мы добавить один, если он служит нашим потребностям?
Деннис

2
Деннис, пожалуйста,
сохраняйте

3
! = TitleCase Dam это! c # снова проигрывает!
Эван

1
@Tim Двойной пробел перед носком голубя правильный . Он сказал, чтобы сохранить расстояние.
mbomb007

2
Что отделяет слова? Какие-либо пробелы (табуляции, новые строки и т. Д.) Или просто пробелы?
Стивен Румбальский

Ответы:


21

CJam, 15 13 байт

Lq{_eu?_S-}/;

Попробуйте онлайн в интерпретаторе CJam .

ПСЕВДОКОД

L             e# B := ""
 q            e# Q := input()
  {       }/  e# for C in Q:
   _eu?       e#     C := B ? C : uppercase(C)
       _S-    e#     B := string(C).strip(" ")
            ; e# discard(B)

Все модифицированные символы C остаются в стеке и, следовательно, печатаются при выходе.


3
Чёрт, это умно. D:
Мартин Эндер

Я должен согласиться, что переиграть кого-то на 4 символа на языке кодгольф само по себе подвиг ... молодец.
WallyWest

12
@WallyWest: языки игры в гольф могут создать впечатление, что они как бы сами играют в гольф, но уверяю вас, что нет. TMTOWTDI подходит для всех языков, особенно для тех, у кого много встроенных программ. Иногда вы выигрываете , иногда проигрываете, а иногда чувствуете, что вас сбил грузовик .
Деннис

13

CSS 2.1, 49

:after{content:attr(t);text-transform:capitalize}

Пояснение :

  • attrФункция принимает входные данные из t(текста) атрибута HTML.
  • Ввод заглавных букв путем установки text-transform в capitalize.
  • Вывод предоставляется в виде сгенерированного содержимого с использованием contentсвойства псевдоэлемента.::after .

Запускаемый фрагмент :

:after {
    content: attr(t);
    text-transform: capitalize;
}
<div t="eCommerce rocks. crazyCamelCase stuff. _those  pigeon-toed shennanigans. Fiery trailblazing 345 thirty-two Roger. The quick brown fox jumped over the lazy dogs. Clancy Brown would have been cool as Lex Luthor. good_bye"></div>

Примечание : CSS 2.1 определил желаемое поведение: capitalizeпрописные буквы первого символа каждого слова. Тем не менее, CSS3 заглавными буквами первого типографского буквенного блока каждого слова. Таким образом, приведенный выше фрагмент не будет работать должным образом ни на старом IE, который не следовал CSS 2.1; ни на новых совместимых браузерах, которые следуют CSS3.


О, это умно!
IQAndreas

1
(слишком плохо о _thoseпроблеме в браузерах CSS3, но я все еще поддерживаю голосование из-за уникального способа решения проблемы.)
IQAndreas

@ Ориоль, "О, это умно!" верно! Извините, IQAndreas, я должен заимствовать ваш комментарий здесь ... это оригинальный подход к решению проблемы ... мне придется использовать этот подход ...
WallyWest

10

Javascript ( ES6 ), 77 байт

alert(prompt().split(' ').map(x=>x&&x[0].toUpperCase()+x.slice(1)).join(' '))

комментарии

alert( // output
    prompt(). // take input
    split(' '). // split by spaces
    map(x=> // map function to array
        x && // if x, empty string "" is falsey and returns itself
        x[0].toUpperCase() + x.slice(1) // capaitalize 1st char and concatenate the rest
    ).
    join(' ') // join array with spaces
)

Что произойдет, если слова разделены несколькими пробелами? [4b]
Caek

3
@Caek Это обрабатывается x&&. Пустая строка является ложной, поэтому происходит &&короткое замыкание и возвращает левый операнд, пустую строку. Пространства сохранились.
nderscore

Круто, спасибо за объяснение. Может помочь мне понять, как я могу заставить его работать сейчас.
Caek

Это будет использовать заглавные буквы, даже не символы Ascii, так что å станет Å!
Лев

9

Perl, 13 байт

perl -040pe '$_="\u$_"'

9 байтов плюс 4 байта для 040p(при условии, что я правильно интерпретировал правила для специальных вызовов ).

-040устанавливает разделитель входной записи $/в один пробел, чтобы пробелы были сохранены; \uпоследовательность символов преобразует следующий символ заголовка дела.


Отличная работа, почетное упоминание за использование командной строки!
WallyWest

7

CJam, 17 15 байт

lS/{S+(eu\+}/W<

Проверьте это здесь.

Довольно простая реализация спецификации. Используйте новое, {}&чтобы избежать ошибок для последовательных пробелов.

Два байта сохранены Денисом.


Отличный материал! Является ли CJam в основном языком для игры в гольф или у него есть практические коммерческие применения?
WallyWest

6
@WallyWest Нет, это просто язык игры в гольф. У него определенно нет коммерческих приложений, но я лично использую его время от времени для быстрых одноразовых скриптов (потому что в нем много встроенных модулей, и если вы знаете, что делаете, то набирать меньше символов быстрее, чем вводить больше персонажей;)).
Мартин Эндер

Вы можете сохранить несколько байтов, добавив пробел к каждому слову. В зависимости от ответа ОП на мой вопрос, это может дать вам 14 или 12 байтов.
Деннис

@Dennis Да, конечно, я поиграл с этим, но не подумал просто добавить его, прежде чем снимать первого персонажа. Я изменю это завтра, спасибо!
Мартин Эндер

@ Dennis Спасибо, я изменил это, но я не уверен, какую 14-байтовую версию вы имели в виду. Если вы говорите об исключении второго +, то это ломается, если входные данные содержат завершающие пробелы.
Мартин Эндер

7

C, 64 63 байта

a;main(c){while(~(c=getchar()))putchar(a?c:toupper(c)),a=c-32;}

Исправлено: некоторым компиляторам (таким как Clang) не нравятся параметры int вместо argv, поэтому я переместил его в глобальную переменную. Количество байтов остается прежним. Спасибо брезгливому ossifrage за то, что заметил. Спасибо, Денис, до 63 байт.

Ungolfed:

int a;

int main(int c) {
    while(~(c = getchar()))
        putchar(a ? c : toupper(c)),
        a = c - ' ';
}

Довольно просто: если значение равно false, символ преобразуется в верхний регистр. Он устанавливается после прочтения пробела: c - '' ложно, только если c == ''. toupper () игнорирует все, что не является строчной буквой, поэтому символы и несколько пробелов в порядке. -1 имеет все установленные биты, поэтому, когда getchar () возвращает -1, оператор NOT устанавливает его в ноль, и цикл останавливается. a объявлен как глобальная переменная, поэтому он инициализируется в ноль (false). Это гарантирует, что первое слово пишется с большой буквы.


1
while(~(c=getchar())- Мне нравится это. Clang на самом деле не скомпилирует это, но вы можете получить то же количество символов с помощьюc;main(a){...}
squeamish ossifrage

1
Если вы поменяете местами объявления aи cпорядок троичного оператора, вы можете заменить ==на, -чтобы сохранить один байт.
Деннис

Вы правы, конечно.
Андреа Биондо

Ницца! +1 Программа будет работать так же при использовании while(!(c = getchar())), верно?
Spikatrix

1
@Cool Guy: Нет, побитовое ~и логическое !не совпадают. В C все, что не равно нулю, считается верным, поэтому ваше состояние будет таким, while((c = getchar()) == 0)которое, конечно, не будет работать. Побитовый оператор NOT ~отрицает значение побитово. Чтобы разорвать цикл, ~cдолжен быть ноль: это означает, что все биты должны быть равны единице, так что при отрицании они становятся всеми нулями. Это значение (для 32-разрядного типа int) 0xFFFFFFFFравно -1(EOF) , если оно подписано .
Андреа Биондо

7

Python 3, 59 56 байт

f=1
for c in input():print(end=f*c.upper()or c);f=c==" "

Спасибо @Reticality за 3 байта.


3
Как насчет print(end=f*c.upper()or c)? Это сэкономило бы 4 байта

@Reticality Ого, я и не подозревала, что вы можете получить пустой отпечаток, используя только ключевое слово arg. Благодарность!
Sp3000

7

Версия Perl <5.18, 30 27 26 25

say map"\u$_",split$,=$"

24символы +1для -n.

\uделает следующий символ в верхнем регистре строки . @ThisSuitIsBlackNot указал на это, чтобы сохранить 1 байт. Прежде чем мы использовали функцию ucfirst.

Из perldocs ,

В качестве другого особого случая split эмулирует поведение по умолчанию инструмента командной строки awk, когда PATTERN либо опущен, либо литеральная строка состоит из одного пробела (например, '' или "\ x20", но не, например, / /). В этом случае все начальные пробелы в EXPR удаляются до того, как произойдет разбиение, и вместо этого PATTERN обрабатывается так, как если бы это было / \ s + /; в частности, это означает, что в качестве разделителя используется любой непрерывный пробел (не только один символ пробела). Тем не менее, этой специальной обработки можно избежать, указав шаблон / / вместо строки "", что позволяет разделить только один пробел. В более ранних версиях Perls этот особый случай ограничивался использованием простого "" в качестве аргумента шаблона для разделения в Perl 5.18.

поскольку $" вычисляет пробел, это сохранит пробелы. Так как мы хотим установить $,пробел и ввести пробел для разделения, @nutki указал, что мы можем использовать оба в качестве входных данных для разделения. Это экономит 3 байта от того, что у нас было раньше, который сначала устанавливался, $,а затем вводил$" в разделение.

Использование ,для карты вместо{} сохранения дополнительного байта, как указал @ alexander-brett.

Бежать с:

echo 'eCommerce     rocks. crazyCamelCase stuff. _those  pigeon-toed shennanigans. Fiery trailblazing 345 thirty-two Roger. The quick brown fox jumped over the lazy dogs. Clancy Brown would have been cool as Lex Luthor. good_bye' | perl -nE'say map"\u$_",split$,=$"'

1
Сохранить 1 байт с...map"\u$_",split...
Александр-Бретт

@ Александр-Бретт спасибо! Я обновил ответ.
hmatt1

5

> <> (Рыба) , 39 байт

</?-' 'o:;?(0:<-*' '*('{'$)'`'::i
i/.0e

Метод:

  • Возьмите один символ и наберите его заглавными буквами, если он находится в диапазоне, a-zзатем распечатайте его. (слева направо код для этой части i::'backquote')$'{'(*' '*+)
  • Если последний взятый символ является EOF символ , то выход еще распечатать
  • Если последний принятый символ является пробелом, то перейдите к пункту 1, либо возьмите новую букву и перейдите к пункту 2.

5

JAVA, 273 байта

РЕДАКТИРОВАТЬ

import static java.lang.System.*;class x{public static void main(String[] s){char[] a=new java.util.Scanner(in).nextLine().toCharArray();boolean f=1>0;for(int i=0;i<a.length;i++){if(a[i]==' '){f=1>0;continue;}if(f){a[i]=Character.toUpperCase(a[i]);f=1<0;}}out.println(a);}}

Это мой первый ответ в PCG, не уверен, что это приемлемо.
Атул Кумбхар

Добро пожаловать на борт! Вы можете попробовать удалить пробелы и использовать одиночные символы для имен переменных. Есть и другие советы для игры в гольф на JAVA .
nderscore

Спасибо @nderscore за подсказку, я отредактировал свой ответ, используя советы.
Атул Кумбхар

Выглядит лучше! Я также добавил количество байтов в ваш пост для вас.
nderscore

1
@TuukkaX Он не имеет publicв передней части class.. А если вы имеете в виду , что он может удалить publicв передней части static void main(..., то вы ошибаетесь, если он не изменится classдо interfaceи использует Java 8+.
Кевин Круйссен

5

JavaScript (решение регулярных выражений) - 104 байта

Кто-то должен укусить пулю и опубликовать решение RegEx! 74 символа плюс штраф +30 символов:

alert(prompt().replace(/(^| )[a-z]/g,function(m){return m.toUpperCase()}))

Или, если вы хотите прочитать и понять код в некомпактном виде:

//     Matches the (beginning of the line or a space), followed by a lowercase English character.  
string.replace( /(^| )[a-z]/g ,
                function(match) { return match.toUpperCase(); }

1
Умно ... хотя, конечно, вы заплатили цену со штрафом в 30 символов ... Я снимаю шляпу перед вами за то, что укусил пулю ...
WallyWest

4

Python 2, 73 байта

i=raw_input()
print''.join((c,c.upper())[p==' ']for p,c in zip(' '+i,i))

Эта программа использует заглавную букву, если ей предшествует пробел (с ключом для первого символа в строке). Это полагается на .upper()строковый метод, чтобы использовать заглавные буквы правильно.


2
Вы можете сэкономить 2 байта, перенеся на Python 3. (-4 raw_input=> input, +2 print=> print())
Стивен Румбальский

Спасибо Стивен. Я рассмотрел экономию в байтах путем кодирования в Python 3. Затем я подумал, что если я хочу изменить язык, чтобы стать конкурентоспособным, я бы изменил на Pyth. Я счастлив соревноваться в подлиге Python 2. Я пишу код на Python 2 каждый день для работы, поэтому этот опыт делает меня лучше на работе (но мой рабочий код не в гольфе!).
Рыцарь логики

4

PHP 64 76 77 83 84 89 байт

Считается ли $_GETвходом в PHP?
Если это так, вот моя первая попытка компьютерной графики

foreach(explode(' ',$_GET[@s])as$k=>$v)echo$k?' ':'',ucfirst($v)

Спасибо, Манатворк :)

Можно просто использовать ucwordsфункцию, что приведет к 21 байту:

<?=ucwords($_GET[@s])

спасибо Гарри Mustoe-Playfair :)


Лично я считаю только fgets(STDIN)читать входные данные. Но у нас нет единого мнения, $_GETнасколько я знаю.
manatwork

Да, это работает: D
Octfx

Вам не нужны хитрости, чтобы скрыть предупреждения. Они предупреждения! Никто не заботится о них.
Исмаэль Мигель

Ну, не думал об этом. Думаю, мне придется придерживаться
Octfx

Нет необходимости в этом. Пришло время забыть мой предыдущий совет по удалению $k=>. Положить его обратно:foreach(split(' ',$_GET[@s])as$k=>$v)echo$k?' ':'',ucfirst($v);
manatwork

4

Хаскелл, 69

import Data.Char
main=interact$tail.scanl(!)' '
' '!c=toUpper c;_!c=c

Объяснение:

scanlпринимает функцию (a -> b -> a)и начальное значение a, затем перебирает список [b]s, чтобы составить список [a]s:

scanl (!) z [a,b,c] == [   z
                       ,   z ! a
                       ,  (z ! a) ! b
                       , ((z ! a) ! b) ! c]

Он многократно принимает предыдущий результат в качестве левого аргумента переданной ему функции, а значение из списка ввода в качестве правого аргумента. для создания следующего.

Я написал функцию, (!) :: Char -> Char -> Charкоторая возвращает правый символ, который вы передаете, но делает его заглавным, если левый символ равен ' '(пробел). Ибо scanlэто означает: вернуть значение из списка ввода , но использовать его заглавными буквами, если предыдущий результат был пробелом. Так scanl (!) ' ' "ab cd"становится:

    scanl (!) ' ' "ab cd"
==> ' ' : scanl (!) (' ' ! 'a') "b cd"
==> ' ' : scanl (!)     'A'     "b cd"
==> ' ' : 'A' : scanl (!) ('A' ! 'b') " cd"
==> ' ' : 'A' : scanl (!)     'b'     " cd"
==> ' ' : 'A' : 'b' : scanl (!) ('b' ! ' ') "cd"
==> ' ' : 'A' : 'b' : scanl (!)     ' '     "cd"
==> ' ' : 'A' : 'b' : ' ' : scanl (!) (' ' ! 'c') "d"
==> ' ' : 'A' : 'b' : ' ' : scanl (!)     'C'     "d"
==> ' ' : 'A' : 'b' : ' ' : 'C' : scanl (!) ('C' ! 'd') ""
==> ' ' : 'A' : 'b' : ' ' : 'C' : scanl (!)     'd'     ""
==> ' ' : 'A' : 'b' : ' ' : 'C' : 'd' : ""
==> " Ab Cd"

Нам нужно, чтобы начальное значение ' 'было написано с заглавной буквы первой буквой, но затем мы отбрасываем его, tailчтобы получить окончательный результат.


Ницца! Можете ли вы объяснить это для меня?
поида

Я написал объяснение.
Линн

Еще несколько scanlпримеров: один , два .
Линн

@Mauris спасибо за использование такого замечательного алгоритма, как это ... :)
WallyWest

3

Pyth, 20 байтов

uXGHr@GH1fqd@+dzTUzz

Эти множественные пространства действительно отстой. В противном случае было бы действительно легкое 12-байтовое решение.

Попробуйте онлайн: Pyth Compiler / Executor

объяснение

                      implicit: z = input string
         f       Uz   filter [0, 1, 2, ..., len(z)-1] for elements T, which satisfy:
          qd@+dzT        " " == (" " + z)[T]
                      (this finds all indices, which should be capitalized)
u                  z  reduce, start with G = z, for H in idices ^ update G by
 XGH                     replace the Hth char of G by
    r   1                upper-case of
     @GH                 G[H]
                      implicitly print result

редактировать: 16 символов возможно с алгоритмом @Dennis.


1
Несколько пробелов делают его более сложным ... в противном случае это был бы простой случай string.split ("") или чего-то подобного ... Но вы преуспели в том, чтобы сделать это в 20 символов
WallyWest

3

CJam, 14 байтов

Это не самое короткое, но ...

qS/Sf.{\eu}s1>

Другой ответ, используя похожие идеи:

qS/Laf.{;eu}S*

.x изменяет только первый элемент, если один из параметров имеет только один элемент.


1
Цепочка fи .довольно гениальная. Еще один 14-байтовый вариант:qS/Sf.{\eu}S.-
Денис

3

Луа, 64 62 61 байт

Lua - ужасный язык для игры в гольф, поэтому я очень горжусь этим.

print(string.gsub(" "..io.read(),"%s%l",string.upper):sub(2))

[Попробуй здесь] 1 устарел, завтра обновлю


1
Добро пожаловать в PPCG! Конечно, вам не нужны эти пробелы после запятых?
Мартин Эндер

Ух ты, я так новичок в этом, что даже не знал, сколько мест считается. 62 байта!

2
Я также только что заметил, что это не совсем правильно: вы пишете заглавными буквами после всех не букв, так abc_defчто дадите Abc_Def. Однако только буквы после пробелов должны быть в верхнем регистре. Хорошей новостью является то, что исправление сохраняет байт. ;)
Мартин Эндер

3

ЯВА, 204 211 226 байтов

Моя первая запись на CG, надеюсь, все в порядке:

class U{public static void main(String[]s){int i=0;char[]r=s[0].toCharArray();r[0]=Character.toUpperCase(r[0]);for(char c:r){if(c==' '&&i>0)r[i+1]=Character.toUpperCase(r[i+1]);i++;System.out.print(c);}}}

Сохранено 7 байт благодаря @TNT


Вовлечение моих плохих навыков Java:public class U{public static void main(String[]s){int i=-1,j;char[]r=s[0].toCharArray();for(char c:r)if(++i==0||c==' '&&i>0)r[j=i+(i==0?0:1)]=Character.toUpperCase(r[j]);System.out.print(r);}}
manatwork

1
Добро пожаловать в PPCG! publicМодификатор не нужен , так что вы можете сэкономить 7 или больше.
ТНТ

3

PHP: 76 74 символа

foreach($l=str_split(fgets(STDIN))as$c){echo$l?ucfirst($c):$c;$l=$c==" ";}

Образец прогона:

bash-4.3$ php -r 'foreach($l=str_split(fgets(STDIN))as$c){echo$l?ucfirst($c):$c;$l=$c==" ";}' <<< 'eCommerce rocks. crazyCamelCase stuff. _those  pigeon-toed shennanigans. Fiery trailblazing 345 thirty-two Roger. The quick brown fox jumped over the lazy dogs. Clancy Brown would have been cool as Lex Luthor. good_bye'
ECommerce Rocks. CrazyCamelCase Stuff. _those  Pigeon-toed Shennanigans. Fiery Trailblazing 345 Thirty-two Roger. The Quick Brown Fox Jumped Over The Lazy Dogs. Clancy Brown Would Have Been Cool As Lex Luthor. Good_bye

Вместо того ucfirst($c), чтобы использовать $c^' '. (Подсказка: если у вас bitwise-xorбуква с пробелом, она будет преобразована из прописных в строчные, и опос также применяется)
Исмаэль Мигель

@IsmaelMiguel, это прекрасно работает в вашем решении, поскольку вы обрабатываете только строчные буквы. Но в моем решении все первые символы обрабатываются. Так что для (в противном случае великолепного) трюка xor мой код также нуждается в некоторой фильтрации типов символов. :(
manatwork

Это не приходило мне в голову. Должен быть побитовый трюк, чтобы проверить, является ли это буквой или нет.
Исмаэль Мигель

1
Одна вещь, которую вы можете сделать $l=str_split(fgets(STDIN)), это уменьшить код на 2 байта!
Исмаэль Мигель

1
Теперь я схожу с ума. Чувак, как долго я играл в этой инициализации и пропустил ее. Спасибо, @IsmaelMiguel.
Манатворк

3

C 74 байта

a,b=1;main(){while((a=getchar())>0)b=isspace(putchar(b?toupper(a):a));}

Не делает никаких предположений о наборе символов во время выполнения (ASCII, EBCDIC, Baudot, ... что угодно). Предполагается, что EOF отрицателен (я думаю, что C гарантирует это).

a,b=1;
main()
{
    while((a=getchar())>0)
        b=isspace(putchar(b?toupper(a):a));
}

а - вводимый символ; b верно, если последний символ был пробел. Единственный неочевидный бит - это то, что мы используем тот факт, что putcharвозвращает напечатанный символ, если нет ошибки.


3

C # Linq - 187

Это далеко не победа, но я просто слишком сильно люблю Линка.

namespace System{using Linq;class P{static void Main(string[]a){Console.Write(a[0].Substring(1).Aggregate(a[0][0].ToString().ToUpper(),(b,c)=>b[b.Length-1]==32?b+char.ToUpper(c):b+c));}}}


2

Баш, 61

a="${@//: / }"
a=(${a//: / })
a="${a[@]^}"
echo "${a//:/ }"

Обратите внимание, что двоеточия просто для того, чтобы программа показала здесь ОК. В действительности это может быть какой-нибудь непечатный символ, например, BEL.

Выход

$ ./cap1st.sh "eCommerce rocks. crazyCamelCase stuff. _those  pigeon-toed shennanigans. Fiery trailblazing 345 thirty-two Roger. The quick brown fox jumped over the lazy dogs. Clancy Brown would have been cool as Lex Luthor. good_bye"
ECommerce Rocks. CrazyCamelCase Stuff. _those  Pigeon-toed Shennanigans. Fiery Trailblazing 345 Thirty-two Roger. The Quick Brown Fox Jumped Over The Lazy Dogs. Clancy Brown Would Have Been Cool As Lex Luthor. Good_bye
$ 

Баш, 12

К сожалению, этот не сохраняет начальные / промежуточные / конечные пробелы, но в противном случае он работает:

echo "${@^}"

Выход

$ ./cap1st.sh eCommerce rocks. crazyCamelCase stuff. _those  pigeon-toed shennanigans. Fiery trailblazing 345 thirty-two Roger. The quick brown fox jumped over the lazy dogs. Clancy Brown would have been cool as Lex Luthor. good_bye
ECommerce Rocks. CrazyCamelCase Stuff. _those Pigeon-toed Shennanigans. Fiery Trailblazing 345 Thirty-two Roger. The Quick Brown Fox Jumped Over The Lazy Dogs. Clancy Brown Would Have Been Cool As Lex Luthor. Good_bye
$ 

5
Но это половина проблемы!
Sp3000

1
@ Sp3000 там я исправил (по цене 49 символов)
Цифровая травма

2

Пип , 15 + 1 для -s= 16

{IaUC:a@0a}Ma^s

Объяснение:

                  a is first cmdline arg (implicit)
            a^s   Split a on spaces
{         }M      Map this function to each element:
 Ia                 If the word is not empty,
   UC:a@0             uppercase its first character
         a          Return the word
                  Output the resulting list (implicit) joined on spaces (-s flag)

Одна интересная особенность Pip, на которую опирается эта программа, - это :мета-оператор присваивания. Большинство C-подобных языков имеют некоторый набор операторов вычисления и назначения: например, x*=5делает то же самое, что и x=x*5. В Пип, однако, вы можете прикрепить :на любой оператор и превратить его в оператор вычислительно и-ASSIGN. Это касается даже унарных операторов. Таким образом, -:xвычисляет -xи присваивает его обратно так xже, как и раньше x:-x. В этом случае,UC: используется (вместе с изменяемыми строками Пипа) для прописных букв первого символа слова.

Программа принимает данные из командной строки, требуя вызова, подобного этому:

python3 pip.py -se "{IaUC:a@0a}Ma^s" "test teSt TEST  _test"

2

С 125

Не самое короткое из решений, но я очень люблю гольф в C.

char b[99];main(c){while(scanf("%[A-Za-z_-]",b)==1)islower(*b)&&(*b&=223),printf("%s",b);~(c=getchar())&&putchar(c)&&main();}

ungolfed:

char b[99];
main(c)
{
  while(scanf("%[A-Za-z_-]", b) == 1) {
    if(islower(b[0])) {
      b[0] &= 0xDF;
    }
    printf("%s", b);
  }
  if((c = getchar()) != -1) {
      putchar(c);
      main();
  }
}

Я не знаю, использует ли синтаксис, подобный регулярному выражению, scanfправила, но это работает довольно хорошо. (Ну технически это не полный регулярное выражение)

Еще одна вещь, которую следует учитывать, это то, что этот код работает только для слов короче 99 байтов. Но я думаю, что это решение будет работать для большинства случаев.


Подсказка: & = 223 -> - = 32
edc65

2

Хаскель: 127 символов

import Data.List
import Data.Char
i=isSpace
s a b=i a==i b
u (w:ws)=(toUpper w):ws
f w=concatMap u$groupBy s w
main=interact f

Я опустился до 69 байтов .
Линн

2

PHP, 82

echo join(' ',array_map(function($s){return ucfirst($s);},explode(' ',$argv[1])));

Использование :

$ php code.php "eCommerce rocks. crazyCamelCase stuff. _those  pigeon-toed shennanigans. Fiery trailblazing 345 thirty-two Roger. The quick brown fox jumped over the lazy dogs. Clancy Brown would have been cool as Lex Luthor. good_bye"

2

C #, 133 131

using C=System.Console;class P{static void Main(){var s=2>1;foreach(var c in C.ReadLine()){C.Write(s?char.ToUpper(c):c);s=c==32;}}}

Вам нужно &&c!=32? Я не слишком хорошо владею C #, но думаю, что преобразование пробела в верхний регистр приводит к пробелу.
DLosc

Ой, спасибо - это было до того, как я сделал некоторые другие изменения, я думаю. Вы правы, это не нужно.
Blorgbeard

попробуйте "используя C = System.Console;" вместо использования системы
Ewan

2

Mathematica, 66 байт

Print@StringReplace[InputString[],WordBoundary~~a_:>ToUpperCase@a]

Я бы использовал ToCamelCase, но это не сохраняет интервал.


2

R 139 105 байт

for(i in 1:length(p<-strsplit(readline(),"")[[1]])){if(i<2||p[i-1]==" ")p[i]=toupper(p[i])};cat(p,sep="")

Ungolfed + объяснение:

# Assign p to be a vector of the input read from stdin, split into characters

for(i in 1:length(p <- strsplit(readline(), "")[[1]])) {

    # If we're at the first iteration or the previous character was a space

    if (i < 2 || p[i-1] == " ") {

        # Convert the current character to its uppercase equivalent

        p[i] <- toupper(p[i])
    }
}

# Join the vector elements into a single string and print it to stdout
cat(p, sep = "")

R с регулярным выражением, 49 41 + 30 = 71 байт

Я действительно расстроен; это на самом деле лучше, используя регулярные выражения со штрафом.

gsub("(^.| +.)","\\U\\1",readline(),pe=T)

Это соответствует любому отдельному символу в начале строки или после любого количества пробелов и заменяет его заглавной версией захвата. Обратите внимание, что применение \\Uзаконно и не влияет на не-буквы. pe=Tинтерпретируется как, perl = TRUEпоскольку он использует частичное соответствие R параметров функции и синоним для TRUE. По какой-то причине R по умолчанию не использует регулярные выражения в стиле Perl.

Спасибо MickyT за помощь в экономии 8 байт на подходе регулярных выражений!


С вашим регулярным выражением совпадающая строка может быть (^.| +.). В верхнем регистре все в порядке.
MickyT

@MickyT: Хорошая идея, спасибо! Отредактировано, чтобы использовать ваше предложение.
Алекс А.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.