Вы были наняты для написания некоторого кода для приложения для диктовки, которое принимает голосовой ввод из разговорного источника, анализирует его как слова и записывает его на экране.
Руководство на самом деле не доверяет вам всю мощь проекта - вы, к сожалению, весь день сидите и играете в гольф, а не выполняете свою работу, поэтому они просто дают вам действительно простую задачу: Предложение со вставленной пунктуацией в правильно отформатированном предложении, где «правильно отформатированный» определяется ниже.
Предложение - это строка ввода. Слово - это группа случайных непробельных символов. Пунктуация - это Слово, первым символом которого является
^
.Слово пишется с большой буквы, если первая буква Слова не строчная (слова с заглавной буквы соответствуют регулярному выражению
/[^a-z].*/
).Первое Слово Предложения должно быть написано заглавными буквами.
A
^COMMA
является запятой,
и имеет пробел после, но не перед ним.aaa ^COMMA bbb
становитсяaaa, bbb
.А
^COLON
это запятая, которая выглядит так:
.А
^SEMICOLON
это запятая, которая выглядит так;
.А
^PERIOD
это запятая, которая выглядит так.
. Слово после a^PERIOD
должно быть написано заглавными буквами.А
^BANG
это период, который выглядит так!
.A
^DASH
является символом тире-
и имеет пробел как перед, так и после.A
^HYPHEN
также является символом тире,-
но не имеет пробела после или перед ним.Это
^EMDASH
дефис (не тире!), Который пишется--
.An
^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()
?Ответы:
JavaScript:
653 611 547 514487 байтО, черт возьми. Брендан Эйч, мне так жаль.
PS: я добавил пробел для удобства чтения, но удаление всех допустимых пробелов приводит к количеству байтов в списке.
Теоретически я мог бы сократить некоторые части, например,
-e-
до чего-то вроде-e
или-e
, но это может вызвать проблему, если предыдущее слово заканчивается или следующее слово начинается с буквы «е» (или любого другого слова, которое я решу использовать). Я полагаю, я мог бы использовать символ ASCII. Я посмотрю на это.Только 487 FF22 +
Только 514 FF22 +
547 только FF22 +
611 FF 22+ Только
653 кросс-браузер
Как это работает:
JSFiddle (для 653-байтового кросс-браузерного решения)
JSFiddle (для 595 FF 22+ только раствор)
JSFiddle ( только для решения 547 FF 22+ )
JSFiddle ( только для решения 514 FF 22+ )
JSFiddle ( только для решения 487 FF 22+ )
Это первый раз, когда мне приходилось писать JS, в котором используется более одного регулярного выражения, и обычно мое регулярное выражение предопределено.
Я буду продолжать сбрить байты настолько, насколько смогу.
источник
c.replace(/\^((COMMA)|(SEMICOLON)|(COLON)|(PERIOD)|(BANG))/g,(m,_,a,b,c,d,e)=>a?',':b?';':c?':':d?'.':'!'))
... и так далее. Синтаксис стрелки короткий, но даже «функция» должна сохранять те же символы=>
s, чтобы заставить его работать, но использование стрелок сэкономило мне 40 байт!PHP, 412 байт
(Разгаданный здесь для ясности; см. Ideone для версии для гольфа .)
Функция PHP preg_replace () будет принимать аргументы массива, что очень полезно здесь. Я думаю, что следующий код делает все, что требуется. Он проходит все тестовые случаи как минимум.
источник