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.
la source
prompt()
?Réponses:
JavaScript:
653 611 547 514487 octetsOh mon Dieu. Brendan Eich Je suis vraiment désolé pour ça.
PS: J'ai ajouté un espace blanc pour la lisibilité, mais supprimer tous les espaces blancs autorisés entraîne le nombre d'octets répertorié.
Théoriquement, je pourrais raccourcir certaines parties comme le
-e-
à quelque chose comme-e
ou-e
, mais cela pourrait causer un problème si le mot précédent se termine par, ou si le mot suivant commence par la lettre `` e '' (ou le mot que je décide d'utiliser). Je suppose que je pourrais utiliser un caractère ASCII. J'examinerai cela.487 FF22 + seulement
514 FF22 + seulement
547 FF22 + seulement
611 FF 22+ uniquement
653 cross-browser
Comment ça fonctionne:
JSFiddle (pour la solution multi-navigateur de 653 octets)
JSFiddle (pour la solution 595 FF 22+ uniquement )
JSFiddle (pour la solution 547 FF 22+ uniquement )
JSFiddle (pour la solution 514 FF 22+ uniquement )
JSFiddle (pour la solution 487 FF 22+ uniquement )
C'est la première fois que je dois écrire JS qui utilise plus d'une expression régulière, et généralement mon expression régulière est prédéfinie.
Je continuerai à raser autant d'octets que possible.
la source
c.replace(/\^((COMMA)|(SEMICOLON)|(COLON)|(PERIOD)|(BANG))/g,(m,_,a,b,c,d,e)=>a?',':b?';':c?':':d?'.':'!'))
... et ainsi de suite. La flèche sintax est courte, mais même la «fonction» devrait enregistrer les mêmes caractères=>
s pour le faire fonctionner, mais en utilisant les flèches, j'ai économisé 40 octets!PHP, 412 octets
(Non golfé ici pour plus de clarté; voir l'idéone pour la version golfée .)
La fonction preg_replace () de PHP acceptera les arguments de tableau, ce qui est plutôt utile ici. Je pense que le code suivant fait tout ce qui est requis. Il passe au moins tous les cas de test.
la source