Мою собаку зовут Рекс. Каждый раз, когда я ругаю его, он, кажется, не очень впечатлен, и я вижу, как он реагирует, только когда я произношу его имя. Если я скажу
Rex, I told you not to do this! You're making me angry Rex!
все что он слышит
Rex, * **** *** *** ** ** ****! ***'** ****** ** ***** Rex!
Задача : с учетом входной строки ваша программа должна вывести ту же строку, где все буквенные символы были превращены в звезды, кроме символов в появлении слова Rex
, которые должны быть оставлены нетронутыми. Неалфавитные символы также остаются нетронутыми.
Детали : Задача не зависит от регистра, поэтому также rex
должна быть оставлена нетронутой. Слово Rex
может быть частью другого слова, поэтому, например, anorexic
должно отображаться как ***rex**
.
Обновление : поскольку в первоначальном тексте этого задания не разъяснялось, как следует обращаться с подчеркиванием, цифрами или выделенными символами, я не предъявляю особых требований к этим символам. Таким образом, решение является действительным до тех пор, пока символы в a-zA-Z
(а также символы, упомянутые в примерах ,!".
) обрабатываются правильно.
Тестовые случаи:
Вход: Rex lives in Rexland.
Выход : Rex ***** ** Rex****.
Вход: To call Rex, just say "Rex".
Выход : ** **** Rex, **** *** "Rex".
Вход: My cat is getting anorexic.
Выход : ** *** ** ******* ***rex**.
источник
Hello! Isn't this ... a nice challenge?
Вы слышите собаку*****! ***'* *** ... * **** *********?
? Если это так, то вы могли бы рассмотреть общение в азбуке отныне ...a-zA-Z
, а также0-9
и / илиäëïöüÿãõñáéíóúýàèìòùç
т. Д. И т. Д.? И не могли бы вы добавить несколько тестов по этому поводу?"Rex lives in Rexland."
, output ="rex ***** ** rex****."
; или в качестве альтернативы input ="My cat is getting anorexic."
, output ="** *** ** ******* ***Rex**."
)Ответы:
Retina ,
2421 байтПопробуйте онлайн!
объяснение
Пропускать
rex
s проще всего, сопоставляя их, потому что совпадения не могут перекрываться. Поэтому, если мы отдадим приоритетrex
над другими буквами, они будут охвачены в одном совпадении и не затронуты сопоставлениями из отдельных букв.Но как мы можем делать разные вещи в зависимости от альтернативы, которая использовалась для матча? К сожалению, Retina (пока) не имеет синтаксиса условных подстановок, таких как Boost regex. Но мы можем подделать его, включив обе замены в одну замену и убедившись, что только одна из них не пуста:
$1
первая группа захвата, то есть(rex)
. Если мы нашли совпадение,rex
это просто записывает его обратно (так что ничего не делает), но если мы не совпали,rex
тогда$1
пустая строка исчезает.$#2$**
следует читать как($#2)$*(*)
.$#2
это количество раз группы2
было использовано, то есть(\w)
. Если мы сопоставилиrex
это0
, но если мы сопоставили любое другое отдельное письмо, это так1
.$*
повторяет следующий символ столько раз, сколько его левый операнд. Таким образом, эта часть вставляет сингл*
для индивидуально-буквенных совпадений и ничего дляrex
.источник
\a
для[a-z]
ZB?** REXX
151148141 байт **(Kinda показался уместным)
Попробуй здесь
Примечания для не REXXers:
Смотрите здесь для функции перевода
Смотрите здесь для наложения функции
источник
JavaScript (ES6),
424138 байтПопробуй
объяснение
источник
APL (Dyalog Unicode) , 22 байта SBCS
Попробуйте онлайн!
Простая замена PCRE R
⍠1
устанавливает регистронезависимость. Просто заменяетrex
собой и всеми остальными символами слова звездочки.источник
\w
включает символ подчеркивания, предполагая, что это RegEx - я не знаю APL.\w
нескольких ответах сейчас!Perl 5 , 24 байта
23 байта кода +
-p
флаг.Я использовал регулярное выражение Мартина Эндера из его ответа на Retina (который в Perl оказался короче, спасибо
\pl
), и мне нужно было только адаптировать правую сторону s ///.Попробуйте онлайн!
источник
Retina ,
3231 байтПопробуйте онлайн! Объяснение: разбивает строку на вхождения слова
rex
и всего остального, но сохраняет совпадения. Затем в строках, которые не начинаютсяrex
(т. Е. «Все остальное»), измените буквы на*
s. Наконец, объедините все вместе.источник
C,
9997928674737265 байтСреда Pelles IDE предоставляет (компилировать с / Go) функцию strnicmp. Эта функция идентична strncasecmp. Посмотрите, как это работает здесь (с функцией замены).
Выход сохраняется в первом параметре, который является параметром входа / выхода.
Спасибо Johan du Toit за сообщение, что рекурсия немного короче.
источник
Рубин,
363532 байтаВ качестве теста:
Это выводит:
источник
PHP, 78 байт
Попробуйте онлайн!
PHP, 84 байта
-1 байт
\w
вместо этого\pl
в этом случае подчеркивание и цифры тоже заменяются\pL
короче как[a-z]
или[[:alpha:]]
Попробуйте онлайн!
источник
\w
вместо\pL
.C (GCC на POSIX),
1671189387 байтПопробуйте онлайн!
источник
f(char*s){for(;*s;s++)strncasecmp("Rex",s,3)?putchar(isalpha(*s)?42:*s):write(1,s-2,3,s+=2);}
, Что это за колдовствоf(s)char*s;{}
? Я никогда не видел этот синтаксис раньше.Python 2 или 3,
757370 байтВ основном так же, как ответ моего Руби .
-2 байта благодаря @Wondercricket.
В качестве теста:
источник
x.group(1) or '*'
Ява 8,
187192168164159138 байт-28 байт благодаря @ OlivierGrégoire.
Объяснение:
Попробуйте онлайн.
источник
0-9
и акцентированные символы не должны быть включены, толькоa-zA-Z
должны."[a-zA-z]"
на/[a-z]/i
?"[a-zA-Z]"
->"(?i)[a-z]"
.s.regionMatches(0<1,i,"rex",0,3)
вместоs.toLowerCase().substring(i,i+(i>l-3?1:3)).equals("rex")
.l
и сохраните 4 байта.Python 2, 87 байт
Я думаю, что можно сократить? :)
источник
sed ,
3733 байта36 байт исходного кода + 1 байт для флага -r.
Попробуйте онлайн!
источник
.
вместо\*
Гема, 25 знаков
Образец прогона:
Больно факт, что может быть
\CRex=$0;<L1>=\*
, но, к сожалению,$0
содержит шаблон, а не совпадение. ☹источник
Сетчатка ,
545049 байтовГольф 5 байтов благодаря @MartinEnder
Сетчатка , 49 байт
Попробуйте онлайн!
источник
dex
, оно дает,*e*
а ваше дает**x
.(
после первого,i
вам не нужно настраивать второй этап.[a-z-[rex]]
.PowerShell, 60 байт
Попробуйте онлайн
источник
\w
на\p{L}
.$args
в качестве массива имеет последствия при цитировании, как в одном примере. И если вы все равно используете только первый аргумент, вам не нужноforeach
.\w
. Примечание:\p{L}
действительно ли нужны брекеты ?"$args"-replace'(rex)|\p{L}','$1*'-replace'(x)\*','$1'
намного короче в целом, завершение$args
в кавычки превращает все это в одну строку и экономит вам много.QuadR ,
1110 + 1 = 11 байт+1 байт за
i
флаг.Попробуйте онлайн!
Пояснение: без учета регистра заменить
rex
и слова-символы на себя и звездочки, соответственно.источник
MATL , 24 байта
Входные данные - это строка, заключенная в одинарные кавычки.
Попробуйте онлайн!
объяснение
Рассмотрим вход
'Rex lives in Rexland.'
источник
Python 2 ,
9392 байтаПопробуйте онлайн!
источник
Perl, 31 байт
Вызвать Perl с
-n
опцией. Например:источник
[a-z]
теперь может быть заменено на, так\w
как ввод никогда не будет содержать чисел или подчеркиваний.-p
вместо-n
и удалить;print
Баш , 128 байт
Попробуйте онлайн!
Я придерживаюсь tr в моем предыдущем ответе: не функциональная замена массива bash, а не замена preg!
Менее гольф:
Пришлось использовать z вместо * из-за расширения
источник
tr
кавычки параметры, если они не содержат ничего расширяемого.r=REXrex
переменной стоимости.'
на"
, поэтому не нужно экранировать литерал"
. Конечно, тогда вы пишете дословный перевод строки разрыва строки в этом месте вместо\n
:$r'",. !'
.Java 7,
96989796 байт+2 байта для пропущенных e, предшествующих r или сопровождаемых x, но не обоими
-1 байт для перехода
[a-z&&[^rex]]
на(?![rex])\\w
Попробуйте онлайн!
Версия регулярного выражения для замены с использованием Java
Все в этом регулярном выражении заменяется на * (примечание в Java \ w должно быть экранировано как \\ w)
источник
C #,
9390 байтПоверьте, это первый раз, когда я использовал регулярное выражение в ответе на C # из-за длинного пространства имен
System.Text.RegularExpressions
.Я не осознавал этого, когда писал свой ответ, но это, похоже, версия C # ответа @ Shaggy's JavaScript .
источник
CJam , 39 байт
Попробуйте онлайн!
Как это устроено
источник
VimScript, 34 байта
И вот интересная замена, которая почти работает:
Представьте, что вы выполняете это несколько раз в строке.
Rex, dex, I told you not to do this! You're making me angry Rex!
После первой строки, строка будетRex, *ex, * **** *** *** ** ** ****! ***'*e ****** *e ***** Rex!
Второй проход закончитсяRex, **x, * **** *** *** ** ** ****! ***'** ****** ** ***** Rex!
, и третий проход завершит его. Любые последующие проходы не изменят строку. Однако для этого может потребоваться более 3 подстановок, например, для строкиxxxxxxxx
. Таким образом, если бы существовал простой способ выполнить вышеуказанную замену, пока она не перестала что-либо менять, или столько раз, сколько длина ввода, это было бы другим решением. Могу поспорить, что это может быть сделано в V, но это, вероятно, будет длиннее, чем 34 байта.источник
Желе , 23 байта
В течение 24 часов нет ответа на мой вопрос по делу , поэтому я опубликую эти предварительные 23 байта.
Смотрите тестовые примеры на сайте Try it online!
Как?
источник
CJam , 26 байт (в верхнем регистре) / 36 байт (с учетом регистра)
Попробуйте онлайн!
Если необходимо сохранить регистр букв (поскольку это все еще немного неясно ), это можно сделать с помощью 10 дополнительных байтов:
Попробуйте онлайн!
Кстати, при написании этого ответа я обнаружил то, что я бы посчитал ошибкой проектирования в CJam: побитовые операторы
&
и|
они не определены между двумя значениями символов, поэтому я не могу использовать.|
для получения побитового ИЛИ двух строк. Решение, которое в итоге обошлось мне в два дополнительных байта, состоит в том, чтобы сначала преобразовать одну из строк:i
в массив целых чисел, который затем можно ORed с другой строкой. (На самом деле это стоило мне трех байтов, потому что, если бы&
работало между двумя символами, я мог бы также использоватьSf&
вместо того,32f&
чтобы сохранить информацию о регистре букв.)С другой стороны, я обнаружил, что он
{...}f%
действительно работает, как и ожидалось, для перебора символов в массиве строк. Приятно.В любом случае, вот (слегка) закомментированная версия 36-байтового кода:
Трюк с сохранением регистра работает, потому что регистр букв ASCII определяется исключительно пятым битом кода ASCII: этот бит равен 0 для прописных букв и 1 для строчных букв. Таким образом, взятие поразрядного И для символа кода с 32 = 2 5 извлекает бит регистра, а побитовое ИЛИ с использованием букв в верхнем регистре восстанавливает их первоначальный регистр.
Конечно, неалфавитные символы могут иметь произвольные значения для пятого бита (хотя из-за того, как организованы символы ASCII, большинство символов пунктуации имеют пятый бит, установленный в 1), но это не имеет значения, поскольку эти символы остаются в любом случае, не затрагивается заглавными буквами и циклом цензуры букв, и если OR для символа с его собственным пятым битом не изменит его. Кроме того, удобно, что у
*
персонажа уже установлен пятый бит, поэтому он также остается неизменным в финале.|
.источник
Пип ,
2119 байтПринимает ввод из stdin, выводит в stdout. Попробуйте онлайн!
объяснение
источник
V ,
27, 24 байтаЯ оставляю оба ответа, потому что я думаю, что они одинаково интересны.
27 байт
Попробуйте онлайн!
Спасибо Брайану Маккатону за его идею сделать это в V
HexDump:
Объяснение:
24 байта
Попробуйте онлайн!
источник