我的狗真正听到了什么


82

我的狗叫雷克斯。每当我责骂他时,他似乎都不会留下深刻的印象,而我唯一看到他的反应就是我念出他的名字时。如果我说

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**.


27
测试用例:Hello! Isn't this ... a nice challenge?您能听见狗的声音*****! ***'* *** ... * **** *********?吗?如果是这样,您可能会考虑从现在开始在莫尔斯进行交流...
Stewie Griffin

2
我们是否只需要支持a-zA-Z,或者0-9和/或äëïöüÿãõñáéíóúýàèìòùç等等等?您可以添加一些有关这些的测试用例吗?
凯文·克鲁伊森

2
@KevinCruijssen由于在初始挑战中未提及$ 0-9 $或带重音符号的字符,因此请勿将它们视为挑战的一部分。
伊万·德拉诺

7
由于“狗没有小写和大写之间的区别”,输出大小写可能不同于输入吗?(例如:input = "Rex lives in Rexland.",output = "rex ***** ** rex****.";或input = "My cat is getting anorexic.",output = "** *** ** ******* ***Rex**."
乔纳森·艾伦

5
为什么此挑战使用星号而不是“ blah”?
hBy2Py

Answers:


24

视网膜24 21字节

i`(rex)|(\w)
$1$#2$**

在线尝试!

说明

rex也可以通过匹配来跳过,因为匹配不能重叠。因此,如果我们优先于rex其他字母,则这些字母将被覆盖在单个匹配项中,而不会受到单个字母匹配项的影响。

但是,根据比赛使用的替代方案,我们如何做不同的事情?不幸的是,Retina还没有像Boost regex之类的任何条件替换语法。但是我们可以通过将两个替换都包含在单个替换中并确保其中只有一个为非空来伪造它:

  • $1是第一个捕获组,即(rex)。如果我们这样做符合rex这只是写回(所以它什么都不做),但如果我们不匹配rex$1是一个空字符串和消失。
  • $#2$**应该读为($#2)$*(*)$#22使用组的次数,即(\w)。如果我们匹配,rex则为0,但如果我们匹配其他任何字母,则为1$*将下一个字符重复其左操作数的次数。因此,此部分*为单个字母匹配项插入单个,而对于则完全不插入任何内容rex

视网膜不\a适合[a-z]zB吗?
Leaky Nun

@LeakyNun不。我必须标记正则表达式(或什至实现我自己的味道)才能向正则表达式本身添加任何功能。
马丁·恩德

163

** REXX 151 148 141字节**

(金田似乎很合适)

i=arg(1)
m=i
o=translate(m,'',xrange('A','z'),'*')
p=0
do forever
   p=pos('REX',m,p+1)
   if p=0 then leave
   o=overlay(substr(i,p,3),o,p)
end
say o

在这里尝试

非REXXer的注意事项:

  1. 翻译是字符替换功能(名称来自IBM MF上的汇编程序指令)。它在string1中搜索string3中的字符。每次找到一个时,它将替换为string2中相同位置的一个。如果string2太短,则用填充字符填充。

看到这里翻译功能

  1. overlay只是将string1在指定位置的string2顶部覆盖。

参见此处的叠加功能


52
...但是那只狗以为他是用REX *编写的。
GuitarPicker '17

10
这些投票中有多少纯粹是为了选择语言?:D
毛茸茸的

72
@Shaggy至少所有人
TheLethalCoder

24

JavaScript(ES6),42 41 38字节

s=>s.replace(/rex|\w/gi,m=>m[1]?m:"*")

试试吧

o.innerText=(f=

s=>s.replace(/rex|\w/gi,m=>m[1]?m:"*")

)(i.value="Rex, I told you not to do this! You're making me angry Rex!")
oninput=_=>o.innerText=f(i.value)
<input id=i><pre id=o>


说明

s=>            :Anonymous function that takes the string as an argument via parameter s.
s.replace(x,y) :Replace x in s with y.
/rex|\w/gi     :Case-insenstive regular expression that globally matches all occurrences
                of "rex" or any single letter, number or underscore.
                (numbers & underscores will never be included in the input.)
m=>            :Anonymous function that takes each match as an argument via parameter m.
m[1]?          :If string m has a second character, ...
                (Equivalent to m.charAt(1))
m              :Return m, ...
:"*"           :Otherwise return "*".


1
不错的解决方案!
史蒂夫·贝内特

13

APL(Dyalog Unicode),22 字节SBCS

'rex' '\w'R'\0' '*'1

在线尝试!

简单PCRE [R E放置。

⍠1设置不区分大小写。只需将rex其自身以及所有其他单词字符替换为星号即可。


\w包括下划线字符,假设这是RegEx-我不知道APL。
毛茸茸的

@Shaggy是的,Dyalog APL使用PCRE,但从OP中不确定是否会出现下划线。例如数字不会。
阿达姆(Adám)'17年

除非另有说明,我们是否不必假设它们会发生?
毛茸茸的

@Shaggy通常情况下,是的,但是似乎表明,没有提到会不会发生什么。OP仅提及逗号,句号,空格和感叹号。
阿达姆(Adám)'17年

嗯...我想我将等待确认不会出现的情况,因为我\w现在对一些答案留有评论!
毛茸茸的


8

视网膜32 31字节

iS`(rex)
%iT`Ll`*`^(?!rex).*
¶

在线尝试!说明:将字符串分成单词rex和其他所有单词的出现,但保留匹配项。然后,在没有开始的行rex(即“其他所有内容”)上,将字母更改为*s。最后,将所有内容重新组合在一起。


3
至少这是我第二次想到音译模式可以使用选项音译不匹配项……
Martin Ender

@MartinEnder为时已晚:-D
约翰·德沃夏克

8

C,99 97 92 86 74 73 72 65字节

f(char*s){*s&&f(s+=strnicmp("Rex",s,3)?!isalpha(*s)||(*s=42):3);}

Pelles IDE环境提供了(使用/ Go编译)功能strnicmp。此功能与strncasecmp相同。看到它在这里工作(具有替换功能)。

输出存储在第一个参数中,第一个参数是输入/输出参数。

感谢Johan du Toit让我知道递归稍微短一些。


有一个提供strncmpi的C环境,因此您可以在69中获得它。我已经将它放在CD上。
约书亚记

1
@约书亚谢谢。什么是CD?
2501年

Borland C ++ 4.5
约书亚记

7

Ruby,36 35 32字节

->s{s.gsub(/(rex)|\w/i){$1||?*}}

作为测试:

f=->s{s.gsub(/(rex)|\w/i){$1||?*}}

tests = [
  ["Rex, I told you not to do this! You're making me angry Rex!", "Rex, * **** *** *** ** ** ****! ***'** ****** ** ***** Rex!"],
  ["Rex lives in Rexland.", "Rex ***** ** Rex****."],
  ["To call Rex, just say \"Rex\".", %q(** **** Rex, **** *** "Rex".)],
  ["My cat is getting anorexic.", "** *** ** ******* ***rex**."]
] 

tests.each do |input, output|
  if f.call(input) == output
    puts "Fine for #{input.inspect}"
  else
    puts "Problem with :\n#{input.inspect}"
    puts f.call(input)
    puts output
  end
  puts
end

它输出:

Fine for "Rex, I told you not to do this! You're making me angry Rex!"

Fine for "Rex lives in Rexland."

Fine for "To call Rex, just say \"Rex\"."

Fine for "My cat is getting anorexic."

6

PHP,78字节

<?=preg_replace("#[a-df-qs-wyz]|r(?!ex)|(?<!r)e|e(?!x)|(?<!re)x#i","*",$argn);

在线尝试!

PHP,84字节

<?=preg_replace_callback("#(rex)|\pL#i",function($t){return$t[1]?$t[1]:"*";},$argn);

在这种情况下,请\w改为-1字节\pl下划线和数字

\pL短于[a-z][[:alpha:]]

在线尝试!


您可以使用\w代替\pL
阿达姆(Adám)'17年

@亚当谢谢它让我不再方法仅1个字节短,并没有真正清晰的东西应该在下划线或数字的情况下
约尔格Hülsermann

输入将永远不会有任何下划线或数字..
亚当

@亚当我必须做出额外的点,并有编辑较长的做法,为什么我已经找到了其他改善
约尔格Hülsermann

5

C(POSIX上的GCC),167 118 93 87字节

i,j;f(char*s){for(i=0;j=s[i];i++)strncasecmp("Rex",s+i,3)?s[i]=isalpha(j)?42:j:(i+=2);}

在线尝试!


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;{}?我以前从未看过这种语法。
克里斯托夫(Christoph)

哦,它曾经有另一个参数,但是我忘了删除它。
betseg

无法正常工作,因为仅对函数的首次调用有效。参见此处:tio.run/nexus/…函数形式的解决方案,例如这一形式,必须能够再次调用并产生正确的结果。
2501年

@ 2501谢谢,已修复。
betseg

5

Python 2或3,75 73 70字节

import re;f=lambda s:re.sub('(?i)(rex)|\w',lambda x:x.group(1)or'*',s)

基本上与我的Ruby的答案相同。

-2个字节,感谢@Wondercricket。

作为测试:

tests = [
  ["Rex, I told you not to do this! You're making me angry Rex!", "Rex, * **** *** *** ** ** ****! ***'** ****** ** ***** Rex!"],
  ["Rex lives in Rexland.", "Rex ***** ** Rex****."],
  ["To call Rex, just say \"Rex\".", "** **** Rex, **** *** \"Rex\"."],
  ["My cat is getting anorexic.", "** *** ** ******* ***rex**."]
]


for test_in, test_out in tests:
    print(test_in)
    print(f(test_in))
    print(f(test_in) == test_out)

1
您可以删除2个字节之间的间距来节省2个字节x.group(1) or '*'
Wondercricket's

@Wondercricket:非常感谢,这是我用Python编写的第一个高尔夫球答案。
埃里克·杜米尼尔

5

爪哇8,187个 192 168 164 159 138字节

s->{for(int i=0;i<s.length();System.out.print(s.regionMatches(0<1,i,"rex",0,3)?s.substring(i,i+=3):s.replaceAll("\\w","*").charAt(i++)));}

-28个字节,感谢@OlivierGrégoire。

说明:

在线尝试。

s->{                         // Method with String parameter and no return-type
  for(int i=0;i<s.length();  //  Loop over the characters of the input-String
    System.out.print         //   Print:
     s.regionMatches(1>0,i,"rex",0,3)? 
                             //    If we've found "rex" (case-insensitive):
      s.substring(i,i+=3)    //     Print this REX-word (case-sensitive)
     :                       //    Else:
      s.replaceAll("\\w","*").charAt(i++));
                             //     Print the current character,
                             //     or '*' if it's an alpha-numeric character

@Shaggy现在应该修复。它在注释中指定之前发布,0-9并且不应该包含重音符号,而应该包含重音字符a-zA-Z
凯文·克鲁伊森

你可以取代"[a-zA-z]"/[a-z]/i
毛茸茸的

@Shaggy是/否。例如,Java使用的正则表达式语法与python或C#略有不同。所以可以,可以使用不区分大小写的正则表达式,但是它会长一个字节:"[a-zA-Z]"-> "(?i)[a-z]"
凯文·克鲁伊森

1
我认为您应该使用s.regionMatches(0<1,i,"rex",0,3)而不是s.toLowerCase().substring(i,i+(i>l-3?1:3)).equals("rex")
奥利维尔·格雷戈雷

1
@KevinCruijssen取得当前的代码(168个字节),删除变量l并保存4个字节。
奥利维尔·格雷戈尔

4

Python 2,87字节

import re
print re.sub(r'(?i)[a-df-qs-wyz]|r(?!ex)|(?<!r)e|e(?!x)|(?<!re)x','*',input())

我想可以缩短吗?:)


1
您可以删除参数之间逗号之间的空格,以减少2个字节。
Mego


3

Gema,25个字符

/[rR][eE][xX]/=$0
<L1>=\*

样品运行:

bash-4.3$ gema '/[rR][eE][xX]/=$0;<L1>=\*' <<< "Rex, I told you not to do this! You're making me angry Rex!
Rex lives in Rexland.
To call Rex, just say \"Rex\".
My cat is getting anorexic."
Rex, * **** *** *** ** ** ****! ***'** ****** ** ***** Rex!
Rex ***** ** Rex****.
** **** Rex, **** *** "Rex".
** *** ** ******* ***rex**.

可能是的痛苦事实\CRex=$0;<L1>=\*,但不幸的是$0包含模板,而不是匹配。☹


3

视网膜54 50 49字节

感谢@MartinEnder,打了5个字节

视网膜,49字节

i(`[\w-[rex]]
*
(?<!r)e|e(?!x)|r(?!ex)|(?<!re)x
*

在线尝试!


@Emigna刚意识到我的解决方案不起作用dex,它付出了*e*你的付出**x
Kritixi Lithos'5

如果您将两个阶段都放在(第一阶段之后进行分组,则i无需配置第二阶段。
马丁·恩德

并且您的第一个正则表达式可以写为[a-z-[rex]]
马丁·恩德

@MartinEnder谢谢,这是我第一次看到可以排除某些字符的字符类
Kritixi Lithos

它们以多种形式存在,但是我相信.NET的语法是唯一的。
马丁·恩德

3

PowerShell,60字节

{$args|%{$_-replace'(rex)|\p{L}','$1*'-replace'(x)\*','$1'}}

在线尝试


我的错。我已替换\w\p{L}
安德烈·奥德戈夫

有趣的主意。请注意,$args作为一个数组,使用引号引起的后果是一个示例。而且,如果您只使用第一个参数,则不需要foreach
乔伊(Joey)

@AndreiOdegov您可以返回\w。旁注:是否\p{L}确实需要大括号?
阿达姆(Adám)'17年

1
"$args"-replace'(rex)|\p{L}','$1*'-replace'(x)\*','$1'正则表达式非常好,整体上更短,$args用引号引起来将它们全部转换为一个字符串,为您节省了很多。
colsw

@Adám.NET中的花括号是必需的。
安德烈·奥德戈夫

3

QuadR11 10 +1 = 11字节

+1字节的i标志。

rex
\w
&
*

在线尝试!

说明:不区分大小写rex,分别用自身和星号替换和单词字符。


2

MATL,24字节

42y3Y2mFGk'rex'Xf!3:q+((

输入是用单引号引起来的字符串。

在线尝试!

说明

考虑输入 'Rex lives in Rexland.'

42    % Push 42 (ASCII for '*')
      % STACK: 42
y     % Implicit input. Duplicate from below
      % STACK: 'Rex lives in Rexland.', 42, 'Rex lives in Rexland.'
3Y2   % Push string 'ABC...YZabc...yz'
      % STACK: 'Rex lives in Rexland.', 42, 'Rex lives in Rexland.', 'ABC...YZabc...yz'
m     % Ismember
      % STACK: 'Rex lives in Rexland.', 42, [1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0]
F     % Push false
      % STACK: 'Rex lives in Rexland.', 42, [1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0], 0
Gk    % Push input lower-cased
      % STACK: 'Rex lives in Rexland.', 42, [1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0], 0, 'rex lives in rexland'
'rex' % Push this string
      % STACK: 'Rex lives in Rexland.', 42, [1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0], 0, 'rex lives in rexland', 'rex'
Xf!   % Strfind and transpose: gives indices of matchings as a column vector
      % STACK: 'Rex lives in Rexland.', 42, [1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0], 0, [1; 14]
3:q   % Push [0 1 2]
      % STACK: 'Rex lives in Rexland.', 42, [1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0], 0, [1; 14], [0 1 2]
+     % Addition, element-wise with broadcast
      % STACK: 'Rex lives in Rexland.', 42, [1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0], 0, [1 2 3; 14 15 16]
(     % Assignment indexing: sets indicated entries to 0
      % STACK: 'Rex lives in Rexland.', 42, [0 0 0 0 1 1 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0]
(     % Assignment indexing: sets indicated entries to 42 (that is, '*'). Implicit display
      % 'Rex ***** ** Rex****.'


2

Perl,31个字节

s/(rex)|[a-z]/$1||"*"/ieg;print

使用-n选项调用perl 。例如:

echo 'To call rex, just say "Rex".'| perl -ne 's/(rex)|[a-z]/$1||"*"/ieg;print'
** **** rex, **** *** "Rex".

[a-z]现在可以替换为,\w因为输入将永远不会包含数字或下划线。
毛茸茸的

您可以使用-p代替-n并删除;print
wastl

2

重击,128字节

r=REXrex;a=`tr -c $r'",. !
' l<<<$1`;for i in {r,R}{e,E}{x,X};{
a=`echo ${a[@]//$i/$(tr $r f-k<<<$i)}`;}
tr $r l<<<$a|tr f-l $r*

在线尝试!

我坚持我以前的回答,非功能性bash数组字符串替换并且没有preg替换!

少打高尔夫球:

    a=`echo $1 |tr -c 'REXrex.,\"! ' 'z'`;        -> a replaces with z chars in input not matching REXrex or punctuation
    for i in {r,R}{e,E}{x,X}; {                   -> iterates over rex .. rEx .. REX
      j=$(tr 'REXrex' 'ABCabc' <<<$i)}            -> holds a for r, A for R, ando so on
      a=`echo ${a[@]//$i/$j`;                     -> replace each combination of rex .. rEx .. REX with abc ... aBc.. ABC
    }
    tr 'REXrex' 'z' <<<$a |tr 'ABCabcz' 'REXrex*' -> replaces each remainig r,e,x,R,E,X with z and finally each ABC with REX and z with *

由于扩展,不得不使用z而不是*


2
似乎不是正确的工具:P
marcosm '17

1
您可以通过不引用tr参数(不含可扩展的参数)来保存几个字符。
manatwork

关于您的其他bash答案:随时进行修复,然后标记为mod注意,要求取消删除。
Rɪᴋᴇʀ

1
再看一遍,有很多r=REXrex值得价值的变量。
manatwork

如果您将$ r放在带引号的字符串中,则无需将周围环境更改'",因此无需转义literal "。当然,您可以通过在该位置换行而不是\n: 来编写文字换行符$r'",. !␤'
manatwork '17

2

Java 7、96 98 97 96字节

+2个字节,用于缺少e的前跟r或后跟x,但不能同时包含两者

-1个字节,用于更改[a-z&&[^rex]](?![rex])\\w

String a(String s){return s.replaceAll("(?i)r(?!ex)|(?<!r)e|e(?!x)|(?<!re)x|(?![rex])\\w","*");}

在线尝试!

使用Java替换的正则表达式版本

用*替换此正则表达式中的所有内容(Java \ w中的注释必须转义为\\ w)

(?i)r(?!ex)|(?<!r)e|e(?!x)|(?<!re)x|(?![rex])\w

(?i)                                                   // Case Insensitive
    r(?!ex)                                            // Any r not followed by ex
           |(?<!r)e                                    // Or any e not preceded by r
                   |e(?!x)                             // Or any e not followed by x
                          |(?<!re)x                    // Or any x not preceded by re
                                   |(?![rex])\w        // Or any other word character

2

C#,93个 90字节

s=>System.Text.RegularExpressions.Regex.Replace(s,"(?i)rex|\w",m=>m.Length>1?m.Value:"*");

相信这是我第一次在C#答案中使用正则表达式,因为名称空间很长System.Text.RegularExpressions


当我编写答案时并没有意识到这一点,但这似乎是@Shaggy的JavaScript答案的C#版本。


1
即使您提出的答案与我无关,也感谢您的提及。
毛茸茸的

@Shaggy Ah谢谢,不知道它是否已更新
TheLethalCoder

1

CJam,39个字节

q{_3<_el"rex"=3{elc_'{,97>&'*@?1}?\o>}h

在线尝试!

这个怎么运作

q           e# Read the input.
{           e# Do:
 _3<        e#  Copy the string and get its first three characters.
 _el"rex"=  e#  Check case-insensitively if they equal "rex".
  3         e#   If they do, push 3.
  {         e#   If they don't:
   elc_     e#    Take the first character of the three, and make it lowercase.
   '{,97>&  e#    Take its set intersection with the lowercase alphabet. Returns a non-empty
            e#      string (truthy) if it's a letter or an empty string (falsy) if not.
   '*@?     e#    Push a * if the char is a letter, or itself if it's not.
   1        e#    Push 1.
  }?        e#  (end if)
 \o         e#  Print the second-from-the-top stack item.
 >          e#  Slice the string after the first 3 or 1 characters, depending on previous outcome.
}h          e# Repeat the above until the string is empty.

1

VimScript,34个字节

s/\v(rex|r@<=ex|(re)@<=x)@!\w/*/gi

这是一个几乎可行的有趣替代方法:

s/\vr(ex)@!|<e|<x|[rex]@!\w/*/gi

想象在字符串上重复运行此命令,Rex, dex, I told you not to do this! You're making me angry Rex!在第一行之后,字符串为Rex, *ex, * **** *** *** ** ** ****! ***'*e ****** *e ***** Rex!。第二遍将得到Rex, **x, * **** *** *** ** ** ****! ***'** ****** ** ***** Rex!,第三遍将完成它。随后的任何传递都不会更改字符串。但是,可能需要3个以上的替换才能到达该位置,例如在string上xxxxxxxx。因此,如果有一种简单的方法可以运行上述替换操作,直到它停止更改内容或输入长度不变,那么这将是另一种解决方案。我敢打赌它可以在V中完成,但它可能仍会超过34个字节。


谢谢你的主意!这是一个V答案。:)
DJMcMayhem

1

果冻,23 字节

在24小时内未对案件提出任何问题,因此没有回复,因此,我将发布此暂定的23言。

“rex”
Œlœṣ¢µØaW;”*yµ€j¢

请参阅“ 在线试用”中的测试用例

怎么样?

“rex” - Link 1, get "rex": no arguments
“rex” - literal "rex"

Œlœṣ¢µØaW;”*yµ€j¢ - Main link: string s (or list of characters)
Œl                - convert s to lowercase
    ¢             - call the last link (1) as a nilad (get "rex")
  œṣ              - split left (s) at sublists equal to right ("rex")
     µ            - call the result t
             µ€   - for each word, w, in t:
      Øa          -   literal: lowercase alphabet
        W         -   wrap it in a list
          ”*      -   literal: '*'
         ;        -   concatenate the wrapped alphabet with the asterisk
            y     -   translate: replace all lowercase letters with asterisks.
                ¢ - call the last link (1) as a nilad (get "rex")
               j  - join left (translated, split text) with copies of right ("rex")

我不确定这是否有效。它与测试用例不匹配。
Okx

请参阅顶部的注释,以及对OP的问题。
乔纳森·艾伦

(尽管很遗憾,我链接到OP所说的“狗在小写字母和大写字母之间没有区别的地方”的评论现在已经消失了)
乔纳森·艾伦

1

CJam,26个字节(大写输出)/ 36个字节(保留大小写)

qeu"REX":R/{__el-'*@?}f%R*

在线尝试!

如果需要保留字母大小写(因为仍然不清楚),那么可以通过增加10个字节来实现:

q_32f&:i\eu"REX":R/{__el-'*@?}f%R*.|

在线尝试!

顺便说一句,在编写此答案时,我发现我会认为是CJam中的一个设计错误:按位运算符&并且|未在两个char值之间定义,因此我无法使用.|两个字符串的按位OR。解决方案最终导致我多花了两个字节,首先将其中一个字符串:i转换为整数数组,然后将其与另一个字符串进行“或”运算。(实际上,这花了我三个字节,因为如果&在两个字符之间工作,我还可以使用它Sf&来代替32f&字母大小写信息。)

从积极的一面来看,我确实发现{...}f%确实可以按预期的那样遍历字符串数组中的字符。真好

无论如何,这是36字节代码的(简短)注释版本:

q                                       "read input";
 _32f&:i\                               "save the case bit of each input char";
         eu"REX":R/                     "uppercase input and split it on 'REX'";
                   {                    "start code block:"
                    __el-'*@?           "c = (c != lowercase(c) ? '*' : c)";
                             }f%        "apply block to chars in each substring";
                                R*      "join the substrings with 'REX' again";
                                  .|    "bitwise OR the case bits back in";

节省大小写的技巧之所以有效,是因为ASCII字母的大小写完全由ASCII码的第五位决定:此位对于大写字母是0,对于小写字母是1。因此,使用32 = 2 5的字符代码按位与将提取大小写位,并将此位与大写字母进行按位或运算将恢复其原始大小写。

当然,非字母字符的第五位可能具有任意值(尽管由于ASCII字符的组织方式,大多数标点符号都将第五位设置为1),但这无关紧要,因为这些字符已保留无论如何都不受大写字母和字母审查循环的影响,并且将字符与自己的第五位进行“或”运算不会改变它。同样,方便地,该*字符已经设置了第五位,因此final也将其保持不变.|


1

21 19字节

qR-`(rex)|\w`{b|'*}

从stdin输入,输出到stdout。在线尝试!

说明

q                    Read a line of stdin
 R                   and replace
   `(rex)|\w`          a regex matching `rex` or any single alphanumeric character,
  -                    case-insensitive
             {    }  with this callback function:
              b|'*     If the 1st capture group (rex) matched, return it, else asterisk
                       The result of the replacement is auto-printed

1

V27,24字节

我将两个答案都保留了,因为我认为它们同样有趣。

27个字节

òÓãr¨ex©À!ü¼eü¼xü[rex]À!÷/*

在线尝试!

感谢Brian McCutchon 在V中执行此操作的想法

十六进制转储:

00000000: f2d3 e372 a865 78a9 c021 fcbc 65fc bc78  ...r.ex..!..e..x
00000010: fc5b 7265 785d c021 f72f 2a              .[rex].!./*

说明:

ò                           " Until the output stops changing...
 Óãr¨ex©À!ü¼eü¼xü[rex]À!÷/* " Run the compressed vim regex:

:s/\vr(ex)@!|<e|<x|[rex]@!\w/*/gi

24字节

Óãrex/ò&ò
HòÓ÷/*/e
jjòÍî

在线尝试!

Ó           " Substitute
 ã          "   (case-insensitive)
  rex       "   'rex'
     /      " with
       &    "   'rex'
      ò ò   "   Surrounded in new lines
ò           " Recursively...
 Ó          "   Substitute...
  ÷         "     A word character
   /        "   with
    *       "     An asterisk
     /e     "     (don't break if there are 0 matches)
jj          "   Move down 2 lines
  ò         " end the recursive loop
   Íî       " Remove all newlines
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.