Программирование очень жесткое. Вы не можете указать программе «выводить количество бананов», вы должны сообщить об этом print(bananas)
.
Но когда вы делаете это, вы сталкиваетесь с проблемой: вы не знаете, сколько у вас бананов заранее, поэтому вы не знаете, стоит ли использовать множественное число.
Иногда программисты идут ленивым путем. Вместо проверки они просто печатают there are X banana(s)
.
Но это ужасно, поэтому нам нужна программа, чтобы это исправить.
Метод (ы)
Чтобы удалить неоднозначное множественное число в строке, выполните следующие действия:
Разбейте строку на пробелы в список слов.
Для каждого слова, которое заканчивается на
(s)
, сделайте следующее:- Если предшествующий слово
a
,an
,1
илиone
, удалить(s)
в конце слова. - В противном случае, если слово является первым словом в строке или предыдущее слово не
a
,an
,1
илиone
, заменить(s)
в конце слова сs
.
- Если предшествующий слово
Соедините список слов обратно в строку, сохранив исходный пробел.
Примеры)
Давайте возьмем строку there's a banana(s) and three apple(s)
.
Сначала мы разбиваем строку на список слов: ["there's", "a", "banana(s)", "and", "three", "apple(s)"]
Для второго шага мы берем два слова, заканчивающиеся на (s)
: banana(s)
и apple(s)
.
Слово раньше banana(s)
есть a
, поэтому мы удаляем (s)
, делая это banana
. Слово , прежде чем apple(s)
это three
, так что мы изменить , (s)
чтобы s
, таким образом , она становится apples
.
Теперь у нас есть ["there's", "a", "banana", "and", "three", "apples"]
. Присоединяясь к списку вместе, мы получаем there's a banana and three apples
. Это наш конечный результат.
Испытания)
Создайте программу или функцию, которая принимает неоднозначную строку в любом приемлемом формате и возвращает однозначную версию этой строки.
Вы можете предположить, что строка не содержит символов новой строки, табуляции или возврата каретки.
Я забыл указать, нужно ли разбивать группы пробелов или пробелов (то есть, следует ли использовать okay then
два пробела ["okay", "then"]
или ["okay", "", "then"]
) при публикации задания , так что вы можете принять любую форму расщепления.
Тестовый набор (ы)
Input -> Output
there are two banana(s) and one leprechaun(s) -> there are two bananas and one leprechaun
there's a banana(s) and three apple(s) -> there's a banana and three apples
apple(s) -> apples
one apple(s) -> one apple
1 banana(s) -> 1 banana
banana -> banana
preserve original whitespace(s) -> preserve original whitespaces
11 banana(s) -> 11 bananas
an apple(s) -> an apple
this is a te(s)t -> this is a te(s)t
I am a (s)tranger(s) -> I am a (s)tranger
счет
Поскольку это код-гольф , выигрывает представление с наименьшим количеством байтов!
apple(s)
тестовый набор дать результатapples
? ЗадачаOtherwise, if the word is the first word in the string . . . replace the (s) at the end of the word with s.
состоит в том, чтобы отметить, что этот случай уступилapples
в песочнице для первых трех ревизий, но изменился на четвертой.There's a single banana(s)
->There's a single bananas
.Ответы:
Mathematica,
151148 байтобъяснение
Установите
j
пробельные символы. Установитеk
для шаблона «notj
» (= непробельный символ).Добавьте два пробела и добавьте один пробел к входным данным.
Для подстроки, соответствующей шаблону:
a
), за которым следуетs
), за которыми следуетw
), за которыми следует"(s)"
, сопровождаемаяЕсли
a
это не одно из единственного слова, оцените"s"
иначе""
.Заменить шаблон согласования с
j
,a
,s
,w
,If[FreeQ[a,"a"|"an"|"1"|"one"],"s",""]
, иj
соединены друг с другом.Возьмите из позиции 3 в позицию -2 (индексирован 1; отрицательные индексы отсчитываются с конца). Это потому, что мы добавили три пробела в начале.
источник
Python 3 , 94 байта
Попробуйте онлайн!
-4 байта, благодаря I Cri Everytim (я думаю, что это приемлемо)
источник
__import__
не может быть короче ... Да, это на 4 байта короче обычногоimport re
.Сетчатка , 53 байта
Попробуйте онлайн!
источник
banana(s)
вthere's a banana(s) and three apple(s)
- попробовать это исправитьa|an
вan?
течение -1 байтMathematica, 313 байтов
источник
Perl 5, 43 + 1 (-p) = 44 байта
Подберите каждый
(s)
конец слова, замените его на!$1
(1 или 0).источник
Pyth - 53 байта
Следует алгоритму в значительной степени, как есть.
Попробуйте это онлайн здесь .
источник
there are two banana(s) and one leprechaun(s)
(два пробела послеone
). Оригинальный пробел сохраняется, ноleprechaun(s)
игнорируетone
перед ним.one
иleprechaun(s)
Желе ,
52 5149 байтУ желе нет одного атома регулярного выражения
Полная программа, принимающая строку (использующая форматирование Python, если многострочное или содержащая кавычки) и распечатывающая выходные данные.
Попробуйте онлайн! или посмотрите набор тестов .
Как?
источник
Ṫ
в качестве отдельной ссылки. Это мешаетṪ
удалить элемент из исходного списка?Ŀ
для этого, но я не вижу короткого пути к хвосту внутри ссылки 4, но это возможно. Там может быть даже способ получить хвост ссылки 4 там же!Ŀ
вещь может называть первую ссылку, поэтомуṪ
это ссылка сама по себе.Java (OpenJDK 8) ,
918396 байтПопробуйте онлайн!
источник
Perl 5 , 56 + 1 (
-p
) = 57 байтПопробуйте онлайн!
источник
a hel(s)lo
.a hel(s)lo
добавлен в тестовыеJavaScript (ES6),
8887 байтОбъяснение в ближайшее время.
источник
\s
на `` в соответствии с "Вы можете предположить, что строка не содержит ни перевода строки, ни табуляции, ни возврата каретки."(\s|$)
в конец регулярное выражение.JavaScript (ES6), 84 байта
Вот интересный способ переставить последнюю часть, которая, к сожалению, на 2 байта длиннее:
источник
JavaScript (SpiderMonkey) , 82 байта
Попробуйте онлайн!
78-байтовая версия (менее надежная)
Это модифицированная версия ETHproductions '(у меня нет 50 представителей)
объяснение
/(\S+ +(\S+))\(s\)/g
- фактический шаблон для поиска (amount object(s)
)(_,a)=>a
-_
это переменная ловить все,a
является(\S+ +(\S+))
"s"[+/^(1|one|an?)/i.test(a)]||""
- вместо нарезки массива просто создайте фиктивный массив и получите индекс (+/.../.test
возвращает число)"s"[+/^(1|one|an?)/i.test(a)]
вернутьundefined
(true
или1
для теста) возврат""
источник