C’est relativement rapide, mais je suis sûr que vous l’aimerez.
Codegolf est un programme qui prend une entrée sous forme de phrase, puis fournit le résultat avec la première lettre en majuscule dans chaque mot.
Règles:
Les soumissions ne peuvent pas être sous la forme d'une fonction. Donc non:
function x(y){z=some_kind_of_magic(y);return z;}
en guise de réponse finale ... Votre code doit indiquer qu'il faut une entrée et une sortie.Le code doit conserver les autres lettres majuscules de l’entrée. Alors
eCommerce and eBusiness are cool, don't you agree, Richard III?
sera rendu comme
ECommerce And EBusiness Are Cool, Don't You Agree, Richard III?
Certains d'entre vous pensent peut-être: "Facile, je vais juste utiliser regex!" ainsi, l'utilisation de l'expression rationnelle native dans la langue de votre choix entraînera une pénalité de 30 caractères qui sera appliquée au nombre de codes final. Rire diabolique
Un "mot" dans ce cas est tout ce qui est séparé par un espace. Donc
palate cleanser
est deux mots, alors quepigeon-toed
est considéré comme un mot.if_you_love_her_then_you_should_put_a_ring_on_it
est considéré comme un mot. Si un mot commence par un caractère non alphabétique, le mot est conservé. Par conséquent, le_this
rendu reste identique à_this
. (Félicitations à Martin Buttner pour avoir signalé ce cas de test).- 4b. Rien ne garantit que les mots de la phrase d'entrée seront séparés par un seul espace.
Cas de test, (veuillez utiliser pour tester votre code):
Contribution:
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
Sortie:
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
C'est le code golf, le code le plus court gagne ...
Bonne chance...
la source
Réponses:
CJam,
15 à13 octetsEssayez-le en ligne dans l' interprète CJam .
Pseudocode
Tous les caractères modifiés C sont laissés sur la pile et sont donc imprimés lors de la sortie.
la source
CSS 2.1, 49
Explication :
attr
fonction prend l'entrée d'unt
attribut HTML (texte).text-transform
àcapitalize
.content
propriété sur un pseudo-élément .::after
Snippet exécutable :
Remarque : CSS 2.1 spécifiait le comportement souhaité: mettre en
capitalize
majuscule le premier caractère de chaque mot. Cependant, CSS3 met en majuscule la première unité de lettre typographique de chaque mot. Ainsi, l'extrait de code ci-dessus ne fonctionnera pas correctement, ni sur l'ancien IE, qui ne suivait pas CSS 2.1; ni sur les nouveaux navigateurs conformes qui suivent CSS3.la source
_those
problème sur les navigateurs CSS3, mais je vote toujours à cause de la façon unique de résoudre le problème.)Javascript ( ES6 ), 77 octets
Commenté
la source
x&&
. Une chaîne vide est falsey donc les&&
courts-circuits et retourne l'opérande gauche, la chaîne vide. Les espaces sont préservés.Perl, 13 octets
9 octets plus 4 octets pour
040p
(en supposant que j'ai correctement interprété les règles relatives aux invocations spéciales ).-040
définit le séparateur d'enregistrement d'entrée$/
sur un seul espace, les espaces sont donc préservés; la\u
séquence d'échappement convertit le caractère suivant en cas de titre.la source
CJam,
1715 octetsTestez-le ici.
Mise en œuvre assez simple de la spécification. Utilisez le nouveau
{}&
pour éviter les erreurs pour les espaces consécutifs.Deux octets enregistrés par Dennis.
la source
+
, cela se brise si l'entrée contient des espaces de fin.C,
6463 octetsCorrection: certains compilateurs (tels que Clang) n'aiment pas les paramètres int à la place de argv, je l'ai donc déplacé vers une variable globale. Le nombre d'octets reste le même. Merci à ossifrage délirant pour l'avoir remarqué. Jusqu'à 63 octets, merci Dennis.
Ungolfed:
Plutôt simple: si a est faux, le caractère est converti en majuscule. Il est défini après la lecture d'un espace: c - '' n'est faux que si c == ''. toupper () ignore tout ce qui n'est pas une lettre minuscule, les symboles et les espaces sont donc acceptables. -1 a tous les bits définis. Ainsi, lorsque getchar () renvoie -1, l'opérateur NOT le met à zéro et la boucle s'arrête. a est déclaré en tant que variable globale, il est donc initialisé à zéro (false). Cela garantit que le premier mot est en majuscule.
la source
while(~(c=getchar())
- J'aime ça. En fait, Clang ne compilera pas cela, mais vous pouvez obtenir le même nombre de personnages avecc;main(a){...}
a
etc
et l'ordre de l'opérateur ternaire, vous pouvez remplacer==
par-
pour enregistrer un octet.while(!(c = getchar()))
, non?~
et la logique!
ne sont pas les mêmes. En C, tout ce qui n’est pas nul est considéré comme vrai; votre condition serait donc comme siwhile((c = getchar()) == 0)
elle ne fonctionnait pas. L'opérateur~
bitwise NOT inverse la valeur bit par bit. Pour rompre la boucle, la valeur~c
doit être zéro: cela signifie que tous les bits doivent être un, de sorte que, une fois annulés, ils deviennent tous des zéros. Cette valeur (pour un int de 32 bits) est0xFFFFFFFF
, qui, si elle est signée, est-1
(EOF).Python 3,
5956 octetsMerci à @Reticality pour 3 octets.
la source
print(end=f*c.upper()or c)
vous Cela économiserait 4 octetsVersion Perl <5.18,
3027262524
personnages+1
pour-n
.\u
met le caractère suivant dans une chaîne en majuscule . @ThisSuitIsBlackNot ne l'a pas signalé pour sauvegarder 1 octet. Avant, nous utilisions la fonctionucfirst
.Du perldocs ,
Puisque
$"
évalue à un espace, ceci préservera les espaces. Puisque nous voulons tous les deux définir$,
un caractère d'espacement et saisir un caractère d'espacement dans la division, @nutki a souligné que nous pouvons effectuer les deux comme entrée de la division. Cela économise 3 octets par rapport à ce que nous avions auparavant, qui était d’abord paramétré$,
puis entré$"
dans la division.Utiliser une
,
carte au lieu d'{}
enregistrer un octet supplémentaire, comme l'a souligné @ alexander-brett.Courir avec:
la source
...map"\u$_",split...
> <> (Poisson) , 39 octets
Méthode:
a-z
puis imprimez-le. (le code de gauche à droite pour cette partie esti::'backquote')$'{'(*' '*+
)la source
JAVA, 273 octets
MODIFIER
la source
public
devant leclass
.. Et si vous voulez dire qu'il peut retirer lepublic
devant de lastatic void main(...
, vous avez tort, à moins qu'il change aussiclass
àinterface
et utilise Java 8+.JavaScript (solution regex) - 104 octets
Quelqu'un doit mordre la balle et publier la solution RegEx! 74 caractères, plus la pénalité de +30 caractères:
Ou si vous voulez lire et comprendre le code de manière non compactée:
la source
Python 2, 73 octets
Ce programme capitalise une lettre si elle est précédée d’un espace (avec un kludge pour le premier caractère de la chaîne). Il s’appuie sur la
.upper()
méthode string pour capitaliser correctement.la source
raw_input
=>input
, +2print
=>print()
)PHP 64
7677838489bytesDoes
$_GET
count as input in PHP?If so, here is my first CG attempt
Thanks manatwork :)
One could just use the
ucwords
function, which would result in 21 bytes:thanks Harry Mustoe-Playfair :)
la source
fgets(STDIN)
to read input. But we have no consensus on$_GET
as far as I know.$k=>
. Put it back:foreach(split(' ',$_GET[@s])as$k=>$v)echo$k?' ':'',ucfirst($v);
Haskell, 69
Explanation:
scanl
takes a function(a -> b -> a)
and an initial valuea
, then iterates over a list of[b]
s to make a list of[a]
s:It repeatedly takes the previous result as the left argument of the function passed to it, and a value from the input list as the right argument, to make the next one.
I wrote a function
(!) :: Char -> Char -> Char
that returns the right character you pass it, but capitalizes it if the left char is' '
(space). Forscanl
, this means: return the value from the input list, but capitalize it if the previous result was a space. Soscanl (!) ' ' "ab cd"
becomes:We need the initial value
' '
to capitalize the first letter, but then we chop it off withtail
to get our final result.la source
scanl
examples: one, two.Pyth, 20 bytes
These multiple spaces really sucks. Otherwise there would have been a really easy 12 bytes solution.
Try it online: Pyth Compiler/Executor
Explanation
edit: 16 chars is possible with @Dennis algorithm.
la source
CJam, 14 bytes
It's not the shortest, but...
Another answer using similar ideas:
.x
only changes the first item if one of the parameters has only one item.la source
f
and.
is pretty ingenious. Another 14 bytes variant:qS/Sf.{\eu}S.-
Lua,
646261 bytesLua is a horrendous language to golf in, so I'm pretty proud of myself for this one.
[Try it here]1 Outdated, will update tommorowla source
abc_def
will giveAbc_Def
. However only letters after spaces should be turning into upper case. The good news is, fixing it saves a byte. ;)JAVA, 204
211226bytesMy first entry on CG, I hope it's fine:
Saved 7 bytes thanks to @TNT
la source
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);}}
public
modifier isn't necessary so you can save 7 more.PHP:
7674 charactersSample run:
la source
ucfirst($c)
, use$c^' '
. (Tip: if youbitwise-xor
a letter with a space, it will be converted from uppercase to lowercase, and the oposite applies too)$l=str_split(fgets(STDIN))
, which reduces the code by 2 bytes!C, 74 bytes
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 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.la source
C# Linq - 187
This is nowhere close to winning but I just love Linq too much.
la source
Vim,
11, 10 bytesExplanation:
Do I get a gold-badge for outgolfing Dennis?
la source
Bash, 61
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
Bash, 12
Sadly this one doesn't preserve leading/mutliple/trailing spaces, but otherwise it works:
Output
la source
Pip, 15 + 1 for
-s
= 16Explanation:
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 asx=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 tox
, the same asx:-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:
la source
C, 125
Not the shortest of solutions, but I really like to golf in C.
ungolfed:
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.
la source
Haskell: 127 characters
la source
PHP, 82
Usage :
la source
C#,
133131la source
&&c!=32
? I'm not too fluent in C#, but I would guess that converting a space to uppercase results in a space.Mathematica, 66 bytes
I would use
ToCamelCase
, but it doesn't preserve spacing.la source
R,
139105 bytesUngolfed + explanation:
R with regex,
4941 + 30 = 71 bytesI'm really bummed; this actually has a better score using regular expressions with the penalty.
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 asperl = TRUE
since it takes advantage of R's partial matching of function parameters and the synonym forTRUE
. 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!
la source
(^.| +.)
. Uppercasing anything is OK.