Йода-говорящий вызов, это

44

Соревнование

Ну, я думаю, это совершенно ясно, не так ли? Вы должны создать функцию или программу, которая принимает строку в качестве аргумента и выводит соответствующий Yoda-говорящий.

Это , поэтому выигрывает наименьшее количество байтов.

Вход

Ввод может быть любой строкой без перевода строки. Вы можете перевести строку, если она составлена ​​так:

Тема + Глагол + Что-то еще.

Где Субъект - это личное местоимение (я, ты, он, она, оно, мы, они). Вам не нужно признавать, что второе слово - это глагол.

Если первое слово не местоимение, ввод действителен, но вывод будет Too difficult, this sentence is.

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

Ввод может заканчиваться буквой, а. или, а не с?

Кроме того, строки могут содержать не-Ascii, скобки, запятые, двоеточия ...

Выход

В случае переводимого предложения выводится то же самое предложение с темой и глаголом в конце предложения.

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

Запятая, точка и строчные на местоимении являются обязательными. (За исключением, конечно, если местоимение это я).

Как указано выше, если это непереводимо, вы должны вывести строку 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.
Эддисон Крамп
9
«Чтобы выиграть этот вызов кода, у вас есть.» звучит действительно странно.
Никель
3
Может ли ввод содержать запятые? Что если ввод не заканчивается буквой, точкой или !? Это гарантированно не произойдет, или мы должны справиться с этим и напечатать то же самое, что и когда нет ведущего местоимения. Может ли ввод содержать перевод строки? Апострофы? Колоны / круглые скобки / обратные кавычки? Не-ASCII символы? Вы говорите, что «входом может быть любая строка», но ваши тестовые случаи охватывают только очень специфические типы строк.
Мартин Эндер
4
«должен» - это странная конструкция глагола-помощника, свойственная английскому языку; маловероятно, что Йода использовал бы это. «Этот код вызов, победа, вы должны.» С другой стороны, у Йоды есть свои собственные конструкции глаголов-помощников, которые он склонен использовать: «Этот вызов кода выиграл, он сделал». Я не могу представить, чтобы Йода сказал: «Это испытание кода, он выиграл» или «Чтобы выиграть это испытание кода, у вас есть».
ЛиндаДжинн
4
Разве ответы не нуждаются в большем количестве мммм?
Стив Айвз

Ответы:

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

Преобразуйте местоимение в нижний регистр, за исключением того, что это я.

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

Отфильтруйте любую строку, которая не соответствует <Pronoun><space><word><space><word>...

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

Разбить pronoun + verb, remainder. Тогда переставь.

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

Преобразуйте первый символ в верхний регистр.

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

Если результат пустой, он не прошел фильтр выше. Распечатать сообщение об ошибке.

^$
Too difficult, this sentence is.
Райнер П.
источник
Классы символов в режиме транслитерации не используют квадратные скобки.
Мартин Эндер
1
Кроме того, [^ ]возможно , может быть заменен \Sвезде, и в первом регулярное выражение [^ ]+может быть заменено на .+. В классах персонажей вам не нужно убегать, .поэтому [.!]отлично работает. Кроме того, поскольку вы не меняете порядок $1и $2на третьем этапе, вы можете объединить их в одну группу и сохранить 5 байтов.
Мартин Эндер
([^I]|It)можно сократить до^\w\w
Мартин Эндер
Вау, какой груз улучшений. Спасибо.
Райнер П.
Я думаю, что I|Itможет стать I?, если Retina поддерживает это
Конор О'Брайен
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

Ungolfed:

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.";
}
HELCO
источник
Сломанный тест: 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.
Исмаэль Мигель
@IsmaelMiguel Исправлено, но даже получило на 3 символа меньше из-за другой ошибки, которую я также исправил
Helco
Это решило все проблемы, все тесты кажутся в порядке. Отлично сработано! Вы получили мое возражение.
Исмаэль Мигель
3
Вам нужно добавить ^в начало вашего регулярного выражения, в противном случае предложение с любым текстом до того, как местоимение все равно будет проанализировано как действительное.
user81655
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."

Тест

Test не использует назначение деструктуризации, чтобы сделать его более совместимым с браузерами.

user81655
источник
162 символа: var solution = 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. Вы можете удалить пробел после возврата на последней строке. это нарушит совместимость с python3, заменив 2 пробела табуляцией и 3 пробела табуляцией и пробелом
подземный
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()]

Ungolfed:

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()]
Zenadix
источник
Вы можете изменить s.split(' ')на s.split()и 'I|We|You|He|She|It|They'.split('|')на 'I We You He She It They'.split(), заменить на if...elseтот же логический список, который использовался в другом месте, изменить t[0]inна t[0]in, удалить spawce вокруг возврата
Blue
1

GNU sed, 129 байт

Я включаю +1 байт для -rфлага.

#!/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 - Вы правы (я виню в отсутствии тестов для коротких входов). Я посмотрю, как переделать это в ближайшее время.
Тоби Спейт