И все люди сказали ...


14

Цель С учетом ввода текста, который не содержит символов [или ], выполните следующие действия:

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

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

Это , поэтому выигрывает самая короткая программа в байтах.

Пример IOs

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.

Бонусные операции

Ввод и вывод имеет форму 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!

Leaderboards

Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# 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 Да.
Конор О'Брайен

Как вы определяете «индекс оскорбительной фразы»?
Зак Гейтс

@ZachGates Быть индексом aв amen. Например, G amen => 2если ваш язык не проиндексирован; 3, если он одноиндексный.
Конор О'Брайен

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!!!.
Деннис

@ Денис Извините, я не думал о множественных знаках препинания одновременно, я исправлю это.
Tobsta

@ Денис Просто исправил это.
Tobsta

@apsillers Этого тоже не заметил. Я постараюсь исправить это позже.
Tobsta

@apsillers Исправлено
Tobsta

3

grep and 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: Ты прав, это намного лучше :-)
Thor

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

Считая Шебанг как единое, ввод берется из стандартного ввода. Поддерживает пунктуацию для -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

Считая Шебанг как единое, ввод берется из стандартного ввода. Поддерживает пунктуацию для -20 байтов.


Образец использования

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

Ваше первое решение не подходит для ввода, как ha]. (Неважно, только что увидел комментарий ОП о том, что входные данные не могут содержать квадратные скобки ... этот вопрос трансформировался столько раз, что я не могу отследить.)
ThisSuitIsBlackNot

@ThisSuitIsBlackNot Я не думаю, что ОП ответил на этот вопрос.
Деннис

@ Денис Ах, ты прав. Еще один неизвестный.
ThisSuitIsBlackNot

3

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

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

Попробуй здесь - только Firefox.

Впервые здесь, в PPCGSE. Надеюсь, этот гольф довольно хорош.

РЕДАКТИРОВАТЬ: На самом деле, я бью 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? о_О
Конор О'Брайен

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)
Конор О'Брайен

Выполнено. Теперь это 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и пунктуации (одна .,?или ноль или более !, что делает пунктуацию необязательной) в отдельных группах соответствия - кредит Деннису за образец пунктуации
  • . - соответствует любому другому персонажу, не являющемуся частью вышеуказанных шаблонов, по одному за раз

Следовательно, любое совпадение должно быть либо строкой «все люди», либо совпадением «аминь» с необязательной пунктуацией, либо одним символом, не входящим ни в одну из этих фраз. Мы используем логику в обратном вызове replacer, чтобы сохранить и заменить соответствующие части строки и заменить любой другой символ пустой строкой.

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

Python 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.