Her girilen kelimenin ilk harfini büyük harf yap


34

Bu nispeten hızlı bir şey, ama eminim beğeneceksiniz.

Codegolf, bir cümle biçiminde girdi alacak ve daha sonra çıktıyı her kelimede büyük harfle yazılan bir program.

Kurallar:

  1. Gönderimler bir işlev biçiminde olmayabilir. Yani hayır:

    function x(y){z=some_kind_of_magic(y);return z;} Son cevabınız olarak ... Kodunuz girdi aldığını ve çıktı aldığını göstermelidir.

  2. Kod, girişin sahip olduğu diğer büyük harfleri korumalıdır. Yani

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

    olarak oluşturulacak

    ECommerce And EBusiness Are Cool, Don't You Agree, Richard III?
    
  3. Bazılarınız "Kolay, sadece regex kullanacağım!" Diye düşünüyor olabilir. ve seçtiğiniz yerel dilde yerel regex kullanmak, son kod sayınıza uygulanacak 30 karakterlik bir ceza verecektir. Kötü gülmek

  4. Bu durumda bir "kelime" boşlukla ayrılmış herhangi bir şeydir. Bu nedenle palate cleanseriki kelime, pigeon-toedbir kelime olarak kabul edilir. if_you_love_her_then_you_should_put_a_ring_on_ittek kelime olarak kabul edilir. Bir sözcük alfabetik olmayan bir karakterle başlıyorsa, sözcük korunur, böylece _thisoluşturma işleminden sonra olduğu gibi kalır _this. (Bu test olayını işaret ettiği için Martin Buttner'a teşekkür ederim).

    • 4b. Giriş deyimindeki kelimelerin tek bir boşlukla ayrılacağının garantisi yoktur.
  5. Test Durumu, (lütfen kodunuzu test etmek için kullanın):

    Giriş:

    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
    

    Çıktı:

    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. Bu kod golf, en kısa kod kazanıyor ...

İyi şanslar...


1
Satırın sonundaki boşluklar ne olacak? Onları korumak zorunda mıyız? İhtiyaçlarımızı karşılarsa bir tane ekleyebilir miyiz?
Dennis,

2
Dennis, lütfen girişteki boşlukları koru ...
WallyWest

3
! = TitleCase boşver! c # TEKRAR kaybeder!
Ewan

1
@Tim Güvercin parmaklı önce iki boşluk doğrudur . Boşluğu korumak dedi.
mbomb007

2
Kelimeleri ayıran nedir? Herhangi bir boşluk (sekmeler, yeni satırlar, vb.) Veya yalnızca boşluklar?
Steven Rumbalski

Yanıtlar:


21

CJam, 15 13 bayt

Lq{_eu?_S-}/;

CJam tercümanında çevrimiçi olarak deneyin .

pseudocode

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)

Değiştirilen tüm C karakterleri istif üzerinde bırakılır ve bu nedenle çıkarken yazdırılır.


3
Kahretsin bu akıllıca. D:
Martin Ender

Kabul etmeliyim ki, kod karakterli bir dilde 4 karakter ile birisini aşmak başlı başına bir başarı ... iyi iş.
WallyWest

12
@WallyWest: Golf dilleri, kendilerini golf oynadıkları izlenimini verebilir, ancak yapmadıkları konusunda sizi temin ederim. TMTOWTDI tüm diller için ve özellikle de birçok yerleşik dil için geçerlidir. Bazen kazanırsın , bazen kaybedersin ve bazen bir kamyonetin çarptığını hissedersin .
Dennis

13

CSS 2.1, 49

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

Açıklama :

  • attrİşlevi, bir girdi alır t(metin) HTML niteliğine.
  • Giriş ayarlayarak sermayeleştirilir text-transformiçin capitalize.
  • Çıktı, sözde elemancontent üzerindeki özellik kullanılarak oluşturulan bir içerik olarak sağlanır .::after

Çalıştırılabilir pasajı :

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

Not : CSS 2.1 istenen davranışı belirledi: capitalizeher kelimenin ilk harfini büyük harfle yazdı. Bununla birlikte, CSS3 her kelimenin ilk tipografik harf birimini büyük harflerle yazmaktadır . Bu yüzden yukarıdaki snippet, CSS 2.1’i izlemeyen eski IE’de düzgün çalışmaz; ne de CSS3'ü takip eden yeni uyumlu tarayıcılarda.


Oh, bu akıllıca!
IQAndreas

1
( _thoseCSS3 tarayıcılarındaki sorun konusunda çok kötü , ancak sorunun çözülmesinin benzersiz yolundan dolayı hala can atıyorum.)
IQAndreas

@Oriol, "ah bu akıllı!" aslında! Üzgünüm IQAndreas, buradaki yorumunuzu ödünç almam gerekiyor ... bu sorunu çözme konusunda ustaca bir yaklaşım ... bu yaklaşımı kullanmak zorunda kalacağım ...
WallyWest

10

Javascript ( ES6 ), 77 bayt

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

Yorumlananlar

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
)

Sözcükler birden çok boşlukla ayrılırsa ne olur? [4b]
Caek

3
@Caek Tarafından işlenir x&&. Boş bir dize falsey, bu nedenle &&kısa devreler ve sol işlenen, boş dize döndürür. Boşluklar korunmuştur.
nderscore

Müthiş, açıklama için teşekkürler. Şimdi nasıl çalışabileceğimi anlamama yardımcı olabilir.
Caek

Bu Ascii olmayan karakterleri bile büyük harf yapar, böylece å Å olur!
leo,

9

Perl, 13 bayt

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

9 bayt artı 4 bayt 040p( özel çağrılarla ilgili kuralları doğru yorumladığımı varsayarak ).

-040giriş kaydı ayırıcısını $/tek bir boşluğa ayarlar , böylece boşluklar korunur; \uçıkış sırası başlık durumda yanındaki karakteri dönüştürür.


Harika iş, komut satırını kullanmak için onur verici söz!
WallyWest

7

CJam, 17 15 bayt

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

Burada test et.

Spesifikasyonun oldukça basit bir şekilde uygulanması. Yeni yararlanın {}&ardışık alanlar için hataları önlemek için.

Dennis tarafından kaydedilen iki bayt.


Harika şeyler! CJam öncelikle sadece bir golf dili mi, yoksa pratikte ticari uygulamaları var mı?
WallyWest

6
@WallyWest Hayır, sadece bir golf dili. Kesinlikle ticari uygulamaları yok, ancak kişisel olarak ara sıra hızlı atma komut dosyaları için kullanıyorum (çünkü birçok yerleşik yapıya sahip ve ne yaptığınızı biliyorsanız, o zaman daha az karakter yazmak, yazmaktan daha hızlı. daha fazla karakter;)).
Martin Ender

Her sözcüğe bir boşluk ekleyerek birkaç bayttan tasarruf edebilirsiniz. OP'nin soruma cevabına bağlı olarak, bu sizi 14 veya 12 bayta ulaştırabilir.
Dennis,

@Dennis Oh doğru, ben bununla oynuyordum, ama ilk karakteri çekmeden önce eklemeyi düşünmedim. Bunu yarın değiştireceğim, teşekkür ederim!
Martin Ender

@Dennis Teşekkürler, değiştirdim, ancak 14-byte versiyonunun ne demek istediğinden emin değilim. İkinciyi atlamaktan bahsediyorsanız +, giriş izleyen boşluklar içeriyorsa bu kırılır.
Martin Ender

7

C, 64 63 bayt

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

Düzeltme: bazı derleyiciler (Clang gibi) argv yerine bir int parametresi beğenmez, bu yüzden onu global bir değişkene taşıdım. Bayt sayısı aynı kalır. Farkındalık için squishish ossifrage sayesinde. 63 bayta kadar, teşekkürler Dennis.

Ungolfed:

int a;

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

Oldukça basit: eğer bir yanlışsa, karakter büyük harfe dönüştürülür. Boşluk okuduktan sonra ayarlanır: c - '' sadece c == '' ise yanlış. toupper (), küçük harf olmayan her şeyi yok sayar, böylece semboller ve birden çok boşluk yeterlidir. -1 tüm bitleri ayarladı, bu nedenle getchar () -1 döndürdüğünde, NOT işleci sıfır yapar ve döngü durur. a global bir değişken olarak bildirildi, bu yüzden sıfır (sıfır) olarak başlatıldı. Bu, ilk kelimenin büyük harfle yazılmasını sağlar.


1
while(~(c=getchar())- Bunu sevdim. Clang aslında bunu derlemeyecek, ancak aynı karakter sayısını elde edebilirsinizc;main(a){...}
squeamish ossifrage

1
Üçlü operatörün bildirimlerini ave csırasını değiştirirseniz ==, -bir byte tasarruf etmek için ile değiştirebilirsiniz .
Dennis

Haklısın tabi ki.
Andrea Biondo

Güzel! +1 Kullanırken program aynı şekilde çalışırdı while(!(c = getchar())), değil mi?
Spikatrix

1
@ Cool Guy: Hayır, bitsel ~ve mantıksal !aynı değildir. C de sıfır olmayan herhangi bir şeyin doğru olduğu kabul edilir, bu nedenle durumunuz while((c = getchar()) == 0)elbette işe yaramayacak gibi olacaktır. Bitsel NOT işleci ~, bit bit değerini reddeder. Döngüyü kırmak için, ~csıfır olmalıdır: bu, tüm bitlerin bir olması gerektiği anlamına gelir, böylece olumsuzlandığında tüm sıfır olur. Bu değer (32bit int için) 0xFFFFFFFF, eğer işaretlenmişse -1(EOF).
Andrea Biondo

7

Python 3, 59 56 bayt

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

3 baytlık @Reticality sayesinde.


3
Ne dersiniz print(end=f*c.upper()or c)? Bu 4 bayt kazandıracak

@Reticality Oh vay, sadece bir anahtar kelime argümanı ile boş bir baskı olabileceğini hiçbir fikrim yoktu. Teşekkürler!
Sp3000

7

Perl Sürüm <5.18, 30 27 26 25

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

24karakterler +1için-n .

\uBir dizgede bir sonraki karakteri büyük harf yapar . @BuSuitIsBlackNot bunu 1 byte tasarruf için işaret etti. Fonksiyonu kullanmadan önce ucfirst.

Gönderen perldocs ,

Başka bir özel durum olarak, split, PATTERN ya atlandığında ya da tek bir boşluk karakterinden (örneğin '' ya da "\ x20" gibi, ancak örneğin / /) oluşan değişmez bir dize olduğunda komut satırı aracının varsayılan davranışını taklit eder. Bu durumda, EXPR'deki tüm boşluklar bölme gerçekleşmeden önce kaldırılır ve PATTERN bunun yerine / \ s + /; özellikle, bu, herhangi bir bitişik boşlukun (sadece bir boşluk karakteri değil) ayırıcı olarak kullanıldığı anlamına gelir. Bununla birlikte, bu özel işlem, "" dizisi yerine desen / / belirtilerek önlenebilir, böylece yalnızca bir boşluk karakterinin ayırıcı olmasına izin verilir. Daha önceki Perls'da, bu özel durum Perl 5.18'de ayrılacak kalıp argümanı olarak "" düzlüğünün kullanımıyla sınırlıydı.

Dan beri $" bir boşluk olarak değerlendirilirse, bu boşluk korur. Hem $,boşluk karakterine ayarlamak, hem de bölmeye boşluk karakteri girmek istediğimiz için, @ nutki ikisini de bölmenin girişi olarak yapabileceğimize dikkat çekti. Bu, daha önce sahip olduklarımızdan 3 bayttan tasarruf eder, bu ilk ayar $,ve ardından $"bölmeye girer.

@ Alexander-brett'in işaret ettiği gibi, bir ,harita yerine bir harita kullanmak {}ek bir bayt kazandırır.

Çalıştır:

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 byte ile kaydet...map"\u$_",split...
alexander-brett

@ alexander-brett teşekkürler! Cevabı güncelledim.
hmatt1

5

> <> (Balık) , 39 bayt

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

Yöntem:

  • Bir char alın ve menzilde ise büyük harfle a-zyazdırın. (bu bölüm için soldan sağa kodi::'backquote')$'{'(*' '*+ )
  • Eğer son alınan karakter EOF karakter olduğunu daha sonra çıkmak başka yazdırmak
  • Eğer son alınan karakter bir boşluk char sonra noktası 1 gidin başka yeni bir mektup alıp noktasına 2'ye geçin.

5

JAVA, 273 bayt

DÜZENLE

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

Bu benim PCG'deki ilk cevabım, kabul edilebilir olup olmadığından emin değilim.
Atul Kumbhar

Gemiye Hoşgeldiniz! Boşlukları kaldırmayı ve değişken isimleri için tek karakterler kullanmayı deneyebilirsiniz. JAVA'da golf oynamak için başka ipuçları da var.
nderscore

Teşekkürler @ ipucu için ipucu, ipuçlarını kullanarak cevabımı düzenledik.
Atul Kumbhar

Daha iyi görünüyorsun! Ayrıca bayt sayısını sizin yerinize ekledim.
nderscore

1
@TuukkaX O yok publicönünde class.. Ve Şunu eğer o kaldırabilirsiniz publicönünde static void main(...o da değişmediği sürece, o zaman, yanlış classiçin interfaceve Java kullanır 8+.
Kevin Cruijssen

5

JavaScript (regex çözümü) - 104 bayt

Birisinin kurşunu ısırması ve RegEx çözümünü göndermesi gerekiyor! 74 karakter, artı +30 karakter cezası:

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

Ya da kodu sıkıştırılmamış bir şekilde okumak ve anlamak istiyorsanız:

//     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
Tabii eğer bir 30 karakter cezası bedel ödedim ama zekice ... ... Ben ... mermiyi ısırma için size şapka çıkarıyorum
WallyWest

4

Python 2,73 bayt

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

Bu program, bir boşluktan önce gelirse (dizedeki ilk karakter için bir tortu ile) bir harfi büyük harf yapar. .upper()Doğru şekilde büyük harf yapmak için string yöntemine güvenir .


2
Python 3'e geçerek 2 bayt tasarruf edebilirsiniz. (-4 raw_input=> input, +2 print=> print())
Steven Rumbalski

Sağol Steven. Python 3'te kodlayarak bayttaki tasarrufları düşünmüştüm. Daha sonra, dili rekabetçi olacak şekilde değiştirirsem Pyth olarak değiştireceğimi düşündüm. Python 2 alt liginde yarışmaktan mutluyum. Her gün iş için Python 2 kodluyorum, bu nedenle bu deneyim beni işimde daha iyi hale getiriyor (ancak iş kodum golf oynamıyor!).
Mantık Şövalyesi

4

PHP 64 76 77 83 84 89 bayt

$_GETPHP'de giriş sayılır mı ?
Eğer öyleyse, işte ilk CG girişimim

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

Teşekkürler manatwork :)

Biri sadece ucwords21 bayt ile sonuçlanacak olan fonksiyonu kullanabilir :

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

teşekkürler Harry Mustoe-Playfair :)


Şahsen ben sadece fgets(STDIN)girişi okumayı düşünüyorum . Ama bildiğim $_GETkadarıyla ilgili bir fikir birliğimiz yok .
Manatwork

Evet, işe yarıyor: D
Octfx

Uyarıları kapatmak için püf noktalarına ihtiyacınız yok. Bu uyarılar! Kimse onları umursamıyor.
Ismael Miguel

Bunu düşünmedim. Sanırım ben substr bağlı kalmak zorunda kalacağım
Octfx

Buna gerek yok. Kaldırmayla ilgili tavsiyemi unutmanın tam zamanı $k=>. Onu geri koy:foreach(split(' ',$_GET[@s])as$k=>$v)echo$k?' ':'',ucfirst($v);
Manatwork

4

Haskell, 69

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

Açıklama:

scanlbir işlev (a -> b -> a)ve bir başlangıç ​​değeri alır a, ardından [b]s'nin bir listesini yapmak için s listesi üzerinde yinelenir [a]:

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

Bu defalarca sürer önceki sonucunu olarak sol argüman kendisine geçirilen fonksiyon ve giriş listeden değer olarak doğru argüman sonraki biri yapmak.

Onu (!) :: Char -> Char -> Chargeçtiğiniz doğru karakteri döndüren bir işlev yazdım , ancak sol karakter ' '(boşluk) ise büyük harf kullan . Bunun için scanlşu anlama gelir: değeri giriş listesinden döndür , ancak önceki sonuç bir boşluksa , büyük harf kullan . Böylece scanl (!) ' ' "ab cd"olur:

    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"

' 'İlk harfi büyük harf yapmak için başlangıç ​​değerine ihtiyacımız var , ancak sonra bunu keseceğiztail nihai sonucumuzu almak için .


Güzel! Lütfen benim için açıklar mısın?
poida

Bir açıklama yazdım.
Lynn,

Biraz daha scanlörnek: bir , iki .
Lynn

@Mauris şunun gibi harika bir algoritma kullandığı için şüphe duyuyor ... :)
WallyWest

3

Pyth, 20 bayt

uXGHr@GH1fqd@+dzTUzz

Bu çoklu alanlar gerçekten berbat. Aksi takdirde, gerçekten kolay 12 baytlık bir çözüm olurdu.

Çevrimiçi deneyin: Pyth Compiler / Executor

açıklama

                      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

düzenleme: @Dennis algoritması ile 16 karakter mümkündür.


1
The multiple space thing is there to make it a lot more challenging... otherwise it would be a simple case of string.split(" ") or something similar... But you've done well to do it in 20 characters
WallyWest

3

CJam, 14 bytes

It's not the shortest, but...

qS/Sf.{\eu}s1>

Another answer using similar ideas:

qS/Laf.{;eu}S*

.x only changes the first item if one of the parameters has only one item.


1
Chaining f and . is pretty ingenious. Another 14 bytes variant: qS/Sf.{\eu}S.-
Dennis

3

Lua, 64 62 61 bytes

Lua is a horrendous language to golf in, so I'm pretty proud of myself for this one.

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

[Try it here]1 Outdated, will update tommorow


1
Welcome to PPCG! Surely, you don't need those spaces after commas?
Martin Ender

Wow, I'm so new to this I didnt even know spaces counted. 62 bytes!

2
I also just noticed it's not entirely correct: you are capitalising letters after all non-letters, so abc_def will give Abc_Def. However only letters after spaces should be turning into upper case. The good news is, fixing it saves a byte. ;)
Martin Ender

3

JAVA, 204 211 226 bytes

My first entry on CG, I hope it's fine:

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

Saved 7 bytes thanks to @TNT


Involving my poor Java skills: 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
Welcome to PPCG! The public modifier isn't necessary so you can save 7 more.
TNT

3

PHP: 76 74 characters

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

Sample run:

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

Instead of ucfirst($c), use $c^' '. (Tip: if you bitwise-xor a letter with a space, it will be converted from uppercase to lowercase, and the oposite applies too)
Ismael Miguel

@IsmaelMiguel, that works fine in your solution as you process only lowercase letters. But in my solution all first characters are processed. So for the (otherwise great) xor trick my code would also need some character type filtering. :(
manatwork

That didn't crossed my mind. There must be a bitwise trick to check if it is a letter or not.
Ismael Miguel

1
One thing you can do is $l=str_split(fgets(STDIN)), which reduces the code by 2 bytes!
Ismael Miguel

1
Now I'm going mad. Man, how long I starred to that initialization and missed it. Thank you, @IsmaelMiguel.
manatwork

3

C, 74 bytes

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

Makes no assumptions about the run-time character set (ASCII, EBCDIC, Baudot, ...whatever). Does assume that EOF is negative (I think C guarantees that).

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

a is the input character; b is true if the last character was space. The only non-obvious bit is that we use the fact that putchar returns the character printed if there's no error.


3

C# Linq - 187

This is nowhere close to winning but I just love Linq too much.

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

Bash, 61

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

Note the colons are simply to make the program display OK here. In reality these can be some non-printable character, such as BEL.

Output

$ ./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
$ 

Bash, 12

Sadly this one doesn't preserve leading/mutliple/trailing spaces, but otherwise it works:

echo "${@^}"

Output

$ ./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
But that's half the challenge!
Sp3000

1
@Sp3000 there I fixed it (at as cost of 49 chars)
Digital Trauma

2

Pip, 15 + 1 for -s = 16

{IaUC:a@0a}Ma^s

Explanation:

                  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)

One interesting feature of Pip that this program draws on is the : assignment meta-operator. Most C-like languages have some set of compute-and-assign operators: e.g. x*=5 does the same thing as x=x*5. In Pip, however, you can tack : onto any operator and turn it into a compute-and-assign operator. This even goes for unary operators. So -:x computes -x and assigns it back to x, the same as x:-x would. In this case, UC: is used (together with Pip's mutable strings) to uppercase the first character of a word.

The program takes input from the command-line, requiring an invocation like this:

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

2

C, 125

Not the shortest of solutions, but I really like to golf in 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();
  }
}

I don't know wheter using regex-like syntax in scanf is streching the rules, but it works quite nicely. (Well, technically it's not a full regex)

An other thing to consider is that this code only works for words shorter than 99 bytes. But I think this solution will work for most cases.


Hint: &=223 --> -=32
edc65

2

Haskell: 127 characters

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

I got down to 69 bytes.
Lynn

2

PHP, 82

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

Usage :

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

Do you need &&c!=32? I'm not too fluent in C#, but I would guess that converting a space to uppercase results in a space.
DLosc

Whoops, thanks - that was from before I made some other changes, I think. You're correct it's not needed.
Blorgbeard

try "using C=System.Console;" instead of using system
Ewan

2

Mathematica, 66 bytes

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

I would use ToCamelCase, but it doesn't preserve spacing.


2

R, 139 105 bytes

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

Ungolfed + explanation:

# 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 with regex, 49 41 + 30 = 71 bytes

I'm really bummed; this actually has a better score using regular expressions with the penalty.

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

This matches any single character at the beginning of the string or following any number of spaces and replaces it with an uppercase version of the capture. Note that applying \\U is legit and has no effect for non-letters. pe=T is interpreted as perl = TRUE since it takes advantage of R's partial matching of function parameters and the synonym for TRUE. For whatever reason, R doesn't use Perl-style regular expression by default.

Thanks to MickyT for helping save 8 bytes on the regex approach!


With your regex the matching string could be (^.| +.). Uppercasing anything is OK.
MickyT

@MickyT: Good idea, thanks! Edited to use your suggestion.
Alex A.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.