De acordo com este site, uma regra geral recomendada pelo Manual de Estilo do Gabinete de Impressão do Governo dos EUA é
Coloque todas as palavras em maiúsculas em títulos de publicações e documentos, exceto a, an, the, at, by, for, in, of, on, to, up e and, as, but, or, and nor.
Isso pode não ser verdade, pois não consigo encontrar essa recomendação no Manual de estilo , mas vamos usar essa regra de qualquer maneira.
O desafio
Dada uma sequência de entrada que consiste em palavras em minúsculas delimitadas por espaços, produza a capitalização da sequência de acordo com as seguintes regras
- A primeira e a última palavra são maiúsculas.
- Todas as outras palavras são capitalizados, exceto um , um , o , a , por , para , em , de , em , para , se , e , como , mas , ou , e nem .
A sequência de entrada conterá pelo menos uma palavra e cada palavra conterá pelo menos uma letra e apenas caracteres de a
até z
.
Este é um desafio de código de golfe, portanto, tente usar o mínimo de bytes possível no idioma de sua escolha. Você pode escrever um programa completo ou uma função para realizar a tarefa.
Casos de teste
"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"
Respostas:
Python 2, 118 bytes
Olha ma, sem regex!
A entrada deve estar entre aspas. A saída tem um espaço à direita e nenhuma nova linha à direita (presumo que esteja tudo bem). Verifique todos os casos de teste no Ideone .
Explicação
Vamos tomar a entrada
a or an
como nosso exemplo.Usando do Python 2
`x`
atalho pararepr
, nós envolvemos a entrada entre aspas simples:'a or an'
. Em seguida, dividimos em espaço em branco e iteramos sobre as palavras.Dentro do loop, pegamos
repr
novamente . Para a primeira e a última palavra, isso fornece"'a"
e"an'"
. Por outras palavras, dá'or'
. Queremos evitar letras maiúsculas se elas se encaixam no último padrão e estão na lista de palavras curtas. Portanto, podemos representar a lista de palavras como a sequência"'a'an'...'up'"
e saber que arepr
palavra curta será uma substring.`w` in "..."
fornece um valor booleano, que podemos tratar como0
ou1
para fins de indexação na lista[w.title(), w]
. Em resumo, colocamos a palavra em maiúsculas e minúsculas se estiver no início, no final ou não na lista de palavras curtas. Caso contrário, deixamos em paz. Felizmente,title()
ainda funciona como esperado, com entradas como'a
.Por fim, separamos as aspas simples da palavra e a imprimimos com um espaço à direita.
fonte
05AB1E ,
6861 bytesEconomizou 7 bytes graças a Adnan
Experimente online!
Explicação
“a€¤€€€›€‹€‡€†€‚€‰€„€¾€ƒ€œ€³€—š¯“
é uma string de dicionário traduzida comoa an the at by for in of on to up and as but or nor
.fonte
a
vez de€…
salvar um byte adicional, bem como a liderança de com ele :) Obrigado!GNU sed
81 7473 bytesInclui +1 para -r
A primeira linha coloca em maiúscula a primeira letra de cada palavra. O segundo alterna todas as palavras necessárias de volta para minúsculas.
Experimente Online!
fonte
Retina,
6966 bytesColoque em maiúscula a primeira letra de cada palavra e altere as palavras selecionadas para minúsculas, se não forem a primeira ou a última palavra. Há um espaço no final da última linha.
Experimente online
Isso também funciona com um espaço em
.
vez do primeiro.Existem muitas regexes com o mesmo comprimento, mas não consigo mais encontrar uma maneira de apará-las ...
fonte
+
truque para encurtá-lo.)JavaScript (ES6),
141138135133 bytesGuardado 3 bytes graças a mbomb007
Casos de teste
Mostrar snippet de código
fonte
Geléia , 58 bytes
TryItOnline! ou execute todos os testes
Quão?
Uma string compactada com espaços que separam as palavras seria
47
bytes, dividindo os custos em1
bytes, para48
bytes.Duas seqüências de caracteres compactadas não separadas das palavras length
2
e3
(com um 'a' no final de uma), respectivamente, seriam40
bytes mais2
para dividir cada uma e1
unir-se a elas, por45
bytes.Um número de base 250, conforme descrito abaixo, é
32
bytes,3
para converter na base 26,3
indexar no alfabeto em minúsculas e3
dividi-lo no caractere não utilizado'z'
, em41
bytes.Assim, a busca pelas palavras para não capitalizar:
“Ð/ṃƇ¬þṄẊƙ€,⁽ṙƬ®OṪJ"ɦ3×kf3Ṙç%ġu’
foi formada assim:
Pegue essas palavras e junte-se a elas com um separador:
s="a an the at by for in of on to up and as but or nor"
Próximo rótulo
'a'
como1
,'b'
como2
no separador, como0
:Converta isso em um
26
número base (a última letra usada é'y'
mais um dígito para o separador, o código Python para isso é:n=sum(v*26**i for i,v in enumerate(x[::-1]))
Converta isso em um
250
número base (usando uma lista para os dígitos):Pesquise os caracteres nesses índices na página de códigos da geléia:
(observação: como a implementação real é bijetiva, se
b
houver algum0
dígito que você precise carregar primeiro)O resto:
fonte
PHP, 158 bytes
10 bytes salvos por @Titus
Versão anterior PHP, 174 Bytes
fonte
foreach(...)echo" "[!$k],(condition)?$v:ucfirst($v);
TI-Basic, 295 + 59 + 148 = 502 bytes
Agora você pode capitalizar sua calculadora. Ótimo para a escola :)
Programa principal, 295 bytes
Basicamente, o truque para combinar palavras para que tudo
A
não se tornea
é colocar espaços, como substituir" A "
por" a "
. Isso também faz automaticamente com que a primeira e a última palavras fiquem em maiúsculas, porque elas não têm espaço nos dois lados e, portanto, não correspondem a nenhuma das palavras. (Gênio, certo? E super longo, porque letras minúsculas têm dois bytes cada ...)Subprograma (
prgmQ
), 59 bytes:Subprograma (
prgmR
), 148 bytes:PS
~
representa token0x81
e@
representa token0x7F
, saiba mais aqui .fonte
Java 7,
271259258 bytesUngolfed & código de teste:
Experimente aqui.
Saída:
fonte
Groovy,
131129Dois bytes economizados graças à carusocomputação
fonte
i->
e useit
para salvar 2 bytes.{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()
ocupam muitos bytes. Existe uma maneira curta de criar um alias para.capitalize()
?C #, 305 bytes
Ainda há muito a melhorar, mas aqui está:
fonte
Ruby,
123117111102 bytesDesculpe por todas as edições - essa deve ser a última.
fonte
Python, 177 bytes
Entregue em formato de função para fins de economia de bytes. Esta não é uma resposta especialmente competitiva, mas é uma resposta que não exige
repr()
nemregex
trapaça. Também é independente de versão; funciona com Python 2 ou 3.Embora seja talvez uma solução muito rígida.
fonte
PHP,
109142 bytesUma fusão das respostas de user59178 e mbomb007 .
em maiúsculas a primeira letra de cada palavra e, em minúsculas, todas as palavras da lista, cercadas por espaços.
Infelizmente, o retorno de chamada precisa operar no conjunto completo; isso custa 29 bytes.
fonte
a an and as at but by for in nor of on or the to up
Raquete 353 bytes
Ungolfed:
Teste:
Saída:
fonte
Java 7,
431 317311 bytesObrigado a @KevinCruijssen por 114 bytes.
Obrigado a @RosLup por salvar 6 bytes.
destroçado
primeira resposta acima de 250 bytes
fonte
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 bytes ) Sugiro dar uma olhada no que mudei como dicas para a próxima vez. :) PS: Publiquei uma resposta com uma abordagem diferente ( 259 bytes ).c.substring(0,1).toUpperCase()+c.substring(1,c.length())+" "
que você fez duas vezes devem fazer você pensar em reutilizá-lo de alguma forma. E inicializações combinadas como você fez corretamente com oint
, mas por algum motivo não com oString
. Além disso, não há necessidade de extraboolean
quando você pode armazenar comoint
0 ou 1 e depois verificá-lo>0
. E tentaria evitar colchetes ebreak
o máximo possível; geralmente há um truque para se livrar deles, como ofor(f=0;f<b.length;z=c.equals(b[f++])|z>0?1:0);
que eu mostrei. :)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;}
E não há problema. :) Também aprendi muito quando era novo no golfe de código. Eu apenas faço uma lista com todas as dicas gerais de codegolf que eu aprendo e às vezes olho / atualizo. Mas meu código ainda é muito jogado por outros.PHP,
117118112 bytesUsa o comportamento
ucwords()
e escapa às palavras relevantes que são cercadas por espaços e exclui os caracteres de escape.Copiei a
(a[snt]?|and|[fn]or|up|by|but|the|to|in|o[rnf])
resposta de Jörg Hülsermann, mas como a abordagem é completamente diferente, estou postando como uma resposta separada.edit: bug percebido por Titus, corrigindo o custo de 1 byte. também: 6 bytes salvos graças ao seu comentário útil sobre strtr
fonte
strtr
vez destr_replace
. Ou acrescente as palavras com<>
e soltethe str_replace
e use a saída HTML.preg_filter
vez depreg_replace
. Eu não experimentá-lo com a sua soluçãonice try for a start
. Substituir um dos espaços por uma asserção resolve isso (+4 bytes).preg_filter
, falharia notitle
caso de teste, não retornando nada.Pure
bash
- 253(nenhum programa externo chamado) - precisa do bash v4
visão normal com comentários
saída
fonte
Japonês , 71 bytes
Experimente online!
Explicação:
Um dos meus recursos favoritos do Japt é a compactação de strings, que usa a biblioteca shoco .
Você pode compactar uma string envolvendo-a em
Oc"{string}"
→Oc"a an the at by for in of on to up and as but or nor"
Em seguida, descompacte-o com backticks ou
Od"{compressed string}"
→Od"a e by f up d ¿t n"
fonte
-S
sinalização foi adicionada após o lançamento deste desafio, portanto sua solução atual não é concorrente. No entanto, eu acho que você pode fazer£...+XÅ}S
, que estaria competindo para o mesmo byte-count ( Experimente online! )Pure
bash
-205192181 bytesComo a resposta do jm66,
tc
aceita entrada padrão.fonte
Na verdade , 79 bytes
Experimente online!
Explicação:
fonte
Lote, 323 bytes
Com comentários:
fonte