내 개가 실제로 듣는 것


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 $ 또는 악센트 부호가있는 문자는 언급되지 않았으므로 챌린지의 일부로 간주하지 마십시오.
Ewan Delanoy

7
"개는 소문자와 대문자의 차이를 얻지 못 하므로 " 출력 대소 문자가 입력과 다를 수 있습니까? (예 : input = "Rex lives in Rexland.", output = "rex ***** ** rex****."; 또는 input = "My cat is getting anorexic.", output = "** *** ** ******* ***Rex**.")
Jonathan Allan

5
이 도전이 왜 "blah"대신
hBy2Py

답변:


24

망막 , 24 21 바이트

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

온라인으로 사용해보십시오!

설명

rexs를 건너 뛰는 것은 일치하는 항목과 겹칠 수 없기 때문에 가장 쉬운 방법입니다. 따라서 rex다른 문자보다 우선 순위가 높은 경우 단일 문자로 표시되며 개별 문자 일치는 다루지 않습니다.

그러나 경기에 사용 된 대안에 따라 어떻게 다른 일을합니까? 불행히도 Retina는 Boost 정규식 풍미와 같은 조건부 대체 구문을 가지고 있지 않습니다. 그러나 두 개의 대체를 단일 대체에 포함시키고 그 중 하나만 비어 있지 않은지 확인하여 위조 할 수 있습니다.

  • $1첫 번째 캡처 그룹 (rex)입니다. 우리가 일치 한 경우 rex이 문제를 간단하게 (그래서 아무것도 안) 다시 쓴다,하지만 우리가 일치하지 않은 경우 rex다음 $1빈 문자열이며 사라진다.
  • $#2$**로 읽어야합니다 ($#2)$*(*). $#2그룹 2이 사용 된 횟수 , 즉 (\w). 일치 rex하면이 (가 0)되지만 다른 개별 문자와 일치하면이 (가) 1입니다. $*다음 문자를 왼쪽 피연산자만큼 여러 번 반복합니다. 따라서이 부분 *은 개별 문자 일치를위한 단일 문자를 삽입 하고 전혀 일치하지 않습니다 rex.

이 망막하지 않습니다 \a에 대한 [a-z]ZB?
Leaky Nun

@LeakyNun 번호 정규식 풍미 자체에 기능을 추가하려면 정규식을 토큰 화하거나 고유 한 풍미를 구현해야합니다.
Martin Ender

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에서 string3의 문자를 검색합니다. 하나를 찾을 때마다 string2에서 동일한 위치로 바꿉니다. string2가 너무 짧으면 패드 문자로 채워집니다.

번역 기능은 여기를 참조하십시오

  1. 오버레이는 단순히 지정된 위치에서 string2 위에 string1을 오버레이합니다.

오버레이 기능은 여기를 참조하십시오


52
...하지만 개는 REX *에서 프로그램을 작성했다고 생각했습니다.
GuitarPicker

10
순전히 언어를 선택하기 위해 얼마나 많은 투표자들이 있습니까?! : D
얽히고 설킨

72
@Shaggy 적어도 그들 모두
TheLethalCoder

24

자바 스크립트 (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
좋은 해결책!.
Steve Bennett

13

APL (Dyalog Unicode) , 22 바이트 SBCS

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

온라인으로 사용해보십시오!

간단한 PCRE R의 eplace.

⍠1대소 문자를 구분하지 않습니다. rex그 자체와 다른 모든 단어 문자를 별표로 간단히 대체합니다 .


\w정규 표현식이라고 가정하고 밑줄 문자를 포함합니다-APL을 모릅니다.
Shaggy

@Shaggy 네, Dyalog APL은 PCRE를 사용하지만 OP가 확실하지 않을 수도 있습니다. 예를 들어 숫자는 없습니다.
Adám

달리 언급하지 않는 한 우리는 그들이 일어날 수 있다고 가정하지 않아도됩니까?
얽히고 설킨

@Shaggy 일반적으로는, 그래,하지만 발생하지 언급되지 않은 그 무엇을 나타내는 것으로 보인다. OP는 쉼표, 마침표, 공백 및 느낌표 만 언급합니다.
Adám

흠 ... 나는 그들이 몇 가지 답변에 대한 의견을 남긴 것처럼, 그들이 일어나지 않을 것이라는 확인을 기다릴 것입니다\w !
Shaggy


8

망막 , 32 31 바이트

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

온라인으로 사용해보십시오! 설명 : 문자열을 단어 rex와 다른 항목으로 나누지 만 일치는 유지합니다. 그런 다음 시작하지 않는 행 rex(예 : "다른 모든 것")에서 문자를 *s로 변경하십시오 . 마지막으로 모든 것을 다시 합치십시오.


3
음역 모드가 비 일치 문자를 음역하는 옵션을 사용할 수 있다고 생각하는 것은 적어도 두 번째입니다.
Martin Ender

@MartinEnder가 너무 늦음 :-D
John Dvorak

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 에게 감사드립니다 .


strncmpi를 제공하는 C 환경이 있으므로 69로 얻을 수 있습니다. CD로 구했습니다.
Joshua

1
@Joshua 감사합니다. CD 란 무엇입니까?
2501

볼랜드 C ++ 4.5
Joshua

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대신 -1 바이트 \pl는 밑줄과 숫자도 바뀝니다.

\pL[a-z]또는 보다 짧다[[:alpha:]]

온라인으로 사용해보십시오!


\w대신 사용할 수 있습니다 \pL.
Adám

@ Adám 감사합니다. 더 긴 접근 방식은 1 바이트 만 짧아지고 밑줄이나 숫자의 경우 무엇을해야하는지 명확하지 않습니다
Jörg Hülsermann

입력에는 밑줄이나 숫자가 절대로 포함되지 않습니다.
Adám

@ Adám 나는 그것에 대해 추가적인 지적을했고 다른 개선점을 찾은 이유에 대해 더 긴 접근법을 편집했습니다
Jörg 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의 답변 과 동일 합니다.

@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
x.group(1) or '*'
Wondercricket

@ 원더 크리켓 : 정말 고마워요. 파이썬에서 내 첫 골프 답변입니다.
Eric Duminil

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

@ 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해서는 안됩니다.
Kevin Cruijssen

당신은 대체 할 수 "[a-zA-z]"와 함께 /[a-z]/i?
Shaggy

@Shaggy 예 / 아니요. Java는 예를 들어 파이썬이나 C #과 약간 다른 정규식 구문을 사용합니다. 따라서 대소 문자를 구분하지 않는 정규 표현식을 사용할 수 있지만 1 바이트 더 길어집니다 "[a-zA-Z]".-> "(?i)[a-z]".
Kevin Cruijssen

1
s.regionMatches(0<1,i,"rex",0,3)대신에 사용해야한다고 생각합니다 s.toLowerCase().substring(i,i+(i>l-3?1:3)).equals("rex").
Olivier Grégoire

1
@KevinCruijssen 현재 코드 (168 바이트)를 가져 와서 변수를 제거하고 l4 바이트를 저장하십시오.
Olivier Grégoire

4

파이썬 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

(첫 번째 단계를 두어 두 단계를 그룹화하는 경우 두 i번째 단계를 구성 할 필요가 없습니다.
Martin Ender

그리고 첫 정규 표현식은로 쓸 수 있습니다 [a-z-[rex]].
Martin Ender

@MartinEnder 감사합니다. 이것은 특정 문자를 제외 할 수있는 문자 클래스를 처음 보는 것입니다.
Kritixi Lithos

그것들은 여러 가지 맛으로 존재하지만 .NET의 구문은 독특하다고 생각합니다.
마틴 엔더

3

PowerShell, 60 바이트

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

온라인으로 사용해보십시오


내 잘못. 로 교체 \w했습니다 \p{L}.
Andrei Odegov

재미있는 생각. $args예를 들어 배열로 사용 하면 인용 할 때 결과가 발생합니다. 그리고 어쨌든 첫 번째 인수 만 사용하는 경우에는 필요하지 않습니다 foreach.
Joey

@AndreiOdegov로 돌아갈 수 있습니다 \w. 참고 : 괄호가 \p{L}실제로 필요한가요?
Adám

1
아주 좋은 정규 표현식 "$args"-replace'(rex)|\p{L}','$1*'-replace'(x)\*','$1'은 전체적으로 훨씬 짧 $args으며 따옴표로 묶으면 모두 단일 문자열로 변환하여 많은 비용을 절약합니다.
colsw

@ Adám .NET에는 중괄호가 필요합니다.
Andrei Odegov 17 년


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

펄, 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입력에 숫자 나 밑줄이 포함되지 않으므로로 대체 할 수 있습니다 .
Shaggy

-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 바꾸기가 tr에 붙어 있습니다!

덜 골프 :

    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확장 가능한 항목이없는 경우의 매개 변수를 인용하여 두 개의 문자를 저장할 수 있습니다 .
manatwork

다른 배쉬 답변과 관련하여 : 자유롭게 수정 한 다음 취소를 요청하는 모드주의 플래그를 지정하십시오.
Rɪᴋᴇʀ

1
다시 한 번 살펴보면, r=REXrex가치가 있는 변수에 대한 많은 rexe 가 있습니다.
manatwork

인용 된 문자열에서 $ r을 유지하면 주변 '을 로 변경할 "필요가 없으므로 리터럴을 이스케이프 처리 할 필요가 없습니다 ". 물론, 다음 대신에 그 줄을 바꾸어 리터럴 개행을 작성 \n하십시오 $r'",. !␤'.
manatwork

2

자바 7, 96 98 97 96 바이트

누락 된 e 앞에 r이 앞에 오거나 x가 오는 경우 +2 바이트

로 변경 [a-z&&[^rex]]하기 위한 -1 바이트(?![rex])\\w

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

온라인으로 사용해보십시오!

Java를 사용하여 교체하기위한 정규식 버전

이 정규식의 모든 것을 *로 바꿉니다 (Java의 참고는 \\ 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!이고 세 번째 패스가 완료됩니다. 후속 패스는 문자열을 변경하지 않습니다. 그러나 예를 들어 string과 같이 3 회 이상 대체해야 할 수 있습니다 xxxxxxxx. 따라서 변경 사항을 멈추거나 입력 길이만큼 여러 번 위의 대체를 실행하는 쉬운 방법이 있다면 또 다른 해결책이 될 것입니다. V로 할 수는 있지만 여전히 34 바이트보다 길 것입니다.


아이디어 주셔서 감사합니다! 여기 에 V 답변이 있습니다. :)
DJMcMayhem

1

젤리 , 23 바이트

case관한 질문에 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에 대한 질문을 참조하십시오.
Jonathan Allan

(안타깝게도 OP가 "개는 소문자와 대문자의 차이를 얻지 못한다"라고 말한 곳에 링크 된 주석이 사라 졌음)
Jonathan Allan

1

CJam , 26 바이트 (대문자 출력) / 36 바이트 (대소 문자 보존)

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

온라인으로 사용해보십시오!

소문자를 보존 해야하는 경우 ( 아직 약간 불분명하기 때문에 ) 10 바이트를 추가하여 수행 할 수 있습니다.

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

온라인으로 사용해보십시오!

그건 그렇고,이 답변을 쓰는 ​​동안 CJam에서 디자인 버그라고 생각하는 것을 발견했습니다. 비트 연산자 &|두 char 값 사이에 정의되어 있지 않으므로 .|두 문자열의 비트 OR을 사용 하는 데 사용할 수 없습니다 . 2 바이트의 비용이 들었던 해결책은 먼저 문자열 중 하나 :i를 정수 배열로 변환 한 다음 다른 문자열과 OR 될 수 있습니다. (실제로 두 문자 사이에서 작업 하면 대소 문자 정보를 저장하는 대신 사용할 수 있기 때문에 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 코드의 다섯 번째 비트만으로 결정되므로 대소 문자를 구분하는 트릭이 작동합니다.이 비트는 대문자는 0이고 소문자는 1입니다. 따라서 32 = 2 5 인 문자 코드의 비트 AND를 취하면 대소 문자를 추출하고이 비트를 대문자로 비트 OR하면 원래 대소 문자를 복원합니다.

물론, 알파벳이 아닌 문자는 다섯 번째 비트에 대해 임의의 값을 가질 수 있습니다 (ASCII 문자가 구성되는 방식으로 인해 대부분의 문장 부호 문자는 다섯 번째 비트가 1로 설정 됨). 어쨌든 대문자와 문자 검열 루프에 의해 건드리지 않고 자신의 다섯 번째 비트로 문자를 OR 링해도 변경되지 않습니다. 또한 편리하게도 *문자에는 이미 다섯 번째 비트 세트가 있으므로 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

V , 27 , 24 바이트

나는 그들이 똑같이 흥미 있다고 생각하기 때문에 두 답변을 모두 떠날 것입니다.

27 바이트

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

온라인으로 사용해보십시오!

V에서이 작업수행 하려는 그의 아이디어에 대해 Brian McCutchon에게 감사합니다.

16 진 덤프 :

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.