El reto
Estaba leyendo la Guía de estilo Java de Google el otro día y me topé con su algoritmo para convertir cualquier cadena arbitraria en notación camelCase. En este desafío, debe implementar este algoritmo ya que no desea hacer todo esto en su cabeza cuando está escribiendo sus presentaciones Java súper competitivas para desafíos de código de golf.
Nota: Hice algunos pequeños ajustes al algoritmo. Debe usar el que se especifica a continuación.
El algoritmo
Comienza con una cadena de entrada arbitraria y le aplica las siguientes operaciones:
- Eliminar todos los apóstrofes
`'
- Divide el resultado en palabras dividiéndolo en
- caracteres que no son alfanuméricos ni un dígito
[^a-zA-Z0-9]
- Letras mayúsculas que están rodeadas por letras minúsculas en ambos lados.
abcDefGhI jk
por ejemplo rendimientosabc Def Ghi jk
- caracteres que no son alfanuméricos ni un dígito
- Minúsculas cada palabra.
- En mayúscula el primer carácter de todas menos la primera palabra.
- Une todas las palabras de nuevo juntas.
Notas adicionales
- La entrada solo contendrá ASCII imprimible.
- Si un dígito es la primera letra de una palabra, déjelo como está y no escriba otra cosa en esta palabra.
- La entrada siempre tendrá al menos un carácter.
Reglas
- Función o programa completo permitido.
- Reglas predeterminadas para entrada / salida.
- Se aplican lagunas estándar .
- Este es el código de golf , por lo que gana el conteo de bytes más bajo. Tiebreaker es una presentación anterior.
Casos de prueba
"Programación de puzzles y código de golf" -> "programaciónPuzzlesCodeGolf" "Solicitud XML HTTP" -> "xmlHttpRequest" "¿Soporta IPv6 en iOS?" -> "supportsIpv6OnIos" "SomeThing w1th, apo'strophe's y 'punc] tuation" -> "someThingW1thApostrophesAndPuncTuation" "nada especial" -> "nada especial" "5pecial ca5e" -> "5pecialCa5e" "1337" -> "1337" "1337-spEAk" -> "1337Speak" "whatA mess" -> "whataMess" "abcD" -> "abcd" "a" -> "a" "B" -> "b"
¡Feliz codificación!
snake_case
&PascalCase
snake_case
por Python, por supuesto. FORTH también tieneFORTHCASE
y APL tieneunreadable in any case
ApostropheS
en la salida.Respuestas:
Retina , 56 bytes
El recuento de bytes asume la codificación ISO 8859-1.
Pruébalo en línea!
Explicación
Esto implementa la especificación literalmente:
Elimine los apóstrofes y las comillas.
Divida la cadena en caracteres que no sean palabras (en expresiones regulares, esto también excluye dígitos y guiones bajos), o guiones bajos o posiciones que tienen una letra minúscula a la izquierda y mayúsculas, minúsculas a la derecha. Esto crearía algunos segmentos vacíos cuando hay dos caracteres sin letras, sin dígitos en una fila, o más importantes al comienzo de la cadena. Nos deshacemos de aquellos con la
_
opción. Aquí, "dividir" significa poner cada parte restante en su propia línea.Convierta todo a minúsculas.
Convierta cada carácter que ocurre después del salto de línea a mayúsculas. Esto omitirá convenientemente la primera palabra porque no hay salto de línea delante de ella.
Deshágase de los avances de línea para unir todo nuevamente.
fuente
Thing
aunque debería.Java,
198190 bytes+3 bytes porque olvidé que
\W+
==[^a-zA-Z0-9_]+
y necesito hacer coincidir[^a-zA-Z0-9]+
-11 bytes gracias a user20093 - en
?:
lugar deif
/else
Porque Java.
Esta es una lambda. Llame así:
Versión legible:
fuente
_
como un delimitador de token.JavaScript (ES6),
156154152148145141140 bytesGracias @Neil (6 bytes), @ETHproductions (3 bytes) y @ edc65 (7 bytes)
Elimina los apóstrofos, luego reemplaza para dividir en caracteres especiales / antes de mayúsculas rodeadas, luego se combina con la carcasa adecuada. Desafortunadamente,
toLowerCase()
ytoUpperCase()
son molestamente largos y difíciles de evitar aquí ...fuente
b.slice(i>0)
enfoque elimina del agua, pero mientras tanto, la expresión regular de mi partido/[A-Z]?([a-z0-9]|[0-9A-Z]{2,})+([A-Z](?![a-z]))?/g
parece ahorrar 2 bytes sobre sureplace
enfoque ingenioso .replace
directamente:replace(/[a-z](?=[A-Z][a-z])/g,'$& ')
match...map
lo general, se puede reemplazar conreplace
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()
lo que creo que le ahorra otros 4 bytes.vim,
696866¿Es más corto que Perl? ¿Qué es esta locura?
¡Gracias a Neil por detectar una pulsación inútil!
fuente
:s
tiene un%
pero ¿por qué la inconsistencia en los dos primeros?:%j<cr>
es equivalente y más corto. 2. Eso agrega espacios entre líneas.Mathematica 10.1, 101 bytes
Utiliza el indocumentado
ToCamelCase
, que funciona de manera similarCapitalize
pero establece otros caracteres en minúsculas.fuente
ToCamelCase[n_,m_]:=n<>Capitalize/@m
correcto? Parece que. ¿Y por qué usarloPrepend
cuando#~ToCamelCase~{##2}
funciona?ToCamelCase::argx: ToCamelCase called with 2 arguments; 1 argument is expected.
ToCamelCase[n_]:=""<>Capitalize/@n
?Julia,
9889 bytesEsta es una función anónima que acepta una cadena y devuelve una cadena. Para llamarlo, asígnelo a una variable.
El enfoque aquí es el mismo que en la respuesta de Perl de Doorknob :
replace
apóstrofos y retrocesos con la cadena vacía,split
en una matriz en una expresión regular que coincide con los casos necesarios,map
laucfirst
función sobre la matriz para poner en mayúscula la primera letra de cada elemento,join
la matriz hacia atrás en una cadena, ylcfirst
el resultado para convertir el primer carácter a minúsculas.fuente
end
sintaxis. Tal vez solo usaré funciones anónimas para todo, luego nunca tendré que escribirend
: DPerl 67 + 1 = 68 bytes
Requiere la
-p
bandera, y-l
para líneas múltiples:Cómo funciona:
fuente
Perl,
878078 bytesByte agregado para la
-p
bandera.Primero, usamos el
y///
operador de transliteración parad
elegir todos los'`
caracteres en la entrada:Luego viene la carne del código:
(divida la cadena de entrada
$_
en las ubicaciones apropiadas, utilizando la fantasía\K
en la cadena de coincidencia para excluir la porción que la precede de la coincidencia real)(mapee sobre cada porción dividida de la cadena y ponga la cadena completa en minúsculas, luego ponga el primer carácter de la cadena modificada en mayúsculas)
(unirse en una cadena vacía y reasignar al guión bajo mágico
$_
, que se imprime al final)Finalmente, ponemos en minúscula la primera letra
regexándola y utilizándolacon una función incorporada, ahorrando 2 bytes sobre el método anterior:\l
en la cadena de reemplazo¡Gracias a @ MartinBüttner por 7 bytes (
[^a-zA-Z\d]
->\W|_
)!fuente
\K
...;)Lua, 127 bytes
Acepta una cadena de stdin y devuelve resultados camelizados.
Probablemente todavía busque una mejor solución ya que almacenar todo en una variable se siente ineficiente.
Pero de todos modos, bastante simple en general:
Esta es la belleza que me ahorró un poco de bytes. gmatch dividirá la cadena en función del patrón:
%w+
que solo toma caracteres alfanuméricos.Después de eso son simples operaciones de cadena. string.upper, string.lower y listo.
fuente
PHP,
145122133 bytesGuardar en archivo, llamar desde CLI.
Toma información de un argumento de línea de comando único; escape comillas y espacios en blanco donde sea necesario.
Descompostura
lcfirst
permitido reducir esto a un solo comando, ahorrando 23 bytes.La fijación de los apóstrofos cuesta 11 bytes para el caso de reemplazo adicional.
fuente
Kotlin , 160 bytes
Mi objetivo era ser Scala, la otra "Java alternativa", así que estoy algo contento con mis resultados. Robé la expresión regular de la respuesta de Java .
Pruébalo con:
fuente
\W|_|(?<=[a-z])(?=[A-Z][a-z])
o modificándola ligeramente, por ejemplo.[\W_]+
fun String.a()=replace(Regex("['`]"),"").split(Regex("[\\W_]+|(?<=[a-z])(?=[A-Z][a-z])")).joinToString(""){it.toLowerCase().capitalize()}.decapitalize()
Scala,
181170144Ensayador:
Atrezzo a CAD97 y disculpas a Nathan Merrill :)
fuente
[^a-zA-Z0-9]+
con[\\W_]+
.C 272 caracteres
El programa C pasa la cadena a camelCase entre comillas como argumento 1. Hay muchas trampas en esta declaración del problema ...
fuente
#include<string.h>
forstrlen
,strtok
, andtoupper
, and#include<ctype.h>
forisalnum
../camel "Programming Puzzles & Code Golf"
on cygwin (compiled with gcc 3.4.4), I getprogrammingPuzzlesCodeEGolf
. Same output with 5.3.0.JavaScript, 123 bytes
Readable version
Remove the apostrophes, make the first character lower case, the last character lowercase, and any grouping of multiple uppercase characters, match any group of 1 or more non-alphanumeric chars + 1 other character, replace with that last character capitalized.
[r="replace"] trick from Mrw247's solution.
fuente