Це виклик, який говорить Yoda, це


44

Змагання

Ну, я думаю, це цілком зрозуміло, чи не так? Ви повинні створити функцію або програму, яка приймає рядок як аргумент і виводить довірливих йодомовних.

Це , тому виграє найменше кількість байтів.

Вхід

Вхід може бути будь-яким рядком без передачі рядків. Ви можете перекласти рядок, якщо він складається так:

Тема + Дієслово + Ще щось.

Де Тема є особистим займенником (я, ти, він, вона, воно, ми, вони). Вам не потрібно визнавати, що друге слово є дієсловом.

Якщо перше слово не є займенником, введення дійсне, але вихід буде Too difficult, this sentence is.

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

Введення може закінчуватися буквою, а. чи з !, а не з ?.

Крім того, рядки можуть містити Non-Ascii, Parenthesis, коми, колонки ...

Вихід

У разі перекладного речення вихідним є те саме речення, з темою та дієсловом в кінці речення.

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
"Щоб виграти цю проблему з кодом, у вас є." звучить насправді дивно.
nicael

3
Чи може вхід містити коми? Що робити, якщо введення не закінчується буквою, крапкою чи !? Чи гарантовано це не відбудеться чи ми маємо це поводитись і друкувати те саме, що і тоді, коли немає провідного займенника. Чи може вхід містити стрічкові канали? Апострофи? Кольори / круглі дужки / зворотні посилання? Не символи ASCII? Ви кажете, що "вхід може бути будь-яким рядком", але ваші тестові випадки охоплюють лише дуже конкретні типи рядків.
Мартін Ендер

4
'must to' - дивна побудова допоміжно-дієслова, властива англійській мові; навряд чи Йода використає це. "Цей виклик коду, виграйте, ви повинні." З іншого боку, у Йоди є власні допоміжно-дієслівні конструкції, які він схильний використовувати: "Цей кодовий виклик, виграв, він зробив". Я не можу уявити, як Йода сказав: "Цей виклик з кодом, він виграв" або "Ви маєте виграти цю проблему з кодом".
LindaJeanne

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?, якщо Ретіна підтримає це
Конор О'Брайен

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 м. Також це не подобається 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
Вам потрібно додати ^до початку свого регулярного виразу, інакше речення з будь-яким текстом перед займенником все ще буде розбиратися як дійсне.
користувач81655

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

@wally Дякую, але, на жаль, цей регекс зробив би великим Itкапіталом, а також збіг Sheyзамість She.
користувач81655

Ах, моє тестування було недостатньо! Так, я бачу, чому ... Ну добре.
wally

3

Пітон, 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", я більше пограю з об'єктом відповідності, якщо мене ніхто не б'є :)


Я думаю, ви можете прибрати простір у b=b[:-1]частині.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ дякую!
Роберт Грант

3
ви можете поставити b=b[:-1]в кінці рядка за допомогою if. ви можете видалити пробіл після повернення в останньому рядку. це порушить сумісність python3, замінивши 2 пробіли на вкладку та 3 на вкладку та пробіл
undergroundmonorail

2

Пітон, 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]inв t[0]in, видалити spawce навколо повернення
Сині

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 - Ти маєш рацію (я звинувачую відсутність тестових випадків для коротких вводів). Подивлюся, як це переробити найближчим часом.
Toby Speight
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.