To jest wyzwanie mówiące w języku Yoda

44

Wyzwanie

Cóż, myślę, że to całkiem jasne, prawda? Musisz stworzyć funkcję lub program, który pobiera ciąg znaków jako argument i wyprowadza odpowiedni język Yoda.

To jest , więc wygrywa najmniejsza liczba bajtów.

Dane wejściowe

Dane wejściowe mogą być dowolnymi ciągami bez linii. Możesz przetłumaczyć ciąg znaków, jeśli składa się on z tego:

Temat + Czasownik + Coś jeszcze.

Gdzie Dotyczy to zaimek osobowy (ja, ty, on, ona, ono, my, oni). Nie musisz rozpoznawać, że drugie słowo jest czasownikiem.

Jeśli pierwsze słowo nie jest zaimkiem, dane wejściowe są prawidłowe, ale dane wyjściowe będą Too difficult, this sentence is.

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

Dane wejściowe mogą kończyć się literą, a. lub a !, nie z?

Ponadto ciągi mogą zawierać znaki non-Ascii, nawiasy, przecinki, dwukropki ...

Wyjście

W przypadku zdania możliwego do przetłumaczenia, wynikiem jest to samo zdanie, z podmiotem i czasownikiem na końcu zdania.

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

Przecinek, kropka i małe litery w zaimku są obowiązkowe. (Z wyjątkiem oczywiście, jeśli zaimkiem jest I).

Jak wspomniano wcześniej, jeśli nie można go przetłumaczyć, należy wyprowadzić ciąg Too difficult, this sentence is.

Przykłady

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.
Simone Chelo
źródło
9
Z niekwestionowanego punktu widzenia nie należy również przenosić bezokoliczników? Na przykład You have to win this code challengepowinno być This code challenge, you have to win.
Addison Crump
9
„Aby wygrać to wyzwanie kodu, musisz.” brzmi naprawdę dziwnie.
nicael
3
Czy dane wejściowe mogą zawierać przecinki? Co jeśli dane wejściowe nie kończą się literą, kropką lub !? Czy to na pewno nie nastąpi, czy też powinniśmy sobie z tym poradzić i wydrukować to samo, co wtedy, gdy nie ma zaimka wiodącego. Czy dane wejściowe mogą zawierać sygnały liniowe? Apostrofy? Dwukropki / nawiasy / wsteczne? Znaki spoza ASCII? Mówisz, że „wejściem może być dowolny ciąg”, ale twoje przypadki testowe obejmują tylko bardzo specyficzne typy ciągów.
Martin Ender
4
„must to” jest dziwną konstrukcją czasownika pomocniczego charakterystyczną dla języka angielskiego; jest mało prawdopodobne, że Yoda go użyje. „To wyzwanie kodu, wygraj, musisz”. Z drugiej strony, Yoda ma własne konstrukcje czasowników pomocniczych, których zwykle używa: „To wyzwanie kodu, wygrał, zrobił”. Nie mogę sobie wyobrazić Yody mówiącego: „To wyzwanie kodu, on wygrał” lub „Aby wygrać to wyzwanie kodu, masz”.
LindaJeanne
4
Czy odpowiedzi nie wymagają więcej „Mmmmm”?
Steve Ives

Odpowiedzi:

17

Retina, 162 137 145 134 131 129

Wiele interpunkcji jest teraz obsługiwanych poprawnie. Przypadek testowy:You will not win this challenge...! -> Not win this challenge..., you will.

Wypróbuj online!

[.!]$

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.

Opis:

Jeśli na końcu jest interpunkcja, usuń ją.

[.!]$

^empty line

Przekształć zaimek na małe litery, z wyjątkiem tego, że to I.

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

Odfiltruj wszystkie niepasujące wiersze <Pronoun><space><word><space><word>...

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

Podzielony pronoun + verb, remainder. Następnie zmień kolejność.

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

Przekształć pierwszy znak na wielkie litery.

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

Jeśli wynik jest pusty, nie przepuścił powyższego filtra. Wydrukuj komunikat o błędzie.

^$
Too difficult, this sentence is.
Rainer P.
źródło
Klasy znaków w trybie transliteracji nie używają nawiasów kwadratowych.
Martin Ender
1
Ponadto, [^ ]można prawdopodobnie zastąpiony \Swszędzie, aw pierwszym regex [^ ]+można zastąpić .+. W klasach postaci nie musisz uciekać, .więc [.!]działa dobrze. Ponadto, ponieważ nie zamienić kolejność of $1a $2w trzecim etapie, można uchwycić je w jedną grupę i zapisać 5 bajtów.
Martin Ender
([^I]|It)można skrócić do^\w\w
Martin Ender
Wow, co za mnóstwo ulepszeń. Dzięki.
Rainer P.
Myślę, że I|Itmoże się stać I?, jeśli Retina to popiera
Conor O'Brien
7

ES6, 212

Prawdopodobnie można to nieco pograć w golfa:

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 (wymaga aktualnej przeglądarki, takiej jak Chrome) lub uruchom ją za pośrednictwem node.js

Nie golfowany:

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
źródło
Zepsuty test: I think they’ll add new features-> zwraca They, I think.na Google Chrome 47.0.2526.106 m. Poza tym to nie lubi I love constants like π. Aby dodać to, I made a fantastic code challenge (I hope)zwraca A fantastic code challenge , I made.zamiastA fantastic code challenge (I hope), I made.
Ismael Miguel
@ IsmaelMiguel Naprawiono, ale nawet dostałem 3 znaki mniej z powodu innego błędu, który również naprawiłem
Helco
Rozwiązało wszystkie problemy, wszystkie testy wydają się w porządku. Dobra robota! Masz moje poparcie.
Ismael Miguel
3
Musisz dodać ^na początku wyrażenia regularnego, w przeciwnym razie zdanie z dowolnym tekstem przed zaimkiem będzie nadal analizowane jako poprawne.
user81655
6

JavaScript (ES6), 164 bajty

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."

Wyjaśnienie

Niemal bolesne jest, ile bajtów wielką literą pierwszej litery ciągu zajmuje 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

Test nie używa przypisania destrukcyjnego, aby uczynić go bardziej kompatybilnym z różnymi przeglądarkami.

użytkownik 81655
źródło
162 znaki: 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()}.: "To trudne, zdanie to jest."
wally
@wally Dzięki, ale niestety regex sprawiłby, że Itpozostała wielka, a także pasowała Sheyzamiast She.
user81655
Ach, moje testy były niewystarczające! Tak, rozumiem, dlaczego ... No cóż.
wally
3

Python, 261 bajtów

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."

Okazuje się, że Python nie ma nic przeciwko takim rzeczom, jak b[-1]in".!"dalej Będę grać z obiektem dopasowania, jeśli nikt mnie nie pobije :)

Robert Grant
źródło
Myślę, że możesz usunąć spację w b=b[:-1]części.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ dzięki!
Robert Grant,
3
możesz umieścić b=b[:-1]na końcu linii za pomocą if. możesz usunąć spację po powrocie do ostatniego wiersza. to zepsuje kompatybilność z Python3, zastępując 2 spacje tabulacją i 3 spacją tabulatorem i spacją
undergroundmonorail
2

Python, 218 217 204 bajtów

Nie jestem pewien, czy można to jeszcze pograć w golfa.

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()]

Nie golfowany:

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
źródło
możesz zmienić s.split(' ')na s.split()i 'I|We|You|He|She|It|They'.split('|')na 'I We You He She It They'.split(), zastąpić tą if...elsesamą listą logiczną, która była używana gdzie indziej, zmienić t[0]inna t[0]in, usunąć spawnie wokół powrotu
Blue
1

GNU sed, 129 bajtów

Podaję +1 bajt dla -rflagi.

#!/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./

Wyjaśnienie

Jeśli dopasujemy wiodącą I, przejdziemy do etykiety:

/^I /b

Jeśli dopasujemy jeden z pozostałych zaimków, zmniejszamy go, a następnie przeskakujemy do etykiety:

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

W przeciwnym razie drukujemy komunikat o błędzie i przechodzimy do następnego wiersza wprowadzania:

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

Jeśli przeskoczyliśmy do etykiety, usuwamy ostatnią interpunkcję:

:
s/[.!]$//

i zamień pierwsze dwa słowa na resztę zdania, dodając wielkie pierwsze słowo i dodając wymaganą interpunkcję:

s/^([^ ]+ [^ ]+) (.*)/\u\2, \1./
Toby Speight
źródło
Twój program nie sprawdza, czy dane wejściowe składają się z co najmniej trzech słów. Zdania takie jak You areprzekazać pierwszy i drugi wiersz, ale nie pasują do ostatniego, więc wynik jest you arezamiast komunikatu o błędzie. Dodaj czek jak ...|They) \S+ \S/\L&/w pierwszych dwóch wierszach.
Rainer P.
@Rainer - Masz rację (obwiniam brak przypadków testowych dla krótkich danych wejściowych). Zobaczę, jak to przerobić wkrótce.
Toby Speight