Und alle Leute sagten ...

14

Ziel Bei einer Texteingabe, die keine Zeichen enthält, [oder ]führen Sie die folgenden Aktionen aus:

  1. Geben Sie für jede Instanz Amenmit mindestens einem Großbuchstaben (also für alle AmenAusschlussinstanzen amen) dasselbe aus Amen(behalten Sie die Großschreibung bei).
  2. Für jede Instanz von /all the people said[?: ]/i(das ist ein regulärer Ausdruck) wird auch ausgegeben Amen(in jedem Fall ist dies in Ordnung.)

Nach jeder Ausgabe können Sie ein beliebiges konstantes Trennzeichen auswählen , z. B. eine neue Zeile, ein Leerzeichen oder nichts.

Dies ist ein , also gewinnt das kürzeste Programm in Bytes.

Beispiel 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

Bonus

  • -20 Bytes , wenn Sie können „greifen“ die Zeichensetzung , die das folgt Amen, das heißt Amen! => Amen!, AmEN. => AmEN., I said Amen, bruh. => Amen,, und AMEN!!!! => AMEN!!!!. !ist das einzige Zeichen, das mehrfach erhalten bleibt. .?!,sind die einzigen Zeichen, die so erhalten bleiben.
  • -40 Bytes, wenn anstelle von nichts eine Instanz von amenausgegeben wird Heresy! at index [i], wo [i]der Index des beleidigenden Wortes ist, d amen. H.

Bonus IOs

Ein- und Ausgabe erfolgt in der Form input => output. (Trennzeichen ist hier ein Leerzeichen.)

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!

Bestenlisten

Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

# Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

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

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

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

Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:

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

Conor O'Brien
quelle
Müssen die amens in Ordnung sein?
Zach Gates
@ZachGates Ja.
Conor O'Brien
Wie bestimmen Sie den "Index der beleidigenden Phrase"?
Zach Gates
@ZachGates der Index des sein ain amen. ZB G amen => 2wenn Ihre Sprache nullindiziert ist; 3 wenn es einindiziert ist.
Conor O'Brien
AMEN!!!! => AMEN!!!!und doch and a final Amen... => Amen.?
ThisSuitIsBlackNot

Antworten:

11

Retina , 37 Bytes

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

Der Code ist 57 Byte lang und qualifiziert sich für den Bonus von -20 Byte . Probieren Sie es online!

Vielen Dank an @ MartinBüttner für die Portierung meiner Perl-Antwort an Retina!

Wie es funktioniert

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.
Dennis
quelle
1
Darf ich Ihr ([.,?]|!*)Interpunktionsmuster für meine Antwort verwenden? Ich habe es gesehen und konnte es nicht sehen (und ich konnte auf keinen Fall eine bessere Lösung finden!). Es wird sicherlich nicht deine schlagen :), aber ich möchte nicht plagiieren, und ich bin mir nicht ganz sicher, wie man Lösungen für Unterprobleme wie dieses ausleiht.
Apsillers
3
@apsillers Rechtlich ist der gesamte Inhalt hier als CC-BY-SA lizenziert, was bedeutet, dass Sie ihn mit Namensnennung frei verwenden können. Moralisch gesehen ist es mehr oder weniger verpönt, jemandes Lösung auf eine andere Sprache zu portieren, um ihn zu übervorteilen, aber einen winzigen Teil der Antwort von jemandem zu übernehmen, ist immer in Ordnung.
Dennis
7

VBA, 193 Bytes

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

Keine Trennung, kein Regex, kein Bonus. Hatte eine Version, die beide Bonus bekam, aber VIEL länger war.

JimmyJazzx
quelle
Sie verlieren 1 Byte Byte, indem Sie for i=1 toauffor i=1To
Taylor Scott
5

Perl, 51 Bytes

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

Der eigentliche Quellcode enthält 70 Byte , muss mit perl -nE( +1 Byte ) ausgeführt werden und qualifiziert sich für den Bonus von -20 Byte .

Dennis
quelle
4

Python 2, 155 Bytes

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

Beispiel

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

JavaScript, 88 Bytes

108 Bytes - 20 Bytes (fängt Interpunktion ab)

alert(prompt().replace(/amen/g,' ').replace(/all the people said[?: ]/ig,'Amen').match(/amen(\??!?\.?)+/ig))
Tobsta
quelle
Dies wird Amen?!.zur Eingabe Amen?!.und Amen!zur Eingabe gedruckt Amen!!!.
Dennis
@Dennis Entschuldigung, ich habe nicht darüber nachgedacht, dass mehrere Satzzeichen gleichzeitig verwendet werden. Ich werde das Problem beheben.
Tobsta
@ Tennis Nur behoben.
Tobsta
@apsillers Habe das auch nicht bemerkt. Ich versuche es später zu beheben.
Tobsta
@apsillers Fixed
Tobsta
3

grep und sed, 85 83 84 77 - 20 = 57 Bytes

sed 's/all the people said[?: ]/Amenx/ig'|grep -oi 'amen[.,!?]*'|grep \[AMEN]
Thor
quelle
1
Dies wird Amen?für die Eingabe gedruckt all the people said??. Die beste Lösung, die ich finden konnte, war, die Zeichenfolge durch zu ersetzen Amenx.
Dennis
Vielen Dank @Dennis, ich habe Ihre Problemumgehung verwendet und die Partitur aktualisiert.
Thor
1
Dies wird amen.für die Eingabe gedruckt amen.. Wenn Sie dies korrigieren, verkürzt sich Ihre Antwort: Ändern Sie einfach grep -v '^[amen]*$'zu grep \[AMEN].
HDV
@hvd: Du hast recht, das ist viel besser :-)
Thor
3

Perl, 103 - 60 = 43 Bytes

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

Zählt man den Shebang als einen, wird die Eingabe von stdin übernommen. Behält die Interpunktion für -20 Bytes bei und identifiziert die Ketzerei für -40 .


Beispielnutzung

$ 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 Bytes

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

Zählt man den Shebang als einen, wird die Eingabe von stdin übernommen. Behält die Interpunktion für -20 Bytes bei.


Beispielnutzung

$ echo All the people said Amen, and all the people said AMEN!! | perl primo-amen.pl
AmenAmen,AmenAMEN!!
primo
quelle
Ihre erste Lösung schlägt für Eingaben wie fehl ha]. (
Egal,
@ThisSuitIsBlackNot Ich glaube nicht, dass das OP diese Frage beantwortet hat.
Dennis
@ Tennis Ah, du hast recht. Noch ein Unbekannter.
ThisSuitIsBlackNot
3

66-20 = 46 Zeichen / 80-20 = 60 Bytes

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

Probieren Sie es hier aus - nur Firefox.

Zum ersten Mal hier bei PPCGSE. Hoffe, dieser Golf ist ziemlich gut.

EDIT: Eigentlich besiege ich CJam (in Char Count), das ist also ziemlich gut!


quelle
1
Jemand spricht meine Sprache! Nicht schlecht für deinen ersten Beitrag.
Mama Fun Roll
2

CJam, 57 Bytes

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

Der Code ist 97 Bytes lang und qualifiziert sich für den Bonus von -40 Bytes .

Probieren Sie es online im CJam-Interpreter aus .

Dennis
quelle
1
CJam ist länger als Perl? o_O
Conor O'Brien
CJam hat keine regulären Ausdrücke, das ist also überhaupt nicht überraschend.
Dennis
Ohhh ... schreibt das auf
Conor O'Brien
2

JavaScript, 100 Bytes

alert(prompt().replace(/all the people said[?: ]/ig,'Amen').replace(/amen/g,'x').match(/amen/ig));
Nautilus
quelle
3
Sie können verwenden x=prompt();und Sie können auch verwendenalert(prompt().replace(...).replace(...).match)
Conor O'Brien
Erledigt. Jetzt ist es 100 Zeichen lang.
Nautilus
2

JavaScript, 136 135 - 40 - 20 = 75 Bytes

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:""))

Erläuterung:

Dieser Code wird von einem dreiteiligen regulären Ausdruck gesteuert, der Ergebnisse in einen replaceRückruf einspeist . Die Teile sind:

  • all the people said[?: ]- entspricht einfach dem gewünschten all the people saidMuster
  • (amen)([.,?]|!*)- Gleicht jeden Fall amenund Interpunktion (eine von .,?oder null oder mehr !, wodurch die Interpunktion optional ist) in separate Übereinstimmungsgruppen ab. - Gutschrift an Dennis für das Interpunktionsmuster
  • . - Stimmt mit jedem anderen Zeichen überein, das nicht zu den oben genannten Mustern gehört

Daher muss jede Übereinstimmung entweder eine Zeichenfolge für alle Personen, eine Amen-Übereinstimmung mit optionaler Interpunktion oder ein einzelnes Zeichen sein, das nicht Teil einer dieser Phrasen ist. Wir verwenden Logik im Ersetzungsrückruf, um die entsprechenden Teile der Zeichenfolge zu speichern und zu ersetzen und jedes andere Zeichen in die leere Zeichenfolge zu ändern.

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
  )
)
Apsillers
quelle
1

Python 2, 191 - 40 = 151 Bytes

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

Kein regulärer Ausdruck und Bonus 2

TFeld
quelle