Пропишіть з великої літери кожного слова введення


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. (Кудос Мартіну Баттнеру за те, що він вказав цей тестовий випадок).

    • 4б. Немає гарантії, що слова у вхідній фразі будуть відокремлені одним пробілом.
  5. Тестовий випадок, (будь ласка, використовуйте для тестування свого коду):

    Вхід:

    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 it it! 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
Чорт це розумний. Д:
Мартін Ендер

Я повинен погодитися, перемогти когось на 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

@Oriol, "о, це розумно!" справді! Вибачте 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]
Каек

3
@Caek Це обробляє x&&. Порожня рядок є фальсією, тому &&коротке замикання повертає лівий операнд, порожній рядок. Простіри збереглися.
nderscore

Дивовижний, дякую за пояснення. Може допомогти мені зрозуміти, як я можу змусити його працювати зараз.
Каек

Це дозволить задіяти великі літери навіть без символів 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 Спасибі, я змінив його, але не знаю, яку 14-байтну версію ви мали на увазі. Якщо ви говорите про пропущення другого +, то це порушується, якщо вхід містить пробіли.
Мартін Ендер

7

C, 64 63 байти

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

Виправлення: деяким компіляторам (наприклад, Clang) не подобаються параметри int замість argv, тому я перемістив його до глобальної змінної. Кількість байтів залишається однаковою. Завдяки грізній косинці за те, що помітили. До 63 байт, дякую Деннісу.

Безголівки:

int a;

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

Досить прямо: якщо a - помилково, символ перетворюється у великі регістри. Він встановлюється після зчитування пробілу: c - '' false, лише якщо c == ''. toupper () ігнорує все, що не є малою літерою, тому символи та кілька пробілів чудово. -1 має всі біти, тому коли getchar () повертає -1 оператор NOT робить його нульовим, і цикл зупиняється. a оголошується як глобальна змінна, тому вона ініціалізується до нуля (false). Це забезпечує, що перше слово з великої літери.


1
while(~(c=getchar())- Мені це подобається. Кланг насправді не збирає це, але ви можете отримати той самий підрахунок персонажівc;main(a){...}
кричущий ossifrage

1
Якщо поміняти місцями декларації aта cі порядок потрійного оператора, ви можете замінити ==з , -щоб зберегти один байти.
Денніс

Ви праві, звичайно.
Андреа Біондо

Приємно! +1 Програма працюватиме однаково при використанні while(!(c = getchar())), правда?
Spikatrix

1
@Cool Guy: Ні, побітна ~і логічна !не однакові. У C все, що не дорівнює нулю, вважається істинним, тож ваш стан буде таким, як, while((c = getchar()) == 0)звичайно, не буде працювати. Побітовий оператор НЕ ~заперечує значення побіт. Щоб перервати цикл, ~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...
Олександр-Бретт

@ alexander-brett дякую! Я оновив відповідь.
hmatt1

5

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

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

Спосіб:

  • Візьміть одну табличку і напишіть її великими літери, якщо в діапазоні, a-zто роздрукуйте її. (Код зліва направо для цієї частини є i::'backquote')$'{'(*' '*+)
  • Якщо останнє взяте char - це EOF, тоді вийдіть із іншого, друкуйте його
  • Якщо останній символ узятий простір символ , то перейти до пункту 1 ще прийняти новий лист і перейти до пункту 2.

5

JAVA, 273 байт

EDIT

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()методу string, щоб правильно використовувати великі літери.


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?
Якщо так, ось моя перша спроба CG

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

Дякую манатриці :)

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

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

дякую Гаррі Мусто-Playfair :)


Особисто я вважаю лише fgets(STDIN)читання матеріалів. Але ми не маємо єдиної думки щодо того $_GET, наскільки я знаю.
манатура

Так, це працює: D
Octfx

Вам не потрібні хитрощі, щоб закрити попередження. Вони попереджають! Ніхто їх не хвилює.
Ісмаїл Мігель

Ну, не думав про це. Здогадуюсь, мені доведеться дотримуватися
субстрату

Не потрібно в цьому. Саме час забути мої попередні поради щодо видалення $k=>. Поставте назад:foreach(split(' ',$_GET[@s])as$k=>$v)echo$k?' ':'',ucfirst($v);
манатура

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для отримання остаточного результату.


Приємно! Чи можете ви поясніть це мені?
poida

Я написав пояснення.
Лінн

Ще кілька scanlприкладів: один , два .
Лінн

@Mauris kudos для використання такого чудового алгоритму, як цей ... :)
WallyWest

3

Pyth, 20 байт

uXGHr@GH1fqd@+dzTUzz

Ці кілька просторів справді смокче. Інакше було б дійсно просте рішення на 12 байт.

Спробуйте в Інтернеті: компілятор / виконавець Pyth

Пояснення

                      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);}}
манатура

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 мій код також потребує фільтрації типів символів. :(
манатура

Це мені не спадало на думку. Повинен бути розрядний трюк, щоб перевірити, чи це лист чи ні.
Ісмаїл Мігель

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));
}

a - символ введення; b вірно, якщо останнім символом було пробіл. Єдиний неочевидний біт - це те, що ми використовуємо той факт, що putcharповертає символ, надрукований, якщо немає помилок.


3

C # Linq - 187

Це ніде не перемагає, але я просто дуже люблю Linq.

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 знаків)
Digital Trauma

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, яку ця програма притягує, є :мета-оператор присвоєння. Більшість мов, подібних С, мають деякий набір операторів обчислення та призначення: наприклад, 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();}

неозорений:

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

Haskell: 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

Ну, спасибі - я вважаю, це було раніше, ніж я вніс деякі інші зміни. Ти прав, це не потрібно.
Блоргберд

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

2

Математика, 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="")

Недоліковані + пояснення:

# 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.