Copodope Gopolopfop


15

Bahasa: Oppifikasi

Bahasa yang lucu untuk diucapkan dibuat dengan menerapkan proses berikut untuk setiap kata:

  1. Tempatkan opsetelah setiap konsonan. Jadi CodemenjadiCopodope .

Ya itu saja. Untuk tujuan tantangan ini,y selalu merupakan konsonan.

The Challenge: De-oppification

Diberi kata menentang, kembalikan kata aslinya. Input hanya akan berisi huruf. Huruf pertama dapat ditulis dengan huruf besar. Kata aslinya tidak akan pernah kosong dan akan selalu berisi vokal.

Kasus uji:

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
Tak satu pun dari kasus uji Anda berisi vokal diikuti oleh op, jadi jawaban sepanjang baris replace(/(.)op/, '\1')tidak akan gagal salah satu dari mereka. Saya sarankan Anda menambahkan kata seperti hoopatau loopedke kasus uji.
Gagang Pintu

@ mbomb007 Saya menambahkan beberapa test case yang lebih rumit.
xnor

Apakah jawabannya hanya bekerja untuk input yang dipra-preoppified atau semua input?
CalculatorFeline

@CalculatorFeline "Diberi kata lawan"
mbomb007

2
Bisakah kita menambahkan "mopmopmopbopopop" sebagai test case? :)
user2390246

Jawaban:



12

Retina , 9 byte

(?!\G)op

Cobalah online!

Alih-alih memeriksa bahwa karakter sebelumnya adalah konsonan, kami hanya memastikan bahwa arus optidak berdekatan dengan awal string atau kecocokan sebelumnya. Satu-satunya kasus di mana kami dapat mencocokkan yang salah opadalah jika string asli berisi op(menghasilkan opop). Tetapi dalam hal ini kami hanya akan menghapus yang pertama, opbukan yang kedua dan hasilnya akan sama.


Bukankah ini memberikan jawaban yang salah untuk input seperti loop?
Leo

4
@ Leo loopbukan input yang valid karena Anda tidak bisa mendapatkannya dari menentang kata lain.
Martin Ender

@ MartinEnder But lopoop(versi yang ditentang loop) adalah valid, dan tidak ditolak loop.
Imus

@Imus tidak, versi yang ditentang loopadalah lopoopop.
Martin Ender

menyadari kesalahan saya juga tak lama setelah mempostingnya :) terlalu lambat dalam menghapus. Poin yang bagus.
Imus

10

Python , 42 byte

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

Cobalah online!

Jika saya tidak salah, Anda bisa mengganti semuanya ?opdengan ?tanpa peduli dengan vokal. Jika string asli berisi op, maka itu dilawan opop, dan penggantian mengembalikannya opdan tidak lebih lanjut. Ini karena pola yang cocok untuk ?optidak dapat tumpang tindih, jadi hanya satuop yang dihapus.

Solusi non-regex lebih panjang 5 byte.

Python , 47 byte

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

Cobalah online


3
Anda dapat mengimpor re setelah Anda merujuknya‽
Adám

4
@ Adám Python tidak mengevaluasinya ketika fungsi didefinisikan, hanya ketika itu dipanggil.
xnor

4
Wow, sudah lama sejak saya melihat ada yang menggunakan interrobang. Saya kira itu cara untuk sedikit mengomentari komentar Anda.
Baldrickk

1
@Baldrickk Tetapi dalam byte , interrobang memiliki> = byte daripada hanya string "?!"
MilkyWay90

5

Perl 5 , 10 + 1 = 11 byte

s/.\Kop//g

Cobalah online!

Jalankan dengan -p (penalti 1 byte); bahasa golf mungkin melakukan I / O implisit secara otomatis, tetapi Perl membutuhkan opsi untuk itu.

Ketika saya melihat jawaban @ xnor , saya menyadari bahwa ini dapat ditingkatkan menggunakan fitur regex khusus Perl; s/a\Kb/c/gsetara dengan s/ab/ac/g(dengan kata lain, s///satu - satunya menggantikan hal-hal setelah yang pertama \K). Jadi begini tampilannya di Perl.



3

Go, 103 92 bytes

Must... compile... Go built-in functions have weird names. :P

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

Try it online!


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

thanks to @nimi suggestions in comments!


2
Some tips: as you are using v and o only once, you can inline it. notElem is shorter than not(...elem...). You can replace the && in a guard with a ,. The last case for a can be written as a x=x. No need for () in x:(a r).
nimi

1
... oh, and the test for =="op" can be replaced with a literal pattern match: a(x:'o':'p':r)|notElem x"aeiouAEIOU"=x:a r
nimi

Updated. thanks @nimi
Davide Spataro

1
One more byte to save: you can omit the space between x and ".
nimi

3

PHP, 36 bytes

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

Try it online!


How is this supposed to be run?
Titus

It fails for the first two test cases. Use preg_replace to fix.
Titus

You can save 3 bytes by renaming the variable to any single character, $a for instance
junkfoodjunkie

@junkfoodjunkie $argn is a reserved variable which is availbale when PHP is run with the -ROption from the command line
Jörg Hülsermann

Ah, okay, didn't know that. The online tester doesn't account for it. :-)
junkfoodjunkie


1

JavaScript (ES6), 35 bytes

Add f= at beginning and invoke like f(arg).

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

I am surprised no one posted a JavaScript solution yet....

Test Snippet

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

Try it online!

Note that this snippet wants to replace op with a ., but later on there is a replacement defined where op is being put back into the string. That second instruction would have the op replaced by a . (and thus insert a . into the end result), so I've used a \ between the o and p to break the pattern.



0

Crystal, 39 Bytes

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

How it works

It simply searches for each consonant, followed by the sequence op. If so, replace that sequence only with the consonant found before: ([^aeiou]).

Try it online



0

Ruby, 34 27 22 + 1 = 23 bytes

-4 bytes thanks to RJHunter.

+1 byte for the -p flag.

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

Try it online!


Using Ruby's -p option will cost a byte but allow your script to start directly with gsub.
RJHunter

0

sed, 22 bytes

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

Reads from STDIN until EOF and outputs de-oppified string
Uses same length reduction technique from @xnor's Python answer


0

R, 29 bytes

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

Try it online!

Much like most other solutions here, captures character followed by op, replaces it with character itself.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.