Scrivi in ​​maiuscolo la prima lettera di ogni parola di input


34

Questo è relativamente veloce, ma sono sicuro che ti piacerà.

Codegolf è un programma che prenderà input sotto forma di frase e quindi fornirà all'output la prima lettera maiuscola in ogni parola.

Regole:

  1. Le presentazioni potrebbero non essere sotto forma di una funzione. Quindi no:

    function x(y){z=some_kind_of_magic(y);return z;} come risposta finale ... Il tuo codice deve mostrare che accetta input e fornisce output.

  2. Il codice deve conservare qualsiasi altra lettera maiuscola contenuta nell'input. Così

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

    sarà reso come

    ECommerce And EBusiness Are Cool, Don't You Agree, Richard III?
    
  3. Alcuni di voi potrebbero pensare: "Facile, userò solo regex!" e quindi l'uso della regex nativa nella lingua da golf prescelta comporterà una penalità di 30 caratteri che verrà applicata al conteggio del codice finale. Risata malefica

  4. Una "parola" in questo caso è qualsiasi cosa separata da uno spazio. Pertanto palate cleansersono due parole, mentre pigeon-toedè considerata una parola. if_you_love_her_then_you_should_put_a_ring_on_itè considerata una parola. Se una parola inizia con un carattere non alfabetico, la parola viene preservata, quindi _thisdopo il rendering rimane come _this. (Complimenti a Martin Buttner per aver segnalato questo caso di test).

    • 4b. Non vi è alcuna garanzia che le parole nella frase di input siano separate da un singolo spazio.
  5. Test Case, (si prega di utilizzare per testare il codice):

    Ingresso:

    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
    

    Produzione:

    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. Questo è il codice golf, il codice più corto vince ...

In bocca al lupo...


1
Che dire degli spazi alla fine della linea? Dobbiamo preservarli? Possiamo aggiungerne uno se soddisfa le nostre esigenze?
Dennis,

2
Dennis, ti preghiamo di preservare gli spazi dall'ingresso ...
WallyWest,

3
! = TitleCase dam it! c # perde ANCORA!
Ewan,

1
@Tim Il doppio spazio prima di Pigeon-toed è corretto . Ha detto di preservare la distanza.
mbomb007,

2
Cosa separa le parole? Qualche spazio bianco (tab, newline, ecc.) O solo spazi?
Steven Rumbalski

Risposte:


21

CJam, 15 13 byte

Lq{_eu?_S-}/;

Provalo online nell'interprete CJam .

pseudocodice

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)

Tutti i caratteri modificati C vengono lasciati in pila e, quindi, stampati all'uscita.


3
Accidenti, questo è intelligente. D:
Martin Ender,

Devo essere d'accordo, superare in astuzia qualcuno di 4 caratteri in un linguaggio codegolf è un'impresa in sé ... ben fatto.
WallyWest,

12
@WallyWest: le lingue del golf possono dare l'impressione di giocare a golf da sole, ma ti assicuro che non lo fanno. TMTOWTDI è vero per tutte le lingue e specialmente per quelli con molti built-in. A volte vinci , a volte perdi e a volte ti senti colpito da un camion .
Dennis,

13

CSS 2.1, 49

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

Spiegazione :

  • La attrfunzione accetta l'input da un tattributo HTML (di testo).
  • L'input viene capitalizzato impostando text-transformsu capitalize.
  • L'output viene fornito come contenuto generato, utilizzando la contentproprietà su uno pseudo-elemento .::after

Snippet eseguibile :

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

Nota : CSS 2.1 ha specificato il comportamento desiderato: ha messo in capitalizemaiuscolo il primo carattere di ogni parola. Tuttavia, CSS3 mette in maiuscolo la prima unità tipografica di ogni parola. Quindi lo snippet sopra non funzionerà correttamente né sul vecchio IE, che non seguiva CSS 2.1; né sui nuovi browser conformi che seguono CSS3.


Oh, questo è intelligente!
IQAndreas,

1
( _thosepeccato per il problema sui browser CSS3, ma sto ancora eseguendo l'upgrade a causa del modo unico di risolvere il problema.)
IQAndreas

@Oriol, "oh, questo è intelligente!" infatti! Mi dispiace IQAndreas, devo prendere in prestito il tuo commento qui ... questo è un approccio ingegnoso per risolvere il problema ...
dovrò

10

Javascript ( ES6 ), 77 byte

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

Commentate

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
)

Cosa succede se le parole sono separate da più spazi? [4b]
Caek,

3
@Caek È gestito da x&&. Una stringa vuota è falsa, quindi i &&cortocircuiti e restituisce l'operando di sinistra, la stringa vuota. Gli spazi sono preservati.
nderscore,

Fantastico, grazie per la spiegazione. Potrebbe aiutarmi a capire come posso farlo funzionare ora.
Caek,

Questo metterà in maiuscolo anche i personaggi non Ascii, così che å diventerà Å!
Leo,

9

Perl, 13 byte

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

9 byte più 4 byte per 040p(supponendo che io abbia interpretato correttamente le regole sulle invocazioni speciali ).

-040imposta il separatore del record di input $/su un singolo spazio, in modo da preservare gli spazi; la \usequenza di escape converte il carattere successivo in maiuscolo / minuscolo.


Ottimo lavoro, menzione d'onore per l'utilizzo della riga di comando!
WallyWest,

7

CJam, 17 15 byte

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

Provalo qui.

Implementazione abbastanza semplice della specifica. Utilizzare il nuovo {}&per evitare errori per spazi consecutivi.

Due byte salvati da Dennis.


Roba fantastica! CJam è principalmente solo un linguaggio di golf o ha alcune applicazioni commerciali pratiche?
WallyWest,

6
@WallyWest No, è solo una lingua da golf. Sicuramente non ha applicazioni commerciali , ma lo uso personalmente di tanto in tanto per gli script a eliminazione rapida (perché ha molti incorporati e se sai cosa stai facendo, quindi digitare meno caratteri è più veloce della digitazione più personaggi;)).
Martin Ender,

È possibile salvare alcuni byte aggiungendo uno spazio a ciascuna parola. A seconda della risposta dell'OP alla mia domanda, ciò potrebbe portare a 14 o 12 byte.
Dennis,

@Dennis Oh giusto, ci stavo giocando, ma non ho considerato semplicemente di aggiungerlo prima di interpretare il primo personaggio. Lo cambierò domani, grazie!
Martin Ender,

@Dennis Grazie, l'ho cambiato, ma non sono sicuro di quale versione di 14 byte intendevi. Se stai parlando di omettere il secondo +, ciò si interrompe se l'input contiene spazi finali.
Martin Ender,

7

C, 64 63 byte

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

Correzione: ad alcuni compilatori (come Clang) non piace un parametro int al posto di argv, quindi l'ho spostato in una variabile globale. Il conteggio dei byte rimane lo stesso. Grazie all'ossifrage schizzinoso per aver notato. Fino a 63 byte, grazie Dennis.

Ungolfed:

int a;

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

Abbastanza semplice: se a è falso, il personaggio viene convertito in maiuscolo. Viene impostato dopo aver letto uno spazio: c - '' è falso solo se c == ''. toupper () ignora tutto ciò che non è una lettera minuscola, quindi i simboli e gli spazi multipli vanno bene. -1 ha tutti i bit impostati, quindi quando getchar () restituisce -1 l'operatore NOT lo rende zero e il ciclo si arresta. a viene dichiarato come variabile globale, quindi è inizializzato su zero (falso). Questo assicura che la prima parola sia maiuscola.


1
while(~(c=getchar())- Mi piace. Clang in realtà non lo compilerà, ma puoi ottenere lo stesso conteggio dei personaggic;main(a){...}
ossifrage squeamish

1
Se si scambiano le dichiarazioni di ae ce l'ordine del operatore ternario, è possibile sostituire ==con -per salvare un byte.
Dennis,

Hai ragione, ovviamente.
Andrea Biondo,

Bello! +1 Il programma funzionerebbe allo stesso modo quando si usa while(!(c = getchar())), giusto?
Spikatrix,

1
@Cool Guy: No, il bit ~per bit e il logico !non sono gli stessi. In C tutto ciò che non è zero è considerato vero, quindi la tua condizione sarebbe come quella while((c = getchar()) == 0)che ovviamente non funzionerà. L'operatore bit a bit NOT ~annulla il valore bit per bit. Per interrompere il loop, ~cdeve essere zero: questo significa che tutti i bit devono essere uno, quindi quando vengono negati diventano tutti zero. Quel valore (per un int a 32 bit) è 0xFFFFFFFF, che, se firmato, è -1(EOF).
Andrea Biondo,

7

Python 3, 59 56 byte

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

Grazie a @Reticality per 3 byte.


3
Che ne dici print(end=f*c.upper()or c)? Ciò consentirebbe di risparmiare 4 byte

@Reticità Oh wow, non avevo idea che avresti potuto avere una stampa vuota con solo una parola chiave arg. Grazie!
Sp3000,

7

Versione Perl <5.18, 30 27 26 25

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

24personaggi +1per -n.

\urende il carattere successivo in una stringa maiuscola . @ThisSuitIsBlackNot lo ha sottolineato per salvare 1 byte. Prima stavamo usando la funzione ucfirst.

Dai perldoc ,

Come altro caso speciale, split emula il comportamento predefinito dello strumento da riga di comando awk quando il PATTERN viene omesso o una stringa letterale composta da un singolo carattere di spazio (come '' o "\ x20", ma non ad esempio / /). In questo caso, qualsiasi spazio bianco iniziale in EXPR viene rimosso prima che si verifichi la divisione e il PATTERN viene invece trattato come se fosse / \ s + /; in particolare, ciò significa che qualsiasi spazio bianco contiguo (non solo un singolo carattere di spazio) viene utilizzato come separatore. Tuttavia, questo trattamento speciale può essere evitato specificando il modello / / invece della stringa "", consentendo in tal modo a un solo carattere di spazio di essere un separatore. Nel precedente Perls questo caso speciale era limitato all'uso di un "" semplice come argomento del modello da dividere, in Perl 5.18.

Poiché $"valuta uno spazio, ciò preserverà gli spazi. Dal momento che entrambi vogliamo impostare $,un carattere spaziale e inserire un carattere spaziale nella divisione, @nutki ha sottolineato che possiamo fare entrambi come input per la divisione. Ciò consente di risparmiare 3 byte da ciò che avevamo prima, che era prima l'impostazione $,e quindi l'immissione $"nella divisione.

Usare una ,mappa for invece di {}salvare un byte aggiuntivo, come ha sottolineato @ alexander-brett.

Corri con:

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

@ alexander-brett grazie! Ho aggiornato la risposta.
hmatt1,

5

> <> (Pesce) , 39 byte

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

Metodo:

  • Prendi un carattere e capitalizzalo se nel raggio di azione, a-zquindi stampalo. (il codice da sinistra a destra per questa parte è i::'backquote')$'{'(*' '*+)
  • Se l'ultimo carattere preso è un carattere EOF, allora esci altrimenti stampalo
  • Se l'ultimo carattere intrapresa è un char spazio poi andare al punto 1 altro prendere una nuova lettera e passare al punto 2.

5

JAVA, 273 byte

MODIFICARE

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

Questa è la mia prima risposta in PCG, non sono sicuro che sia accettabile.
Atul Kumbhar,

Benvenuto a bordo! Potresti provare a rimuovere gli spazi bianchi e usare singoli caratteri per i nomi delle variabili. Ci sono anche altri suggerimenti per giocare a golf JAVA .
nderscore,

Grazie @nderscore per il suggerimento, ho modificato la mia risposta usando i suggerimenti.
Atul Kumbhar,

Guardando meglio! Ho anche aggiunto il conteggio dei byte nel tuo post per te.
nderscore,

1
@TuukkaX Non ha publicdi fronte alla class.. E se si intende che può rimuovere il publicfronte della static void main(..., allora vi sbagliate, a meno che non cambia anche il classper interfacee utilizza Java 8+.
Kevin Cruijssen,

5

JavaScript (soluzione regex) - 104 byte

Qualcuno deve mordere il proiettile e pubblicare la soluzione RegEx! 74 caratteri, più la penalità di +30 caratteri:

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

O se vuoi leggere e comprendere il codice nel suo modo non compattato:

//     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
Intelligente ... anche se ovviamente hai pagato il prezzo con una penalità di 30 caratteri ... Mi tolgo il cappello per
avermi

4

Python 2, 73 byte

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

Questo programma mette in maiuscolo una lettera se preceduto da uno spazio (con un kludge per il primo carattere nella stringa). Si basa sul .upper()metodo stringa per capitalizzare correttamente.


2
Puoi salvare 2 byte raw_inputinputprintprint()
eseguendo

Grazie Steven. Avevo considerato i risparmi in byte codificando in Python 3. Poi ho pensato che, se avessi cambiato lingua per essere competitivo, avrei cambiato in Pyth. Sono felice di competere nella sotto-lega Python 2. Codifico in Python 2 ogni giorno per lavoro, quindi questa esperienza mi rende migliore nel mio lavoro (ma il mio codice di lavoro non è golf!).
Logic Knight,

4

PHP 64 76 77 83 84 89 byte

Non $_GETconta come input in PHP?
Se è così, ecco il mio primo tentativo di CG

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

Grazie manatwork :)

Si potrebbe semplicemente usare la ucwordsfunzione, che comporterebbe 21 byte:

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

grazie Harry Mustoe-Playfair :)


Personalmente considero solo fgets(STDIN)di leggere input. Ma non abbiamo consenso $_GETper quanto ne so.
arte

Sì, funziona: D
Ottfx,

Non hai bisogno dei trucchi per far tacere gli avvertimenti. Sono avvertimenti! A nessuno importa di loro.
Ismael Miguel,

Beh, non ci ho pensato.
Suppongo che dovrò attenermi

Non ce n'è bisogno. È solo il momento di dimenticare i miei precedenti consigli sulla rimozione $k=>. foreach(split(' ',$_GET[@s])as$k=>$v)echo$k?' ':'',ucfirst($v);
Rimettilo a posto

4

Haskell, 69

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

Spiegazione:

scanlaccetta una funzione (a -> b -> a)e un valore iniziale a, quindi scorre su un elenco di [b]s per creare un elenco di [a]s:

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

Prende ripetutamente il risultato precedente come argomento sinistro della funzione passato ad esso e un valore dall'elenco di input come argomento giusto per creare il successivo.

Ho scritto una funzione (!) :: Char -> Char -> Charche restituisce il carattere giusto che lo passi, ma lo rende maiuscolo se il carattere sinistro è ' '(spazio). Per scanlquesto significa: restituire il valore dalla lista di input , ma capitalizzare se il risultato precedente era uno spazio. Quindi scanl (!) ' ' "ab cd"diventa:

    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"

Abbiamo bisogno del valore iniziale ' 'per scrivere in maiuscolo la prima lettera, ma poi lo tronciamo tailper ottenere il nostro risultato finale.


Bello! Puoi spiegarmelo per favore?
poida,

Ho scritto una spiegazione
Lynn,

Alcuni altri scanlesempi: uno , due .
Lynn,

@Mauris complimenti per aver usato un algoritmo così grande come questo ... :)
WallyWest

3

Pyth, 20 byte

uXGHr@GH1fqd@+dzTUzz

Questi spazi multipli fanno davvero schifo. Altrimenti ci sarebbe stata una soluzione davvero semplice da 12 byte.

Provalo online: Pyth Compiler / Executor

Spiegazione

                      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

modifica: 16 caratteri è possibile con l'algoritmo @Dennis.


1
Lo spazio multiplo è lì per renderlo molto più impegnativo ... altrimenti sarebbe un semplice caso di string.split ("") o qualcosa di simile ... Ma hai fatto bene a farlo in 20 caratteri
WallyWest,

3

CJam, 14 byte

Non è il più corto, ma ...

qS/Sf.{\eu}s1>

Un'altra risposta usando idee simili:

qS/Laf.{;eu}S*

.x cambia il primo elemento solo se uno dei parametri ha un solo elemento.


1
Incatenarsi fed .è piuttosto geniale. Un'altra variante di 14 byte:qS/Sf.{\eu}S.-
Dennis,

3

Lua, 64 62 61 byte

Lua è una lingua orribile in cui giocare a golf, quindi sono abbastanza orgoglioso di me stesso per questo.

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

[Provalo qui] 1 Non aggiornato, aggiornerà domani


1
Benvenuti in PPCG! Sicuramente, non hai bisogno di quegli spazi dopo le virgole?
Martin Ender,

Wow, sono così nuovo in questo che non sapevo nemmeno che gli spazi contati. 62 byte!

2
Ho anche notato che non è del tutto corretto: stai capitalizzando le lettere dopo tutte le non lettere, quindi abc_defdarai Abc_Def. Tuttavia, solo le lettere dopo gli spazi dovrebbero diventare maiuscole. La buona notizia è che, risolvendolo, si salva un byte. ;)
Martin Ender,

3

JAVA, 204 211 226 byte

La mia prima voce su CG, spero che vada bene:

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

Salvato 7 byte grazie a @TNT


Coinvolgere le mie scarse abilità 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
Benvenuti in PPCG! Il publicmodificatore non è necessario, quindi puoi salvarne altri 7.
TNT,

3

PHP: 76 74 caratteri

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

Esecuzione di esempio:

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

Invece di ucfirst($c), utilizzare $c^' '. (Suggerimento: se bitwise-xoruna lettera con uno spazio, verrà convertita da maiuscola a minuscola e anche l'opposto si applica)
Ismael Miguel,

@IsmaelMiguel, che funziona bene nella tua soluzione mentre elabori solo lettere minuscole. Ma nella mia soluzione vengono elaborati tutti i primi personaggi. Quindi per il trucco xor (altrimenti eccezionale) il mio codice avrebbe bisogno anche di un filtro per il tipo di carattere. :(
arte

Non mi è passato per la testa. Deve esserci un trucco per verificare se si tratta di una lettera o meno.
Ismael Miguel,

1
Una cosa che puoi fare è $l=str_split(fgets(STDIN))ridurre il codice di 2 byte!
Ismael Miguel,

1
Ora sto impazzendo. Amico, per quanto tempo ho recitato a quell'inizializzazione e l'ho perso. Grazie, @IsmaelMiguel.
arte

3

C, 74 byte

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

Non fa ipotesi sul set di caratteri di runtime (ASCII, EBCDIC, Baudot, ... qualunque cosa). Suppone che EOF sia negativo (penso che C lo garantisca).

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

a è il carattere di input; b è vero se l'ultimo carattere era spazio. L'unico bit non ovvio è che usiamo il fatto che putcharrestituisce il carattere stampato se non ci sono errori.


3

C # Linq - 187

Questo non è affatto vicino alla vittoria, ma adoro Linq troppo.

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//:/ }"

Nota i due punti sono semplicemente per rendere OK il display del programma qui. In realtà questi possono essere dei caratteri non stampabili, come BEL.

Produzione

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

Purtroppo questo non conserva spazi iniziali / multipli / finali, ma altrimenti funziona:

echo "${@^}"

Produzione

$ ./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
Ma questa è metà della sfida!
Sp3000,

1
@ Sp3000 lì l'ho risolto (al costo di 49 caratteri)
Digital Trauma

2

Pip , 15 + 1 per -s= 16

{IaUC:a@0a}Ma^s

Spiegazione:

                  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)

Una caratteristica interessante di Pip su cui si basa questo programma è il :meta-operatore di assegnazione. La maggior parte dei linguaggi simili a C ha un insieme di operatori di calcolo e assegnazione: ad esempio x*=5fa la stessa cosa di x=x*5. In Pip, tuttavia, è possibile virare :su qualsiasi operatore e di trasformarlo in un operatore compute-e-assegnazione. Questo vale anche per gli operatori unari. Quindi -:xcalcola -xe lo riassegna ax , come x:-xfarebbe. In questo caso, UC:viene utilizzato (insieme alle stringhe mutabili di Pip) per mettere in maiuscolo il primo carattere di una parola.

Il programma accetta input dalla riga di comando, richiedendo una chiamata come questa:

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

2

C, 125

Non è la soluzione più breve, ma mi piace molto giocare a 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();
  }
}

Non so chi utilizzi la sintassi simile a regex in scanfsta stringendo le regole, ma funziona abbastanza bene. (Beh, tecnicamente non è una regex completa )

Un'altra cosa da considerare è che questo codice funziona solo per parole inferiori a 99 byte. Ma penso che questa soluzione funzionerà nella maggior parte dei casi.


Suggerimento: & = 223 -> - = 32
edc65,

2

Haskell: 127 caratteri

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

Sono arrivato a 69 byte .
Lynn,

2

PHP, 82

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

Utilizzo:

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

Ti serve &&c!=32? Non sono molto fluente in C #, ma immagino che la conversione di uno spazio in maiuscolo comporti uno spazio.
DLosc,

Whoops, grazie - che era di prima che facessi alcune altre modifiche, penso. Hai ragione, non è necessario.
Blorgbeard,

prova "usando C = System.Console;" invece di usare il sistema
Ewan

2

Mathematica, 66 byte

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

Vorrei usare ToCamelCase, ma non conserva la spaziatura.


2

R, 139 105 byte

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

Ungolfed + spiegazione:

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

Sono davvero distrutto; questo ha effettivamente un punteggio migliore usando le espressioni regolari con la penalità.

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

Questo corrisponde a qualsiasi singolo carattere all'inizio della stringa o seguendo un numero qualsiasi di spazi e lo sostituisce con una versione maiuscola dell'acquisizione. Si noti che l'applicazione \\Uè legittima e non ha alcun effetto per le non lettere. pe=Tviene interpretato come perl = TRUEpoiché sfrutta la corrispondenza parziale di R dei parametri di funzione e il sinonimo di TRUE. Per qualsiasi motivo, R non usa l'espressione regolare in stile Perl per impostazione predefinita.

Grazie a MickyT per aver contribuito a salvare 8 byte sull'approccio regex!


Con il tuo regex potrebbe essere la stringa corrispondente (^.| +.). Mettere in evidenza tutto è OK.
MickyT,

@MickyT: buona idea, grazie! Modificato per utilizzare il tuo suggerimento.
Alex A.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.