Großschreibung des ersten Buchstabens jedes eingegebenen Wortes

34

Dies ist eine relativ schnelle, aber ich bin sicher, dass es Ihnen gefallen wird.

Codegolf ist ein Programm, das Eingaben in Form eines Satzes vornimmt und dann die Ausgabe mit dem ersten Buchstaben in Großbuchstaben für jedes Wort liefert.

Regeln:

  1. Beiträge dürfen nicht in Form einer Funktion eingereicht werden. Also nein:

    function x(y){z=some_kind_of_magic(y);return z;} als endgültige Antwort ... Ihr Code muss zeigen, dass er Eingaben akzeptiert und Ausgaben liefert.

  2. Der Code muss alle anderen Großbuchstaben der Eingabe beibehalten. So

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

    wird gerendert als

    ECommerce And EBusiness Are Cool, Don't You Agree, Richard III?
    
  3. Einige von Ihnen denken vielleicht: "Einfach, ich benutze nur Regex!" Wenn Sie also die native Regex in der von Ihnen gewählten Golfsprache verwenden, wird eine 30-Zeichen-Strafe verhängt, die auf Ihre endgültige Codezählung angewendet wird. Böses Lachen

  4. Ein "Wort" ist in diesem Fall alles, was durch ein Leerzeichen getrennt ist. Daher palate cleanserist zwei Wörter, während pigeon-toedein Wort betrachtet wird. if_you_love_her_then_you_should_put_a_ring_on_itwird als ein Wort angesehen. Beginnt ein Wort mit einem nicht alphabetischen Zeichen, _thisbleibt das Wort erhalten, sodass es nach dem Rendern unverändert bleibt _this. (Ein großes Lob an Martin Buttner für den Hinweis auf diesen Testfall).

    • 4b. Es gibt keine Garantie dafür, dass Wörter in der Eingabephrase durch ein einzelnes Leerzeichen getrennt werden.
  5. Testfall (bitte zum Testen des Codes verwenden):

    Eingang:

    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
    

    Ausgabe:

    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. Das ist Code Golf, der kürzeste Code gewinnt ...

Viel Glück...

WallyWest
quelle
1
Was ist mit Leerzeichen am Ende der Zeile? Müssen wir sie bewahren? Können wir einen hinzufügen, wenn er unseren Bedürfnissen entspricht?
Dennis
2
Dennis, bitte bewahre Leerzeichen vor der Eingabe ...
WallyWest
3
! = TitleCase verdammt noch mal! c # verliert WIEDER!
Ewan
1
@Tim Das doppelte Leerzeichen vor Taubenzehen ist korrekt . Er sagte, um Abstand zu bewahren.
mbomb007
2
Was trennt die Wörter? Beliebige Leerzeichen (Tabulatoren, Zeilenumbrüche usw.) oder nur Leerzeichen?
Steven Rumbalski

Antworten:

21

CJam, 15 13 Bytes

Lq{_eu?_S-}/;

Probieren Sie es online im CJam-Interpreter aus .

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)

Alle geänderten Zeichen C verbleiben auf dem Stapel und werden daher beim Verlassen gedruckt.

Dennis
quelle
3
Verdammt, das ist schlau. D:
Martin Ender
Ich muss zustimmen, jemanden in einer Codegolf-Sprache um 4 Zeichen zu übertreffen, ist eine Meisterleistung für sich ... gut gemacht.
WallyWest
12
@WallyWest: Golfsprachen können den Eindruck erwecken, dass sie selbst Golf spielen, aber ich versichere Ihnen, dass dies nicht der Fall ist. TMTOWTDI gilt für alle Sprachen und insbesondere für diejenigen mit vielen integrierten Funktionen. Manchmal gewinnt man , manchmal verliert man und manchmal fühlt man sich von einem LKW angefahren .
Dennis
13

CSS 2.1, 49

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

Erklärung :

  • Die attrFunktion übernimmt die Eingabe von einem t(Text-) HTML-Attribut.
  • Die Eingabe wird durch Setzen text-transformauf großgeschrieben capitalize.
  • Die Ausgabe wird als generierter Inhalt unter Verwendung der contentEigenschaft eines Pseudoelements bereitgestellt .::after

Runnable-Snippet :

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

Hinweis : CSS 2.1 hat das gewünschte Verhalten angegeben: capitalizeGroßbuchstaben für jedes Wort. In CSS3 wird jedoch der erste typografische Buchstabe jedes Wortes in Großbuchstaben geschrieben . Das obige Snippet funktioniert also auch nicht mit dem alten IE, der CSS 2.1 nicht gefolgt ist. noch auf neuen kompatiblen Browsern, die CSS3 folgen.

Oriol
quelle
Oh, das ist schlau!
IQAndreas
1
( _thoseSchade um das Problem in CSS3-Browsern, aber ich bin immer noch auf dem neuesten Stand wegen der einzigartigen Art und Weise, das Problem zu lösen.)
IQAndreas
@Oriol, "oh das ist schlau!" tatsächlich! Tut mir leid, IQAndreas, ich muss Ihren Kommentar hier ausleihen. Dies ist ein genialer Ansatz zur Lösung des Problems. Ich muss diesen Ansatz
anwenden.
10

Javascript ( ES6 ), 77 Byte

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

Kommentiert

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
)
nderscore
quelle
Was passiert, wenn Wörter durch mehrere Leerzeichen getrennt sind? [4b]
Caek,
3
@ Kaek Es wird von der gehandhabt x&&. Eine leere Zeichenfolge ist falsch, daher schließt sie &&kurz und gibt den linken Operanden zurück, die leere Zeichenfolge. Leerzeichen bleiben erhalten.
nderscore
Super, danke für die Erklärung. Könnte mir helfen, herauszufinden, wie ich es jetzt zum Laufen bringen kann.
Caek,
Dadurch werden auch Nicht-ASCII-Zeichen großgeschrieben, sodass aus å Å wird!
Leo
9

Perl, 13 Bytes

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

9 Bytes plus 4 Bytes für 040p(vorausgesetzt, ich habe die Regeln für Spezialaufrufe richtig interpretiert ).

-040Setzt das Trennzeichen $/für Eingabedatensätze auf ein einzelnes Leerzeichen, sodass Leerzeichen erhalten bleiben. Die \uEscape-Sequenz konvertiert das nächste Zeichen in die Groß- und Kleinschreibung.

ThisSuitIsBlackNot
quelle
Großartige Arbeit, lobende Erwähnung für die Verwendung der Befehlszeile!
WallyWest
7

CJam, 17 15 Bytes

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

Teste es hier.

Ziemlich unkomplizierte Umsetzung der Spezifikation. Nutzen Sie das Neue {}&, um Fehler bei aufeinanderfolgenden Leerzeichen zu vermeiden.

Zwei von Dennis gespeicherte Bytes.

Martin Ender
quelle
Tolles Zeug! Ist CJam in erster Linie nur eine Golfsprache oder hat es einige praktische kommerzielle Anwendungen?
WallyWest
6
@WallyWest Nein, es ist nur eine Golfsprache. Es gibt definitiv keine kommerziellen Anwendungen, aber ich persönlich verwende es gelegentlich für schnelle Wegwerfskripte (weil es viele integrierte Funktionen hat und wenn Sie wissen, was Sie tun, ist es schneller, weniger Zeichen einzugeben als zu tippen mehr Zeichen;)).
Martin Ender
Sie können einige Bytes sparen, indem Sie an jedes Wort ein Leerzeichen anhängen. Abhängig von der Antwort des OP auf meine Frage können Sie damit entweder 14 oder 12 Bytes erreichen.
Dennis
@Dennis Oh, richtig, ich habe damit rumgespielt, aber ich habe nicht darüber nachgedacht, es einfach hinzuzufügen, bevor ich den ersten Charakter gezogen habe. Ich werde das morgen ändern, danke!
Martin Ender
@Dennis Danke, ich habe es geändert, aber ich bin mir nicht sicher, welche 14-Byte-Version du meintest. Wenn Sie über das Weglassen der Sekunde sprechen +, bricht dies ab, wenn die Eingabe nachgestellte Leerzeichen enthält.
Martin Ender
7

C, 64 63 Bytes

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

Fix: Einige Compiler (wie Clang) mögen keine int-Parameter anstelle von argv, deshalb habe ich sie in eine globale Variable verschoben. Die Byteanzahl bleibt gleich. Dank squeamish Ossifrage für das Bemerken. Bis zu 63 Bytes, danke Dennis.

Ungolfed:

int a;

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

Ganz einfach: Wenn a falsch ist, wird das Zeichen in Großbuchstaben umgewandelt. Es wird nach dem Lesen eines Leerzeichens gesetzt: c - '' ist nur dann falsch, wenn c == '' ist. toupper () ignoriert alles, was kein Kleinbuchstabe ist, so dass Symbole und mehrere Leerzeichen in Ordnung sind. In -1 sind alle Bits gesetzt. Wenn also getchar () -1 zurückgibt, macht der NOT-Operator den Wert zu Null und die Schleife stoppt. a wird als globale Variable deklariert und daher mit Null (false) initialisiert. Dies stellt sicher, dass das erste Wort groß geschrieben wird.

Andrea Biondo
quelle
1
while(~(c=getchar())- Ich mag es. Clang wird dies nicht kompilieren, aber Sie können die gleiche Anzahl von Zeichen mitc;main(a){...}
squeamish Ossifrage
1
Wenn Sie die Erklärungen austauschen aund cund die Reihenfolge des ternären Operator können Sie ersetzen ==mit -einem Byte zu speichern.
Dennis
Sie haben natürlich recht.
Andrea Biondo
Nett! +1 Das Programm würde genauso funktionieren while(!(c = getchar())), oder?
Spikatrix
1
@Cool Guy: Nein, das Bitweise ~und das Logische !sind nicht dasselbe. In C wird alles, was nicht Null ist, als wahr angesehen, so dass Ihre Bedingung wie while((c = getchar()) == 0)die wäre, die natürlich nicht funktioniert. Der bitweise NOT-Operator ~negiert den Wert bitweise. Um die Schleife ~czu unterbrechen, muss Null sein: Dies bedeutet, dass alle Bits Eins sein müssen, damit sie bei Negation alle Nullen werden. Dieser Wert (für ein 32-Bit-Int) 0xFFFFFFFFist -1(EOF) , wenn er signiert ist .
Andrea Biondo,
7

Python 3, 59 56 Bytes

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

Danke an @Reticality für 3 Bytes.

Sp3000
quelle
3
Wie wäre es print(end=f*c.upper()or c)? Das würde 4 Bytes sparen
@Reticality Oh wow, ich hatte keine Ahnung, dass Sie einen leeren Ausdruck mit nur einem Schlüsselwort arg haben könnten. Vielen Dank!
Sp3000,
7

Perl-Version <5.18, 30 27 26 25

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

24Zeichen +1für -n.

\uLegt das nächste Zeichen in Großbuchstaben fest . @ThisSuitIsBlackNot wies darauf hin, um 1 Byte zu sparen. Bevor wir die Funktion verwendeten ucfirst.

Von den perldocs ,

Als weiteren Sonderfall emuliert split das Standardverhalten des Befehlszeilen-Tools awk, wenn das PATTERN entweder weggelassen wird oder eine Literalzeichenfolge, die aus einem einzelnen Leerzeichen besteht (z. B. '' oder "\ x20", jedoch nicht z. B. / /). In diesem Fall werden führende Leerzeichen in EXPR vor dem Aufteilen entfernt, und das PATTERN wird stattdessen so behandelt, als wäre es / \ s + /; Dies bedeutet insbesondere, dass zusammenhängende Leerzeichen (nicht nur ein einzelnes Leerzeichen) als Trennzeichen verwendet werden. Diese spezielle Behandlung kann jedoch vermieden werden, indem das Muster // anstelle der Zeichenfolge "" angegeben wird, wodurch nur ein einzelnes Leerzeichen als Trennzeichen zulässig ist. In früheren Perls war dieser Sonderfall auf die Verwendung eines einfachen "" als zu teilendes Musterargument in Perl 5.18 beschränkt.

Da $"ein Leerzeichen ausgewertet wird, bleiben die Leerzeichen erhalten. Da wir beide $,ein Leerzeichen setzen und ein Leerzeichen in die Teilung eingeben möchten, hat @nutki darauf hingewiesen, dass wir beide als Eingabe für die Teilung ausführen können. Das spart 3 Bytes von dem, was wir vorher hatten, was zuerst eingestellt $,und dann $"in die Aufteilung eingegeben wurde .

Die Verwendung einer ,for-Map anstelle von {}speichert ein zusätzliches Byte, wie @ alexander-brett hervorhob.

Laufen mit:

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$,=$"'
hmatt1
quelle
1
Speichern Sie 1 Byte mit...map"\u$_",split...
Alexander-Brett
@ alexander-brett danke! Ich habe die Antwort aktualisiert.
hmatt1
5

> <> (Fisch) , 39 Bytes

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

Methode:

  • Nehmen Sie ein Zeichen und aktivieren Sie es, wenn es sich in Reichweite befindet. a-zDrucken Sie es dann aus. (Code von links nach rechts für diesen Teil ist i::'backquote')$'{'(*' '*+)
  • Wenn das zuletzt aufgenommene char ein EOF char ist dann beenden sonst ausdrucken
  • Wenn das zuletzt gewählte Zeichen ein Leerzeichen ist, gehe zu Punkt 1, ansonsten nimm einen neuen Buchstaben und gehe zu Punkt 2.
randomra
quelle
5

JAVA, 273 Bytes

BEARBEITEN

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);}}
Atul Kumbhar
quelle
Dies ist meine erste Antwort in PCG, nicht sicher, ob dies akzeptabel ist.
Atul Kumbhar
Willkommen an Bord! Sie können versuchen, Leerzeichen zu entfernen und einzelne Zeichen für Variablennamen zu verwenden. Es gibt noch einige andere Tipps zum Golfen mit JAVA .
nderscore
Danke @nderscore für den Hinweis, ich habe meine Antwort mit den Tipps bearbeitet.
Atul Kumbhar
Sieht besser aus! Ich habe auch die Byteanzahl in Ihren Beitrag für Sie eingefügt.
nderscore
1
@TuukkaX Er hat nicht publicvor dem class.. Und wenn du meinst, er kann das publicvor dem entfernen static void main(..., dann liegst du falsch, es sei denn er ändert auch das classauf interfaceund benutzt Java 8+.
Kevin Cruijssen
5

JavaScript (Regex-Lösung) - 104 Byte

Jemand muss die Kugel beißen und die RegEx-Lösung posten! 74 Zeichen plus 30 Zeichen Strafe:

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

Oder wenn Sie den Code nicht komprimiert lesen und verstehen möchten:

//     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(); }
IQAndreas
quelle
1
Clever ... obwohl Sie den Preis natürlich mit einer 30-Zeichen-Strafe bezahlt haben ... Ich nehme meinen Hut ab, weil Sie in die Kugel
gebissen haben
4

Python 2, 73 Bytes

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

Bei diesem Programm wird ein Buchstabe mit einem vorangestellten Leerzeichen großgeschrieben (mit einem Klumpen für das erste Zeichen in der Zeichenfolge). Die .upper()korrekte Großschreibung basiert auf der String-Methode.

Logik-Ritter
quelle
2
Sie könnten 2 Bytes sparen, indem Sie nach Python 3 raw_inputinputprintprint()
portieren
Vielen Dank, Steven. Ich hatte die Einsparungen an Bytes durch die Codierung in Python 3 in Betracht gezogen. Dann dachte ich, wenn ich die Sprache ändern würde, um wettbewerbsfähig zu sein, würde ich zu Pyth wechseln. Ich freue mich, in der Python 2-Unterliga anzutreten. Ich programmiere in Python 2 jeden Tag für die Arbeit, daher verbessert mich diese Erfahrung in meinem Beruf (aber mein Arbeitscode ist nicht gut genug!).
Logic Knight
4

PHP 64 76 77 83 84 89 Bytes

Zählt $_GETals Eingabe in PHP?
Wenn ja, hier ist mein erster CG-Versuch

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

Danke manatwork :)

Man könnte einfach die ucwordsFunktion verwenden, die 21 Bytes ergeben würde:

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

danke Harry Mustoe-Playfair :)

Octfx
quelle
Persönlich halte ich nur fgets(STDIN)Eingaben zum Lesen. $_GETSoweit ich weiß, besteht jedoch kein Konsens .
manatwork
Ja, das funktioniert: D
Octfx
Sie brauchen keine Tricks, um die Warnungen zu unterdrücken. Das sind Warnungen! Niemand kümmert sich um sie.
Ismael Miguel
Na ja, daran habe ich nicht gedacht. Ich
schätze,
Keinen Bedarf. Es ist nur Zeit, meine früheren Ratschläge zum Entfernen zu vergessen $k=>. Setzen Sie es zurück: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

Erläuterung:

scanlNimmt eine Funktion (a -> b -> a)und einen Anfangswert aund iteriert dann über eine Liste von [b]s, um eine Liste von [a]s zu erstellen:

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

Das vorherige Ergebnis wird wiederholt als linkes Argument der übergebenen Funktion und ein Wert aus der Eingabeliste als rechtes Argument verwendet , um das nächste zu erstellen.

Ich habe eine Funktion geschrieben (!) :: Char -> Char -> Char, die das richtige Zeichen zurückgibt, das Sie übergeben, aber es großschreibt, wenn das linke Zeichen ' '(Leerzeichen) ist. Für scanlbedeutet dies: Den Wert aus der Eingabeliste zurückgeben , ihn aber großschreiben, wenn das vorherige Ergebnis ein Leerzeichen war. So scanl (!) ' ' "ab cd"wird:

    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"

Wir brauchen den Anfangswert ' ', um den ersten Buchstaben groß zu schreiben, aber dann hacken wir ihn mit ab tail, um unser Endergebnis zu erhalten.

Lynn
quelle
Nett! Kannst du es mir bitte erklären?
Poida
Ich habe eine Erklärung geschrieben.
Lynn
Noch ein scanlpaar Beispiele: eins , zwei .
Lynn
@ Mauris Lob für die Verwendung eines so großartigen Algorithmus ... :)
WallyWest
3

Pyth, 20 Bytes

uXGHr@GH1fqd@+dzTUzz

Diese mehreren Räume sind wirklich scheiße. Sonst hätte es eine wirklich einfache 12-Byte-Lösung gegeben.

Probieren Sie es online aus: Pyth Compiler / Executor

Erläuterung

                      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

edit: 16 Zeichen sind mit dem @ Tennis-Algorithmus möglich.

Jakube
quelle
1
Das Multiple-Space-Ding ist dazu da, es viel herausfordernder zu machen ... ansonsten wäre es ein einfacher Fall von string.split ("") oder etwas ähnlichem ... Aber du hast es gut gemacht, es in 20 Zeichen zu machen
WallyWest
3

CJam, 14 Bytes

Es ist nicht die kürzeste, aber ...

qS/Sf.{\eu}s1>

Eine andere Antwort mit ähnlichen Ideen:

qS/Laf.{;eu}S*

.x Ändert das erste Element nur, wenn einer der Parameter nur ein Element enthält.

jimmy23013
quelle
1
Verkettung fund .ist ziemlich genial. Weitere 14-Byte-Variante:qS/Sf.{\eu}S.-
Dennis
3

Lua, 64 62 61 Bytes

Lua ist eine schreckliche Sprache zum Golfspielen, deshalb bin ich ziemlich stolz auf mich.

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

[Versuchen Sie es hier] 1 Veraltet, wird morgen aktualisiert


quelle
1
Willkommen bei PPCG! Sicherlich brauchen Sie diese Leerzeichen nach dem Komma nicht?
Martin Ender
Wow, ich bin so neu darin, dass ich nicht einmal wusste, dass Leerzeichen gezählt werden. 62 Bytes!
2
Mir ist auch gerade aufgefallen, dass es nicht ganz richtig ist: Sie schreiben nach allen Nichtbuchstaben Großbuchstaben, also abc_defgeben Sie Abc_Def. Es sollten jedoch nur Buchstaben nach Leerzeichen in Großbuchstaben umgewandelt werden. Die gute Nachricht ist, dass ein Byte eingespart wird, wenn das Problem behoben wird. ;)
Martin Ender
3

Java, 204 211 226 Bytes

Mein erster Eintrag auf CG, ich hoffe es ist in Ordnung:

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 Bytes dank @TNT gespart

Angelo Tricarico
quelle
Einbeziehung meiner schlechten Java-Kenntnisse: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
Willkommen bei PPCG! Der publicModifikator ist nicht erforderlich, Sie können also weitere 7 speichern.
TNT
3

PHP: 76 74 Zeichen

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

Probelauf:

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
Mann bei der Arbeit
quelle
ucfirst($c)Verwenden Sie stattdessen $c^' '. (Tipp: Wenn Sie bitwise-xoreinen Buchstaben mit einem Leerzeichen haben, wird er von Groß- in Kleinbuchstaben konvertiert, und das Gegenteil gilt auch)
Ismael Miguel
@IsmaelMiguel, das funktioniert in Ihrer Lösung einwandfrei, da Sie nur Kleinbuchstaben verarbeiten. Aber in meiner Lösung werden alle ersten Zeichen verarbeitet. Für den (ansonsten großartigen) xor-Trick würde mein Code also auch eine Zeichenfilterung benötigen. :(
manatwork
Das ist mir nicht in den Sinn gekommen. Es muss einen bitweisen Trick geben, um zu prüfen, ob es sich um einen Buchstaben handelt oder nicht.
Ismael Miguel
1
Eine Sache, die Sie tun können, ist $l=str_split(fgets(STDIN)), den Code um 2 Bytes zu reduzieren!
Ismael Miguel
1
Jetzt werde ich verrückt. Mann, wie lange habe ich bei dieser Initialisierung mitgespielt und sie verpasst? Vielen Dank, @IsmaelMiguel.
manatwork
3

C 74 Bytes

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

Es werden keine Annahmen über den Laufzeitzeichensatz getroffen (ASCII, EBCDIC, Baudot, ... was auch immer). Nimmt an, dass EOF negativ ist (ich denke, C garantiert das).

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

a ist das Eingabezeichen; b ist wahr, wenn das letzte Zeichen ein Leerzeichen war. Das einzige nicht offensichtliche Problem ist, dass wir die Tatsache verwenden, dass putchardas gedruckte Zeichen zurückgegeben wird, wenn kein Fehler vorliegt.

Toby Speight
quelle
3

C # Linq - 187

Dies ist bei weitem nicht zu gewinnen, aber ich liebe Linq einfach zu sehr.

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));}}}
Verdammt
quelle
3

Vim, 11 , 10 Bytes

qqvUW@qq@q

Erläuterung:

qq           #Start recording in register 'q'
  vU        #Make the character under the cursor uppercase
     W       #Move forward a WORD
      @q     #recursively call macro 'q'
        q    #stop recording
         @q  #Call the recursive macro

Bekomme ich ein goldenes Abzeichen dafür, dass ich Dennis übervorteilt habe?

DJMcMayhem
quelle
2

Bash, 61

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

Beachten Sie, dass die Doppelpunkte lediglich dazu dienen, das Programm hier in Ordnung zu bringen. In Wirklichkeit kann es sich dabei um ein nicht druckbares Zeichen handeln, z. B. BEL.

Ausgabe

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

Leider behält dieses keine führenden / mehrfachen / nachfolgenden Leerzeichen bei, aber ansonsten funktioniert es:

echo "${@^}"

Ausgabe

$ ./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
$ 
Digitales Trauma
quelle
5
Aber das ist die halbe Herausforderung!
Sp3000,
1
@ Sp3000 dort habe ich es behoben (zum Preis von 49 Zeichen)
Digital Trauma
2

Pip , 15 + 1 für -s= 16

{IaUC:a@0a}Ma^s

Erläuterung:

                  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)

Ein interessantes Merkmal von Pip, auf das dieses Programm zurückgreift, ist der :Zuweisungs-Metaoperator. Die meisten C-ähnlichen Sprachen haben eine Reihe von Compute-and-Assign-Operatoren: z. B. x*=5das Gleiche wie x=x*5. In Pip, jedoch können Sie tack :auf jeden Bediener und machen es zu einem Rechen-and-assign - Operator. Dies gilt auch für unäre Operatoren. So -:xberechnet -xund weist sie zurück , um xdas gleiche wie, x:-xtun würde. In diesem Fall,UC: wird (zusammen mit Pips veränderlichen Zeichenfolgen) das erste Zeichen eines Wortes in Großbuchstaben geschrieben.

Das Programm nimmt Eingaben über die Befehlszeile entgegen und erfordert einen Aufruf wie diesen:

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

C 125

Nicht die kürzeste Lösung, aber ich spiele sehr gerne 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();
  }
}

Ich weiß nicht, ob die Verwendung von Regex-ähnlicher Syntax scanfdie Regeln übertrifft, aber es funktioniert ganz gut. (Nun, technisch ist es keine vollständige Regex)

Eine andere zu berücksichtigende Sache ist, dass dieser Code nur für Wörter funktioniert, die kürzer als 99 Bytes sind. Aber ich denke, diese Lösung wird in den meisten Fällen funktionieren.

MarcDefiant
quelle
Hinweis: & = 223 -> - = 32
edc65
2

Haskell: 127 Zeichen

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
Poida
quelle
Ich bin auf 69 Bytes runtergekommen .
Lynn
2

PHP, 82

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

Verwendung :

$ 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"
kuldeep.kamboj
quelle
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;}}}
Blorgbart
quelle
Sie braucht &&c!=32? Ich spreche nicht fließend C #, aber ich würde vermuten, dass das Konvertieren eines Leerzeichens in Großbuchstaben zu einem Leerzeichen führt.
DLosc
Whoops, danke - das war, bevor ich einige andere Änderungen vorgenommen habe, denke ich. Du hast recht, es wird nicht benötigt.
Blorgbeard
versuchen Sie "using C = System.Console;" anstatt system zu benutzen
Ewan
2

Mathematica, 66 Bytes

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

Ich würde verwenden ToCamelCase, aber es wird der Abstand nicht beibehalten.

LegionMammal978
quelle
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 + Erklärung:

# 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 mit Regex, 49 41 + 30 = 71 Bytes

Ich bin wirklich verblüfft. Dies hat tatsächlich eine bessere Punktzahl mit regulären Ausdrücken mit der Strafe.

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

Dies entspricht einem einzelnen Zeichen am Anfang der Zeichenfolge oder nach einer beliebigen Anzahl von Leerzeichen und ersetzt es durch eine Großbuchstabenversion des Captures. Beachten Sie, dass die Bewerbung \\Ulegitim ist und keine Auswirkungen auf Nicht-Briefe hat. pe=Twird interpretiert alsperl = TRUE es die teilweise Übereinstimmung von Funktionsparametern und dem Synonym für R ausnutzt TRUE. Aus irgendeinem Grund verwendet R standardmäßig keinen regulären Ausdruck im Perl-Stil.

Vielen Dank an MickyT, der 8 Bytes beim Regex-Ansatz gespart hat!

Alex A.
quelle
Mit Ihrer Regex könnte die passende Zeichenfolge sein (^.| +.). Alles ist in Ordnung.
MickyT
@ MickyT: Gute Idee, danke! Bearbeitet, um Ihren Vorschlag zu verwenden.
Alex A.