Задача
Создать функцию для обратного объединения строк
вход
Две строки (буквенно-цифровые + пробелы), где одна должна быть вычтена для другой.
- Вы можете предположить, что вычитаемая строка никогда не будет больше, чем другая.
Выход
Результат от вычитания
Вычитание
Вы должны удалить одну строку из начала или конца другой строки. Если строка присутствует в начале и в конце, вы можете удалить только одну, которая будет удалена на ваше усмотрение.
Если строка не находится в начале или в конце или не является точным соответствием, это недопустимое вычитание, и вы должны вывести исходную строку.
Тестовые случаи
Действительное вычитание
'abcde','ab' -> 'cde'
'abcde','cde' -> 'ab'
'abab','ab' -> 'ab'
'abcab','ab' -> 'abc' or 'cab'
'ababcde','ab' -> 'abcde'
'acdbcd','cd' -> 'acdb'
'abcde','abcde' -> ''
'abcde','' -> 'abcde'
'','' -> ''
Неверное вычитание (возвращает исходную строку)
'abcde','ae' -> 'abcde'
'abcde','aa' -> 'abcde'
'abcde','bcd' -> 'abcde'
'abcde','xab' -> 'abcde'
'abcde','yde' -> 'abcde'
Неверный ввод (не нужно обрабатывать)
'','a' -> ''
Это код-гольф , поэтому выигрывает самый короткий код в байтах!
cde
? Что вы подразумеваете под действительным? Нужно ли нам оценивать достоверность ввода или вы имеете в виду, что мы не получим неверные данные?'abcde','bcd' -> 'abcde'
, за нарушение моего решения'ababcde', 'ab'
→'abcde'
в качестве контрольного примера. Некоторые наивные алгоритмы терпят неудачу на этом.Ответы:
Java 8,
46454440 байт-1 байт благодаря TheLethalCoder
-1 байт, потому что я тупой (спасибо, Род!)
-4 байта благодаря Кевину Круйссену
Попробуйте онлайн! (включает все тестовые случаи)
Ответ Java на самом деле превосходит несколько других практических языков. Улыбки. (и теперь это бьет JS!)
источник
a->b->
First
вAll
течение -2 байт. Из-за^
и$
он всегда либо в конце, либо в начале строки, поэтому даже при этомreplaceAll
он заменяется только один раз. Попробуй это здесь. PS: я добавил зачеркнутый предыдущий счетчик байтов к вашему ответу, что обычно делается после внесения изменений в код-гольф здесь, на PPCG.All
вместоFirst
, это становится правдой:"abab" + "ab" -> ""
JavaScript (ES6), 41 байт
Принимает ввод через выделку синтаксиса, то есть
f("abab")("ab")
.источник
eval()
для создания RegExes раньше ?!Brachylog (попробуйте онлайн!), 12 байт
Попробуйте онлайн!
Принимает строку для вычитания из стандартного ввода и строку для вычитания в качестве аргумента командной строки.
объяснение
источник
Сетчатка , 21 байт
1 байт благодаря Мартину Эндеру.
Попробуйте онлайн!
источник
JavaScript (ES6),
76704541 байтПопытайся
источник
new
.Perl 6 , 21 байт
Попытайся
Expanded:
источник
Japt ,
119 байтПопробуйте онлайн!
источник
TI-Basic (TI-84 Plus CE), 63 байта
источник
Ans
относится к четвертой строке?Ans
относится к последнему оцененному значению, поэтому в этом случае оно относится к возвращаемому значениюinString(
, которое является индексом подстрокиStr2
в строке,Str0
или 0, если подстрока не появляется. Оператор if не изменяет значение Ans, поэтому в четвертой строке индекс все еще находится вAns
.inString
работал. Хороший гольф!Mathematica, 162 байта
тестовый стиль ввода ["abcde", "ab"]
источник
#
вместо#1
- они означают точно так же. Кроме того, вместо использованияStringJoin@t
вы можете обмануть, присоединив к нему пустую строку""<>t
, которая автоматически объединяет всеt
вместе. Вы видели страницу с советами по игре в гольф Mathematica ?t={};
в начале), но может быть проще использовать другой подход полностью - вы пытались использоватьStringReplace
функция?c=Characters;a=c@#;b=c@#2;
l@Intersection[a,b]
естьl[a∩b]
.Python,
696864575145 байтВ итоге это стало совершенно другим решением с Regex.
Спасибо Value Ink за -2 байта!
и Фелипе Нарди Батиста за массивные -6 байт!
Попробуйте онлайн!
источник
re.sub(c.join("^|$"),'',s,1)
c+'$|^'+c
Баш ,
666149 байтовПопробуйте онлайн!
меньше гольфа:
Использует регистр для проверки начала или конца и вычитание префикса / суффикса массива (% / #)
источник
case
, но дольше, чем необходимо. Второй и третий шаблон , могут быть объединены в один:*)c=${1#$2};;
. Затем с только 2 ветви будет короче , чтобыecho
каждый непосредственно , вместо использования переменной$c
:case $1 in *$2)echo ${1%$2};;*)echo ${1#$2};;esac
. Или вы могли бы продолжать использовать его, но безcase
:c=${1%$2};[[ $c = $1 ]]&&c=${1#$2};echo $c
.APL (Dyalog) ,
3130 байт-1 спасибо Захари .
Это фактически использует обратную (то есть обратную) конкатенацию! Принимает исходную строку в качестве левого аргумента и что вычитать в качестве правого аргумента.
Попробуйте онлайн!
Ungolfed:
Условные обозначения:
{
…}
Анонимная функция⍺
левый аргумент текущей функции⍵
правильный аргумент текущей функции0::
... если произойдет какая-либо ошибка, выполните это, иначе ...⍣¯1⊢
обратный,∘⍵
сцепление ⍵ справа⍵,
сцепление ⍵ слеваисточник
{0::⍺{0::⍺⋄,∘⍵⍣¯1⊢⍺}⍵⋄⍵,⍣¯1⊢⍺}
.PHP, 54 байта
Testcases
источник
Python 2 , 68 байт
Попробуйте онлайн!
источник
Haskell , 49 байтов
Попробуйте онлайн! Использование:
f"" "abcdef" "ab"
. В качестве альтернативы, определите(-)=f""
и используйте как"abcdef" - "ab"
.Это решение без регулярных выражений работает путем рекурсивного разделения строки на все ее префиксы и постфиксы и проверки, соответствует ли строка, которая должна быть вычтена, одному из них.
источник
Python 2 ,
7265 байтПопробуйте онлайн!
-7 байт благодаря @FelipeNardiBatista
источник
C #, 88 байт
Компилирует в
Func<string, Func<string, string>>
.источник
Рубин (лямбда-выражение), 29 байт
Yay для регулярного выражения! Требуются вычитаемые безопасные регулярные выражения, но это нормально в соответствии с задачей.
источник
Tcl , 37 байт
Попробуйте онлайн! (сейчас запускаются все тесты)
Tcl прост.
proc s {a b}
определяет функцию с именем,s
которая принимает параметрыa
иb
.regsub
подставляет{}
пустую строку для значения,b
когда она находится в начале или в концеa
. Возврат неявный.источник
C 96 байтов
Общеизвестно, что манипулирование струнами в Си является громоздким, поскольку расширение игры в гольф будет граничить с мазохизмом. Звучит хорошо для меня.
Одна из менее читаемых программ, которые я написал. Принимает два ввода (несмотря на то, как выглядит функция):
char**
указатель на деконкатенированную строку иchar*
строка, которую нужно удалить. Входной указатель редактируется на месте и становится выходным (в любом случае, в случае утечки памяти).Пример использования:
источник
AWK ,
2132 байтаПопробуйте онлайн!
Исходное представление наивно заменяет текст в первой строке, а не только в начале или конце.
Попробуйте онлайн!
Первоначально пытался без фигурных скобок, но он требовал хитрости для печати пустых строк и / или несоответствий, что в итоге добавило больше байтов, чем эта версия.
источник
R,
204241 байт-1 байт благодаря MickyT!
Возвращает анонимную функцию (которая имеет аргументы в порядке
b,a
). Вычисляет разницу строкa-b
.sub
простая замена, которая заменяет первое вхождение шаблона, в данном случае, пустой строкой''
. Создает регулярное выражение с,sprintf
чтобы соответствовать только в начале и конце строки. Требуетсяpryr
пакет для установки.На ссылке TIO, используется более многословный
function(a,b)
определение для функции еще на четыре байта.Попробуйте онлайн!
источник
'abcde','bcd' -> 'abcde'
дела?sub
это простая замена, которая просто меняет первое вхождение наb
ina
»: будет ли это замена, если вторая строка находится в середине первой строки?sprintf('^%s|%s$',b,b)
Common Lisp, 121 байт
Попробуйте онлайн!
Обычный многословный Common Lisp!
Безголовая версия:
источник
Котлин , 91 байт
Попробуйте онлайн!
источник
{a,b->var c=a.removePrefix(b);if(a==c){c=a.removeSuffix(b)};c}
Powershell,
3440 байт+6 байт при
Invalid Subtraction
добавлении тестовых случаевКомментарий:
Выражение регулярного выражения
^$t|$t$
не работает должным образом: оно заменяет оба совпадения вместо одного (флагg
всегда включен). Таким образом, мы вынуждены использовать группу с негативным прогнозом.Тестовый скрипт:
Выход:
источник
QBIC , 57 байт
Хм, это беспорядок в QBIC / QBasic ...
источник
Луа ,
7165 байтПринятие предложений
Попробуйте онлайн!
источник
Я изначально неправильно прочитал инструкцию. Спасибо, Орджан Йохансен за указание на мою ошибку!
PowerShell ,
4651 байтПопробуйте онлайн!
источник
abcde
-bcd
не встречается ни в одном конце строки.Excel, 129 байт
источник
sed ,
5653 bytesПопробуйте онлайн!
источник