Le défi
Je lisais le Java Style Guide de Google l'autre jour et je suis tombé sur son algorithme pour convertir toute chaîne arbitraire en notation camelCase. Dans ce défi, vous devez implémenter cet algorithme, car vous ne voulez pas faire tout cela dans votre tête lorsque vous écrivez vos soumissions Java extrêmement compétitives aux défis de code-golf.
Note: J'ai fait quelques petits ajustements à l'algorithme. Vous devez utiliser celui spécifié ci-dessous.
L'algorithme
Vous commencez avec une chaîne d'entrée arbitraire et appliquez-lui les opérations suivantes:
- Supprimer toutes les apostrophes
`'
- Diviser le résultat en mots en divisant en
- caractères non alphanumériques et non numériques
[^a-zA-Z0-9]
- Lettres majuscules entourées de lettres minuscules des deux côtés.
abcDefGhI jk
par exemple les rendementsabc Def Ghi jk
- caractères non alphanumériques et non numériques
- Minuscule chaque mot.
- Majuscule le premier caractère de chaque mot sauf le premier.
- Rejoins tous les mots ensemble.
Notes complémentaires
- L'entrée ne contiendra que l'ASCII imprimable.
- Si un chiffre est la première lettre d'un mot, laissez-le tel quel et ne capitalisez pas autre chose dans ce mot.
- L'entrée aura toujours au moins un caractère.
Règles
- Fonction ou programme complet autorisé.
- Règles par défaut pour les entrées / sorties.
- Les failles standard s'appliquent.
- C'est le code-golf , donc le plus petit nombre d'octets gagne. Tiebreaker est une soumission antérieure.
Cas de test
"Programmation Puzzles & Code Golf" -> "programmationPuzzlesCodeGolf" "Demande HTTP XML" -> "xmlHttpRequest" "supporte IPv6 sur iOS?" -> "supportsIpv6OnIos" "Quelque chose avec apo'strophe's et 'punc] tuation" -> "someThingW1thApostrophesAndPuncTuation" "rien de spécial" -> "rien de spécial" "5pecial ca5e" -> "5pecialCa5e" "1337" -> "1337" "1337-spEAk" -> "1337Speak" "quel désordre" -> "whataMess" "abcD" -> "abcd" "a" -> "a" "B" -> "b"
Bon codage!
snake_case
&PascalCase
snake_case
cause de Python, bien sûr. FORTH a égalementFORTHCASE
et APL aunreadable in any case
ApostropheS
dans la sortie.Réponses:
Retina , 56 octets
Le nombre d'octets suppose un codage ISO 8859-1.
Essayez-le en ligne!
Explication
Cela implémente littéralement la spécification:
Supprimer les apostrophes et les backticks.
Divisez la chaîne en caractères non-mots (dans regex, cela exclut également les chiffres et les tirets bas), ou les traits de soulignement ou les positions qui ont une lettre minuscule à gauche et une majuscule, la minuscule à droite. Cela créerait des segments vides quand il y a deux caractères non-lettres, non-numériques dans une ligne, ou plus important au début de la chaîne. Nous nous débarrassons de ceux qui ont l'
_
option. Dans ce cas, "fractionner" signifie mettre chaque partie restante sur sa propre ligne.Convertissez tout en minuscule.
Convertissez chaque caractère qui apparaît après le saut de ligne en majuscule. Cela évite le premier mot car il n'y a pas de saut de ligne devant lui.
Débarrassez-vous des sauts de ligne pour réunir le tout.
la source
Thing
bien qu’elle le devrait.Java,
198190 octets+3 octets parce que j'ai oublié que
\W+
==[^a-zA-Z0-9_]+
et que je dois correspondre[^a-zA-Z0-9]+
-11 octets grâce à user20093 -
?:
au lieu deif
/else
Parce que, Java.
C'est un lambda. Appelle comme ça:
Version lisible:
la source
_
comme un délimiteur de jeton.JavaScript (ES6),
156154152148145141 141140 octetsMerci @Neil (6 octets), @ETHproductions (3 octets) et @ edc65 (7 octets)
Supprime les apostrophes, puis effectue un remplacement pour séparer les caractères spéciaux / avant les majuscules entourées, puis se combine avec une casse appropriée. Malheureusement,
toLowerCase()
ettoUpperCase()
sont ennuyeusement long et difficile à éviter ici ...la source
b.slice(i>0)
approche met hors de l'eau, mais entre-temps, mon regex de match/[A-Z]?([a-z0-9]|[0-9A-Z]{2,})+([A-Z](?![a-z]))?/g
semble économiser 2 octets de plus que votrereplace
approche ingénieuse .replace
directement:replace(/[a-z](?=[A-Z][a-z])/g,'$& ')
match...map
Peut généralement être remplacé parreplace
a=>a.replace(/`|'/g,'').replace(/[a-z](?=[A-Z][a-z])/g,'$& ').replace(/[\W_]*([a-z0-9]+)[\W_]*/gi,(_,b,i)=>(i?b[0].toUpperCase():'')+b.slice(i>0).toLowerCase())
b=>a+=(a?b[0].toUpperCase():'')+b.slice(!!a).toLowerCase()
ce qui, je crois, vous épargne 4 octets supplémentaires.vim,
696866Vim plus court que Perl?! Quelle est cette folie?
Merci à Neil d' avoir remarqué une frappe inutile!
la source
:s
a un%
mais pourquoi l'incohérence dans les deux premiers?:%j<cr>
est équivalent et plus court. 2. Cela ajoute des espaces entre les lignes.Mathematica 10.1, 101 octets
Utilise le non documenté
ToCamelCase
, qui fonctionne de la même façonCapitalize
mais définit les autres caractères en minuscule.la source
ToCamelCase[n_,m_]:=n<>Capitalize/@m
correct? On dirait bien. Et pourquoi utiliserPrepend
quand#~ToCamelCase~{##2}
fonctionne?ToCamelCase::argx: ToCamelCase called with 2 arguments; 1 argument is expected.
ToCamelCase[n_]:=""<>Capitalize/@n
?Julia,
9889 octetsIl s'agit d'une fonction anonyme qui accepte une chaîne et retourne une chaîne. Pour l'appeler, assignez-le à une variable.
L’approche est la même que dans la réponse Perl de Doorknob :
replace
apostrophes et backticks avec la chaîne vide,split
dans un tableau sur une expression régulière qui correspond aux cas nécessaires,map
laucfirst
fonction sur le tableau pour mettre en majuscule la première lettre de chaque élément,join
le tableau dans une chaîne, etlcfirst
le résultat pour convertir le premier caractère en minuscule.la source
end
syntaxe. J'utiliserai peut-être des fonctions anonymes pour tout, mais je n'aurai jamais à taperend
: DPerl 67 + 1 = 68 octets
Nécessite le
-p
drapeau, et-l
pour plusieurs lignes:Comment ça marche:
la source
Perl,
878078 octetsOctet ajouté pour le
-p
drapeau.Tout d'abord, nous utilisons l'
y///
opérateur de translittération pourd
supprimer tous les'`
caractères de l'entrée:Puis vient la viande du code:
(divisez la chaîne d'entrée
$_
aux emplacements appropriés, en utilisant la fantaisie\K
de la chaîne de correspondance pour exclure la partie la précédant de la correspondance réelle)(mappez chaque partie de la chaîne et mettez la chaîne entière en minuscule, puis mettez le premier caractère de la chaîne modifiée en majuscule)
(rejoindre sur une chaîne vide et réaffecter à un soulignement magique
$_
, qui est imprimé à la fin)Enfin, nous mettons la première lettre
enminuscule en la\l
faisant correspondre par expression rationnelle et en utilisantdans la chaîne de remplacementavec une valeur intégrée, en économisant 2 octets par rapport à la méthode précédente:Merci à @ MartinBüttner pour 7 octets (
[^a-zA-Z\d]
->\W|_
)!la source
\K
...;)Lua, 127 octets
Accepte une chaîne de stdin et renvoie des résultats camélisés.
Je vais probablement chercher une meilleure solution car tout stocker dans une variable semble inefficace.
Mais de toute façon, assez simple en général:
C'est la beauté qui m'a sauvé un peu d'octets. gmatch divisera la chaîne en fonction du modèle:
%w+
qui ne saisit que les caractères alphanumériques.Après cela, c’est de simples opérations sur les chaînes. string.upper, string.lower et done.
la source
PHP,
145122133 octetsEnregistrer dans un fichier, appelez à partir de la CLI.
Prend les entrées à partir d'un seul argument de ligne de commande; citations d'échappement et espaces blancs si nécessaire.
panne
lcfirst
autorisé à réduire cela à une seule commande, économisant 23 octets.La fixation des apostrophes coûte 11 octets pour le cas de remplacement supplémentaire.
la source
Kotlin , 160 octets
Mon but était d'être Scala, l'autre "alternative Java", donc je suis assez content de mes résultats. J'ai volé la regex de la réponse Java .
Testez-le avec:
la source
\W|_|(?<=[a-z])(?=[A-Z][a-z])
ou la modifie légèrement, par exemple.[\W_]+
fun String.a()=replace(Regex("['`]"),"").split(Regex("[\\W_]+|(?<=[a-z])(?=[A-Z][a-z])")).joinToString(""){it.toLowerCase().capitalize()}.decapitalize()
Scala,
181170144Testeur:
Accessoires à CAD97 et excuses à Nathan Merrill :)
la source
[^a-zA-Z0-9]+
par[\\W_]+
.C 272 caractères
La chaîne de transmission du programme C à camelCase est placée entre guillemets en tant qu'argument 1. Il y a beaucoup de pièges dans cette déclaration de problème ...
la source
#include<string.h>
pourstrlen
,strtok
ettoupper
, et#include<ctype.h>
pourisalnum
../camel "Programming Puzzles & Code Golf"
sur cygwin (compilé avec gcc 3.4.4), je reçoisprogrammingPuzzlesCodeEGolf
. Même résultat avec 5.3.0.JavaScript, 123 octets
Version lisible
Supprimez les apostrophes, placez le premier caractère en minuscule, le dernier caractère en minuscule et tout regroupement de plusieurs caractères majuscules en faisant correspondre tout groupe d'un ou plusieurs caractères non alphanumériques + 1 autre caractère en remplaçant par le dernier caractère en majuscule.
[r = "remplace"] astuce de la solution de Mrw247.
la source