Vous avez été embauché pour écrire du code pour une application de prise de dictée, qui prend les entrées vocales d'une source parlée, les analyse comme des mots et les écrit sur un écran.
La direction ne vous fait pas vraiment confiance avec autant de puissance dans le projet - vous êtes connu pour vous asseoir et jouer au golf toute la journée au lieu de faire votre travail, malheureusement - alors ils vous donnent juste une tâche très simple à effectuer: tourner un Phrase avec ponctuation entrecoupée en une phrase correctement formatée, où «correctement formaté» est défini ci-dessous.
La phrase est la chaîne d'entrée. Un mot est un groupe de caractères non spatiaux contingents. Une ponctuation est un mot dont le premier caractère est
^
.Un mot est mis en majuscule si la première lettre du mot n'est pas une lettre minuscule (les mots en majuscule correspondent à l'expression régulière
/[^a-z].*/
).Le premier mot de la phrase doit être en majuscule.
A
^COMMA
est le caractère virgule,
et possède un espace suivant mais non précédant.aaa ^COMMA bbb
devientaaa, bbb
.A
^COLON
est une virgule qui ressemble:
.A
^SEMICOLON
est une virgule qui ressemble;
.A
^PERIOD
est une virgule qui ressemble.
. Le mot suivant a^PERIOD
doit être en majuscule.A
^BANG
est une période qui ressemble!
.A
^DASH
est le tiret-
et a un espace à la fois avant et après.A
^HYPHEN
est également le caractère de tiret-
mais n'a aucun espace suivant ou précédent.An
^EMDASH
est un trait d'union (pas un tiret!) Qui est orthographié--
.An
^OPENQUOTE
est un caractère de citation"
qui a un espace précédant mais non suivant. Le mot suivant un^OPENQUOTE
doit être en majuscule. Si un^OPENQUOTE
est précédé d'un mot qui n'est pas un signe de ponctuation, ajoutez un^COMMA
entre ce mot et le^OPENQUOTE
. Si an^OPENQUOTE
est précédé d'une ponctuation qui met le mot suivant en majuscule, cela passe au^OPENQUOTE
mot suivant.A
^CLOSEQUOTE
est le digraphe,"
qui a un espace suivant mais non précédant. Si un^CLOSEQUOTE
est précédée par un^COMMA
,^PERIOD
ou^BANG
que Ponctuation disparaît et^CLOSEQUOTE
est orthographié,"
,."
ou!"
respectivement. Si la ponctuation disparue spécifiait une capitalisation, cette capitalisation doit toujours se produire sur le mot disponible suivant.Les espaces initiaux ou de fin dans le résultat final complet doivent être supprimés et toute chaîne de deux espaces ou plus dans une ligne doit être entièrement réduite en un seul caractère d'espace.
Tout cas non couvert ci-dessus (par exemple
^COMMA ^COMMA
ou^SEMICOLON ^CLOSEQUOTE
ou^UNDEFINEDPUNCTUATION
) ne se produira pas dans une entrée bien formée et est donc un comportement indéfini.
L'équipe de développement vous informe des éléments suivants:
Le projet est écrit dans la langue [votre langue ici] et doit être aussi court que possible afin qu'il prenne le moins de place possible lorsqu'il s'agit d'une application pour Android / iPhone. Vous essayez d'expliquer que ce n'est pas ainsi que fonctionne le développement d'applications, mais ils n'écoutent pas. Mais bon, quelle coïncidence! Vous êtes un golfeur incroyable dans [votre langue ici] !
L'application ne disposera d'aucune autorisation d'accès Web et aucune bibliothèque installée n'effectuera cette mise en forme pour vous. Vous pouvez probablement convaincre le chef d'équipe de vous autoriser une bibliothèque d'expressions régulières s'il en existe une pour votre langue, si vous pensez en avoir besoin.
La prise en charge des devis imbriqués qui utilisent correctement les guillemets doubles / simples est prévue pour une version ultérieure de l'application, mais pas la version sur laquelle vous travaillez maintenant, alors ne vous inquiétez pas.
La gestion est un grand fan du développement piloté par les tests, et donc l'équipe de développement a déjà eu un malheureux singe clavier pour écrire des tests pour votre partie du programme: (nouvelles lignes ajoutées pour plus de lisibilité, les traiter comme des espaces)
Contribution:
hello ^COMMA world ^BANG
Production:
Hello, world!
Contribution:
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
Production:
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
Contribution:
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
Production:
Begin a. B, c: d; e! F-g - h--i, "j. "K; "l," m!" N. 0x6C6F6C end
C'est un golf de code: le score le plus bas l'emporte. Vous pouvez écrire une fonction d'un argument de chaîne ou un programme lisant à partir de STDIN et écrivant à STDOUT.
prompt()
?