สิ่งที่สุนัขของฉันได้ยินจริงๆ


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?สุนัขคุณได้ยิน*****! ***'* *** ... * **** *********?ไหม ถ้าเป็นเช่นนั้นคุณอาจพิจารณาการสื่อสารในมอร์สจากนี้ไป ...
สตีวีกริฟฟิ

2
เราต้องการการสนับสนุนa-zA-Zหรือยัง0-9และ / หรือäëïöüÿãõñáéíóúýàèìòùçอื่น ๆ เป็นต้นหรือไม่? และคุณสามารถเพิ่มกรณีทดสอบเกี่ยวกับสิ่งเหล่านี้
Kevin Cruijssen

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" s ???
hBy2Py

คำตอบ:


24

เรติน่า24 24ไบต์

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

ลองออนไลน์!

การอธิบาย

การข้ามrexเป็นวิธีที่ง่ายที่สุดโดยการจับคู่ด้วยเช่นกันเนื่องจากการแข่งขันไม่สามารถทับซ้อน ดังนั้นหากเราให้ความสำคัญกับrexตัวอักษรอื่นมากกว่าตัวอักษรเหล่านั้นจะถูกกล่าวถึงในการแข่งขันครั้งเดียว

แต่เราจะทำสิ่งต่าง ๆ อย่างไรขึ้นอยู่กับทางเลือกที่ใช้สำหรับการแข่งขัน? แต่น่าเสียดายที่ Retina ไม่ได้มีรูปแบบการทดแทนตามเงื่อนไขเช่นรสชาติของ regex Boost แต่เราสามารถปลอมได้โดยรวมการทดแทนทั้งสองรายการไว้ในการเปลี่ยนครั้งเดียวและตรวจสอบให้แน่ใจว่ามีเพียงรายการเดียวเท่านั้นที่ไม่ว่างเปล่า:

  • $1(rex)เป็นกลุ่มที่จับครั้งแรกคือ ถ้าเราจับคู่rexสิ่งนี้ก็แค่เขียนมันกลับมา (ดังนั้นมันจึงไม่ทำอะไรเลย) แต่ถ้าเราไม่ตรงrexก็$1เป็นสตริงที่ว่างเปล่าและหายไป
  • $#2$**($#2)$*(*)ควรจะอ่านเป็น $#2คือหมายเลขของกลุ่มครั้งถูกนำมาใช้คือ2 (\w)ถ้าเราจับคู่rexนี้อยู่0แต่ถ้าเราจับคู่ตัวอักษรบุคคลอื่น ๆ 1นี้เป็น $*ซ้ำอักขระถัดไปซ้ำหลายครั้งเท่ากับตัวถูกดำเนินการทางซ้าย ดังนั้นส่วนนี้แทรกเดียวสำหรับการแข่งขันแต่ละตัวอักษรและไม่มีอะไรเลยสำหรับ*rex

เรตินามี\aไว้สำหรับ[a-z]zB หรือไม่?
Leun Nun

@LeakyNun ไม่ ฉันต้อง tokenise regex (หรือแม้แต่ใช้รสชาติของตัวเอง) เพื่อเพิ่มคุณสมบัติใด ๆ เพื่อรสชาติ Regex เอง
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. แปลเป็นฟังก์ชั่นการเปลี่ยนอักขระ (ชื่อมาจากคำสั่งแอสเซมเบลอร์บน IBM MF) มันค้นหา string1 สำหรับตัวละครใน string3 ทุกครั้งที่พบมันจะแทนที่ด้วยตำแหน่งเดียวกันใน string2 ถ้า string2 สั้นเกินไปมันจะเสริมด้วยอักขระแพด

ฟังก์ชั่นการแปลที่นี่

  1. การซ้อนทับเพียงวางทับ string1 ที่ด้านบนของ string2 ที่ตำแหน่งที่ระบุ

ดูที่นี่สำหรับฟังก์ชั่นการซ้อนทับ


52
... แต่สุนัขคิดว่าเขาตั้งโปรแกรมไว้ใน REX *
GuitarPicker

10
กี่ upvotes เหล่านี้ล้วนเป็นทางเลือกของภาษา! : D
Shaggy

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
ทางออกที่ดี!
Steve Bennett

13

APL (Dyalog Unicode) , 22 ไบต์SBCS

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

ลองออนไลน์!

ง่าย ๆ PCRE R eplace

⍠1กำหนดความรู้สึกตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ เพียงแทนที่rexด้วยตัวเองและอักขระคำอื่น ๆ ทั้งหมดด้วยเครื่องหมายดอกจัน


\wรวมอักขระขีดล่างโดยสมมติว่านี่คือ RegEx - ฉันไม่รู้จัก APL
Shaggy

@Shaggy Yeah, Dyalog APL ใช้ PCRE แต่ไม่แน่ใจจาก OP ว่าจะเกิดขีดล่าง เช่นตัวเลขจะไม่
2560

เราไม่ต้องคิดว่ามันจะเกิดขึ้นได้เว้นแต่จะมีการบอกเป็นอย่างอื่น?
Shaggy

@Shaggy ปกติแล้วใช่ แต่สิ่งนี้ดูเหมือนจะบ่งบอกว่าสิ่งที่ไม่ได้กล่าวถึงจะไม่เกิดขึ้น OP ระบุเฉพาะเครื่องหมายจุลภาคจุดช่องว่างและเครื่องหมายอัศเจรีย์
2560

อืม ... ฉันคิดว่าฉันจะรอการยืนยันว่าพวกเขาจะไม่เกิดขึ้นเพราะฉันได้แสดงความคิดเห็นเกี่ยวกับ\wคำตอบสองสามตอนนี้!
Shaggy


8

เรติน่า32 32ไบต์

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 จัดเตรียม (คอมไพล์ด้วย / Go) ฟังก์ชัน strnicmp ฟังก์ชั่นนี้เหมือนกับ strncasecmp ดูว่าทำงานได้ที่นี่ (พร้อมฟังก์ชันทดแทน)

เอาท์พุทจะถูกเก็บไว้ในพารามิเตอร์แรกซึ่งเป็นพารามิเตอร์ที่เข้า / ออก

ขอบคุณJohan du Toit ที่แจ้งให้ฉันทราบว่าการเรียกซ้ำสั้นลงเล็กน้อย


มีสภาพแวดล้อม C ที่ให้ strncmpi ดังนั้นคุณสามารถรับมันใน 69. ฉันได้รับมันในแผ่นซีดี
Joshua

1
@Joshua ขอบคุณ ซีดีคืออะไร
2501

Borland C ++ 4.5
Joshua

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

-1 ไบต์\wแทน\plในกรณีนี้ขีดล่างและตัวเลขจะถูกแทนที่ด้วย

\pLสั้นกว่า[a-z]หรือ[[:alpha:]]

ลองออนไลน์!


คุณสามารถใช้แทน\w \pL
อดัม

@ Adámขอบคุณมันทำให้การเข้าใกล้ของฉันนานขึ้นเพียง 1 ไบต์สั้นลงและไม่ค่อยชัดเจนว่าควรทำอะไรในกรณีที่ขีดล่างหรือตัวเลข
JörgHülsermann

อินพุตจะไม่มีขีดเส้นใต้หรือตัวเลขใด ๆ ..
2560

@ Adámฉันได้เพิ่มจุดพิเศษและได้แก้ไขวิธีการที่ยาวกว่าว่าทำไมฉันถึงได้พบกับการปรับปรุงอื่น ๆ
JörgHülsermann

5

C (GCC บน POSIX), 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 ขอบคุณคงแล้ว
เดิมพัน

5

Python 2 หรือ 3, 75 73 70 ไบต์

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

โดยทั่วไปเช่นเดียวกับรูบี้ของฉันคำตอบ

-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 ไบต์ได้โดยลบระยะห่างระหว่างx.group(1) or '*'
Wondercricket

@Wondercricket: ขอบคุณมากมันเป็นคำตอบกอล์ฟครั้งแรกของฉันใน Python
Eric Duminil

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

-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ควร
Kevin Cruijssen

คุณสามารถแทนที่"[a-zA-z]"ด้วย/[a-z]/i?
ปุย

@Shaggy ใช่ / ไม่ Java ใช้ไวยากรณ์ regex แตกต่างกันเล็กน้อยเช่น python หรือ C # ดังนั้นใช่มันเป็นไปได้ที่จะใช้ regex กรณีตาย แต่มันจะเป็นหนึ่งไบต์อีกต่อไป: ->"[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 ไบต์) ลบตัวแปรlและบันทึก 4 ไบต์
Olivier Grégoire

4

Python 2, 87 Bytes

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 ไบต์

Golfed 5 ไบต์ต้องขอบคุณ @MartinEnder

เรติน่า 49 ไบต์

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

ลองออนไลน์!


@Emigna รู้เพียงว่าการแก้ปัญหาของฉันไม่ได้ทำงานเพื่อdexจะช่วยให้ในขณะที่คุณให้*e* **x
Kritixi Lithos

หากคุณจัดกลุ่มทั้งสองสเตจโดยใส่(หลังจากขั้นแรกiคุณไม่จำเป็นต้องกำหนดค่าสเตจที่สอง
Martin Ender

และ regex [a-z-[rex]]ครั้งแรกของคุณสามารถเขียนเป็น
Martin Ender

@MartinEnder ขอบคุณนี่เป็นครั้งแรกที่ฉันเห็นคลาสอักขระที่คุณสามารถยกเว้นอักขระบางตัวได้
Kritixi Lithos

มีหลายรสชาติ แต่ฉันเชื่อว่าไวยากรณ์ของ. NET สำหรับพวกเขานั้นไม่เหมือนใคร
Martin Ender

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
Regex ที่ดี"$args"-replace'(rex)|\p{L}','$1*'-replace'(x)\*','$1'มากสั้นโดยรวมมากการใส่$argsเครื่องหมายคำพูดเปลี่ยนเป็นสตริงเดียวและช่วยให้คุณประหยัดได้มาก
colsw

@ Adámจำเป็นต้องใช้เครื่องมือจัดฟันแบบหยิกใน. NET
Andrei Odegov

3

QuadR , 11 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

เรียกใช้ Perl พร้อม-nตัวเลือก ตัวอย่างเช่น:

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
ทำลาย

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*

ลองออนไลน์!

ฉันเกาะติดกับคำตอบก่อนหน้าของฉันสตริงทุบตีอาร์เรย์ที่ไม่ทำงานและไม่มีการแทนที่ 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พารามิเตอร์ของพารามิเตอร์เมื่อไม่มีสิ่งใดที่ขยายได้
จัดการ

เกี่ยวกับคำตอบทุบตีอื่น ๆ ของคุณ: อย่าลังเลที่จะแก้ไขแล้วตั้งค่าสถานะเพื่อขอความสนใจ mod ที่ขอยกเลิกการลบ
Rɪᴋᴇʀ

1
มองอีกครั้งมีจำนวนมาก rexes สำหรับr=REXrexตัวแปรที่คุ้มค่า
จัดการ

ถ้าคุณเก็บ $ R ออกจากสายยกคุณไม่จำเป็นต้องเปลี่ยนรอบ'การจึงไม่จำเป็นที่จะหลบหนีอักษร" "แน่นอนคุณเขียนบรรทัดใหม่ตามตัวอักษรโดยการแบ่งบรรทัดในสถานที่นั้นแทน\n: $r'",. !␤'.
จัดการ

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","*");}

ลองออนไลน์!

เวอร์ชัน regex สำหรับการแทนที่โดยใช้ Java

แทนที่ทุกอย่างใน regex นี้ด้วย * (โน้ตใน 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:"*");

เชื่อว่านี่เป็นครั้งแรกที่ผมเคยใช้ regex ใน C # คำตอบที่นี่เพราะ System.Text.RegularExpressionsnamespace


ไม่ได้ตระหนักถึงมันเมื่อฉันเขียนคำตอบของฉัน แต่ตอนนี้ดูเหมือนว่าจะเป็นรุ่น C # ของ@ คำตอบ


1
ขอบคุณที่พูดถึงแม้ว่าคุณจะได้คำตอบที่เป็นอิสระจากฉัน
Shaggy

@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 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
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: ตัวดำเนินการระดับบิต&และ|ไม่ได้กำหนดไว้ระหว่างสองค่าถ่านดังนั้นฉันไม่สามารถใช้.|รับบิตหรือสองสาย วิธีการแก้ปัญหาซึ่งจบลงด้วยการคิดต้นทุนสองไบต์พิเศษคือการแปลงสตริงหนึ่งด้วยสตริง:iเป็นจำนวนเต็มก่อนแล้วจึงสามารถ ORed ด้วยสตริงอื่น (อันที่จริงมันมีค่าใช้จ่ายฉันสามไบต์เพราะถ้า&ทำงานระหว่างสองตัวอักษรฉันสามารถใช้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 จะแยกบิตของเคสและบิตหรือ ORING บิตนี้ด้วยตัวอักษรตัวพิมพ์ใหญ่จะคืนค่าเคสดั้งเดิมของพวกเขา

แน่นอนว่าอักขระที่ไม่ใช่ตัวอักษรอาจมีค่าตามอำเภอใจสำหรับบิตที่ห้า (แม้ว่าเนื่องจากวิธีการจัดระเบียบอักขระ ASCII อักขระเครื่องหมายวรรคตอนส่วนใหญ่มีการตั้งค่าบิตที่ห้าเป็น 1) แต่สิ่งนี้ไม่สำคัญเนื่องจากอักขระเหล่านั้นถูกทิ้งไว้ แตะต้องโดยตัวพิมพ์ใหญ่และตัวอักษรตรวจสอบวนรอบต่อไปและการ ORING อักขระที่มีบิตที่ห้าของตัวเองจะไม่เปลี่ยน นอกจากนี้ยังมีสิ่งอำนวยความสะดวกที่ตัวละครแล้วมีบิตชุดที่ห้าจึงยังไม่มีการเปลี่ยนแปลงโดยสุดท้าย*.|


1

Pip , 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]À!÷/*

ลองออนไลน์!

ขอบคุณ Brian McCutchon สำหรับความคิดของเขาที่จะทำสิ่งนี้ใน V

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.