І всі люди сказали ...


14

Завдання Враховуючи текст, який не містить символів, [або ]виконайте такі дії:

  1. Для кожного примірника Amenхоча б однієї великої літери (тому всі випадки Amenвиключення amen) виведіть ту саму Amen(збережіть великі літери).
  2. Для кожного примірника /all the people said[?: ]/i(це регулярний вираз) також виводиться Amen(будь-який випадок є нормальним.)

Після кожного виводу ви можете вибрати будь-який постійний роздільник, наприклад, новий рядок, пробіл чи нічого.

Це , тому виграє найкоротша програма в байтах.

Приклад IO

Input: I said AMEN! AMEN, PEOPLE!
Output: AMENAMEN         ; any separator is fine, I choose none.

Input: amen amen amen amen
Output:                  ; nothing

Input:                   ; empty
Output:                  ; nothing

Input: *blah blah blah* And all the people said?
Output: Amen

Input: all the people said:
Output: Amen

Input: AMEN AMeN AmeN aMEN amen AmEn
Output: AMEN AMeN AmeN aMEN AmEn

Input: All the people said Amen! And all the people said AMEN!
Output: Amen Amen Amen AMEN

Input: LAMEN! Amen.
Output: AMEN Amen

Input: AmenAmenAmenAmenAMENamen
Output: Amen Amen Amen Amen AMEN

Input: And he was like, "Amen", then we were all like, "Amen, bruh."
Output: Amen Amen

Input: And all the aMen people said.
Output: aMen

Бонус

  • -20 байт , якщо ви можете «захопити» пунктуація , що слідує за Amen, тобто Amen! => Amen!, AmEN. => AmEN., I said Amen, bruh. => Amen,і AMEN!!!! => AMEN!!!!. !є єдиним символом, який зберігається кілька разів. .?!,є єдиними символами, які збереглися таким чином.
  • -40 байтів, якщо є екземпляр amen, вивести, Heresy! at index [i]а не нічого, де [i]є індекс слова, що порушує, тобто amen.

Бонусні IO

Вхід і вихід мають форму input => output. (Роздільник тут - пробіл.)

BONUS 1
Can I get an Amen! => Amen!
AMEN! and AMEN! and a final Amen... => AMEN! AMEN! Amen.
Amen? Amen, and amEn! => Amen? Amen, amEn!

BONUS 2
The man sighed and said, "amen," and left. It's AMEN! => Heresy! at index [26] AMEN!

Табло лідерів

Ось фрагмент стека для створення як звичайного табло, так і огляду переможців за мовою.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# Language Name, N bytes

де Nрозмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:

# Ruby, <s>104</s> <s>101</s> 96 bytes

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

# Perl, 43 + 2 (-p flag) = 45 bytes

Ви також можете зробити ім'я мови посиланням, яке потім з’явиться у фрагменті таблиць лідерів:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


Чи amenповинні бути в порядку?
Зак Гейтс

@ZachGates Так.
Conor O'Brien

Як ви визначаєте "індекс образотворчої фрази"?
Зак Гейтс

@ZachGates Бути індексом aв amen. Наприклад, G amen => 2якщо ваша мова нульова; 3, якщо він одноіндексований.
Conor O'Brien

AMEN!!!! => AMEN!!!!і все ж and a final Amen... => Amen.?
ThisSuitIsBlackNot

Відповіді:


11

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

S`amen
i`all the people said[?: ]
amenx
!i`amen([.,?]|!*)

Код, якщо довжина 57 байт і відповідає бонусу -20 байт . Спробуйте в Інтернеті!

Дякую @ MartinBüttner за те, що він передавав мою відповідь Perl Retina!

Як це працює

S`                          Split the input at...
  amen                      matches of "amen".
i`                          Case-insensitively search for
  all the people said[?: ]  matches of "all the people said",
                            followed by '?', ':' or ' '...
    amenx                   and replace them with "amenx"
!i`                         Print all case-insensitive matches of...
  amen([.,?]|!*)            "amen", followed either by a single '.',
                            ',' or '?', or by 0 or more '!'s.

1
Чи можу я використовувати вашу ([.,?]|!*)відповідність пунктуаційного відповідності для своєї відповіді? Я побачив це і не міг його побачити (і, звичайно, не зміг знайти кращого рішення!). Це, звичайно, не збирається бити ваших :), але я не хочу плагіатувати, і я не зовсім впевнений у етикеті для запозичення рішень для таких проблем.
апсилери

3
@apsillers Юридично весь вміст тут ліцензований як CC-BY-SA, тобто ви можете вільно використовувати його з атрибуцією. Морально переносити чиєсь рішення на іншу мову, щоб перевершити його, більш-менш знущається, але брати крихітну частину чиєїсь відповіді завжди добре.
Денніс

7

VBA, 193 байт

Function v(b)
For i=1 To Len(b)
If StrConv(Mid(b,i,19),2) Like "all the people said" Then v=v& "Amen"
q=Mid(b,i,4):k="amen"
If StrConv(q,2) Like k And Not q Like k Then v=v& q
Next
End Function

Ні поділу, ні Регексу, ні бонусу. Мав версію, яка отримала обидва бонусу, але була набагато довшою.


Ви втрачаєте 1 байт, переходячи for i=1 toнаfor i=1To
Тейлор Скотт

5

Perl, 51 байт

s/amen/x/g;s/all the people said[?: ]/amenx/ig;say/amen[.,?]|amen!*/ig

Фактичний вихідний код містить 70 байт , він повинен бути запущений perl -nE( +1 байт ), і він може бути бонус -20 байт .


4

Python 2, 155 байт

from re import*
F,m=findall,"((?i)amen)"
for i in split(m,input()):
 if F("((?i)all the people said[?: ])",i):print'AMen'
 elif F(m,i)and i!="amen":print i

Приклад

$ python2 test.py
"All the people said Amen! And all the people said AMEN!"
AMen
Amen
AMen
AMEN

3

JavaScript, 88 байт

108 байт - 20 байт (фіксує розділові знаки)

alert(prompt().replace(/amen/g,' ').replace(/all the people said[?: ]/ig,'Amen').match(/amen(\??!?\.?)+/ig))

Це друкує Amen?!.для введення Amen?!.та Amen!для введення Amen!!!.
Денніс

@ Денніс Вибачте, я не думав про те, як використовувати декілька розділових знаків одночасно, я це виправлю.
Тобста

@Dennis Просто виправив це.
Тобста

@apsillers цього також не помітили. Спробую це виправити пізніше.
Тобста

Виправлено @apsillers
Tobsta

3

grep і sed, 85 83 84 77 - 20 = 57 байт

sed 's/all the people said[?: ]/Amenx/ig'|grep -oi 'amen[.,!?]*'|grep \[AMEN]

1
Це буде надруковано Amen?для введення all the people said??. Найкращим вирішенням, яке я міг знайти, було замінити рядок на Amenx.
Денніс

Дякую @Dennis, я використав ваш спосіб вирішення і оновив рахунок.
Тор

1
Це буде надруковано amen.для введення amen.. Виправлення це скоротить вашу відповідь: просто змініть grep -v '^[amen]*$'на grep \[AMEN].
hvd

@hvd: Ти маєш рацію, це набагато краще :-)
Тор

3

Perl, 103 - 60 = 43 байти

#!perl -p
s/amen/Heresy! at index [@-]/g;s/all the people said[?: ]/Amen /gi;s/(amen([.,?]|!*)|h[^h]+\])\K|.//gi

Підрахувавши шебанг як один, вхід береться від stdin. Підтримує розділові знаки на -20 байт та визначає єресь на -40 .


Використання зразка

$ echo amen amen, and all the people said?? amen amen | perl amen.pl
Heresy! at index [0]Heresy! at index [5]AmenHeresy! at index [37]Heresy! at index [42]

$ echo AMEN AMeN AmeN aMEN amen AmEn | perl amen.pl
AMENAMeNAmeNaMENHeresy! at index [20]AmEn

$ echo The man sighed and said, "amen," and left. It's AMEN! | perl amen.pl
Heresy! at index [26]AMEN!

Perl, 70 - 20 = 50 байт

#!perl -p
s/all the people said[?: ]/Amen /gi;s/amen|(?i:amen([.,?]|!*))\K|.//g

Підрахувавши шебанг як один, вхід береться від stdin. Підтримує розділові знаки на -20 байт.


Використання зразка

$ echo All the people said Amen, and all the people said AMEN!! | perl primo-amen.pl
AmenAmen,AmenAMEN!!

Ваше перше рішення не вдається на зразок введення ha]. (Незважаючи на те, щойно побачив коментар ОП про те, що вхід не може містити квадратні дужки ... це питання перетворюється стільки разів, що я не можу відслідковувати.)
ThisSuitIsBlackNot

@ThisSuitIsBlackNot Я не думаю, що ОП відповіла на це питання.
Денніс

@Dennis Ah, ти правий. Ще одна невідома.
ThisSuitIsBlackNot

3

𝔼𝕊𝕄𝕚𝕟, 66 - 20 = 46 символів / 80 - 20 = 60 байт

ïċ/all the people said[?: ]⍀,`Amen”ċ(/amen⌿,`x”ĉ/amen(\??!?\.?)+⍀)

Спробуйте тут - лише Firefox.

Вперше тут, на PPCGSE. Сподіваюся, цей гольф досить непоганий.

EDIT: Насправді я б'ю CJam (за рахунком), тож це дуже добре!


1
Так, хтось використовує мою мову! Непогано для вашого першого повідомлення.
Mama Fun Roll

2

CJam, 57 байт

 q_,,\f{\:I>_4<_el"amen":A=*_A="Heresy! at index ["I+']+@?oK<)"?: "&,*el"all the people said"=A*o}

Код завдовжки 97 байт і відповідає бонусу -40 байт .

Спробуйте його в Інтернеті в інтерпретаторі CJam .


1
CJam довше Perl? o_O
Conor O'Brien

У CJam немає регулярних виразів, тому це зовсім не дивно.
Денніс

Ох ... записує це вниз
Конор О'Брайен

2

JavaScript, 100 байт

alert(prompt().replace(/all the people said[?: ]/ig,'Amen').replace(/amen/g,'x').match(/amen/ig));

3
Ви можете використовувати, x=prompt();а також можете використовуватиalert(prompt().replace(...).replace(...).match)
Conor O'Brien

Зроблено. Зараз це 100 символів.
Наутілус

2

JavaScript, 136 135 - 40 - 20 = 75 байт

alert(prompt(A="ameN").replace(/all the people said[?: ]|(amen)([.,?]|!*)|./ig,(v,a,p,i)=>a?a>A?`Heresy! at index [${i}]`:v:v[1]?A:""))

Пояснення:

Цей код керується трискладовим регулярним виразом, який подає результати до replaceзворотного виклику . Частини:

  • all the people said[?: ]- просто відповідає необхідній all the people saidсхемі
  • (amen)([.,?]|!*)- відповідає будь-якому регістру amenта пунктуації (одна .,?або нульова чи більше !, що робить пунктуацію необов'язковою) в окремі групи відповідності - зарахуйте Деннісу для пунктуаційного шаблону
  • . - відповідає будь-якому іншому символу, який не є частиною вищезазначених шаблонів, один за одним

Отже, будь-яка відповідність повинна бути або загальнолюдським рядком, і збігом Amen з необов'язковими розділовими знаками, або одним символом, що не є частиною жодної з цих фраз. Ми використовуємо логіку для зворотного виклику замінника, щоб зберегти та замінити відповідні частини рядка та змінити будь-який інший символ на порожній рядок.

alert(
  // store "ameN" in `A` and then prompt
  prompt(A="ameN")
    .replace(
      // three-part regex:
      /all the people said[?: ]|(amen)([.,?]|!*)|./ig,

      // replacer callback, with arguments
      //   v - total match
      //   a - "amen" match group
      //   p - punctuation match group (unused)
      //   i - index of match
     (v,a,p,i)=>
        a?           // if there is an Amen match
          a>A?      //   if the Amen is lowercase (lexically more than "ameN")
               `Heresy! at index [${i}]`
              :v     //   otherwise, output full Amen with punctuation
         :v[1]?      // if there is no Amen, but more than one character
          A          //   this must be all-the-people; output "ameN"
         :""         // otherwise, not an Amen or all-the-people
  )
)

1

Пітон 2, 191 - 40 = 151 байт

i=input()
a='amen'
for j in range(len(i)):
 s=i[j:j+20];w=s[:4]
 if s[:-1].lower()=="all the people said"and s[-1]in'?: ':print a
 if w.lower()==a:print'Heresy! at index[%d]'%j if w==a else w

Без регулярного вираження та бонусу 2

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