Você foi contratado para escrever um código para um aplicativo que utiliza ditados, que recebe a entrada de voz de uma fonte falada, a analisa como palavras e a anota na tela.
A gerência realmente não confia em você com tanta força no projeto - você sabe que fica sentado e codifica golfe o dia todo, em vez de fazer seu trabalho, infelizmente - então eles apenas oferecem uma tarefa realmente simples de executar: Frase com Pontuação intercalada em uma frase formatada corretamente, onde 'formatado corretamente' é definido abaixo.
A frase é a sequência de entrada. Uma palavra é um grupo de caracteres não-espaço contíguos. Uma pontuação é uma palavra cujo primeiro caractere é
^
.Uma palavra é maiúscula se a primeira letra da palavra não for minúscula (as palavras maiúsculas correspondem à regex
/[^a-z].*/
).A primeira palavra da sentença deve ser maiúscula.
A
^COMMA
é o caractere de vírgula,
e tem um espaço a seguir, mas não precedendo.aaa ^COMMA bbb
torna-seaaa, bbb
.A
^COLON
é uma vírgula que se parece:
.A
^SEMICOLON
é uma vírgula que se parece;
.A
^PERIOD
é uma vírgula que se parece.
. A palavra após a^PERIOD
deve ser maiúscula.A
^BANG
é um período que parece!
.A
^DASH
é o caractere de traço-
e tem um espaço anterior e seguinte.A
^HYPHEN
também é o caractere de hífen,-
mas não possui espaço a seguir ou anterior.An
^EMDASH
é um hífen (não um traço!) Que está escrito--
.An
^OPENQUOTE
é um caractere de citação"
que possui um espaço anterior, mas não segue. A palavra após um^OPENQUOTE
deve ser maiúscula. Se um^OPENQUOTE
for precedido por uma palavra que não seja pontuação, adicione um^COMMA
entre essa palavra e o^OPENQUOTE
. Se um^OPENQUOTE
for precedido por uma Pontuação que coloque a próxima palavra em maiúscula, ela passará^OPENQUOTE
para a próxima palavra.A
^CLOSEQUOTE
é o dígrafo,"
que possui um espaço a seguir, mas não precedendo. Se um^CLOSEQUOTE
é precedida por um^COMMA
,^PERIOD
ou^BANG
, que a pontuação desaparece eo^CLOSEQUOTE
está escrito,"
,."
ou!"
, respectivamente. Se a Pontuação que desapareceu especificou uma capitalização, essa capitalização ainda deve ocorrer na próxima palavra disponível.Os espaços iniciais ou finais no resultado final completo devem ser removidos e qualquer sequência de dois ou mais espaços em uma linha deve ser recolhida em um único caractere de espaço.
Qualquer caso não coberto acima (por exemplo,
^COMMA ^COMMA
ou^SEMICOLON ^CLOSEQUOTE
ou^UNDEFINEDPUNCTUATION
) não ocorrerá em dados bem formados e, portanto, é um comportamento indefinido.
A equipe de desenvolvimento informa o seguinte:
O projeto está sendo escrito no idioma [seu idioma aqui] e deve ser o mais curto possível, para que ocupe o mínimo de espaço possível quando for um aplicativo para Android / iPhone. Você tenta explicar que não é assim que o desenvolvimento de aplicativos funciona, mas eles não ouvem. Mas ei, que coincidência! Você é um jogador incrível no [seu idioma aqui] !
O aplicativo não terá permissões de acesso à Web e não haverá bibliotecas instaladas que façam essa formatação para você. Provavelmente, você pode convencer o líder da equipe a permitir uma biblioteca de expressões regulares, se houver alguma para o seu idioma, se achar que precisa de uma.
O suporte para cotações aninhadas que usam aspas duplas / simples corretamente está planejado para uma versão posterior do aplicativo, mas não para a versão em que você está trabalhando agora, portanto, não se preocupe.
O gerenciamento é um grande fã do desenvolvimento orientado a testes e, portanto, a equipe de desenvolvedores já solicitou que um macaco de teclado infeliz escrevesse alguns testes para sua parte do programa: (novas linhas adicionadas para facilitar a leitura, trate-as como espaços)
Entrada:
hello ^COMMA world ^BANG
Resultado:
Hello, world!
Entrada:
once upon a time ^COMMA there was a horse ^PERIOD that horse cost me $50 ^PERIOD ^OPENQUOTE eat your stupid oats ^COMMA already ^BANG ^CLOSEQUOTE I told the horse ^PERIOD the horse neighed back ^OPENQUOTE no ^CLOSEQUOTE and died ^PERIOD THE END
Resultado:
Once upon a time, there was a horse. That horse cost me $50. "Eat your stupid oats, already!" I told the horse. The horse neighed back, "No," and died. THE END
Entrada:
begin a ^PERIOD b ^COMMA c ^COLON d ^SEMICOLON e ^BANG f ^HYPHEN g ^DASH h ^EMDASH i ^OPENQUOTE j ^PERIOD ^OPENQUOTE k ^SEMICOLON ^OPENQUOTE l ^CLOSEQUOTE m ^BANG ^CLOSEQUOTE n ^PERIOD 0x6C6F6C end
Resultado:
Begin a. B, c: d; e! F-g - h--i, "j. "K; "l," m!" N. 0x6C6F6C end
Este é um código de golfe: a pontuação mais baixa vence. Você pode escrever uma função de um argumento de seqüência de caracteres ou um programa lendo STDIN e gravando em STDOUT.
fonte
prompt()
?Respostas:
JavaScript:
653611547514487bytesOh meu Deus. Brendan Eich Sinto muito por isso.
PS: Adicionei espaço em branco para facilitar a leitura, mas eliminando todos os resultados de espaço em branco permitidos na contagem de bytes listados.
Teoricamente, eu poderia encurtar algumas partes como a
-e-
para algo como-e
ou-e
, mas isso pode causar um problema se a palavra anterior terminar com, ou a palavra seguinte começar com a letra 'e' (ou a palavra que eu decidir usar). Suponho que eu poderia usar um caractere ASCII. Eu vou investigar isso.Apenas 487 FF22 +
Apenas 514 FF22 +
Apenas 547 FF22 +
Apenas 611 FF 22+
653 entre navegadores
Como funciona:
JSFiddle (para a solução de navegador cruzado de 653 bytes)
JsFiddle (para o 595 FF 22+ única solução)
JsFiddle (para o 547 FF 22+ única solução)
JsFiddle (para o 514 FF 22+ única solução)
JsFiddle (para o 487 FF 22+ única solução)
É a primeira vez que escrevo JS que usa mais de um regex e, geralmente, meu regex é predefinido.
Continuarei a cortar os bytes o máximo que puder.
fonte
c.replace(/\^((COMMA)|(SEMICOLON)|(COLON)|(PERIOD)|(BANG))/g,(m,_,a,b,c,d,e)=>a?',':b?';':c?':':d?'.':'!'))
... e assim por diante. Arrow sintaxe é curto, mas 'função' ainda deve salvar mesmos caracteres=>
s para fazê-lo funcionar, mas usar as setas me salvou 40 bytes!PHP, 412 bytes
(Aqui não é para ser jogado para maior clareza; veja ideone para a versão em golfe ).
A função preg_replace () do PHP aceitará argumentos de matriz, o que é bastante útil aqui. Eu acho que o código a seguir faz tudo o que é necessário. Ele passa em todos os casos de teste pelo menos.
fonte