É relativamente rápido, mas tenho certeza que você vai gostar.
Codegolf um programa que terá entrada na forma de uma frase e fornecerá a saída com a primeira letra maiúscula em cada palavra.
Regras:
Os envios podem não estar na forma de uma função. Então não:
function x(y){z=some_kind_of_magic(y);return z;}
como sua resposta final ... Seu código deve mostrar que recebe entrada e fornece saída.O código deve preservar quaisquer outras letras maiúsculas que a entrada possui. tão
eCommerce and eBusiness are cool, don't you agree, Richard III?
será renderizado como
ECommerce And EBusiness Are Cool, Don't You Agree, Richard III?
Alguns de vocês podem estar pensando: "Calma, vou usar regex!" e, portanto, o uso da expressão regular nativa no idioma de golfe escolhido sofrerá uma penalidade de 30 caracteres, que será aplicada à sua contagem final de códigos. Risada maléfica
Uma "palavra" neste caso é qualquer coisa separada por um espaço. Portanto,
palate cleanser
há duas palavras, enquanto quepigeon-toed
é considerada uma palavra.if_you_love_her_then_you_should_put_a_ring_on_it
é considerado uma palavra. Se uma palavra começa com um caracter não alfabético, a palavra é preservada; portanto,_this
após a renderização, permanece como_this
. (Parabéns a Martin Buttner por apontar este caso de teste).- 4b Não há garantia de que as palavras na frase de entrada sejam separadas por um único espaço.
Caso de teste (use para testar seu código):
Entrada:
eCommerce rocks. crazyCamelCase stuff. _those pigeon-toed shennanigans. Fiery trailblazing 345 thirty-two Roger. The quick brown fox jumped over the lazy dogs. Clancy Brown would have been cool as Lex Luthor. good_bye
Saída:
ECommerce Rocks. CrazyCamelCase Stuff. _those Pigeon-toed Shennanigans. Fiery Trailblazing 345 Thirty-two Roger. The Quick Brown Fox Jumped Over The Lazy Dogs. Clancy Brown Would Have Been Cool As Lex Luthor. Good_bye
Este é o código de golfe, o código mais curto vence ...
Boa sorte...
fonte
Respostas:
CJam,
1513 bytesExperimente online no intérprete CJam .
Pseudo-código
Todos os caracteres modificados C são deixados na pilha e, portanto, impressos ao sair.
fonte
CSS 2.1, 49
Explicação :
attr
função recebe a entrada de umt
atributo HTML (texto).text-transform
paracapitalize
.content
propriedade em um pseudoelemento .::after
Fragmento executável :
Nota : CSS 2.1 especificou o comportamento desejado:
capitalize
coloque o primeiro caractere de cada palavra em maiúsculas. No entanto, o CSS3 maiúscula a primeira unidade de letra tipográfica de cada palavra. Portanto, o snippet acima não funcionará corretamente nem no IE antigo, que não seguia o CSS 2.1; nem em novos navegadores compatíveis que seguem CSS3.fonte
_those
problema em navegadores CSS3, mas eu ainda estou upvoting por causa da maneira única de resolver o problema.)Javascript ( ES6 ), 77 bytes
Comentado
fonte
x&&
. Uma string vazia é falsey, então os&&
curto-circuitos e retornam o operando esquerdo, a string vazia. Os espaços são preservados.Perl, 13 bytes
9 bytes mais 4 bytes para
040p
(assumindo que eu tenha interpretado as regras sobre invocações especiais corretamente).-040
define o separador de registro de entrada$/
para um único espaço, para que os espaços sejam preservados; a\u
sequência de escape converte o próximo caractere em maiúscula.fonte
CJam,
1715 bytesTeste aqui.
Implementação bastante direta das especificações. Utilize o novo
{}&
para evitar erros em espaços consecutivos.Dois bytes salvos por Dennis.
fonte
+
, isso será interrompido se a entrada contiver espaços à direita.C,
6463 bytesCorreção: alguns compiladores (como Clang) não gostam de parâmetros int no lugar do argv, então mudei para uma variável global. A contagem de bytes permanece a mesma. Graças a ossifrage melindroso por perceber. Até 63 bytes, obrigado Dennis.
Ungolfed:
Bem direto: se a é falso, o caractere é convertido em maiúsculas. É definido após a leitura de um espaço: c - '' é falso apenas se c == ''. toupper () ignora tudo que não é uma letra minúscula; portanto, símbolos e vários espaços são adequados. -1 possui todos os bits configurados; portanto, quando getchar () retorna -1, o operador NOT o torna zero e o loop para. a é declarado como uma variável global e, portanto, é inicializado como zero (falso). Isso garante que a primeira palavra seja maiúscula.
fonte
while(~(c=getchar())
- Eu gosto disso. Clang realmente não vai compilar isso, mas você pode obter o mesmo número de caracteres comc;main(a){...}
a
ec
e a ordem do operador ternário, você pode substituir==
com-
para salvar um byte.while(!(c = getchar()))
, certo?~
e o lógico!
não são os mesmos. Em C, qualquer coisa que não seja zero é considerada verdadeira; portanto, sua condição seria como awhile((c = getchar()) == 0)
que, obviamente, não funcionará. O operador NOT bit a bit~
nega o valor bit a bit. Para interromper o loop,~c
deve ser zero: isso significa que todos os bits devem ser um, para que, quando negados, se tornem todos os zeros. Esse valor (para um int de 32 bits) é0xFFFFFFFF
que, se assinado, é-1
(EOF).Python 3,
5956 bytesGraças a @Reticality por 3 bytes.
fonte
print(end=f*c.upper()or c)
? Isso salvaria 4 bytesVersão Perl <5.18,
3027262524
caracteres+1
para-n
.\u
torna o próximo caractere em uma seqüência de caracteres em maiúsculas . @ThisSuitIsBlackNot apontou isso para economizar 1 byte. Antes estávamos usando a funçãoucfirst
.Dos perldocs ,
Como
$"
avalia um espaço, isso preservará os espaços. Como queremos definir$,
um caractere de espaço e inserir um caractere de espaço na divisão, @nutki apontou que podemos fazer as duas coisas como entrada da divisão. Isso economiza 3 bytes do que tínhamos antes, que foi a primeira configuração$,
e depois a entrada$"
na divisão.Usar um
,
mapa for em vez de{}
salvar um byte adicional, como @ alexander-brett apontou.Correr com:
fonte
...map"\u$_",split...
> <> (Peixe) , 39 bytes
Método:
a-z
e imprima-o. (o código da esquerda para a direita desta parte éi::'backquote')$'{'(*' '*+
)fonte
JAVA, 273 bytes
EDITAR
fonte
public
na frente doclass
.. E se você quer dizer que ele pode remover opublic
na frente dostatic void main(...
, então você está errado, a menos que ele também mude oclass
parainterface
e use o Java 8+.JavaScript (solução regex) - 104 bytes
Alguém tem que morder a bala e postar a solução RegEx! 74 caracteres, mais a penalidade de +30 caracteres:
Ou se você quiser ler e entender o código de maneira não compactada:
fonte
Python 2, 73 bytes
Este programa coloca em maiúscula uma letra se precedido por um espaço (com um kludge para o primeiro caractere na string). Ele se baseia no
.upper()
método string para capitalizar corretamente.fonte
raw_input
=>input
, +2print
=>print()
)PHP 64
7677838489bytesConta
$_GET
como entrada em PHP?Se sim, aqui está minha primeira tentativa de computação gráfica
Graças manatwork :)
Pode-se usar a
ucwords
função, o que resultaria em 21 bytes:obrigado Harry Mustoe-Playfair :)
fonte
fgets(STDIN)
ler a entrada. Mas não temos consenso$_GET
até onde eu sei.$k=>
. Colocá-lo de volta:foreach(split(' ',$_GET[@s])as$k=>$v)echo$k?' ':'',ucfirst($v);
Haskell, 69
Explicação:
scanl
pega uma função(a -> b -> a)
e um valor iniciala
e itera sobre uma lista de[b]
s para criar uma lista de[a]
s:Ele pega repetidamente o resultado anterior como o argumento esquerdo da função passado para ele e um valor da lista de entrada como o argumento correto , para fazer o próximo.
Eu escrevi uma função
(!) :: Char -> Char -> Char
que retorna o caractere certo que você passa, mas coloca em maiúscula se o caractere esquerdo for' '
(espaço). Poisscanl
, isso significa: retornar o valor da lista de entrada , mas colocar em maiúscula se o resultado anterior for um espaço. Assimscanl (!) ' ' "ab cd"
se torna:Precisamos do valor inicial
' '
para colocar em maiúscula a primeira letra, mas depois a cortamostail
para obter nosso resultado final.fonte
scanl
exemplos: um , dois .Pitão, 20 bytes
Esses espaços múltiplos são realmente péssimos. Caso contrário, haveria uma solução realmente fácil de 12 bytes.
Experimente on-line: Compilador / Executor Pyth
Explicação
edit: 16 caracteres são possíveis com o algoritmo @Dennis.
fonte
CJam, 14 bytes
Não é o mais curto, mas ...
Outra resposta usando idéias semelhantes:
.x
somente altera o primeiro item se um dos parâmetros tiver apenas um item.fonte
f
e.
é bastante engenhoso. Outra variante de 14 bytes:qS/Sf.{\eu}S.-
Lua,
646261 bytesLua é uma linguagem horrenda para jogar golfe, então estou muito orgulhosa de mim mesma por esta.
[Experimente aqui]1 Desatualizado, atualizará amanhãfonte
abc_def
isso daráAbc_Def
. No entanto, apenas as letras após os espaços devem estar em maiúsculas. A boa notícia é que corrigi-lo economiza um byte. ;)JAVA, 204
211226bytesMinha primeira entrada no CG, espero que esteja bem:
Guardado 7 bytes graças a @TNT
fonte
public class U{public static void main(String[]s){int i=-1,j;char[]r=s[0].toCharArray();for(char c:r)if(++i==0||c==' '&&i>0)r[j=i+(i==0?0:1)]=Character.toUpperCase(r[j]);System.out.print(r);}}
public
modificador não é necessário para que você possa economizar mais 7.PHP:
7674 caracteresExemplo de execução:
fonte
ucfirst($c)
, use$c^' '
. (Dica: se vocêbitwise-xor
usar uma letra com um espaço, ela será convertida de maiúscula para minúscula e o contrário também se aplica)$l=str_split(fgets(STDIN))
, o que reduz o código em 2 bytes!C, 74 bytes
Não faz suposições sobre o conjunto de caracteres em tempo de execução (ASCII, EBCDIC, Baudot, ... qualquer que seja). Assume que o EOF é negativo (acho que C garante isso).
a é o caractere de entrada; b é verdadeiro se o último caractere for espaço. O único bit não óbvio é que usamos o fato de
putchar
retornar o caractere impresso se não houver erro.fonte
C # Linq - 187
Isso não está nem perto de ganhar, mas eu amo Linq demais.
fonte
Vim,
11, 10 bytesExplicação:
Recebo um distintivo de ouro por derrotar Dennis?
fonte
Bash, 61
Observe que os dois pontos são simplesmente para fazer o programa exibir OK aqui. Na realidade, esses caracteres podem ser imprimíveis, como BEL.
Saída
Bash, 12
Infelizmente este não preserva espaços à esquerda / múltiplos / à direita, mas, caso contrário, funciona:
Saída
fonte
Pip , 15 + 1 para
-s
= 16Explicação:
Uma característica interessante do Pip que este programa utiliza é o
:
meta-operador de atribuição. A maioria das linguagens tipo C possui algum conjunto de operadores de computação e atribuição: por exemplo,x*=5
faz a mesma coisa quex=x*5
. No Pip, no entanto, você pode prender:
em qualquer operador e transformá-lo em um operador de computação e atribuição. Isso vale mesmo para operadores unários. Então-:x
calcula-x
e atribui de voltax
, da mesma forma quex:-x
faria. Nesse caso,UC:
é usado (junto com as seqüências mutáveis do Pip) para colocar em maiúscula o primeiro caractere de uma palavra.O programa recebe entrada da linha de comando, exigindo uma chamada como esta:
fonte
C, 125
Não é a menor das soluções, mas eu realmente gosto de jogar golfe em C.
ungolfed:
Eu não sei se o uso de sintaxe do tipo regex
scanf
está estendendo as regras, mas funciona muito bem. (Bem, tecnicamente, não é um regex completo )Outra coisa a considerar é que esse código funciona apenas para palavras menores que 99 bytes. Mas acho que essa solução funcionará na maioria dos casos.
fonte
Haskell: 127 caracteres
fonte
PHP, 82
Uso:
fonte
C #,
133131fonte
&&c!=32
? Não sou muito fluente em c #, mas acho que converter um espaço em maiúsculas resulta em um espaço.Mathematica, 66 bytes
Eu usaria
ToCamelCase
, mas não preserva o espaçamento.fonte
R,
139105 bytesUngolfed + explicação:
R com regex,
4941 + 30 = 71 bytesEstou realmente chateado; isso realmente tem uma pontuação melhor usando expressões regulares com a penalidade.
Isso corresponde a qualquer caractere único no início da sequência ou após qualquer número de espaços e o substitui por uma versão em maiúscula da captura. Observe que a inscrição
\\U
é legítima e não tem efeito para não letras.pe=T
é interpretado comoperl = TRUE
uma vez que tira proveito da correspondência parcial de parâmetros de função de R e do sinônimo deTRUE
. Por qualquer motivo, R não usa a expressão regular no estilo Perl por padrão.Agradecemos a MickyT por ajudar a economizar 8 bytes na abordagem regex!
fonte
(^.| +.)
. Maiúsculas qualquer coisa está OK.