Вдохновлен этим скромным вопросом StackOverflow .
Идея проста; учитывая String и массив Strings, удалите любые экземпляры слов в массиве (игнорируя регистр) из входной строки, кроме первой, вместе с любыми дополнительными пробелами, которые это может оставить. Слова должны соответствовать целым словам во входной строке, а не частям слов.
например "A cat called matt sat on a mat and wore a hat A cat called matt sat on a mat and wore a hat", ["cat", "mat"]
должен выводить"A cat called matt sat on a mat and wore a hat A called matt sat on a and wore a hat"
вход
- В качестве входных данных можно использовать либо строку, либо массив строк или массив строк, где входная строка является первым элементом. Эти параметры могут быть в любом порядке.
- Входная строка не может быть принята как список строк, разделенных пробелом.
- Входная строка не будет иметь начальных, конечных или последовательных пробелов.
- Все входные данные будут содержать только символы [A-Za-z0-9], за исключением входной строки, также включающей пробелы.
- Входной массив может быть пустым или содержать слова, отсутствующие во входной строке.
Выход
- Вывод может быть либо возвращаемым значением из функции, либо распечатан в STDOUT
- Вывод должен быть в том же случае, что и исходная строка
Контрольные примеры
the blue frog lived in a blue house, [blue] -> the blue frog lived in a house
he liked to read but was filled with dread wherever he would tread while he read, [read] -> he liked to read but was filled with dread wherever he would tread while he
this sentence has no matches, [ten, cheese] -> this sentence has no matches
this one will also stay intact, [] -> this one will also stay intact
All the faith he had had had had no effect on the outcome of his life, [had] -> All the faith he had no effect on the outcome of his life
5 times 5 is 25, [5, 6] -> 5 times is 25
Case for different case, [case] -> Case for different
the letters in the array are in a different case, [In] -> the letters in the array are a different case
This is a test Will this be correct Both will be removed, [this,will] -> This is a test Will be correct Both be removed
Поскольку это кодовый гольф, выигрывает самое низкое количество байтов!
This is a test Will this be correct Both will be removed
+this will
. Вторые два слова удаляются правильно, но оно также удаляетсяbe
после второгоwill
по некоторым причинам.@B=<>;$_=join$",grep!(/^$_$/xi~~@B&&$v{+lc}++),@F
lc
без паренов. Потрясающие! И использование регулярных выражений для массива намного лучше, спасибо! Я изо всех сил, чтобы вспомнить все ваши советы!Pyth, 27 байт
Попробуйте онлайн
объяснение
Я уверен, что 10 байтов для проверки без учета регистра могут быть уменьшены, но я не вижу как.
источник
Stax , 21 байт CP437
25 байт при распаковке,
Результатом является массив. Удобный вывод для Stax - один элемент на строку.
Запускать и отлаживать онлайн!
объяснение
источник
Perl 6 , 49 байт
Проверь это
Expanded:
источник
Perl 5 ,
5048 байтовВключает
+1
в себя для-p
Укажите целевую строку, за которой следует каждое слово фильтра в отдельных строках STDIN:
Требуется
chop
только для исправления завершающего пробела в случае удаления последнего словаПросто код:
Попробуйте онлайн!
источник
JavaScript (ES6), 98 байт
источник
К4 , 41 байт
Решение:
Примеры:
Объяснение:
Разделите пробел, строчные буквы обоих входов, найдите совпадения, удалите все, кроме первого вхождения, соедините строку обратно вместе.
источник
JavaScript (Node.js) , 75 байт
Попробуйте онлайн!
источник
f=
в ваш счетчик байтов. Вы также можете сохранить байты по выделке параметров, заменяя(s,a)=>
с ,s=>a=>
а затем вызвать функцию сf(s)(a)
.JavaScript ES6, 78 байт
Как это устроено:
источник
f
для рекурсивного вызова, безымянная функция также будет допустимой отправкой, поэтому вы можете сохранить два байта, отбросивf=
.PowerShell v3 или новее, 104 байта
За счет одного байта он может работать в PS 2.0, заменяя
$Matches.0
на$Matches[0]
.Длинная версия:
Используйте
Save as Whwhat.ps1 и вызывайте со строкой и словами в качестве аргументов. Если нужно передать более одного слова, слова должны быть заключены в @ ():
Альтернатива без файла (может быть вставлена непосредственно в консоль PS):
сохраните сценарий как ScriptBlock (внутри фигурных скобок) в переменной, затем вызовите его метод Invoke () или используйте его с Invoke-Command:
источник
Javascript, 150 байт
источник
Чистый ,
153142138134 байтаПопробуйте онлайн!
Определяет функцию
$ :: String [String] -> String
, буквально делая то, что описывает задача. Он находит и удаляет каждое вхождение после первого, для каждого целевого слова.источник
Сетчатка,
4637 байт-14 байтов благодаря @Neil и +5 байтов за исправление ошибки.
Ввод в формате
word1,word2,word3,sentence
, потому что я не уверен, как сделать многострочный ввод (где входы используются по-разному) ..Объяснение:
Попробуйте онлайн.
источник
+i`((.+),.*\2.* )\2( |$)
второй,$1
но я заметил, что ваш кодoften,he intended to keep ten geese
все равно не работает.\b
вместо(^|,)
, но плохие новости в том, что я думаю, что вам нужно\b\3\b
(хотя я еще не разработал подходящий тестовый пример).Красный , 98 байт
Попробуйте онлайн!
источник
Шелуха , 13 байт
Принимает список строк и одну строку в качестве аргументов в указанном порядке. Предполагается, что список не содержит дубликатов. Попробуйте онлайн!
объяснение
источник
Мин , 125 байт
Входные данные находятся
quot
в стеке с входной строкой в качестве первого элемента, аquot
повторяющиеся строки - в качестве второго элемента, т.е.источник
Python 3 , 168 байт
Попробуйте онлайн!
источник
AWK , 120 байт
Попробуйте онлайн!
Часть «удалить пробелы» сделала это немного сложнее, чем я думал. Установка поля в
""
, удаляет поле, но оставляет дополнительный разделитель.Ссылка TIO имеет 28 дополнительных байтов для разрешения нескольких записей.
Ввод дан более 2 строк. Первая строка - это список слов, а вторая - «предложение». Обратите внимание, что «слово» и «слово» не считаются идентичными приложенным знакам препинания. Наличие требований пунктуации, вероятно, сделает эту проблему еще более забавной .
источник
Рубин ,
63 61 6059 байтПопробуйте онлайн!
Более короткая версия, чувствительная к регистру и не работающая ~ каждые 10 15 раз из-за случайности (37 байт)
источник
Python 2 , 140 байт
Попробуйте онлайн!
Объяснение:
re.sub(..)
может принимать в качестве аргумента функцию вместо строки замены. Итак, у нас есть какая-то необычная лямбда. Функция вызывается для каждого экземпляра шаблона, и в эту функцию передается один объект - matchobject. Этот объект имеет информацию о найденном происшествии. Меня интересует индекс этого события, который можно получить с помощьюstart()
илиend()
функции. Последний короче, поэтому он используется.Чтобы исключить замену первого вхождения слова, я использовал другую функцию поиска по регулярному выражению, чтобы получить точно первый, а затем сравнить индексы, используя тот же
end()
Флаг
re.I
является короткой версиейre.IGNORECASES
источник