说尤达(Yoda)的挑战,这是


44

挑战

好吧,我认为这很清楚,不是吗?您必须创建一个函数或程序,该函数或程序将字符串作为参数并输出对应的Yoda语言。

这是,因此最少的字节数获胜。

输入

输入可以是没有换行符的任何字符串。如果字符串是这样组成的,则可以翻译它:

主语 +动词+其他。

其中Subject是人称代词(我,您,他,她,它,我们,他们)。您不必认识到第二个单词是动词。

如果第一个单词不是代词,则输入有效,但输出为 Too difficult, this sentence is.

You have to win this code challenge -> Translatable
Luke has to win this code challenge -> Untranslatable

输入可以以字母a结束。或!,而不是?。

此外,字符串可以包含Non-Ascii,括号,逗号,冒号...

输出

对于可翻译的句子,输出是相同的句子,主语和动词位于句子的末尾。

You have to win this code challenge -> To win this code challenge, you have.

代词中的逗号,句号和小写字母是必填项。(当然,如果代词是I)。

如前所述,如果不可翻译,则必须输出字符串 Too difficult, this sentence is.

例子

You have to win this code challenge -> To win this code challenge, you have.
He won this code challenge -> This code challenge, he won.  (I know this is not yoda-speaking, but I don’t want to overcomplicate this challenge)
I ate an ice cream earlier! -> An ice cream earlier, I ate.
I liked the Star Wars original trilogy more than the prequel’s one. -> The Star Wars original trilogy more than the prequel’s one, I liked.
I find your lack of faith disturbing -> Your lack of faith disturbing, I find.
I think we are done with the examples -> We are done with examples, I think.
He is your son, Vader -> Your son, Vader, he is.
I think they’ll add new features -> They’ll add new features, I think.
I made a fantastic code challenge (I hope) -> A fantastic code challenge (I hope), I made.
I love constants like π -> Constants like π, I love.

I’ll be the next President, I swear! -> Too difficult, this sentence is.
This challenge is great! -> Too difficult, this sentence is.
Is this challenge great? -> Too difficult, this sentence is.
Luke is not ready for this task -> Too difficult, this sentence is.
Somebody loves constants like π -> Too difficult, this sentence is.
[Empty string] -> Too difficult, this sentence is.

9
从非质疑的角度来看,不定式词也应该移动吗?例如,You have to win this code challenge应该为This code challenge, you have to win
Addison Crump

9
“要赢得此代码挑战,您必须拥有。” 听起来真的很奇怪。
nicael

3
输入内容可以包含逗号吗?如果输入以字母,句号或结尾结尾!怎么办?是否保证不会发生这种情况,还是我们应该处理这种情况并打印出与没有主导代词时相同的内容。输入中可以包含换行符吗?使徒?冒号/括号/反引号?非ASCII字符?您说“输入可以是任何字符串”,但是您的测试用例仅涵盖非常特定类型的字符串。
马丁·恩德

4
“必须”是英语特有的奇怪辅助动词结构;Yoda不太可能会使用它。“这个代码挑战,胜利,你必须。” 另一方面,尤达倾向于使用自己的辅助动词结构:“这个代码挑战,赢了,他做到了。” 我无法想象尤达说“这个代码挑战,他赢了”或“要赢得这个代码挑战,您就拥有了”。
LindaJeanne

4
答案不需要更多的“嗯”吗?
史蒂夫·艾夫斯

Answers:


17

视网膜,162 137 145 134 131 129

现在可以正确处理多个标点符号。测试用例:You will not win this challenge...! -> Not win this challenge..., you will.

在线尝试!

[.!]$

T`A-Z`a-z`^\w\w
G`^(I|we|you|s?he|it|they) \S+ \S
(\S+ \S+) (.*)
$2, $1.
T`a-z`A-Z`^.
^$
Too difficult, this sentence is.

描述:

如果最后有标点符号,请将其删除。

[.!]$

^empty line

将代词转换为小写,除了它是I。

T`A-Z`a-z`^\w\w

过滤掉任何不匹配的行 <Pronoun><space><word><space><word>...

G`^(I|we|you|s?he|it|they) \S+ \S

拆分为pronoun + verbremainder。然后重新排列。

(\S+ \S+) (.*)
$2, $1.

将第一个字符转换为大写。

T`a-z`A-Z`^.

如果结果为空,则未通过上面的过滤器。打印错误信息。

^$
Too difficult, this sentence is.

音译模式下的字符类不使用方括号。
马丁·恩德

1
另外,[^ ]可能在\S任何地方都可以替换,并且在第一个正则表达式[^ ]+中可以替换为.+。在字符类中,您不需要转义,.因此[.!]效果很好。此外,由于你没有交换顺序$1,并$2在第三阶段,你可以捕捉它们放到同一个组,并保存5个字节。
马丁·恩德

([^I]|It)可以缩短为^\w\w
Martin Ender'1

哇,好多改进。谢谢。
Rainer P.

我认为,如果Retina支持,它将I|It成为I?可能
Conor O'Brien

7

ES6,212

这可能会进一步降低:

i=>(r=/(you|s?he|it?|we|they)( \S+) ([^\.!?]+)/i.exec(i))?(c=(a,b)=>a[`to${['Low','Upp'][b]}erCase`]())(r[3].slice(0,1),1)+r[3].slice(1)+", "+c(r[1],+(/i/i.test(r[1])))+r[2]+".":"Too difficult, this sentence is."

JSFiddle(需要使用最新的浏览器,例如Chrome)或通过node.js运行它

取消高尔夫:

i=>{
    r=/(you|s?he|it?|we|they)( \S+) ([^\.!?]+)/i.exec(i); //Main RegExp
    c=(a,b)=>a[`to${['Low','Upp'][b]}erCase`](); //shortcut for toUpperCase/toLowerCase
    if (r)
        return c(r[3].slice(0,1),1)+r[3].slice(1) + ", " //the "something else", properly formated
             + c(r[1], +(/i/i.test(r[1]))) //The subject lowercased except for "i" or "I"
             + r[2] + "."; //The End
    else //no match, no sentence to translate
        return "Too difficult, this sentence is.";
}

测试失败:I think they’ll add new features-> They, I think.在Google Chrome 47.0.2526.106 m上返回。另外,它也不喜欢I love constants like π。此外,I made a fantastic code challenge (I hope)返回A fantastic code challenge , I made.而不是A fantastic code challenge (I hope), I made.
Ismael Miguel

@IsmaelMiguel已修复,但由于另一个错误我

它解决了所有问题,所有测试似乎都很好。做得好!你得到我的支持。
Ismael Miguel

3
您需要^在正则表达式的开头添加其他内容,否则代词前带有任何文本的句子仍将被解析为有效。
user81655 2016年

6

JavaScript(ES6),164个字节

s=>([,p,,i,r]=s.match`^(((I)|You|He|She|It|We|They) \\S+) (.*?)[.!]?$`)?r[0].toUpperCase()+r.slice(1)+`, ${i?p:p.toLowerCase()}.`:"Too difficult, this sentence is."

说明

在JavaScript中将一个字符串的首字母大写需要多少个字节几乎是痛苦的...

s=>

  // Match and get specific parts of the input string
  ([,p,,i,r]=s.match`^(((I)|You|He|She|It|We|They) \\S+) (.*?)[.!]?$`)?

    r[0].toUpperCase()+r.slice(1)     // capitalise first letter
      +`, ${i?p:p.toLowerCase()}.`    // lower-case the pronoun (unless it is I)
  :"Too difficult, this sentence is."

测试

测试不使用结构化分配来使其与跨浏览器更兼容。


162个字符:var解决方案= s =>(p = s.match ^(((It?)|You|[HW]e|[ST]hey) \\S+) (.*?)[.!]?$)?p [4] [0] .toUpperCase()+ p [4] .slice(1)+ , ${p[3]?p[1]:p[1].toLowerCase()}.:“这句话太难了。”
沃利

@wally谢谢,但是很遗憾,正则表达式会使首It字母大写,并且也会匹配Shey而不是She
user81655

啊,我的测试还不够!是的,我明白了为什么……嗯。
沃利

3

Python,261个字节

import re
def a(b):
 if b[-1:]in".!":
  b=b[:-1]
 if re.match('(I|YOU|S?HE|IT|WE|THEY) \w+ \S+',b.upper()):
  b=(b+',').split()
  if b[0]!="I":
   b[0]=b[0].lower()
  b=" ".join(b[2:]+b[:2])
  return b[0].upper()+b[1:]
 return "Too difficult, this sentence is."

事实证明,Python不会介意像b[-1]in".!"Next这样的事情,如果没人能击败我,我会更多地使用match对象:)


我认为您可以在b=b[:-1]零件中删除空间。
科纳·奥布莱恩

@CᴏɴᴏʀO'Bʀɪᴇɴ谢谢!
罗伯特·格兰特

3
您可以将放在b=b[:-1]行尾if。您可以在最后一行返回后删除空格。通过用制表符替换2个空格和用制表符和空格替换3个空格将破坏python3的兼容性
Undergroundmonorail

2

Python,第218个 217 204字节

不确定是否可以进一步打下去。

def f(s):t=s.split();u=' '.join(t[2:]).rstrip('!.');return['Too difficult, this sentence is.','%s, %s %s.'%(u[0].upper()+u[1:],['I',t[0].lower()][t[0]!='I'],t[1])][t[0]in'I We You He She It They'.split()]

取消高尔夫:

def f(s):
    t = s.split()
    u = ' '.join(t[2:]).rstrip('!.')
    return [
        'Too difficult, this sentence is.',
        '%s, %s %s.' % (u[0].upper() + u[1:],
                        ['I', t[0].lower()][t[0] != 'I'],
                        t[1])
    ][t[0] in 'I We You He She It They'.split()]

你可以改变s.split(' ')s.split()'I|We|You|He|She|It|They'.split('|')'I We You He She It They'.split(),更换if...else与其他地方使用相同的布尔列表,更改t[0]int[0]in,除去周围的回报spawce

1

GNU sed,129个字节

我要为该-r标志添加+1字节。

#!/bin/sed -rf

/^I /b
s/^(You|[HW]e|She|It|They) /\L&/
t
s/.*/Too difficult, this sentence is./p
d
:
s/[.!]$//
s/^([^ ]+ [^ ]+) (.*)/\u\2, \1./

说明

如果我们匹配领先者,I我们将跳转到标签:

/^I /b

如果我们匹配其他代词之一,则将其缩小写,然后跳转至标签:

s/^(You|[HW]e|She|It|They) /\L&/
t

否则,我们将打印失败消息并移至下一个输入行:

s/.*/Too difficult, this sentence is./p
d

如果跳到标签,我们将删除所有最后的标点符号:

:
s/[.!]$//

然后将前两个词与句子的其余部分交换,将新的第一个词大写并添加所需的标点符号:

s/^([^ ]+ [^ ]+) (.*)/\u\2, \1./

您的程序不会检查输入是否至少包含三个单词。像这样的句子You are通过第一行和第二行,但在最后一行不匹配,因此输出you are代替错误消息。...|They) \S+ \S/\L&/在前两行中添加类似的支票。
Rainer P.

@Rainer-您是对的(我责怪缺乏简短输入的测试用例)。我将尽快研究如何进行返工。
Toby Speight
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.