Copodope Gopolopfop

15

Die Sprache: Opposition

Eine lustige Sprache zum Sprechen wird erstellt, indem auf jedes Wort der folgende Vorgang angewendet wird:

  1. Setzen Sie opnach jedem Konsonanten. So Codewird es Copodope.

Ja das ist es. Für den Zweck dieser Herausforderung yist immer ein Konsonant.

Die Herausforderung: Entgegensetzung

Geben Sie bei einem gegenteiligen Wort das ursprüngliche Wort zurück. Die Eingabe enthält nur Buchstaben. Der erste Buchstabe kann groß geschrieben werden. Das ursprüngliche Wort wird niemals leer sein und wird immer einen Vokal enthalten.

Testfälle:

Oppified      ->         Original 
a                        a
I                        I
itop                     it
opop                     op
Opop                     Op
popopop                  pop
Copopop                  Cop
opopopop                 opop
Kopicopkop               Kick
Asopia                   Asia
soptopopop               stop
hopoopopsop              hoops
hopoopopedop             hooped
ooooohop                 oooooh
aaaopopaaa               aaaopaaa
Popopopsopicoplope       Popsicle
gopaloplopopopinopgop    galloping
aopopbopopopcopopop      aopbopcop
mbomb007
quelle
8
Keiner Ihrer Testfälle enthält einen Vokal, gefolgt von op, sodass eine Antwort in der Art von replace(/(.)op/, '\1')keinen von ihnen fehlschlägt. Ich schlage vor, dass Sie ein Wort wie hoopoder loopedzu den Testfällen hinzufügen .
Türknauf
@ mbomb007 Ich habe einige weitere knifflige Testfälle hinzugefügt.
xnor
Muss die Antwort nur für vorab veränderte Eingaben oder für alle Eingaben funktionieren?
CalculatorFeline
@CalculatorFeline "Angesichts eines gegenteiligen Wortes"
mbomb007
2
Können wir "mopmopmopbopopop" als Testfall hinzufügen? :)
user2390246

Antworten:

10

V , 12 , 5 Bytes

Í.“op

Probieren Sie es online!

00000000: cd2e 936f 70                             ...op

7 Bytes gespart dank der Erkenntnis von @ Xnor, dass wir nicht nach Vokalen suchen müssen, da die Eingabe immer entgegengesetzt werden muss.

DJMcMayhem
quelle
Hmm, das scheint so schwer zu schlagen ...
Erik the Outgolfer
4
Der Hex-Dump: ...op
Bringt
12

Netzhaut , 9 Bytes

(?!\G)op

Probieren Sie es online!

Anstatt zu überprüfen, ob das vorangegangene Zeichen ein Konsonant ist, stellen wir nur sicher, dass das aktuelle Zeichen opweder dem Anfang der Zeichenfolge noch der vorherigen Übereinstimmung benachbart ist. Der einzige Fall, in dem wir mit einem falschen übereinstimmen könnten, opist, wenn die ursprüngliche Zeichenfolge einen op(resultierenden opop) enthält. In diesem Fall wird nur der erste opanstelle des zweiten entfernt, und das Ergebnis ist dasselbe.

Martin Ender
quelle
Wäre das nicht eine falsche Antwort für eine Eingabe wie loop?
Leo
4
@Leo loopist keine gültige Eingabe, da Sie sie nicht erhalten können, wenn Sie ein anderes Wort ablehnen.
Martin Ender
@MartinEnder Aber lopoop(die entgegengesetzte Version von loop) ist gültig und wird nicht entgegensetzt loop.
Imus
@Imus nein, die gegnerische Version von loopist lopoopop.
Martin Ender
habe meinen fehler auch kurz nach dem posten gemerkt :) war beim löschen zu langsam. Guter Punkt.
Imus
10

Python , 42 Bytes

lambda s:re.sub('(.)op',r'\1',s)
import re

Probieren Sie es online!

Wenn ich mich nicht irre, können Sie einfach alle ?opdurch ersetzen, ?ohne sich um Vokale zu kümmern. Wenn die ursprüngliche Zeichenfolge enthält op, ist sie dagegen opopund die Ersetzung gibt sie an opund nicht weiter zurück. Dies liegt daran, dass sich die Musterübereinstimmungen für ?opnicht überlappen können, sodass nur eines opentfernt wird.

Eine Nicht-Regex-Lösung ist 5 Byte länger.

Python , 47 Bytes

f=lambda s:s and s[0]+f(s[1+2*(s[1:3]=='op'):])

Probieren Sie es online aus

xnor
quelle
3
Sie können importieren, re nachdem Sie es referenziert haben‽
Adám
4
@ Adám Python wertet es nicht aus, wenn die Funktion definiert ist, sondern nur, wenn sie aufgerufen wird.
5.
4
Wow, es ist schon eine Weile her, seit ich jemanden gesehen habe, der einen Interrobang benutzt. Ich denke, das ist eine Möglichkeit, Ihren Kommentar ein wenig zu verbessern.
Baldrickk
1
@Baldrickk Aber in Bytes hat der Interrobang> = Bytes als nur die Zeichenfolge "?!"
MilkyWay90
5

Perl 5 , 10 + 1 = 11 Bytes

s/.\Kop//g

Probieren Sie es online!

Laufen Sie mit -p(1 Byte Strafe); Golfsprachen führen möglicherweise implizite E / A-Vorgänge automatisch aus, aber Perl benötigt eine Option dafür.

Als ich die Antwort von @ xnor sah , wurde mir klar, dass es mit einer Perl-spezifischen Regex-Funktion verbessert werden könnte. s/a\Kb/c/gist äquivalent zu s/ab/ac/g(mit anderen Worten, das s///ersetzt nur die Dinge nach dem ersten \K). So sieht es in Perl aus.


quelle
3

Los , 103 bis 92 Bytes

Muss ... kompilieren ... eingebaute Funktionen haben seltsame Namen. : P

import."regexp"
func f(s string)string{return MustCompile("(.)op").ReplaceAllString(s,"$1")}

Probieren Sie es online!

total menschlich
quelle
3

Haskell (93 62 61 Bytes)

a(x:'o':'p':r)|notElem x"aeiouAEIOU"=x:a r
a(x:r)=x:a r
a x=x

danke an @nimi vorschläge in kommentaren!

Davide Spataro
quelle
2
Einige Tipps: wie Sie verwenden , vund onur einmal, können Sie es inline. notElemist kürzer als not(...elem...). Sie können die &&in einer Wache mit einem ersetzen ,. Der letzte Fall für akann als geschrieben werden a x=x. Keine Notwendigkeit für ()in x:(a r).
nimi
1
... oh, und der Test für =="op"kann durch einen wörtlichen Mustervergleich ersetzt werden:a(x:'o':'p':r)|notElem x"aeiouAEIOU"=x:a r
nimi
Aktualisiert. danke @nimi
Davide Spataro
1
Ein weiteres Byte zum Speichern: Sie können das Leerzeichen zwischen xund weglassen ".
Nimi
3

PHP , 36 Bytes

<?=preg_replace("#.\Kop#","",$argn);

Probieren Sie es online!

Jörg Hülsermann
quelle
Wie soll das laufen?
Titus
Bei den ersten beiden Testfällen schlägt dies fehl. Verwenden Sie preg_replacezu beheben.
Titus
Sie können 3 Bytes einsparen, indem Sie die Variable in ein beliebiges einzelnes Zeichen
umbenennen,
@junkfoodjunkie $argnist eine reservierte Variable, die verfügbar ist, wenn PHP mit der -ROption über die Befehlszeile ausgeführt wird
Jörg Hülsermann,
Ah, okay, das wusste ich nicht. Der Online-Tester berücksichtigt dies nicht. :-)
junkfoodjunkie
1

JavaScript (ES6), 35 Byte

Fügen Sie f=am Anfang und rufen Sie wie f(arg).

s=>s.replace(/([^aeiou])op/gi,"$1")

Ich bin überrascht, dass noch niemand eine JavaScript-Lösung gepostet hat.

Testschnipsel

let f=
s=>s.replace(/([^aeiou])op/gi,"$1")

console.log("a" + " -> " + f("a"));
console.log("I" + " -> " + f("I"));
console.log("itop" + " -> " + f("itop"));
console.log("opop" + " -> " + f("opop"));
console.log("Opop" + " -> " + f("Opop"));
console.log("popopop" + " -> " + f("popopop"));
console.log("Copopop" + " -> " + f("Copopop"));
console.log("opopopop" + " -> " + f("opopopop"));
console.log("Kopicopkop" + " -> " + f("Kopicopkop"));
console.log("Asopia" + " -> " + f("Asopia"));
console.log("soptopopop" + " -> " + f("soptopopop"));
console.log("hopoopopsop" + " -> " + f("hopoopopsop"));
console.log("hopoopopedop" + " -> " + f("hopoopopedop"));
console.log("ooooohop" + " -> " + f("ooooohop"));
console.log("aaaopopaaa" + " -> " + f("aaaopopaaa"));
console.log("Popopopsopicoplope" + " -> " + f("Popopopsopicoplope"));
console.log("gopaloplopopopinopgop" + " -> " + f("gopaloplopopopinopgop"));
console.log("aopopbopopopcopopop" + " -> " + f("aopopbopopopcopopop"));

Arjun
quelle
0

/// , 18 Bytes

/op/.//../o\p//.//

Probieren Sie es online!

Beachten Sie, dass dieses Snippet durch opa ersetzt werden .soll. Später wird jedoch eine Ersetzung definiert, bei opder die Zeichenfolge wiederhergestellt wird. Diese zweite Anweisung würde opdurch ein ersetzt werden .(und somit ein .in das Endergebnis einfügen ), also habe ich ein \zwischen ound verwendet p, um das Muster zu brechen.

steenbergh
quelle
0

Kristall, 39 Bytes

def o(s)s.gsub(/([^aeiou])op/,"\\1")end

Wie es funktioniert

Es wird einfach nach jedem Konsonanten gesucht, gefolgt von der Sequenz op. Wenn ja, ersetzt diese Sequenz nur mit den Konsonanten gefunden vor: ([^aeiou]).

Probieren Sie es online aus

Domii
quelle
0

Ruby , 34 27 22 + 1 = 23 Bytes

-4 Bytes dank RJHunter.

+1 Byte für das -pFlag.

$_.gsub!(/(.)op/,'\1')

Probieren Sie es online!

total menschlich
quelle
Die Verwendung der Ruby- -pOption kostet ein Byte, ermöglicht es Ihrem Skript jedoch, direkt damit zu beginnen gsub.
RJHunter
0

sed, 22 bytes

sed -E 's/(.)op/\1/g'

Liest von STDIN bis EOF und gibt den gegenteiligen String aus.
Verwendet die gleiche Längenreduktionstechnik aus der Python-Antwort von @ xnor

Arc676
quelle
0

R 29 Bytes

gsub("(.)op","\\1",scan(,''))

Probieren Sie es online!

Ähnlich wie bei den meisten anderen Lösungen wird hier das Zeichen gefolgt von op erfasst und durch das Zeichen selbst ersetzt.

Sumner18
quelle