你叔叔帮助醉汉


10

醉酒叔叔(对不起,我和AUS锁定区域锁定)是《周六夜现场》的虚构人物。他经常为听起来像他们的其他人混淆单词。对于此挑战,您需要将普通语音转换为醉酒语音。

算法

转换为醉汉言语需要交换文本中的单词顺序。交换基于两个单词的醉酒相似性。酒醉相似度定义为两个单词在同一索引处出现的字母数。但是,两个相同的单词的醉酒相似度为-1。例如,treefriend具有2醉酒的相似性,因为它们都具有“R”在索引1,和一个“e”在索引3。

您所要做的就是在文本中找到醉酒相似度最高的两个单词,然后交换它们。交换两个条款后,它们将不再移动。然后,查看其余的可交换条款,并交换醉酒相似度最高的两个。您将继续执行此操作,直到无法再交换任何内容为止。然后输出(或返回一个函数)更新后的文本。

细节

  • 为简单起见,输入是由[A-Za-z]中的字符组成的单词列表
  • 每个输入至少包含一个字
  • 字母匹配不区分大小写:A与匹配a注意:由于此规则Dogdog相同,因此DS值为-1)
  • 如果多对醉酒相似度最高:
    1. 在可以最大程度提高醉酒相似性的单词中,选择列表中索引最低的单词
    2. 将单词与索引最低的单词配对,以最大程度地提高醉酒相似度

例子

  1. Drunk Uncle needs your help (标题)

    • S 1:醉<=>您的(DS:1)your Uncle needs Drunk help
    • S 2:需要<=>帮助(DS:1)your Uncle help Drunk needs
    • 输出: your Uncle help Drunk needs
  2. I love fidget spinners (无聊的例子)

    • S 1:我<=>爱(DS:0)love I fidget spinners
    • S 2:烦恼<=>微调(DS:0)love I spinners fidget
  3. dog eat dog ear

    • S 1:吃耳朵(DS:2)dog ear dog eat
    • S 2:dog <=> dog(DS:-1)dog ear dog eat(此步骤只是形式)
  4. Let me tell you a story

    • S 1:让<=> me(DS:1)me Let tell you a story
    • S 2:告诉<=>您(DS:0)me Let you tell a story
    • S 3:故事(DS:0)me Let you tell story a
  5. Too many money and purple people

    • S 1:紫色<=>人(DS:4)Too many money and people purple
    • S 2:很多钱(DS:2)Too money many and people purple
    • S 3:太<=>和(DS:0)and money many Too people purple

让我知道您是否想讲更多示例。


8
请将“我爱
飞旋陀飞轮

1
“自然语言”
HyperNeutrino

Answers:


3

JavaScript- 286279字节

f=(a,n=(a=a.split` `).length)=>{for(d=n>>1;w=-2,d--;){for(i=n;i--;)for(j=n;j--;)s=((a,f,v=0)=>{for(u=s=a!=f;(r=a[v])&&(t=f[v++]);s+=(p=a=>a.toLowerCase())(r)==p(t));return u*s-1})(a[i],a[j]),!(f[i]|f[j])&&s>=w&&(w=s,x=i,y=j);f[x]=f[y]=1,[a[x],a[y]]=[a[y],a[x]];}return a.join` `}

您可以在JSFiddle尝试


再次欢迎您来到PPCG :)不错的初稿!
HyperNeutrino

2

Python 3中,285 277 270 267字节,而不是工作

i=input().split();r=range;l=len;t=y=z=-1;n=str.lower
for p in r(l(i)):
 for q in r(p):
  b=min(l(i[p]),l(i[q]));x=0
  for s in r(b):
   if n(i[p][s])==n(i[q][s]):
    x=x+1
  if n(i[p])==n(i[q]):
   x=-1
  if x>t:
   t=x;y=p;z=q
i[y],i[z]=i[z],i[y]
print(" ".join(i))

我试图使输出匹配挑战而不是测试用例,因为其中有两个测试用例与挑战相矛盾。

编辑:打高尔夫球的“下”事。

编辑:将split(“”)更改为split()

编辑:我意识到这实际上并不能解决所有问题,尽管我可能会给出一个完整的工作答案,但与此同时,我还可以补充一点,这只能完成一次迭代。


1
您需要定义一个g = str.lowerg = lambda s: s.lower()可以使用的形式,如下所示
ბიმო

@Bruce Forte谢谢!这摆脱了8个字节。(尽管它只下降到270,因为我还必须修复一个东西使它即使在最高相似度为0的情况下也可以交换字;这增加了一个字节)。
无害的

1
没问题,欢迎使用PPCG!如果您还没有看过,这些帖子会很有帮助。Btw .split(' ')可以替换为.split()
ბიმო

等等,您更改了哪些测试用例,它们出了什么问题?
geokavel

我没有足够的代表来更改职位,但明显的矛盾是第一个例子-“醉酒的叔叔需要醉酒帮助”的答案是“您的叔叔需要醉酒帮助”而不是“您的叔叔需要醉酒帮助”。这两个答案都交换了具有相同相似度分数的单词,并且它们都通过使用配对中的第一个来决定交换哪个单词,从而遵循了给定的平局,从某种意义上来说,它们都是从第一个单词开始的。(我现在在写这篇文章时意识到矛盾并不是真正的矛盾,而是更多的模棱两可)。决定用尽字符的方法见下一个
无害
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.