Вас взяли на роботу, щоб написати якийсь код для програми, що приймає диктанти, яка приймає голосовий вхід із розмовного джерела, розбирає його як слова та записує його на екрані.
Керівництво насправді не довіряє вам всією силою в проекті - вам відомо, що ви цілий день сидите навколо та гольф-код, замість того, щоб робити свою роботу, на жаль, - тому вони просто дають вам справді просте завдання для виконання: поверніть Речення з вписаними розділовими знаками в правильно відформатоване речення, де "правильне відформатування" визначено нижче.
Речення - це рядок введення. Слово - це група непересічних символів, що не є космосом. Пунктуація - це слово, першим символом якого є
^.Слово пишеться з великої літери, якщо перша літера слова не є малою літерою (великі слова відповідають рівню
/[^a-z].*/).Перше слово Речення має бути з великої літери.
A
^COMMAє символом кома,і має пробіл, що слідує, але не передує.aaa ^COMMA bbbстаєaaa, bbb.A
^COLON- це кома, яка виглядає так:.A
^SEMICOLON- це кома, яка виглядає так;.A
^PERIOD- це кома, яка виглядає так.. Слово, що йде за a,^PERIODмає бути з великої літери.А
^BANG- це період, який виглядає так!.A
^DASH- тире-і має пробіл як перед, так і після нього.А
^HYPHENтакож є тире символом,-але не має місця після або перед ним.Ан
^EMDASH- це дефіс (не тире!), Що написано--.^OPENQUOTEЦитата персонаж ,"який має місце попереднє , але не такий. Слово, що йде за^OPENQUOTEобов’язковим колом, має бути з великої літери. Якщо^OPENQUOTEпередує слову, яке не є пунктуаційним знаком, додайте^COMMAміж цим словом і знаком^OPENQUOTE. Якщо^OPENQUOTEпередує пунктуація, що робить наступне слово з великої літери, це переходить^OPENQUOTEдо наступного слова.A
^CLOSEQUOTE- це диграф,,"який має пробіл, що слідує, але не передує. Якщо^CLOSEQUOTEпередує^COMMA,^PERIODабо^BANG, що пунктуації зникає і^CLOSEQUOTEпишеться,",."або!"відповідно. Якщо пунктуація, що зникає, вказала велику літери, ця величина все одно має відбуватися у наступному доступному слові.Початкові або кінцеві пробіли в повному кінцевому результаті повинні бути видалені, і будь-який рядок з двох або більше пробілів підряд повинен бути зведений в один пробільний символ.
Будь-який випадок не поширюється вище (наприклад ,
^COMMA ^COMMAчи ,^SEMICOLON ^CLOSEQUOTEабо^UNDEFINEDPUNCTUATION) не виникатимуть в добре сформовану вхід і, таким чином , поведінка не визначено.
Команда розробників повідомляє про наступне:
Проект написаний мовою [ваша мова тут] і повинен бути якомога коротшим, щоб він займав якомога менше місця, коли це додаток для Android / iPhone. Ви намагаєтесь пояснити, що розробка додатків працює не так, але вони не слухають. Але ей, який збіг! Ти дивовижний гольфіст [тут твоєї мови] !
У додатку не буде жодних дозволів доступу до Інтернету, і не буде встановлено бібліотек, які роблять це форматування для вас. Ви, напевно, можете переконати команду керівника дозволити вам створити бібліотеку регулярних виразів, якщо така існує для вашої мови, хоча ви вважаєте, що вона потрібна.
Підтримка вкладених пропозицій, які належним чином використовують подвійні / одинарні лапки, планується для більш пізньої версії програми, але не для версії, над якою ви зараз працюєте, тому не хвилюйтеся про це.
Керівництво є величезним шанувальником тестових розробок, і тому команді розробників вже була якась невдала мавпа з клавіатури, яка написала кілька тестів для вашої частини програми: (додаються нові рядки для читабельності, трактуйте їх як пробіли)
Вхід:
hello ^COMMA world ^BANGВихід:
Hello, world!Вхід:
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Вихід:
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Вхід:
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Вихід:
Begin a. B, c: d; e! F-g - h--i, "j. "K; "l," m!" N. 0x6C6F6C end
Це кодовий гольф: виграє найнижчий бал. Ви можете записати функцію одного аргументу рядка або зчитувати програму з STDIN і записати в STDOUT.
prompt()?