Copodope Gopolopfop


15

语言:Oppification

通过对每个单词应用以下过程来创建一种有趣的语言:

  1. 放在op每个辅音之后。如此Code成为Copodope

对,就是那样。为了这个挑战的目的,y总是辅音。

挑战:去势化

给定一个单词,返回原始单词。输入内容仅包含字母。首字母可以大写。原始单词永远不会为空,并且始终包含元音。

测试用例:

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
您的所有测试用例均不包含元音,后跟op,因此按照的答案replace(/(.)op/, '\1')不会使任何一个失败。我建议你添加像一个字hooplooped到测试用例。
Doorknob

@ mbomb007我添加了一些更棘手的测试用例。
xnor

答案仅适用于预先确定的输入还是所有输入?
CalculatorFeline

@CalculatorFeline“给出一个被反对的词”
mbomb007

2
我们可以添加“ mopmopmopbopopop”作为测试用例吗?:)
user2390246

Answers:



12

视网膜,9字节

(?!\G)op

在线尝试!

无需检查前面的字符是否是辅音,我们只需确保当前op字符与字符串的开头或上一个匹配项不相邻即可。我们唯一可以匹配不正确的情况op是原始字符串是否包含op(导致opop)。但是在那种情况下,我们将只删除第一个op而不是第二个,结果将是相同的。


对于这样的输入,这不会给出错误的答案loop吗?
狮子座

4
@Leo loop不是有效的输入,因为您不能通过选择另一个单词来获取它。
Martin Ender

@MartinEnder但是lopoop(的优化版本loop)是有效的,并且不会被删除loop
伊姆斯(Umus)

@Imus不,的优化版本looplopoopop
Martin Ender

发布它后不久也意识到我的错误:)删除速度太慢。好点子。
伊姆斯(Umus),

10

Python,42字节

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

在线尝试!

如果我没有记错的话,你可以替换所有?op?,而无需关心元音。如果原始字符串包含op,则它被选择为opop,并且替换字符串将其返回给op并且不再返回。这是因为匹配的模式?op不能重叠,因此仅op删除了一个。

非正则表达式解决方案要长5个字节。

Python,47个字节

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

在线尝试


3
引用re 即可导入‽
Adám2015年

4
@AdámPython不会在定义函数时对其进行评估,只有在调用该函数时才对其进行评估。
xnor

4
哇,已经有一段时间了,因为我看到有人在使用interrobang。我想这是一种表达您的意见的方法。
Baldrickk

1
@Baldrickk但是,以字节为单位,interrobang的字符串不只是字符串“?!”而具有> =字节。
MilkyWay90

5

Perl 5,10 +1 = 11字节

s/.\Kop//g

在线尝试!

运行-p(1个字节的罚款);高尔夫语言可能会自动执行隐式I / O,但Perl需要一个选项。

当我看到@xnor的答案时,我意识到可以使用Perl特有的正则表达式功能来改进它。s/a\Kb/c/g等价于s/ab/ac/g(换句话说,s///仅替换第一个之后的东西\K)。这就是Perl的外观。



3

Go103 92字节

必须...编译...内置函数的名称很奇怪。:P

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

在线尝试!


3

哈斯克尔(93 62 61字节)

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

感谢@nimi在评论中的建议!


2
一些提示:如您使用的是vo只有一次,您现在可以了。notElem比短not(...elem...)。您可以将&&护罩中的替换为,。的最后一种情况a可以写成a x=x。不需要()in x:(a r)
nimi 2015年

1
...哦,=="op"可以用文字模式匹配项代替测试:a(x:'o':'p':r)|notElem x"aeiouAEIOU"=x:a r
nimi 2015年

更新。感谢@nimi
Davide Spataro

1
还有一个字节保存:您可以省略之间的空间x"
nimi 2015年

3

PHP,36字节

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

在线尝试!


应该如何运行?
泰特斯(Titus),

对于前两个测试用例,它失败。使用preg_replace来修复。
泰特斯(Titus)

您可以通过将变量重命名为任何单个字符(例如$ a)来节省3个字节
junkfoodjunkie

@junkfoodjunkie $argn是一个保留变量这是当PHP与运行availbale -R从命令行选项
约克Hülsermann

啊,好的,不知道。在线测试仪不负责。:-)
junkfoodjunkie


1

JavaScript(ES6),35个字节

f=在开始处添加并调用f(arg)

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

令我惊讶的是,还没有人发布JavaScript解决方案。

测试片段

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字节

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

在线尝试!

请注意,此片段想要替换op.,但后来有定义,其中一个替代op正在被放回字符串。第二条指令将被op替换为a .(并.在最终结果中插入a ),因此我\o和之间使用了a p来中断模式。



0

水晶,39字节

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

怎么运行的

它仅搜索每个辅音,然后搜索序列op。如果是这样,请仅使用在以下位置找到的辅音来替换该序列:([^aeiou])

在线尝试



0

Ruby34 27 22 +1 = 23字节

-4个字节,感谢RJHunter。

+1字节的-p标志。

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

在线尝试!


使用Ruby的-p选项将花费一个字节,但允许您的脚本直接以开头gsub
RJHunter


0

R,29个字节

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

在线尝试!

就像这里的大多数其他解决方案一样,先捕获字符,然后捕获op,然后将其替换为字符本身。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.