Що насправді чує моя собака


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та / або äëïöüÿãõñáéíóúýàèìòùçі т.д. тощо? А ви могли б додати кілька тестових випадків щодо них?
Кевін Круїссен

2
@KevinCruijssen Оскільки $ 0-9 $ або наголошені символи не згадуються в початковому виклику, не вважайте їх частиною виклику.
Еван Деланой

7
Оскільки "собаки не мають різниці між малими та великими літерами" , може випадок виходу відрізняється від вхідного? (Наприклад: input = "Rex lives in Rexland.", output = "rex ***** ** rex****."; або альтернативно input = "My cat is getting anorexic.", output = "** *** ** ******* ***Rex**.")
Джонатан Аллан

5
Чому цей виклик використав зірочки замість "бла"?
hBy2Py

Відповіді:


24

Сітківка , 24 21 байт

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

Спробуйте в Інтернеті!

Пояснення

Пропустити rexs найпростіше, якщо їх також узгодити, оскільки збіги не можуть перетинатися. Тож якщо ми надамо пріоритет rexпорівняно з іншими літерами, вони будуть охоплені в одній відповідності та не будуть торкатися відповідності окремих літер.

Але як ми можемо робити різні речі залежно від альтернативи, яка була використана для матчу? На жаль, у Retina (поки що) немає жодного умовного синтаксису заміни, як аромат Boost regex. Але ми можемо підробити це, включивши обидві заміни в одну заміну і переконавшись, що лише одна з них не порожня:

  • $1є першою групою захоплення, тобто (rex). Якщо ми збігалися, rexпросто записуємо його назад (значить, він нічого не робить), але якщо ми не відповідали, rexто $1це порожній рядок і зникає.
  • $#2$**слід читати як ($#2)$*(*). $#2- кількість разів, яку 2використовувала група , тобто (\w). Якщо ми відповідали rexце так 0, але якщо ми відповідали будь-якій іншій букві, це так 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). Він шукає string1 для символів у string3. Кожен раз, коли він знаходить один, він замінює його на той самий, що розташований у string2. Якщо string2 занадто короткий, він прошитий символом накладки.

Дивіться тут функцію перекладу

  1. overlay просто накладає string1 поверх string2 у вказаному положенні.

Тут див. Функцію накладання


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, але невідомо, що в ОП буде підкреслено. Наприклад цифри не будуть.
Adám

Чи не треба вважати, що вони можуть виникнути, якщо не сказано інше?
Кудлатий

@Shaggy Зазвичай, так, але це, мабуть, означає, що те, що не згадується, не відбудеться. У OP згадуються лише кома, період, пробіл та знак оклику.
Adám

Хм ... я думаю, я зачекаю підтвердження, що вони не відбудуться, побачивши, як я залишив цей коментар щодо \wкількох відповідей зараз!
Кудлатий


8

Сітківка , 32 31 байт

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

Спробуйте в Інтернеті! Пояснення: Розбиває рядок на входження слова rexта все інше, але зберігає відповідність. Потім на рядках, які не починаються rex(тобто "все інше"), змініть літери на *s. Нарешті, з'єднайте все разом.


3
Це, принаймні, другий раз, коли я думаю, що режим транслітерації може використати опцію для транслітерації невідповідностей ...
Мартін Ендер

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

Середовище IDE Pelles забезпечує (компілює з / Go) функцію strnicmp. Ця функція ідентична strncasecmp. Дивіться, як це працює тут (з функцією заміни).

Вихід зберігається в першому параметрі, який є параметром вводу / виходу.

Завдяки Йохану дю Тойте за те, що він повідомив мені, що рекурсія дещо коротша.


Існує середовище C, яке надає strncmpi, так що ви можете отримати їх у 69. У мене це є на CD.
Джошуа

1
@Joshua Дякую Що таке 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);

-1 \wзамість \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 (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;{}? Я ніколи раніше не бачив цього синтаксису.
Крістоф

О, у нього був інший параметр, але я забув його видалити.
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)

В основному такий же , як мій Рубі відповідь .

-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.
Ерік Думініл

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повинні.
Кевін Круїссен

Чи не могли б ви замінити "[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

Пітон 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

Гема, 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 байт

Поле 5 байтів завдяки @MartinEnder

Сітківка , 49 байт

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

Спробуйте в Інтернеті!


@Emigna Щойно зрозумів, що моє рішення не працює dex, воно дає, *e*поки твоє дає **x.
Kritixi Lithos

Якщо ви згрупуєте обидва етапи, додавши (після першого, 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}дійсно потрібні брекети ?
Адам

1
дуже хороший Regex, "$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опцією. Наприклад:

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
виглядає, що це не правильний інструмент: Р
маркосм

1
Ви можете зберегти пару символів, не цитуючи trпараметрів, коли вони не містять нічого розгорнутого.
манатура

Що стосується іншої вашої відповіді: не соромтеся виправити, а потім позначте модну увагу, яка вимагає відміни.
Rɪᴋᴇʀ

1
Подивившись знову, існує досить багато рексів для r=REXrexзмінної до вартості.
манатурка

Якщо ви тримаєте $ г з рядка в лапках, ви не повинні змінити навколишній 'до ", тому немає необхідності , щоб уникнути буквальне ". Звичайно, тоді ви пишете дослівний переклад рядки розриву рядка в цьому місці замість \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","*");}

Спробуйте в Інтернеті!

Версія з регулярним виразом для заміни за допомогою 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.


Я не усвідомлював цього, коли я написав свою відповідь, але, здається, це версія C # на відповідь JavaScript @ Shaggy .


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!Другим проходом 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

Дивіться мою записку вгорі та моє запитання до ОП.
Джонатан Аллан

(хоча, на жаль, коментар, який я посилався на те, де в ОП сказали, що "собаки не мають різниці між малими та великими літерами" зараз пішов)
Джонатан Аллан

1

CJam , 26 байт (верхній регістр) / 36 байт (збереження регістру)

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

Спробуйте в Інтернеті!

Якщо аркуш літер потрібно зберегти (оскільки це ще трохи незрозуміло ), це можна досягти за допомогою 10 додаткових байтів:

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

Спробуйте в Інтернеті!

До речі, під час написання цієї відповіді я виявив, що вважаю помилкою дизайну в CJam: побітові оператори &і |не визначаються між двома знаками char, тому я не можу використовувати, .|щоб взяти побітові АБО два рядки. Рішення, яке в кінцевому рахунку коштувало мені двох зайвих байтів, полягає в тому, щоб спочатку перетворити один з рядків :iу масив цілих чисел, який потім можна ORE з іншим рядком. (Насправді це коштувало мені трьох байтів, тому що, якщо я &працював між двома символами, я міг би також використати 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), але це не має значення, оскільки ці символи залишилися не торкаючись верхнього регістру та петлі цензури літер так чи інакше, і АБО символ із власним п'ятим бітом не змінює його. Також зручно, що *персонаж вже має п'ятий біт, тому його також залишають незмінним до фіналу .|.


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 ст

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.