Вас взяли на роботу, щоб написати якийсь код для програми, що приймає диктанти, яка приймає голосовий вхід із розмовного джерела, розбирає його як слова та записує його на екрані.
Керівництво насправді не довіряє вам всією силою в проекті - вам відомо, що ви цілий день сидите навколо та гольф-код, замість того, щоб робити свою роботу, на жаль, - тому вони просто дають вам справді просте завдання для виконання: поверніть Речення з вписаними розділовими знаками в правильно відформатоване речення, де "правильне відформатування" визначено нижче.
Речення - це рядок введення. Слово - це група непересічних символів, що не є космосом. Пунктуація - це слово, першим символом якого є
^
.Слово пишеться з великої літери, якщо перша літера слова не є малою літерою (великі слова відповідають рівню
/[^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()
?