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.
prompt()
?