Selon ce site, une règle générale recommandée par le US Government Printing Office Style Manual est
Mettez en majuscule tous les mots dans les titres des publications et des documents, à l'exception de a, an, the, at, by, for, in, of, on, to, up, and, as, but, or, and nor.
Ce n'est peut-être pas vrai car je ne peux pas trouver une telle recommandation dans le manuel de style , mais utilisons quand même cette règle.
Le défi
Étant donné une chaîne d'entrée composée de mots en minuscules délimités par des espaces, affichez la capitalisation de la chaîne selon les règles suivantes
- Le premier et le dernier mot sont en majuscule.
- Tous les autres mots sont en majuscules, sauf a , an , the , at , by , for , in , of , on , to , up , and , as , but , or , and nor .
La chaîne d'entrée contiendra au moins un mot et chaque mot contient au moins une lettre et uniquement des caractères de a
à z
.
C'est un défi de golf de code, essayez donc d'utiliser le moins d'octets possible dans la langue de votre choix. Vous pouvez écrire un programme complet ou une fonction pour accomplir la tâche.
Cas de test
"the rule of thumb for title capitalization" -> "The Rule of Thumb for Title Capitalization"
"programming puzzles and code golf" -> "Programming Puzzles and Code Golf"
"the many uses of the letter a" -> "The Many Uses of the Letter A"
"title" -> "Title"
"and and and" -> "And and And"
"a an and as at but by for in nor of on or the to up" -> "A an and as at but by for in nor of on or the to Up"
"on computable numbers with an application to the entscheidungsproblem" -> "On Computable Numbers With an Application to the Entscheidungsproblem"
Réponses:
Python 2, 118 octets
Regardez ma, pas de regex!
L'entrée doit être entourée de guillemets. La sortie a un espace de fin et aucune nouvelle ligne de fin (je suppose que c'est correct). Vérifiez tous les cas de test sur Ideone .
Explication
Prenons l'entrée
a or an
comme exemple.L' utilisation de Python 2
`x`
raccourci pourrepr
nous envelopper l'entrée dans des guillemets simples:'a or an'
. Ensuite, nous nous séparons sur les espaces blancs et parcourons les mots.A l' intérieur de la boucle, nous prenons le
repr
nouveau . Pour les premier et dernier mots, cela donne"'a"
et"an'"
. Autrement dit, ça donne'or'
. Nous voulons éviter de mettre des mots en majuscule s'ils correspondent à ce dernier modèle et sont dans la liste des mots courts. Nous pouvons donc représenter la liste de mots comme une chaîne"'a'an'...'up'"
et savoir que lerepr
mot court sera une sous-chaîne.`w` in "..."
donne une valeur booléenne, que nous pouvons traiter comme0
ou1
à des fins d'indexation dans la liste[w.title(), w]
. En bref, on met en majuscule le mot s'il se trouve au début, à la fin ou non dans la liste des mots courts. Sinon, nous le laissons tranquille. Heureusement,title()
fonctionne toujours comme prévu avec une entrée comme'a
.Enfin, nous supprimons les guillemets simples du mot et l'imprimons avec un espace de fin.
la source
05AB1E ,
6861 octets7 octets enregistrés grâce à Adnan
Essayez-le en ligne!
Explication
“a€¤€€€›€‹€‡€†€‚€‰€„€¾€ƒ€œ€³€—š¯“
est une chaîne de dictionnaire traduite para an the at by for in of on to up and as but or nor
.la source
a
au lieu d'€…
enregistrer un octet supplémentaire également si le plomb de avec ça :) Merci!GNU sed
81 7473 octetsComprend +1 pour -r
La première ligne met en majuscule la première lettre de chaque mot. Le second bascule tous les mots requis en minuscules.
Essayez-le en ligne!
la source
Rétine,
6966 octetsMettez en majuscule la première lettre de chaque mot, puis changez les mots sélectionnés en minuscules s'ils ne sont pas le premier ou le dernier mot. Il y a un espace à la fin de la dernière ligne.
Essayez-le en ligne
Cela fonctionne également avec un
.
au lieu du premier espace.Il y a beaucoup de regex de même longueur, mais je ne trouve plus de moyen de les couper ...
la source
+
astuce pour la raccourcir.)JavaScript (ES6),
141138135133 octetsSauvegardé 3 octets grâce à mbomb007
Cas de test
Afficher l'extrait de code
la source
Gelée , 58 octets
TryItOnline! ou exécutez tous les tests
Comment?
Une chaîne compressée avec des espaces séparant les mots serait des
47
octets, la fractionnant coûte1
octet, pour les48
octets.Deux chaînes compressées non séparées des mots de longueur
2
et3
(avec un «a» à la fin d'un) respectivement seraient des40
octets plus2
pour les séparer et1
les joindre, pour les45
octets.Un nombre de base 250 comme décrit ci-dessous est des
32
octets, puis3
à convertir en base 26,3
à indexer dans l'alphabet en minuscules et3
à le diviser sur le caractère inutilisé ,,'z'
pour les41
octets.Ainsi, la recherche des mots à ne pas mettre en majuscule: a
“Ð/ṃƇ¬þṄẊƙ€,⁽ṙƬ®OṪJ"ɦ3×kf3Ṙç%ġu’
été formée comme suit:
Prenez ces mots et joignez-les à un séparateur:
s="a an the at by for in of on to up and as but or nor"
Etiquette suivante
'a'
as1
,'b'
as2
avec le séparateur as0
:Convertissez-le en un
26
nombre de base (la dernière lettre utilisée est'y'
plus un chiffre pour le séparateur, le code Python pour cela est:n=sum(v*26**i for i,v in enumerate(x[::-1]))
Convertissez cela en un
250
nombre de base (en utilisant une liste pour les chiffres):Recherchez les caractères de ces index dans la page de codes de jelly:
(Remarque: étant donné que l'implémentation réelle est bijective, s'il y
b
avait des0
chiffres, il faudrait d'abord les effectuer)Le reste:
la source
PHP, 158 octets
10 octets enregistrés par @Titus
Version précédente PHP, 174 octets
la source
foreach(...)echo" "[!$k],(condition)?$v:ucfirst($v);
TI-Basic, 295 + 59 + 148 = 502 octets
Vous pouvez maintenant capitaliser sur votre calculatrice. Idéal pour l'école :)
Programme principal, 295 octets
Fondamentalement, l'astuce pour faire correspondre les mots afin que tout
A
ne devienne pasa
est de joindre des espaces, tels que remplacer" A "
par" a "
. Cela permet également automatiquement que les premier et dernier mots restent en majuscule, car ils n'ont pas d'espace des deux côtés et ne correspondent donc à aucun des mots. (Génie, non? Et super long parce que les lettres minuscules font deux octets chacune ...)Sous-programme (
prgmQ
), 59 octets:Sous-programme (
prgmR
), 148 octets:PS
~
représente un jeton0x81
et@
représente un jeton0x7F
, apprenez-en plus ici .la source
Java 7,
271259258 octetsCode non testé et testé:
Essayez-le ici.
Sortie:
la source
Groovy,
131129Deux octets économisés grâce à carusocomputing
la source
i->
et utilisezit
pour économiser 2 octets.{it.split()*.with{a->a in "a an the at by for in of on to up and as but or nor".split()?a:a.capitalize()}.join(" ").capitalize()}
.capitalize()
prennent beaucoup d'octets. Existe-t-il un moyen rapide de créer un alias.capitalize()
?C #, 305 octets
Il y a encore beaucoup de place à l'amélioration mais c'est parti:
la source
Ruby,
123117111102 octetsDésolé pour toutes les modifications - ce devrait être le dernier.
la source
Python, 177 octets
Livré au format de fonction à des fins d'économie d'octets. Ce n'est pas une réponse particulièrement compétitive, mais c'est une réponse qui ne nécessite
repr()
niregex
astuce. Il est également indépendant de la version; cela fonctionne avec Python 2 ou 3.Bien qu'il s'agisse peut-être d'une solution très stricte.
la source
PHP,
109142 octetsUne fusion de réponse user59178 et de mbomb007 .
met en majuscule la première lettre de chaque mot, puis met en minuscule tous les mots de la liste entourés d'espaces.
Malheureusement, le rappel doit opérer sur l'ensemble complet; cela coûte 29 octets.
la source
a an and as at but by for in nor of on or the to up
Raquette 353 octets
Non golfé:
Essai:
Sortie:
la source
Java 7,
431 317311 octetsMerci à @KevinCruijssen pour 114 octets.
Merci à @RosLup pour avoir économisé 6 octets.
non golfé
première réponse supérieure à 250 octets
la source
String f(String s){String v="",x,l[]=s.split(" "),b[]={"a","an","the","at","by","for","in","of","on","to","up","and","as","but","or","and","nor"};int i=0,f=0,z=0;for(String c:l){for(f=0;f<b.length;z=c.equals(b[f++])|z>0?1:0);x=(char)(c.charAt(0)-32)+c.substring(1);v+=z>0?i<1|i++==l.length-1?x:c:x)+" ";}return v;}
( 314 octets ) Je suggère de jeter un œil à ce que j'ai changé comme conseils pour la prochaine fois. :) PS: j'ai posté une réponse avec une approche différente ( 259 octets ).c.substring(0,1).toUpperCase()+c.substring(1,c.length())+" "
que vous avez faites deux fois devraient vous faire penser à la réutiliser d'une manière ou d'une autre. Et des initialisations combinées comme vous l'avez fait correctement avec leint
, mais pour une raison quelconque, pas avec leString
. De plus, pas besoin de supplémentboolean
lorsque vous pouvez stocker àint
0 ou 1, puis le vérifier>0
. Et j'essaierais d'éviter les crochets etbreak
autant que possible; généralement, il y a une astuce pour s'en débarrasser, commefor(f=0;f<b.length;z=c.equals(b[f++])|z>0?1:0);
je l'ai montré. :)String c(String s){String v="",x,l[]=s.split(" "),b[]={"a","an","the","at","by","for","in","of","on","to","up","and","as","but","or","and","nor"};int i=0,f=0,z=0;for(String c:l){for(f=0;f<b.length;z=c.equals(b[f++])|z>0?1:0);x=(char)(c.charAt(0)-32)+c.substring(1);v+=(z>0?i<1|i++>l.length-2?x:c:x)+" ";}return v;}
Et pas de problème. :) J'ai aussi beaucoup appris lorsque j'étais nouveau au golf à code. Je fais juste une liste avec toutes les astuces générales de golf que j'apprends et je les regarde / mets à jour parfois. Mais mon code est encore beaucoup joué par d'autres.PHP,
117118112 octetsUtilise le comportement des
ucwords()
mots pertinents entourés d'espaces et les échappe, puis supprime les caractères d'échappement.J'ai copié la
(a[snt]?|and|[fn]or|up|by|but|the|to|in|o[rnf])
réponse de Jörg Hülsermann mais comme l'approche est complètement différente, je la poste en tant que réponse distincte.edit: bug remarqué par Titus, le fixant coûte 1 octet. aussi: 6 octets économisés grâce à son commentaire utile sur strtr
la source
strtr
au lieu destr_replace
. Ou ajoutez les mots avec<>
et déposezthe str_replace
et utilisez la sortie HTML.preg_filter
place depreg_replace
. Je ne l'ai pas essayé avec votre solutionnice try for a start
. Remplacer l'un des espaces par une assertion résout cela (+4 octets).preg_filter
échouerait sur letitle
cas de test, ne retournant rien.Pur
bash
- 253(aucun programme externe appelé) - nécessite bash v4
vue normale avec commentaires
sortie
la source
Japt , 71 octets
Essayez-le en ligne!
Explication:
L'une de mes fonctionnalités Japt préférées est sa compression de chaîne, qui utilise le bibliothèque shoco .
Vous pouvez compresser une chaîne en l'enveloppant dans
Oc"{string}"
→Oc"a an the at by for in of on to up and as but or nor"
Ensuite, décompressez-le avec des backticks ou
Od"{compressed string}"
→Od"a e by f up d ¿t n"
la source
-S
drapeau a été ajouté après la publication de ce défi, votre solution actuelle n'est donc pas en concurrence. Cependant, je pense que vous pouvez le faire£...+XÅ}S
, ce qui serait en concurrence pour le même nombre d'octets ( Essayez-le en ligne! )Pure
bash
-205192181 181 octetsComme la réponse de jm66
tc
accepte l'entrée standard.la source
En fait , 79 octets
Essayez-le en ligne!
Explication:
la source
Lot, 323 octets
Avec commentaires:
la source