Copodope Gopolopfop


15

El lenguaje: oppificación

Se crea un lenguaje divertido para hablar aplicando el siguiente proceso a cada palabra:

  1. Colocar opdespués de cada consonante. Así se Codeconvierte Copodope.

Si eso es. A los efectos de este desafío, ysiempre es una consonante.

El desafío: desaptación

Dada una palabra oppified, devuelve la palabra original. La entrada solo contendrá letras. La primera letra puede estar en mayúscula. La palabra original nunca estará vacía y siempre contendrá una vocal.

Casos de prueba:

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
Ninguno de sus casos de prueba contiene una vocal seguida de op, por lo que una respuesta a lo largo de las líneas de replace(/(.)op/, '\1')no fallará en ninguno de ellos. Sugiero que agregue una palabra como hoopo loopeda los casos de prueba.
Pomo de la puerta

@ mbomb007 Agregué algunos casos de prueba más complicados.
xnor

¿La respuesta solo tiene que funcionar para entradas preoppified o todas las entradas?
CalculatorFeline

@CalculatorFeline "Dada una palabra oppified"
mbomb007

2
¿Podemos agregar "mopmopmopbopopop" como un caso de prueba? :)
user2390246

Respuestas:



12

Retina , 9 bytes

(?!\G)op

Pruébalo en línea!

En lugar de verificar que el carácter anterior es una consonante, solo nos aseguramos de que la corriente opno sea adyacente ni al comienzo de la cadena ni a la coincidencia anterior. El único caso en el que podríamos coincidir con un incorrecto opes si la cadena original contenía un op(que resulta en opop). Pero en ese caso, eliminaremos el primero en oplugar del segundo y el resultado será el mismo.


¿No daría esto una respuesta incorrecta para una entrada como loop?
Leo

44
@Leo loopno es una entrada válida porque no puede obtenerla optando por otra palabra.
Martin Ender

@MartinEnder Pero lopoop(la versión oppified de loop) es válida y no se des-oppified loop.
Imus

@Imus no, la versión oppified de loopes lopoopop.
Martin Ender

También me di cuenta de mi error poco después de publicarlo :) la eliminación fue demasiado lenta. Buen punto.
Imus

10

Python , 42 bytes

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

Pruébalo en línea!

Si no me equivoco, sólo puede sustituir todo ?opcon ?y sin preocuparse por las vocales. Si la cadena original contiene op, entonces está oppified opop, y el reemplazo la devuelve opy no más. Esto se debe a que las coincidencias de patrones para ?opno se pueden superponer, por lo que solo opse elimina una.

Una solución no regex es 5 bytes más larga.

Python , 47 bytes

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

Pruébalo en línea


3
Puede importar re después de hacer referencia a él‽
Adám

44
@ Adám Python no lo evalúa cuando se define la función, solo cuando se llama.
xnor

44
Wow, ha pasado un tiempo desde que vi a alguien usar un interrogatorio. Supongo que es una forma de jugar un poco tu comentario.
Baldrickk

1
@Baldrickk Pero en bytes , el interrobang tiene> = bytes que solo la cadena "?!"
MilkyWay90

5

Perl 5 , 10 + 1 = 11 bytes

s/.\Kop//g

Pruébalo en línea!

Ejecutar con -p(penalización de 1 byte); los lenguajes de golf pueden hacer E / S implícitas automáticamente, pero Perl necesita una opción para ello.

Cuando vi la respuesta de @ xnor , me di cuenta de que podría mejorarse usando una función de expresión regular específica de Perl; s/a\Kb/c/ges equivalente a s/ab/ac/g(en otras palabras, el s///único reemplaza las cosas después del primero \K). Así es como se ve en Perl.



3

Go , 103 92 bytes

Debe ... compilar ... Ir Las funciones incorporadas tienen nombres extraños. :PAG

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

Pruébalo en línea!


3

Haskell93 62 61 bytes)

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

gracias a @nimi sugerencias en los comentarios!


2
Algunos consejos: como está utilizando vy osolo una vez, puede incorporarlo. notElemes más corto que not(...elem...). Puede reemplazar el &&en un guardia con un ,. El último caso para ase puede escribir como a x=x. No hay necesidad de ()entrar x:(a r).
nimi

1
... oh, y la prueba =="op"se puede reemplazar con una coincidencia de patrón literal:a(x:'o':'p':r)|notElem x"aeiouAEIOU"=x:a r
nimi

Actualizado. gracias @nimi
Davide Spataro

1
Un byte más para guardar: puede omitir el espacio entre xy ".
nimi

3

PHP , 36 bytes

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

Pruébalo en línea!


¿Cómo se supone que se debe ejecutar esto?
Titus

Falla en los dos primeros casos de prueba. Use preg_replacepara arreglar.
Titus

Puede guardar 3 bytes cambiando el nombre de la variable a cualquier carácter individual, $ a, por ejemplo
junkfoodjunkie

@junkfoodjunkie $argnes una variable reservada que está disponible cuando PHP se ejecuta con la -ROpción desde la línea de comandos
Jörg Hülsermann

Ah, está bien, no lo sabía. El probador en línea no lo tiene en cuenta. :-)
junkfoodjunkie


1

JavaScript (ES6), 35 bytes

Agregue f=al principio e invoque como f(arg).

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

Me sorprende que nadie haya publicado una solución de JavaScript todavía ...

Fragmento de prueba

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

Pruébalo en línea!

Tenga en cuenta que este fragmento quiere reemplazar opcon un ., pero más adelante hay un reemplazo definido donde opse vuelve a colocar en la cadena. Esa segunda instrucción tendría el opreemplazado por a .(y, por lo tanto, inserte un .en el resultado final), por lo que he usado un \entre oy ppara romper el patrón.



0

Cristal, 39 bytes

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

Cómo funciona

Simplemente busca cada consonante, seguido de la secuencia op. Si es así, sustituya esa secuencia única con la consonante encuentra antes: ([^aeiou]).

Pruébalo en línea




0

sed, 22 bytes

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

Lee desde STDIN hasta EOF y emite una cadena desaplicada
Usa la misma técnica de reducción de longitud de la respuesta Python de @ xnor


0

R , 29 bytes

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

Pruébalo en línea!

Al igual que la mayoría de las otras soluciones aquí, captura el personaje seguido de op, lo reemplaza con el personaje en sí.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.