Задание
Напишите программу или функцию, которая с учетом трех строк A, B, C
создает выходную строку, в которой каждый экземпляр B
in A
был рекурсивно заменен C
. Под рекурсивной подстановкой понимается повторение подстановки, когда на каждом шаге все неперекрывающиеся экземпляры B
in A
(выбираются жадно слева направо) заменяются на, C
пока B
больше не содержится в A
.
Ввод, вывод
- Вы можете использовать любой из методов по умолчанию для ввода / вывода .
- Строки будут содержать только печатаемые символы ASCII (и могут содержать любые из них).
B
никогда не будет пустой строкой,A
аC
может быть.- Строки следует рассматривать как открытый текст, например, вы не можете рассматривать их
B
как шаблон Regex. - Некоторые комбинации входов никогда не прекратятся. Ваша программа может делать что угодно в этих случаях.
Контрольные примеры
Это в формате: A/B/C\nOutput
Hello, world!/world!/PPCG
Hello, PPCG
Uppercase is up/up/down
Uppercase is down
ababababa/aba/ccc
cccbcccba
delete/e/{empty string}
dlt
{empty string}/no/effect
{empty string}
llllrrrr/lr/rl
rrrrllll
+-+-+-+/+-+/+
+
ababababa/aba/bada
badabbadbada
abaaba/aba/ab
abb
((())())())/()/{empty string}
)
Примеры, которые не заканчиваются:
grow/ow/oow
loop/lo/lo
code-golf
string
substitution
code-golf
math
code-golf
string
set-theory
code-golf
code-golf
compile-time
code-golf
kolmogorov-complexity
binary
code-golf
sequence
cops-and-robbers
code-golf
subsequence
card-games
code-golf
sequence
primes
code-golf
code-golf
number
graphical-output
music
code-golf
ascii-art
code-golf
string
lambda-calculus
code-golf
string
code-generation
code-golf
unicode
code-golf
math
combinatorics
code-golf
balanced-string
code-golf
sequence
cops-and-robbers
code-golf
sequence
cops-and-robbers
code-challenge
fastest-code
chess
code-golf
math
graphical-output
code-golf
string
hello-world
animation
code-golf
number
arithmetic
code-golf
integer
code-golf
code-golf
combinatorics
code-golf
kolmogorov-complexity
graphical-output
code-golf
string
code-golf
code-golf
game
code-golf
math
combinatorics
code-golf
ascii-art
popularity-contest
random
code-golf
arithmetic
number-theory
integer
code-golf
tips
underload
code-golf
math
sequence
primes
code-golf
math
path-finding
code-golf
ascii-art
primes
code-golf
kolmogorov-complexity
alphabet
Лео
источник
источник
((())())())/()/
downpercase is down
Ответы:
05AB1E , 2 байта
Попробуйте онлайн!
объяснение
Это может быть
:
за 1 байт, если нам не нужно иметь дело с пустыми строками.источник
:
это встроенный, который решает всю проблему? Я должен был запретить buildins;)Python 2 , 43 байта
Попробуйте онлайн!
Оценивает строку вида
Чтобы достичь фиксированной точки, если она существует, достаточно сделать замены, равные длине исходной строки.
источник
ES6 (Javascript),
4743 байтаGolfed
Попытайся
источник
c=>b=>g=a=>a==(a=a.split(b).join(c))?a:g(a)
Some combinations of inputs will never terminate. Your program can do anything in those cases.
Сетчатка , 27 байт
Число байтов предполагает кодировку ISO 8859-1.
Ввод должен быть разделен переводом строки.
Попробуйте онлайн! (Для удобства используется формат ввода набора тестов, где каждая строка представляет собой разделенные слешем тестовые случаи.)
источник
C #, 44 байта
Укороченная версия:
Пример программы:
Объяснение: Функция написана как хвостовое рекурсивное выражение, избегая ключевого слова return и фигурных скобок, используя следующее:
Это позволяет нам сохранить это в одном утверждении.
РЕДАКТИРОВАТЬ: Вернулся к пропущению типа функции r, так как это кажется приемлемым. При объявлении типа с использованием массивов это 68 символов. Без, это 44 символа.
источник
r=
или еще больше для объявления (частично потому, что я не полностью знаю правила, частично потому, что я не знаю C # достаточно хорошо, чтобы их применять).Japt , 15 байт
Проверьте это онлайн!
Как это работает
Japt имеет встроенную рекурсивную замену, но он видит первый вход как регулярное выражение. Если входные данные гарантированно содержат только буквенно-цифровые символы, это трехбайтовое решение будет работать:
Если бы входные данные могли содержать любой символ кроме
^
,\
или]
, это 12-байтовое решение было бы правильным:источник
C #,
3349 байтВероятно, один из самых маленьких фрагментов, написанных на C # ... А поскольку он
Replace
является родным дляstring
структуры, в s нет необходимостиusing
(по крайней мере, для встроенной функции VS, C # Interactive ... )Кроме того, так как
B
всегда имеет значение, код не нуждается в каких-либо проверках.Golfed
Ungolfed
Полный код
релизы
+19 bytes
- Исправлено не рекурсивное решение.33 bytes
- Исходное решение.источник
Replace
рекурсивная замена?"((())())())".Replace("()", "")
возвращает(()))
.Обработка,
7572 байтаПечатает результаты. Назови это как
g("llllrrrr", new String[]{"lr","rl"});
источник
Mathematica,
3532 байтаАргументы приведены в виде последовательности. Никогда не прекращается в течение ,
grow
например, возвращаетсяloop
кloop
примеру. Три байта прочь благодаря предложению Мартина.источник
FixedPoint
имеет тенденцию быть слишком длинным и может эмулироваться с помощью//.
:#//.x_:>StringReplace[x,#2->#3]&
ReplaceRepeated
работать на струнах!$RecursionLimit
время цикла , что2^16
по умолчанию не влияет на ваш ответReplaceRepeated
это контролируется$RecursionLimit
- я только что проверил это, установив ограничение в 20, и программа все еще счастливо циклично выполняет непрерывный ввод ..ReplaceRepeated
есть отдельная опция (которую нельзя использовать с//.
синтаксисом), называетсяMaxIterations
. Это по умолчанию 2 ^ 16. (cc @ngenisis)Рубин, 29 байт
Учитывая 3 аргумента, применяйте замену к первому, пока больше не будет ничего заменить.
объяснение
1
прежде чемwhile
это просто nopgsub!
возвращает строку илиnil
если подстановка не произошлаисточник
Пайк, 6 байт
Попробуй это здесь!
источник
/// , 3 байта
Поместите строку B после первой косой черты, C после второй и A в конце, то есть:
Попробуйте онлайн!
источник
///
не принимает входные данные любым другим способом./
присутствует a в любой из входных строкJavaScript (Firefox 48 или более ранняя версия), 43 байта
Принимает аргументы карри в обратном порядке. В Firefox был нестандартный третий параметр, для
replace
которого указывались флаги регулярного выражения. Этот параметр был удален в Firefox 49.источник
SmileBASIC,
7268 байтОдним из редких случаев, когда создание функции на самом деле является SHORTER в SmileBASIC.
источник
Javascript 130 байт
Javascript заменит все одновременно, если вы дадите ему регулярное выражение. Чтобы это регулярное выражение работало для всех значений, все символы, используемые для регулярного выражения, должны быть заменены на экранированную версию. Наконец, замена вычисляется, чтобы заменить все экземпляры B в A на C и снова передать это обратно в функцию.
источник
q, 15 байтов
Пример:
ссылка на переводчик скачать
Пояснение: ssr , / (сходится)
источник
Чеддер, 37 байт
На телефоне, поэтому добавить ссылку TIO немного сложно. В основном использует рекурсию, в то время как проверка находится в. Решение могло бы быть,
(a,b,c)->a.sub(Regex{b,"cr"},c)
но по какой-то причине не работает.источник
Perl 6 , 40 байт
Попробуй (если обновится tio.run)
Попробуй измененную версию
Expanded:
источник
PHP, 46 байт
источник
PHP, 102 байта
Тестовые случаи (функциональные)
Тестовый случай с ошибкой цикла
источник
function replace(...){...}
, иначе ваша отправка - просто фрагмент, который по умолчанию запрещен;)
Java - 157 байт
Для пустого ввода возвращает пустую строку.
Вылетает с
StackOverflowException
ошибкой, когдаB
пусто или оно снабжено такими даннымиA/A/A
.Как это работает:
Развернутый код с комментариями:
источник
AutoHotkey, 87 байт
%1%
,,%2%
и%3%
первые 3 аргумента, переданные в функцию.Если функция ожидает переменный аргумент,
%
s отбрасывается.Изменение значения чувствительности к регистру стоит 19 байт, но без него вы получите такие вещи, как
downpercase is down
.источник