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

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:



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.


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


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.




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!


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!


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



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.



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




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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.