Capitaliser la chaîne

18

Étant donné une chaîne, mettez-la en majuscule. Par capitalisation, j'entends les conTeNT-lENgthmodifications apportées à Content-Length. Dans l'exemple, j'ai montré la chaîne avec 2 mots avec -comme limite de mot. Cependant, je m'attends à ce que vous écriviez le code de la chaîne contenant un nombre quelconque de mots séparés par un seul caractère comme limite. Cette limite peut changer à travers la chaîne.

Conditions

  1. l'utilisation regular expressionsn'est pas autorisée .
  2. il peut y avoir n'importe quel nombre de mots dans une phrase (chaîne).
  3. chaque mot sera composé de Englishlettres [a-zA-Z]de n'importe quel cas.
  4. les différents mots de la phrase seront séparés par un seul caractère. Ce personnage ne sera l'une des -, ., <space-character>, /, &, #. Vous pouvez sans risque supposer que la phrase ne contiendra aucun autre caractère que ceux mentionnés.
  5. les limites des mots doivent être conservées dans la sortie.
  6. le code le plus court gagne.

Par exemple, votre programme devrait sortir Begin/With.Type&Contentpour BeGin/wITH.tyPE&conTeNt.

Some test cases:
 "aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe" 
 "type&AgeNt/CC/COnteNt lEnGth#acCePT/AgeNt.RAnGe-Cc/contEnt/cODe" 
 "cc/rEspoNCe.lEngtH#tYpE-witH&UsEr/bEgIN&uSer.AGEnT&begIn/aCCEPt/Cc" 
 "lENgTH#USeR.tYpE/BeGiN&LENGth tYpe/ACCEpt#rANge/codE&AnD-ACCepT/ConTenT" 
 "contENT/ACcEpT" 
 "BeGin/wITH.tyPE&conTeNt"
 "Code.cc#User.lenGTh-USer-AND&tyPE TypE&leNgtH.tYPe usER.UseR&with" 
 "RaNgE&COnTeNT WITh CoNTENT-TypE tyPe"
 "BEgin COdE#uSeR#aGeNt.USeR"
 "TypE LENGth"
homme chauve-souris
la source
2
Ce que vous appelez la capitalisation est en fait une transformation en chameau.
Pierre Arlaud
6
@ArlaudPierre Non, ce qu'il a donné comme "cas de test" ressemble plus à un cas de chameau. Ce que l'on appelle la capitalisation est plus proche de l'affaire du titre.
Iszi
Pouvez-vous fournir la sortie attendue pour les cas de test? Il semble que certaines fonctions intégrées supposent que les mots en majuscules (comme /CC/à la ligne 2 ou -AND&à la ligne 7) doivent être laissés seuls. Est-ce correct pour ce défi?
Iszi
L'entrée commence-t-elle toujours par un mot ou peut-elle commencer par un séparateur?
lebatsnok

Réponses:

7

GolfScript, 36 27 19 caractères

0\{95&+.47>32*\}%\;

Une approche GolfScript assez basique qui fonctionne pour toutes les entrées selon les spécifications. Les exemples peuvent être testés en ligne .

Howard
la source
Cool. Était curieux de savoir si ma solution est au moins deux fois plus professionnelle. :) Mais je suis sûr que vous raccourcirez cela plusieurs fois avant la fin de la journée.
manatwork
@manatwork Nous avons maintenant un facteur de deux ;-) Toujours mécontent de tous les échanges.
Howard
Je savais que tu ne me décevrais pas.
manatwork
22

Python 3,22

print(input().title())

Ce code prendra une chaîne en entrée de stdin et donnera une sortie en majuscule à stdout.

par exemple:

contribution:

BEGIN/wITH.tyPe&cOnTENt

sortie:

Begin/With.Type&Content

Le code suivant est pour les entrées multilignes (si nécessaire)

Python 3, 46

import sys
for i in sys.stdin:print(i.title())
Étais-je
la source
while 1:print(input.title())est un équivalent plus court pour le dernier morceau de code.
Ramchandra Apte
1
@RamchandraApte Je ne suis pas sûr que ce soit autorisé ou non. Votre code mourra avec un EOFError dès qu'il frappera l' EOF
Wasi
1
Je pense que le consensus général pour les golfs est que tant que la sortie est correcte, les erreurs n'ont pas d'importance
Volatilité
Dang; dès que j'ai vu cette question, j'y ai pensé, mais tu m'as battu. +1
Justin
+1 J'aime mieux cela que celui de golfscript car il ne ressemble pas à une obscénité.
Tim Seguine
6

Mathematica 62

Les données

tests={"aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe","type&AgeNt/CC/COnteNt lEnGth#acCePT/AgeNt.RAnGe-Cc/contEnt/cODe","cc/rEspoNCe.lEngtH#tYpEwitH&UsEr/bEgIN&uSer.AGEnT&begIn/aCCEPt/Cc","lENgTH#USeR.tYpE/BeGiN&LENGth tYpe/ACCEpt#rANge/codE&AnD-ACCepT/ConTenT","contENT/ACcEpT","BeGin/wITH.tyPE&conTeNt","Code.cc#User.lenGTh-USer-AND&tyPE TypE&leNgtH.tYPe usER.UseR&with","RaNgE&COnTeNT WITh CoNTENT-TypE tyPe","BEgin COdE#uSeR#aGeNt.USeR","TypE LENGth"}

Code

StringReplace[ToLowerCase@#,WordBoundary~~x_:>ToUpperCase@x]&

Usage

f["aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe"]

"Plage d’acceptation de l’agent / Type d’utilisateur. Type"

f /@ tests

{"Agent Accept / Longueur-Type User Range.Type",
"Type & Agent / Cc / Content Length # Accept / Agent.Range-Cc / Content / Code", "Cc / Responce.Length # Type-With & User / Begin & User.Agent & Begin / Accept / Cc "," Length # User.Type / Begin & Length Type / Accept # Range / Code & And-Accept / Content "," Content / Accept ",
" Begin / With.Type & Content ",
" Code.Cc # User.Length-User -Et & Type Type & Length.Type User.User & With ",
" Range & Content With Content-Type Type ",
" Begin Code # User # Agent.User ",
" Type Length "}

DavidC
la source
-1 C'est fondamentalement regex
CalculatorFeline
Mathematica peut exécuter regex directement mais j'ai utilisé autre chose. C'est similaire à l'expression régulière, mais ce n'est pas l'expression régulière.
DavidC
%% %%% % %%
CalculatorFeline
6

JavaScript (94)

prompt().split(l='').map(function(a){return l='A'>l?a.toUpperCase():a.toLowerCase()}).join('')
menthe douce
la source
5

PHP: 78 73 65 64 caractères

$b=ucfirst;foreach(str_split($s)as$c)echo$b($c),!$b[0]=$c<A?u:l;

L'entrée est transmise $s. Il opère sur la chaîne comme un tableau de caractères.

Il s'agit d'une simple machine à 2 états. Il repose sur l'ordre lexical des chaînes et que l'analyseur suppose automatiquement que vous vouliez taper une chaîne dans certains cas.

L'état est stocké dans $bet est représenté comme le nom de la fonction qui doit être appelée sur le caractère suivant. ucfirstet lcfirstsont plus courts à taper et ont un comportement identique à strtolower/ strtouppersur les chaînes de caractères uniques. De plus, comme ils ne diffèrent que par une seule lettre, nous pouvons les utiliser efficacement pour stocker l'état. La version d'origine devait stocker l'état explicitement dans un booléen.

Comme l'écho n'imprime rien pour les booléens faux, j'ai utilisé une virgule et le ! opérateur pour "masquer" l'affectation (qui dans ce cas est véridique) dans l'instruction echo. Cela m'a permis de sauvegarder un personnage en supprimant le {}.

Tim Seguine
la source
Veuillez utiliser le balisage de bloc de code au lieu du code en ligne, afin que les scripts tels que Code Golf UserScript Enhancement Pack puissent insérer la taille sous le code. Soit dit en passant, dans votre code, les 3 caractères d'espace peuvent être supprimés.
manatwork
Au lieu d' $b=ord($c)>64;essayer $b=$c>"@";. Ou même $b=$c>=A;- AFAIR qui lance un avertissement, mais les bonnes pratiques de codage ne sont pas une vertu ici.
manatwork
@manatwork merci, je n'y ai pas pensé. Je lance déjà un avertissement pour l'utilisation d'une variable non définie de toute façon.
Tim Seguine
Hmm… Qu'en est-il de ne pas utiliser $ b uniquement comme indicateur, mais d'y stocker le nom réel de la fonction? $b=ucfirst;foreach(str_split($s)as$c){echo$b($c);$b[0]=$c>=A?l:u;}.
manatwork
@manatwork great! J'essayais de penser à un moyen de le faire avec la fonction. Mes essais étaient tous plus grands.
Tim Seguine
4

C, 83

n;main(c){c=getchar();putchar(c>96?n?c:(n=c-32):c&64?n?c+32:(n=c):(n=0,c));main();}

Prend des lignes stdin, les traduit en stdout. (Préfère SIGINTà EOF.)

Darren Stone
la source
4

Powershell: 37 - 43

Selon la façon dont vous souhaitez prendre l'entrée ...

Inviter l'utilisateur à entrer: 43

(Culture).TextInfo.ToTitleCase((read-host))

Prendre la contribution du pipeline: 38

(Culture).TextInfo.ToTitleCase($input)

Fournissez une entrée comme argument lors de l'exécution du script: 37

(Culture).TextInfo.ToTitleCase($args)

REMARQUE: Les scripts ci-dessus ignoreront les mots en majuscules, les laissant tels quels. Si cela doit être pris en compte, l'entrée doit être forcée en minuscules avant la conversion de casse de titre. Cela ajoute 10 caractères à la première méthode et 12 aux deux autres.

(Culture).TextInfo.ToTitleCase((read-host).ToLower())
(Culture).TextInfo.ToTitleCase("$input".ToLower())
(Culture).TextInfo.ToTitleCase("$args".ToLower())
Iszi
la source
Ne fonctionne pas selon les spécifications. Essayez foo:bar.
Mormegil
@Mormegil Lequel? La version en lecture seule, au moins, fonctionne bien pour moi. Je l'ai testé par rapport à tous les cas de test dans la question et ils sont tous revenus comme prévu, sauf pour les cas spéciaux que j'ai postés en commentaire de la question.
Iszi
:(deux-points) n'est pas répertorié comme séparateur de mots dans la règle n ° 4, par conséquent, AFAICS, foo:bardevrait entraîner Foo:bar, non Foo:Bar . Mais ce n'est que ma lecture (assez stricte) de la spécification.
Mormegil
2
@Mormegil Eh bien, c'est bien. Il semble que la spécification a été modifiée pour résoudre cette ambiguïté, tout en n'invalidant pas cette réponse.
Iszi
1
Vous pouvez remplacer get-culturepar culture; voir codegolf.stackexchange.com/a/778/1308
Danko Durbić
4

Java - 209 caractères

class C{
public static void main(String[]a){
for(String b:a){
char[]k=b.toLowerCase().toCharArray();
for(int i=-1;i<k.length;i++){if(i<0||"-. /&#".indexOf(k[i])>=0)k[++i]=(char)(k[i]-32);}
System.out.println(k);}}}

J'ai ajouté des nouvelles lignes uniquement pour la lisibilité.

True Soft
la source
3

R, 143 116

Une solution un peu longue peut-être mais c'est parti:

f=function(x){a=sapply(1:nchar(x),function(y)substr(tolower(x),y,y));d=c(1,which(!a%in%letters)+1);a[d]=toupper(a[d]);cat(a,sep="")}

Légèrement non golfé et expliqué:

f <- function(x){
    #Split the string in characters and "lower-case" everything
    a <- sapply(1:nchar(x),function(y)substr(tolower(x),y,y))
    #Select the first character and each character following a 
    #character that doesn't belong to lower case alphabet
    d <- c(1,which(!a%in%letters)+1)
    #Make those ones uppercase.
    a[d] <- toupper(a[d])
    #Output (stdout) while pasting them back together.
    cat(a,sep="")
    }

Éditer : 116 caractères

Le principal défi ici est de vectoriser substr. Voici une autre façon moins verbeuse.

f=function(x){n=1:nchar(x);a=mapply(substr,tolower(x),n,n);d=c(T,!a%in%letters);a[d]=toupper(a[d]);cat(a[n],sep="")}

Dentelé:

f <- function(x){
    n <- 1:nchar(x)
    a <- mapply(substr,tolower(x),n,n)
    d <- c(T,!a%in%letters) #This has been simplified as well
    a[d] <- toupper(a[d])
    cat(a[n],sep="") #Because a is now 1 char longer than x, need to subset a
    }

Usage:

> f("aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe")
Agent Accept/Length-Type User Range.Type
plannapus
la source
Vous pouvez enregistrer certains caractères. Comme il ne acontient que des caractères en minuscules, il n'est pas nécessaire de vérifier les correspondances avec des majuscules LETTERS.
Sven Hohenstein
@SvenHohenstein en effet, merci!
plannapus
Un autre: vous pouvez remplacer TRUEpar T.
Sven Hohenstein
À l'origine, j'avais le tolowerplus tard.
plannapus
OK, voici un autre ;-) Vous pouvez remplacer mapply(substr,tolower(x),n,n) par strsplit(tolower(x),"")[[1]]pour enregistrer un caractère.
Sven Hohenstein,
3

Befunge 98 - 24 45

~\j:'``!3*j' -;:'``b*j:'/`!3*j' +#;:,'/`!jc#@

Écrire cela m'a fait mal au cerveau.

Cela prend l'entrée ~et si le caractère précédent était l'un des séparateurs (ou s'il n'y avait pas de caractère précédent), il s'exécute

:'``!3*j' -;

Cet extrait prend le caractère et si sa valeur ascii est supérieure ou égale à a, il en soustrait 32, le modifiant ainsi en majuscules. S'il est inférieur à a,3*j ignore le réglage. Ensuite, il saute la partie suivante. Cette partie gère le passage des majuscules aux minuscules (je suis sûr qu'elle peut être fusionnée avec la partie suivante; je ne sais pas comment):

:'``b*j:'/`!3*j' +#;

Le caractère est imprimé ( ,), puis cela vérifie si le caractère est l'une des limites:

'/`!

Il compare fondamentalement le caractère à la valeur ascii de /. Si le caractère n'est pas une frontière, le code pousse 12pour qu'il saute l'ajustement de capitalisation la prochaine fois. #saute le programme de fin:, @et si la fin de l'entrée est atteinte, ~renvoie l'exécution du code à la @fin du programme.

Justin
la source
3

Rubis: 60 51 50 47 caractères

$_.downcase.chars{|c|$><<$/=$/<?0?c.upcase: c}

Exemple d'exécution:

bash-4.1$ for line in "${test[@]}"; do printf '%-75s | %s\n' "$line" "$( ruby -ne '$_.downcase.chars{|c|$><<$/=$/<?0?c.upcase: c}' <<< "$line" )"; done
aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe                                    | Agent Accept/Length-Type User Range.Type
type&AgeNt/CC/COnteNt lEnGth#acCePT/AgeNt.RAnGe-Cc/contEnt/cODe             | Type&Agent/Cc/Content Length#Accept/Agent.Range-Cc/Content/Code
cc/rEspoNCe.lEngtH#tYpE-witH&UsEr/bEgIN&uSer.AGEnT&begIn/aCCEPt/Cc          | Cc/Responce.Length#Type-With&User/Begin&User.Agent&Begin/Accept/Cc
lENgTH#USeR.tYpE/BeGiN&LENGth tYpe/ACCEpt#rANge/codE&AnD-ACCepT/ConTenT     | Length#User.Type/Begin&Length Type/Accept#Range/Code&And-Accept/Content
contENT/ACcEpT                                                              | Content/Accept
BeGin/wITH.tyPE&conTeNt                                                     | Begin/With.Type&Content
Code.cc#User.lenGTh-USer-AND&tyPE TypE&leNgtH.tYPe usER.UseR&with           | Code.Cc#User.Length-User-And&Type Type&Length.Type User.User&With
RaNgE&COnTeNT WITh CoNTENT-TypE tyPe                                        | Range&Content With Content-Type Type
BEgin COdE#uSeR#aGeNt.USeR                                                  | Begin Code#User#Agent.User
TypE LENGth                                                                 | Type Length
homme au travail
la source
1
N'est-ce pas l==l.swapcasela même chose que l<?0(non testé)? Au moins pour l'entrée autorisée pour cette tâche.
Howard
Oui. Maintenant que batman a souligné qu'aucun autre séparateur n'est à prévoir, en effet c'est plus court. Merci, @Howard.
manatwork
2

C # - 110

Un traitement simple basé sur une machine à états finis:

x.Aggregate(new{b=1>0,r=""},(s,c)=>new{b="-. /&#".Contains(c),r=s.r+(s.b?Char.ToUpper(c):Char.ToLower(c))}).r

(où xest le stringpour capitaliser)

et bien sûr, si vous voulez être ennuyeux (après la mise à jour des spécifications), vous pouvez utiliser

new CultureInfo(9).TextInfo.ToTitleCase(x)

ou, avec tout le passe-partout ennuyeux:

class C{static void Main(string[]a){System.Console.WriteLine(new System.Globalization.CultureInfo(9).TextInfo.ToTitleCase(a[0]));}}
Mormegil
la source
Non, ne compilera pas car C # n'est pas un langage de script et vous devez l'encapsuler dans une classe.
Pierre Arlaud
2
Dit qui? Microsoft (R) Roslyn C# Compiler version 1.2.20906.1 Loading context from 'CSharpInteractive.rsp'. Type "#help" for more information. > "foobar".Aggregate(new{b=1>0,r=""},(s,c)=>new{b="-. /&#".Contains(c),r=s.r+(s.b?Char.ToUpper(c):Char.ToLower(c))}).r "Foobar"Mais si vous vous souciez vraiment du passe-partout ennuyeux, ajoutez 112 caractères.
Mormegil
1
Vous pouvez couper le publicet string[]adu passe
partout
Oh oui, vous avez raison public, mais j'ai besoin des arguments, car c'est ce que je traite…
Mormegil
2

Javascript 102

prompt().split(o=q='').map(function(c){o+=(q)?c.toLowerCase():c.toUpperCase(),q=('A'>c)?0:1})
alert(o)
marteau-de-loup
la source
Vous n'avez pas besoin ()autour de la condition ternaire. Plus encore, vous avez pas besoin du deuxième ternaire: function(c){o+=q?c.toLowerCase():c.toUpperCase(),q='@'<c}.
manatwork
2

Forth, 135

: s swap ;
: c 1 begin key dup 96 > if s if 32 - then 0 s 
else dup 64 > if s 0= if 32 + then 0 s then else 1 s then then emit again ; c

La sortie traduite est écrite au stdoutfur et à mesure de sa lecture stdin.

Darren Stone
la source
1
"puis émettez à nouveau" rimant avec avant!
cat
2

Befunge-98 (29), C (65)

Puisque la méthode / l'algorithme est à peu près le même, j'inclus les deux versions dans le même article. Les deux s'appuient sur le suivi du fait que le dernier caractère était un symbole ou une lettre, afin de savoir s'il faut minuscule ou non une lettre.

Befunge-98 (29)
#@~:'0` #v_,0>
',++@'% '<   ^
C (65)
c,d;main(){for(;~(c=getchar());d=c>48)putchar(c<48?c:c&95|32*d);}
Luciole
la source
2

05AB1E , 1 octet

Code:

Explication:

™   # Implicit input which is converted to title case.

Essayez-le en ligne!

Adnan
la source
C'est plutôt cool :-)
batman
1

Caractères Excel VBA-11

Dans la fenêtre Exécution

?[Proper()]

VBscript

Set xlapp = CreateObject("excel.application")
wscript.echo xlapp.Evaluate("Proper(""BeGin/wITH.tyPE&conTeNt"")"
brettdj
la source
Pourriez-vous fournir de l'aide sur l'utilisation? J'obtiens «Erreur de compilation: nom externe non défini». (Dans Word 2013 sur l'onglet Développeur, j'ai cliqué sur Visual Basic, puis dans Visual Basic pour Application j'ai copié-collé votre code dans la fenêtre
Exécution
@manatwork J'aurais dû préciser que c'était dans Excel. Vous pouvez le faire à partir de Word, mais le chemin est plus long car vous devez automatiser Excel.
brettdj
1
Cool. Fonctionne parfaitement lorsque VBA est démarré à partir d'Excel 2013.
manatwork
Fonctionne aussi directement dans Excel =PROPER(A1)
:,
1

AWK, 113 103 octets

{for(;++i<=split($0,a,"");){s=a[i]
O=O (L?tolower(s):toupper(s))
L=1
if(index("-. /&#",s))L=0}print O}

Cela fonctionne très bien pour le contenu sur une seule ligne, mais pour une entrée multiligne, quelques bits doivent être ajoutés

{O=""
for(L=0;++i<=split($0,a,"");){s=a[i]
O=O (L?tolower(s):toupper(s))
L=1
if(index("-. /&#",s))L=0}print O}

Ce serait bien si nous pouvions profiter de la division automatique d'un enregistrement en champs et de la modification de ces champs, mais nous perdrions alors nos séparateurs de champs. :(

Je sais que ce n'est pas la réponse la plus golfique et c'est une question plutôt ancienne, mais je pense que AWK est sous-représenté dans l'espace de réponse de CG :)

(Merci @manatwork pour avoir testé le code, cela devrait fonctionner maintenant :) A également changé le flux mais gardé le nombre d'octets le même, en remplaçant certains ;par des sauts de ligne.)

Robert Benson
la source
1
Êtes-vous sûr? Aucun des codes ne semble produire la sortie requise ni avec gawk, mawkni original-awk. (Testé sur Ubuntu.)
Manatwork
Il a été écrit à l'aide gawkd'une boîte RHEL6, puis transcrit dans une boîte Windows. Il pourrait très bien y avoir un problème de transcription. J'essaierai de tester après le travail quand je pourrai faire des tests et publier sur la même machine ... Je pense que je vois le problème, de toute façon. l=0devrait êtreL=0
Robert Benson
Espérons que cela fonctionne maintenant, @manatwork. Merci pour les tests. :)
Robert Benson
1
Semble maintenant fonctionner correctement. Non vérifié tous les cas de test, mais semble être possible de réduire un peu: {for(l=split($0,a,$0="");i<=l;s=a[++i]){$0=$0(L?toupper(s):tolower(s));L=index("-. /&#",s)}}1.
manatwork
J'aime votre utilisation de la modification $0et le 1libellé pour éviter la printcommande sont des choses auxquelles je n'ai pas pensé. Je devrai garder cela à l'esprit pour le futur golf :)
Robert Benson
1

PHP (> v5.4.32) - 25 caractères

<?=ucwords($a,'-. /&#')?>

Explication:

  • ucwords () est une fonction PHP intégrée

  • Le premier paramètre $aest l'entrée

  • Le deuxième paramètre est le délimètre (caractères non alphabétiques trouvés dans les cas de test)

  • Le retour / l'écho / l'impression est supposé en raison de l'utilisation de <?= ?>

Liens:

jpl42
la source
1
Salut et bienvenue sur le site! Je pense que pour le moment c'est un extrait qui n'est pas autorisé par défaut, mais vous pouvez obtenir 41 octets en tant que programme complet en utilisant -R: Essayez-le en ligne! ou 42 en utilisant des arguments: Essayez-le en ligne!
Dom Hastings
0

T-SQL, 179

DECLARE @T VARCHAR(MAX)='foo',@X VARCHAR(2),@ INT=0WHILE @<LEN(@T)SELECT @X=SUBSTRING(@T,@,2),@+=1,@T=STUFF(@T,@,1,IIF(@X LIKE'[a-Z]_',LOWER(RIGHT(@X,1)),UPPER(RIGHT(@X,1))))PRINT @T

Essayez la version SELECT dans SQL Server 2012 ici .

Remplacez "foo" par la chaîne d'entrée. Le nombre de caractères correspond à une chaîne de longueur nulle. Ce code traverse la chaîne à l'aide d'un index, en mettant en majuscule ou en minuscule le caractère à cette position en fonction du caractère précédent.

Muqo
la source
0

JavaScript (Node.js) , 70 octets

c=>a=>c.split``.map(b=>a="A">a?b.toUpperCase():b.toLowerCase()).join``

Essayez-le en ligne!

Je suis sûr que cela peut être joué plus loin.

Remarque :

Prend entrée via f(string)(), les derniers sont requis mais n'effectuent rien.

Muhammad Salman
la source
0

Powershell, 77 75 octets

Cette solution répond pleinement aux règles de la tâche (même exemple ambigu foo:bar).

-join($args|% t*y|%{"$_"|%('ToU*r','ToL*r')[+$l];$l=!('# -./&'|% Co*s $_)})

Voir également la solution Powershell avec fonction intégrée ToTitleCase de @Iszi.

Script de test expliqué:

$f = {

-join(
$args|% t*y|%{                   # for each char from input string
    "$_"|%('ToU*r','ToL*r')[+$l] # evaluate ToUpper or ToLower method depend on $l (lower) value
                                 # Note the variable $l is not defined for a first char
                                 # so it evaluates toUpper for the first char 
    $l=!('# -./&'|% Co*s $_)     # golfed form for $l=!'# -./&'.Contains($_) expression
                                 # =0 if the current char is specified separator (toUpper for next char)
}                                # =1 otherwise (toLower for next char)
)                                # finally, join all chars to a result string

}

@(
    ,('foo:bar'                                                                 ,'Foo:bar')
    ,('aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe'                                ,'Agent Accept/Length-Type User Range.Type')
    ,('type&AgeNt/CC/COnteNt lEnGth#acCePT/AgeNt.RAnGe-Cc/contEnt/cODe'         ,'Type&Agent/Cc/Content Length#Accept/Agent.Range-Cc/Content/Code')
    ,('cc/rEspoNCe.lEngtH#tYpE-witH&UsEr/bEgIN&uSer.AGEnT&begIn/aCCEPt/Cc'      ,'Cc/Responce.Length#Type-With&User/Begin&User.Agent&Begin/Accept/Cc')
    ,('lENgTH#USeR.tYpE/BeGiN&LENGth tYpe/ACCEpt#rANge/codE&AnD-ACCepT/ConTenT' ,'Length#User.Type/Begin&Length Type/Accept#Range/Code&And-Accept/Content')
    ,('contENT/ACcEpT'                                                          ,'Content/Accept')
    ,('BeGin/wITH.tyPE&conTeNt'                                                 ,'Begin/With.Type&Content')
    ,('Code.cc#User.lenGTh-USer-AND&tyPE TypE&leNgtH.tYPe usER.UseR&with'       ,'Code.Cc#User.Length-User-And&Type Type&Length.Type User.User&With')
    ,('RaNgE&COnTeNT WITh CoNTENT-TypE tyPe'                                    ,'Range&Content With Content-Type Type')
    ,('BEgin COdE#uSeR#aGeNt.USeR'                                              ,'Begin Code#User#Agent.User')
    ,('TypE LENGth'                                                             ,'Type Length')
) | % {
    $s,$e = $_
    $r = &$f $s
    "$($r-ceq$e): $r"
}

Production:

True: Foo:bar
True: Agent Accept/Length-Type User Range.Type
True: Type&Agent/Cc/Content Length#Accept/Agent.Range-Cc/Content/Code
True: Cc/Responce.Length#Type-With&User/Begin&User.Agent&Begin/Accept/Cc
True: Length#User.Type/Begin&Length Type/Accept#Range/Code&And-Accept/Content
True: Content/Accept
True: Begin/With.Type&Content
True: Code.Cc#User.Length-User-And&Type Type&Length.Type User.User&With
True: Range&Content With Content-Type Type
True: Begin Code#User#Agent.User
True: Type Length
mazzy
la source
0

QBasic, 74 octets

1c$=LCASE$(INPUT$(1))
IF f=0THEN c$=UCASE$(c$)
f=c$>"@
?c$;
IF""<c$GOTO 1

Les octets sont comptés dans CP-437 ;est un octet unique (code de caractère 20).

La méthode de saisie ici est un peu étrange: les caractères sont tapés un à la fois et leur capitalisation est convertie avant d'être affichée. Ainsi, lorsque vous tapez aGeNT, il apparaît à l'écran sous la forme Agent. Frapper Entermet fin au programme.

DLosc
la source
0

Python 3 , 122 octets

lambda s:''.join(chr(ord(c)+[[0,0],[0,32],[-32,0]][('@'<c<'[')-('`'<c<'{')]['@'<p<'['or'`'<p<'{'])for c,p in zip(s,'-'+s))

Essayez-le en ligne!

Pas un bon score, mais je voulais l'essayer sans opérations de chaîne intégrées pour changer la casse.

Matthew Jensen
la source
-2

PHP - 23 caractères

mb_convert_case ($ w, 2);

Il a besoin de php_mbstring pour fonctionner

mattecapu
la source
1
Sur mon 5.3.26 mb_convert_case("BeGin/wITH.tyPE&conTeNt", 2);renvoie "Begin / with.type & content", pas "Begin / With.Type & Content".
manatwork