私の犬が本当に聞くこと


83

私の犬はレックスと呼ばれています。私が彼をscるたびに、彼はあまり感銘を受けていないようで、彼が反応するのを見るのは彼の名前を発音するときだけです。私が言うなら

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

彼が聞くのは

Rex, * **** *** *** ** ** ****! ***'** ****** ** ***** Rex!

課題:入力文字列が与えられた場合、プログラムはすべてのアルファベット文字を星に変えた同じ文字列を出力する必要があります。ただし、wordの外観の文字は除き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グリフィン

2
サポートする必要があるのはa-zA-Z0-9および/またはäëïöüÿãõñáéíóúýàèìòùçなどのみですか?そして、これらに関するいくつかのテストケースを追加できますか?
ケビンCruijssen

2
@KevinCruijssen $ 0-9 $またはアクセント記号付きの文字は最初のチャレンジでは言及されていないため、チャレンジの一部と見なさないでください。
ユアンデラノイ

7
「犬は小文字と大文字の違いを取得しない」ため、出力ケースは入力と異なる場合がありますか?(例:input = "Rex lives in Rexland."、output = "rex ***** ** rex****.";または、代わりにinput = "My cat is getting anorexic."、output = "** *** ** ******* ***Rex**."
ジョナサンアラン

5
このチャレンジで「blah」の代わりに
hBy2Py

回答:


25

網膜24 21バイト

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

オンラインでお試しください!

説明

rex一致を重複させることはできないため、sをスキップすることも簡単に一致させます。そのためrex、他の文字よりも優先する場合、それらは単一の一致でカバーされ、個々の文字の一致には触れられません。

しかし、試合に使用された選択肢に応じて、どのように異なることを行うのでしょうか?残念ながら、Retinaには(まだ)Boost正規表現のような条件付き置換構文がありません。しかし、1つの置換に両方の置換を含め、そのうちの1つだけが空でないことを確認することにより、偽造することができます。

  • $1は最初のキャプチャグループ、つまり(rex)です。我々は一致しなかった場合rex、これは単にそれを書き戻す(それは何もしません)、私たちは一致しなかった場合はrex、その後$1、空の文字列であると消えます。
  • $#2$**として読む必要があります($#2)$*(*)$#2はグループ2が使用された回数です(\w)。これに一致する場合はrexですが0、他の個々の文字に一致する場合はになり1ます。$*次の文字をその左側のオペランドと同じ回数だけ繰り返します。したがって、この部分は*、個々の文字の一致に対して1つを挿入し、に対しては何も挿入しませんrex

網膜は持っていない\aため[a-z]ZB?
リーキー修道女

@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

ここで試してみてください

非REXXersに関する注意:

  1. translateは文字置換関数です(名前はIBM MFのアセンブラー命令に由来します)。string3の文字をstring1で検索します。見つかるたびに、string2内の同じ位置に置き換えられます。string2が短すぎる場合は、埋め込み文字が埋め込まれます。

変換機能についてはこちらをご覧ください

  1. overlayは、string2の指定された位置にstring1を単にオーバーレイします。

オーバーレイ機能についてはこちらをご覧ください


52
...しかし、犬はREX *でプログラムしたと思っていました。
GuitarPicker

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 eplace。

⍠1大文字と小文字を区別しないように設定します。rexそれ自体と他のすべての単語文字をアスタリスクに置き換えるだけです。


\wアンダースコア文字が含まれます。これがRegExであると仮定すると、APLがわかりません。
シャギー

@Shaggyうん、Dyalog APLはPCREを使用していますが、OPからアンダースコアが発生することは確かではありません。例えば、数字はしません。
アダム

特に指示がない限り、それらが発生する可能性があると想定する必要はありませんか?
シャギー

@Shaggy通常、はい、しかしこれは言及されていないことが起こらないことを示しているようです。OPは、コンマ、ピリオド、スペース、感嘆符のみに言及します。
アダム

うーん...私はそれら発生しないことを確認するのを待つと思う、私は\w今いくつかの答えについてそのコメントを残したので見て!
シャギー


8

網膜32 31バイト

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

オンラインでお試しください!説明:文字列を単語rexとその他すべての出現箇所に分割しますが、一致は保持します。次に、開始しない行rex(つまり「その他すべて」)で、文字を*s に変更します。最後に、すべてを一緒に戻します。


3
これは私が非マッチを翻字するためのオプションを使用することができ音訳モードを考えている少なくとも第2の時間です...
マーティン・エンダー

@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環境は、strnicmp関数を提供します(/ Goでコンパイルします)。この関数はstrncasecmpと同じです。ここ動作することを確認してください(置換機能を使用)。

出力は、入力/出力パラメーターである最初のパラメーターに保存されます。

再帰が少し短いことを知らせてくれたJohan du Toitに感謝します。


69で入手できるようにstrncmpiを提供するC環境が存在します。CDで入手できます。
ジョシュア

1
@ジョシュアありがとう。CDとは何ですか?
2501

ボーランドC ++
ジョシュア

7

ルビー、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代わり\plに-1バイトでアンダースコアと数字も置き換えられます

\pL短いです[a-z][[:alpha:]]

オンラインでお試しください!


\w代わりに使用できます\pL
アダム

@アダムは、それが私の長いアプローチが唯一の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;{}ですか?この構文を見たことがありません。
クリストフ

ああ、以前は別のパラメーターがありましたが、それを削除するのを忘れていました。
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の答えと同じです。

@Wondercricketのおかげで-2バイト。

テストとして:

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バイト節約できますx.group(1) or '*'
-Wondercricket

@Wondercricket:ありがとう、Pythonでの最初のゴルフの答えです。
エリックドゥミニル

5

Java 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++)));}

@OlivierGrégoireのおかげで-28バイト。

説明:

オンラインでお試しください。

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べきです。
ケビンCruijssen

に置き換え"[a-zA-z]"てもらえます/[a-z]/iか?
シャギー

@Shaggyはい/いいえ。Javaは、たとえばpythonやC#とは少し異なる正規表現構文を使用します。そのため、大文字と小文字を区別しない正規表現を使用できますが、1バイト長くなります"[a-zA-Z]"-> "(?i)[a-z]"
ケビンCruijssen

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バイトオフの場合、引数間のカンマの後のスペースを取り除くことができます。
メゴ


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

(最初のステージの後に置くことで両方のステージをグループ化する場合i、2番目のステージを構成する必要はありません。
マーティンエンダー

そして、最初の正規表現はと書くことができます[a-z-[rex]]
マーティンエンダー

おかげ@MartinEnder、これはあなたが特定の文字を除外することができ、私は文字クラスを見ているの初めてです
KritixiのLithos

それらはいくつかのフレーバーで存在しますが、それらの.NETの構文はユニークだと思います。
マーティンエンダー

3

PowerShell、60バイト

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

オンラインで試す


私のせい。に置き換え\wました\p{L}
アンドレイオデゴフ

面白いアイデア。$args1つの例のように、配列として使用すると、物を引用するときに結果が生じることに注意してください。とにかく最初の引数のみを使用している場合、を必要としませんforeach
ジョーイ

@AndreiOdegovに戻ることができ\wます。サイドノート:中括弧は\p{L}本当に必要ですか?
アダム

1
非常に素晴らしい正規表現は、"$args"-replace'(rex)|\p{L}','$1*'-replace'(x)\*','$1'全体的にはるかに短く$args、引用符で囲むと、すべてが単一の文字列になり、大幅に節約されます。
colsw

@Adám.NETの中括弧は必須です。
アンドレイオデゴフ


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

Bash、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*

オンラインでお試しください!

私は以前の答えであるtrに固執しています。非機能的な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

1
tr展開可能なものが含まれていない場合、パラメータを引用しないことで、いくつかの文字を保存できます。
マナトワーク

あなたの他のbashの答えに関して:気軽に修正してから、MODの注意を解除して削除するようにフラグを立ててください。
Rɪᴋᴇʀ

1
もう一度見てみると、r=REXrex価値のある変数には非常に多くのrexeがあります。
マナトワーク

$ rを引用符で囲まれていない場合、周囲'をに変更する必要はない"ため、リテラルをエスケープする必要はありません"。もちろん、あなたがするのではなく、その場所にラインを壊すことによってリテラルの改行を書きます\n$r'",. !␤'
マナトワーク

2

Java 7、96 98 97 96バイト

rが前にあるかxが後にあるが両方ではないeがない場合は+2バイト

-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ああおかげでそれが更新されていた知らなかった
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!2番目のパスはRex, **x, * **** *** *** ** ** ****! ***'** ****** ** ***** Rex!となり、3番目のパスは終了します。以降のパスでは、文字列は変更されません。ただし、そこに到達するには、たとえばstringで3回以上の置換が必要になる場合があります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の設計上のバグと考えられるものを見つけました。ビット単位の演算子で&あり|、2つのchar値の間で定義されていないため.|、2つの文字列のビット単位のORを取ることはできません。最終的に2バイト余分にコストがかかる解決策は、最初に文字列の1つ:iを整数の配列に変換し、それを他の文字列とOR演算することです。(実際には、2 バイトの間で作業した場合、大文字と小文字の情報を保存する代わりに使用できたため、3バイトかかりました。)&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コードの5番目のビットによってのみ決定されるため、大文字小文字を節約するトリックが機能します。このビットは大文字の場合は0、小文字の場合は1です。したがって、32 = 2 5の文字コードのビット単位のANDを取得すると、大文字と小文字のビットが抽出され、このビットと大文字のビット単位のORをとると、元の大文字と小文字が復元されます。

もちろん、アルファベット以外の文字は、5番目のビットに任意の値を持つことがあります(ただし、ASCII文字の編成方法により、ほとんどの句読点文字には5番目のビットが1に設定されます)とにかく大文字と文字検閲のループに影響されず、文字と独自の5番目のビットのORをとっても変更されません。また、便利なことに、*文字にはすでに5番目のビットが設定されているため、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]À!÷/*

オンラインでお試しください!

Vでこれ行うというアイデアをくれたBrian McCutchonに感謝します。

Hexdump:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.