Задача состоит в том, чтобы просто переключить строку внутри другой строки.
объяснение
Если строка переключения является подстрокой основной строки , удалите все экземпляры строки переключения из основной строки ; в противном случае добавьте строку переключения в конец основной строки .
правила
- Все строки состоят из печатных символов ASCII
- Функция должна принимать два параметра: основную строку и строку переключения .
- Основная строка может быть пустой.
- Строка переключения не может быть пустым.
- Результатом должна быть строка, которая может быть пустой.
- Самый короткий ответ выигрывает.
Примеры
function toggle(main_string, toggle_string){ ... }
toggle('this string has 6 words ', 'now')
=> 'this string has 6 words now'
toggle('this string has 5 words now', ' now')
=> 'this string has 5 words'
Тесты кейсы
'','a' => 'a'
'a','a' => ''
'b','a' => 'ba'
'ab','a' => 'b'
'aba','a' => 'b'
'ababa', 'aba' => 'ba'
Ответы:
Желе , 7 байт
Попробуйте онлайн!
Как это устроено
источник
Java 8,
80706534 байтаВероятно, мой самый короткий Java 'codegolf' до сих пор .. xD
с некоторой помощью из комментариев ..;)
Объяснение:
Попробуйте онлайн.
источник
if
троичный. Если ничего другого, он избавится от «лишнего»return
.return m=m.replace(t,"")?m+t:m;
m==(m=m.replace...
MATL, 11 байт
Попробуйте онлайн!
Все тесты
объяснение
источник
Python 3, 38 байт
источник
JavaScript (ES6),
3937 байтисточник
Пайк, 14 байт
Попробуй это здесь!
Учитывая, что Пайк не имеет
else
структуры, я думаю, что это довольно разумный результатОбъяснение:
источник
CJam, 9
Попробуйте онлайн. Спасибо jimmy23013 за обрезание 1 байта :)
Объяснение:
источник
q~:B/2Be]
.Javascript (ECMAScript 6): 47 байт
источник
("a", ".")
возвращает""
вместо"a."
.Retina ,
3831 байтКоличество байтов предполагает кодировку ISO 8859-1.
Конечный перевод строки значителен. Формат ввода - обе строки, разделенные переводом строки.
Попробуйте онлайн! Первая строка позволяет запускать несколько тестовых случаев одновременно (для набора тестов используйте
;
для разделения строк и перевода строки для разделения тестовых случаев; первая строка заботится о преобразовании).объяснение
На этом первом шаге мы заменяем все вхождения строки переключения в основной строке на
·
. Нам нужно вставить эти маркеры, чтобы впоследствии мы могли определить, произошла ли какая-либо замена.Это еще одна замена, которая удаляет
·
маркер или вторую строку (включая разделительный перевод строки). Однако1>
это предел, который означает, что рассматриваются только совпадения после первого. Следовательно, если строка переключения не встречается в основной строке, мы не вставим ни одной·
, поэтому вторая строка будет первым совпадением и не будет удалена. В противном случае мы удаляем вторую строку вместе со всеми, кроме первого маркера.Хотя здесь используется этап транслитерации, он также используется просто для удаления символов. В частности, мы перемещаем как
·
и перевод строки. Нам нужен первый, в случае, если было совпадение (потому что тогда первый·
будет оставлен на предыдущем этапе), и нам нужен второй в случае, если не было совпадения (чтобы объединить две строки и тем самым добавить строку переключения к основной строке).источник
Python (3,4):
55544744 байтТестирование:
Тестовый вывод
Использование def было бы длиннее, потому что вы должны использовать оператор return, если бы это было возможно без возврата, это сэкономило бы 2 байта,поскольку явное объявление функции не требуется (извините, я этого не знал) 7 байтов были сохранены.источник
toggle=
.toggle=
toggle
это нужно для проверки. Но вам только нужно рассчитывать сlambda m,t:
на.m+''+t
чтобыm+t
сохранить 3 байта, если я не ошибаюсь.m+' '+t
ввода пробела между ними, но после прочтения описания снова удалил пробел, но не '' и +C #, 63
Лучше чем Java :)
Тестовый код:
Выход:
источник
Pyth,
131110 байтТестирование.
Формат ввода: первая строка в кавычках, вторая строка без кавычек.
Это также 10 байтов:
Тестирование.
Это 11 байт:
Тестирование.
Предыдущее 13-байтовое решение:
Тестирование.
источник
?}zQ:Qzk+Qz
Джольф, 12 байт
Или, если мы должны включить регулярные выражения:
Попробуй это здесь!
объяснение
источник
JavaScript (ES6), 37 байт
Чуть короче, чем ответ @ nobe4, используя преимущества разделения и объединения
источник
Ракетка, 70 байт
Довольно прямо вперед.
источник
Scala,
7270 байтОнлайн переводчик: www.tryscala.com
источник
if(r==m)
.Oracle SQL 11.2, 66 байт
источник
Perl,
3730 байтРегулярные выражения внутри строки переключения не оцениваются из-за цитирования с
\Q
...\E
.sub F
и\E
удалены согласно комментарию msh210.Это не совсем без побочных эффектов из-за настройки
$_
. Использование локальной переменной будет стоить шесть дополнительных байтов:С другой стороны, с переключенными входными параметрами можно сохранить два байта, используя
pop
вместоshift
(28 байтов):Тестовый файл:
Результат испытаний:
источник
sub F
свой счетчик байтов. Кроме того, вы должны иметь возможность использоватьpop
вместоshift
(путем изменения порядка ввода, natch) сохранение двух байтов. (Не проверено.) Наконец, вы сможете опустить\E
, сохранив еще два байта. (Также не проверено.)pop
вместо того, чтобыshift
помочь, потому что$_
должен быть первый аргумент, чтобы избежать$_[1]=~s/.../
. Порядок входных аргументов фиксируется вопросом AFAIK.C # (58 байт)
string F(string s,string t)=>s==(s=s.Replace(t,""))?s+t:s;
Он использует встроенное назначение, чтобы сбрить несколько байтов
источник
var s,t
илиvar s,var t
вместоstring
?var
можно использовать только в тех местах, где тип известен во время компиляции, поэтому его нельзя использовать в сигнатурах методов. Вы можете использоватьdynamic
, но это на 1 символ длиннее, чемstring
var F(string s, string t
? Это можно сделать вывод ...bash + sed, 28 байт
Сценарий находится в файле toggle-string.bash, который мы вызываем
bash toggle-string.bash mainstring togglestring
.s/$2//g
удаляет строку переключения из основной строкиt
переходит в конец, если предыдущая подстановка прошла успешно (т. е. основная строка содержала строку переключения)/$/$2/
добавляет строку переключения в конец ($
), если мы не прыгали до концаbash требуется для herestring
источник
Юлия,
3331 байтПопробуйте онлайн!
источник
PowerShell v2 +, 47 байт
Принимает ввод
$a,$b
и затем использует псевдо-троичный(... , ...)[...]
оператор для выполнения if / else. Внутренние части оцениваются первыми, чтобы сформировать массив из двух элементов. 0-й - для$a
всех вхождений$b
-replace
d, в которых ничего не хранится$c
. 1-й это просто последовательность строк$a
и$b
.Если
$c
это-eq
UAL к$a
, что означает , что$b
не было установлено, что это Логическое$true
или1
, и поэтому выбирается первый элемент массива (конкатенации). Иначе, это логическое значение$false
, поэтому мы выводим$c
выводим 0-й элемент.Обратите внимание, что
-replace
он жадный, поэтому сначала он будет заменен слева, что означает, чтоababa / aba
контрольный пример вернется правильноba
.источник
Java 8, 65 байт
Та же логика, что и у решения Java 7, написанного с помощью лямбды.
Попробуй здесь
источник
Ruby,
33 байта27 байтов (28 при использовании глобального подстановки)определенно 28 байтовисточник
Mathematica, 45 байт
Анонимная функция, которая принимает основную строку и строку переключения (в указанном порядке) и возвращает результат. Объяснение:
источник
TSQL,
143129121 байтУдобочитаемый:
Live Demo
114 байт со строго введенным символом
источник
TSQL (Sqlserver 2012), 49 байт
Попробуйте онлайн!
источник
Рубин,
353728 байтУра для интерполяции строк! Это даже работает в регулярных выражениях. Все остальное просто: если строка
t
соответствуетm
, заменитьt
на''
, иначе вернутьm+t
.Редактировать: Исправлена ошибка.
Изменить: я применил предложение Кевина Лау, но, похоже, я достиг того же алгоритма, который использовался в ответе Луиса Масуэлли .
источник
("a", ".")
возвращает"a"
вместо"a."
.m[t]
намного корочеm.include?(t)
и все еще проверяет наличие в строках.к (23 байта)
Примеры:
источник
Котлин, 61 байт
Это было бы короче, если бы присваивание было выражением в Kotlin, а параметры были изменяемыми, и был троичный условный оператор, к сожалению, это не так :(
Попробуйте онлайн!
UnGolfed
источник