O desafio
Eu estava lendo o Java Style Guide do Google outro dia e me deparei com o algoritmo deles para converter qualquer string arbitrária em notação camelCase. Nesse desafio, você precisa implementar esse algoritmo, pois não deseja fazer tudo isso em sua mente quando estiver escrevendo seus envios Java super competitivos para os desafios do código-golfe.
Nota: Fiz alguns pequenos ajustes no algoritmo. Você precisa usar o especificado abaixo.
O algoritmo
Você começa com uma sequência de entrada arbitrária e aplica as seguintes operações a ela:
- Remova todos os apóstrofos
`'
- Divida o resultado em palavras, dividindo em
- caracteres que não são alfanuméricos e nem um dígito
[^a-zA-Z0-9]
- Letras maiúsculas cercadas por letras minúsculas nos dois lados.
abcDefGhI jk
por exemplo, produzabc Def Ghi jk
- caracteres que não são alfanuméricos e nem um dígito
- Minúsculas cada palavra.
- Coloque em maiúscula o primeiro caractere de todas, exceto a primeira palavra.
- Junte todas as palavras novamente.
Notas Adicionais
- A entrada conterá apenas ASCII imprimível.
- Se um dígito é a primeira letra de uma palavra, deixe-o como está e não capalize outra coisa nessa palavra.
- A entrada sempre terá pelo menos um caractere.
Regras
- Função ou programa completo permitido.
- Regras padrão para entrada / saída.
- Aplicam-se brechas padrão .
- Isso é código-golfe , portanto, a menor contagem de bytes vence. O desempate é uma submissão anterior.
Casos de teste
"Programação de quebra-cabeças e código de golfe" -> "programmingPuzzlesCodeGolf" "Solicitação HTTP XML" -> "xmlHttpRequest" "suporta IPv6 no iOS?" -> "suportaIpv6OnIos" "SomeThing w1th, apo'strophe and 'punc] tuation" -> "someThingW1thApostrophesAndPuncTuation" "nada de especial" -> "nada de especial" "5pecial ca5e" -> "5pecialCa5e" "1337" -> "1337" "1337-spEAk" -> "1337Speak" "o que é uma bagunça" -> "o que é que" "abcD" -> "abcd" "a" -> "a" "B" -> "b"
Feliz codificação!
snake_case
&PascalCase
snake_case
por causa de Python, é claro. FORTH também temFORTHCASE
e APL hasunreadable in any case
ApostropheS
na saída.Respostas:
Retina , 56 bytes
A contagem de bytes assume a codificação ISO 8859-1.
Experimente online!
Explicação
Isso implementa a especificação literalmente:
Remova apóstrofos e backticks.
Divida a string em caracteres que não sejam palavras (no regex, isso também exclui dígitos e sublinhados) ou sublinhados ou posições com letras minúsculas à esquerda e maiúsculas e minúsculas à direita. Isso criaria alguns segmentos vazios quando houver dois caracteres sem letra e sem dígito em uma linha ou mais importantes no início da string. Nós nos livramos daqueles com a
_
opção. Aqui, "divisão" significa colocar cada parte restante em sua própria linha.Converta tudo para minúsculas.
Converta cada caractere que ocorre após o avanço de linha em maiúsculas. Isso ignora convenientemente a primeira palavra, porque não há avanço de linha na frente.
Livre-se dos feeds de linha para juntar tudo de novo.
fonte
Thing
embora deva.Java,
198190 bytes+3 bytes porque esqueci que
\W+
==[^a-zA-Z0-9_]+
e preciso corresponder[^a-zA-Z0-9]+
-11 bytes graças a user20093 - em
?:
vez deif
/else
Porque Java.
Este é um lambda. Ligue assim:
Versão legível:
fonte
_
com um delimitador de token.JavaScript (ES6),
156154152148145141140 bytesObrigado @Neil (6 bytes), @ETHproductions (3 bytes) e @ edc65 (7 bytes)
Remove apóstrofos, depois substitui para dividir em caracteres especiais / antes de maiúsculas circundadas e, em seguida, combina com o revestimento apropriado. Infelizmente,
toLowerCase()
etoUpperCase()
são irritantemente longos e difíceis de evitar aqui ...fonte
b.slice(i>0)
abordagem explode, mas nesse meio tempo minha expressão de correspondência/[A-Z]?([a-z0-9]|[0-9A-Z]{2,})+([A-Z](?![a-z]))?/g
parece economizar 2 bytes em relação à suareplace
abordagem engenhosa .replace
diretamente:replace(/[a-z](?=[A-Z][a-z])/g,'$& ')
match...map
pode ser substituído porreplace
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()
que acredito poupar mais 4 bytes.vim,
696866vim mais curto que o Perl ?! Que loucura é essa?
Agradecemos a Neil por detectar um pressionamento de tecla inútil!
fonte
:s
tem um,%
mas por que a inconsistência nos dois primeiros?:%j<cr>
é equivalente e mais curto. 2. Isso adiciona espaços entre as linhas.Mathematica 10.1, 101 bytes
Usa o não documentado
ToCamelCase
, que funciona de maneira semelhante a,Capitalize
mas define outros caracteres para minúsculas.fonte
ToCamelCase[n_,m_]:=n<>Capitalize/@m
correto? Parece que sim. E por que usarPrepend
quando#~ToCamelCase~{##2}
funciona?ToCamelCase::argx: ToCamelCase called with 2 arguments; 1 argument is expected.
ToCamelCase[n_]:=""<>Capitalize/@n
?Julia,
9889 bytesEsta é uma função anônima que aceita uma string e retorna uma string. Para chamá-lo, atribua-o a uma variável.
A abordagem aqui é a mesma que na maçaneta da porta resposta Perl porta :
replace
apóstrofos e backticks com a string vazia,split
em uma matriz em uma expressão regular que corresponde aos casos necessários,map
aucfirst
função na matriz para colocar em maiúscula a primeira letra de cada elemento,join
a matriz de volta em uma sequência elcfirst
o resultado para converter o primeiro caractere em minúscula.fonte
end
sintaxe. Talvez eu vou usar apenas funções anônimas para tudo, então eu nunca digitarend
: DPerl 67 + 1 = 68 bytes
Requer a
-p
bandeira e-l
para várias linhas:Como funciona:
fonte
Perl,
878078 bytesByte adicionado para o
-p
sinalizador.Primeiro, usamos o
y///
operador de transliteração parad
excluir todos os'`
caracteres da entrada:Depois vem a carne do código:
(divida a string de entrada
$_
nos locais apropriados, usando o sofisticado\K
na string de correspondência para excluir a parte que a precede da correspondência real)(mapeie cada parte dividida da string e coloque a string inteira em minúscula e, em seguida, o primeiro caractere da string modificada)
(junte uma string vazia e atribua novamente ao sublinhado mágico
$_
, que é impresso no final)Por fim, minúscula a primeira letra
, correspondendo-a ao regex e usandocom uma incorporada, economizando 2 bytes em relação ao método anterior:\l
na cadeia de substituiçãoObrigado a @ MartinBüttner por 7 bytes (
[^a-zA-Z\d]
->\W|_
)!fonte
\K
...;)Lua, 127 bytes
Aceita uma sequência de caracteres de stdin e retorna resultados camelizados.
Provavelmente ainda procurará uma solução melhor, pois armazenar tudo em uma variável parece ineficiente.
Mas de qualquer maneira, bastante simples em geral:
Essa é a beleza que me salvou um pouco de bytes. O gmatch dividirá a string com base no padrão:
%w+
que captura apenas alfanuméricos.Depois disso, são simples operações de string. string.upper, string.lower e done.
fonte
PHP,
145122133 bytesSalve no arquivo, ligue da CLI.
Recebe entrada de um único argumento de linha de comando; evite aspas e espaços em branco quando necessário.
demolir
lcfirst
permitido reduzir isso para um único comando, economizando 23 bytes.A correção dos apóstrofos custa 11 bytes para o caso de substituição adicional.
fonte
Kotlin , 160 bytes
Meu objetivo era ser o Scala, o outro "Java alternativo", então estou um pouco feliz com meus resultados. Eu roubei o regex da resposta Java .
Teste com:
fonte
\W|_|(?<=[a-z])(?=[A-Z][a-z])
ou modificando-o levemente, por exemplo.[\W_]+
fun String.a()=replace(Regex("['`]"),"").split(Regex("[\\W_]+|(?<=[a-z])(?=[A-Z][a-z])")).joinToString(""){it.toLowerCase().capitalize()}.decapitalize()
Scala,
181170144Testador:
Adereços para CAD97 e desculpas a Nathan Merrill :)
fonte
[^a-zA-Z0-9]+
por[\\W_]+
.Caracteres C 272
O programa C passa a string para camelCase entre aspas como argumento 1. Há muitas dicas nesta declaração de problema ...
fonte
#include<string.h>
destrlen
,strtok
etoupper
, e#include<ctype.h>
paraisalnum
../camel "Programming Puzzles & Code Golf"
cygwin (compilado com o gcc 3.4.4), receboprogrammingPuzzlesCodeEGolf
. Mesma saída com 5.3.0.JavaScript, 123 bytes
Versão legível
Remova os apóstrofos, coloque o primeiro caractere em minúscula, o último caractere em minúscula e qualquer agrupamento de vários caracteres maiúsculos, corresponda a qualquer grupo de 1 ou mais caracteres não alfanuméricos + 1 outro caractere, substitua pelo último caractere em maiúscula.
[r = "replace"] truque da solução Mrw247.
fonte