Dies ist eine Yoda-sprechende Herausforderung


44

Die Herausforderung

Nun, ich denke es ist ziemlich klar, nicht wahr? Sie müssen eine Funktion oder ein Programm erstellen, das einen String als Argument verwendet und das entsprechende Yoda-Sprechen ausgibt.

Das ist , also gewinnt die geringste Anzahl von Bytes.

Die Eingabe

Die Eingabe kann eine beliebige Zeichenfolge ohne Zeilenvorschub sein. Sie können einen String folgendermaßen übersetzen:

Betreff + Verb + Etwas anderes.

Wo Subjekt ein Personalpronomen ist (ich, du, er, sie, es, wir, sie). Sie müssen nicht erkennen, dass das zweite Wort ein Verb ist.

Wenn das erste Wort kein Pronomen ist, ist die Eingabe gültig, die Ausgabe jedoch Too difficult, this sentence is.

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

Die Eingabe kann mit einem Buchstaben enden. oder a!, nicht mit a?

Darüber hinaus können Zeichenfolgen Nicht-ASCII-Zeichen, Klammern, Kommas, Doppelpunkte usw. enthalten.

Die Ausgabe

Im Falle eines übersetzbaren Satzes ist die Ausgabe derselbe Satz mit dem Betreff und dem Verb am Ende des Satzes.

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

Komma, Punkt und Kleinschreibung auf dem Pronomen sind obligatorisch. (Außer natürlich, wenn das Pronomen I ist).

Wie bereits erwähnt, müssen Sie den String ausgeben, wenn er nicht übersetzbar ist Too difficult, this sentence is.

Beispiele

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
Sollten Infinitive nicht auch aus der Sicht der Fraglosigkeit bewegt werden? Zum Beispiel You have to win this code challengesollte das sein This code challenge, you have to win.
Addison Crump

9
"Um diese Code-Herausforderung zu gewinnen, müssen Sie." klingt wirklich komisch.
Nicoleel

3
Kann die Eingabe Kommas enthalten? Was ist, wenn die Eingabe nicht mit einem Buchstaben, Punkt oder endet !? Kommt das garantiert nicht vor oder sollten wir damit umgehen und das Gleiche drucken, als gäbe es kein Leitpronomen. Kann die Eingabe Zeilenumbrüche enthalten? Apostrophe? Doppelpunkte / Klammern / Backticks? Nicht-ASCII-Zeichen? Sie sagen, die Eingabe könnte eine beliebige Zeichenfolge sein, aber Ihre Testfälle decken nur sehr bestimmte Arten von Zeichenfolgen ab.
Martin Ender

4
'muss' ist eine seltsame Hilfsverbkonstruktion, die dem Englischen eigen ist; es ist unwahrscheinlich, dass Yoda es benutzen würde. "Gewinnen Sie diese Code-Herausforderung, Sie müssen." Auf der anderen Seite hat Yoda seine eigenen Hilfsverbkonstruktionen, die er gerne benutzt: "Diese Code-Herausforderung hat er gewonnen." Ich kann mir nicht vorstellen, wie Yoda sagt: "Diese Code-Herausforderung hat er gewonnen" oder "Um diese Code-Herausforderung zu gewinnen, haben Sie".
LindaJeanne

4
Benötigen die Antworten nicht mehr "Mmmmm"?
Steve Ives

Antworten:


17

Retina, 162 137 145 134 131 129

Mehrfachinterpunktion wird jetzt korrekt behandelt. Testfall:You will not win this challenge...! -> Not win this challenge..., you will.

Probieren Sie es 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.

Beschreibung:

Wenn es am Ende eine Interpunktion gibt, löschen Sie sie.

[.!]$

^empty line

Transformiere das Pronomen in Kleinbuchstaben, außer es ist I.

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

Filtern Sie alle Zeilen heraus, die nicht übereinstimmen <Pronoun><space><word><space><word>...

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

Geteilt in pronoun + verb, remainder. Dann neu anordnen.

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

Wandle das erste Zeichen in Großbuchstaben um.

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

Wenn das Ergebnis leer ist, hat es den Filter oben nicht bestanden. Drucken Sie eine Fehlermeldung.

^$
Too difficult, this sentence is.

Die Zeichenklassen im Transliterationsmodus verwenden keine eckigen Klammern.
Martin Ender

1
Auch [^ ]kann wahrscheinlich mit \Süberall ersetzt werden, und in der ersten Regex [^ ]+kann mit ersetzt werden .+. In den Charakterklassen musst du nicht fliehen ., das [.!]funktioniert also einwandfrei. Da Sie die Reihenfolge von $1und $2in der dritten Stufe nicht vertauschen , können Sie sie auch in einer einzelnen Gruppe erfassen und 5 Bytes sparen.
Martin Ender

([^I]|It)kann verkürzt werden auf^\w\w
Martin Ender

Wow, was für eine Menge Verbesserungen. Vielen Dank.
Rainer P.

Ich denke I|Itkann werden I?, wenn Retina das unterstützt
Conor O'Brien

7

ES6, 212

Das kann wohl etwas weiter runtergolfen:

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 (erfordert einen aktuellen Browser wie Chrome) oder führen Sie es über node.js aus

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

Gebrochener Test: I think they’ll add new features-> kehrt They, I think.auf Google Chrome 47.0.2526.106 m zurück. Auch mag es nicht I love constants like π. So fügen Sie auf , dass, I made a fantastic code challenge (I hope)kehrt A fantastic code challenge , I made.stattA fantastic code challenge (I hope), I made.
Ismael Miguel

@IsmaelMiguel Behoben, aber durch einen anderen Fehler, den ich ebenfalls behoben habe, sogar 3 Zeichen weniger
Helco

Es hat alle Probleme gelöst, alle Tests scheinen in Ordnung zu sein. Gut gemacht! Du hast meine Gegenstimme.
Ismael Miguel

3
Sie müssen ^am Anfang Ihres regulären Ausdrucks einen Satz einfügen, sonst wird ein beliebiger Text vor dem Pronomen als gültig analysiert.
user81655

6

JavaScript (ES6), 164 Byte

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

Erläuterung

Es ist fast schmerzhaft, wie viele Bytes der erste Buchstabe eines Strings in JavaScript benötigt ...

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

Prüfung

Test verwendet keine destrukturierende Zuweisung, um die Kompatibilität mit anderen Browsern zu verbessern.


162 Zeichen: 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()}.: "Dieser Satz ist zu schwierig."
Wally

@wally Danke, aber leider würde dieser Regex dafür sorgen It, dass die Großschreibung erhalten bleibt und Sheystattdessen auch passt She.
user81655

Ah, meine Tests waren unzureichend! Ja, ich kann verstehen, warum ... Ah, gut.
Wally

3

Python, 261 Bytes

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

Es stellt sich heraus, dass Python Dinge wie b[-1]in".!"Next nichts ausmacht. Ich spiele mehr mit dem Match-Objekt, wenn mich niemand schlägt :)


Ich denke, Sie können ein Leerzeichen im b=b[:-1]Teil entfernen .
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ danke!
Robert Grant

3
Sie können b=b[:-1]am Ende der Zeile mit dem if. Sie können das Leerzeichen nach der Rückkehr in der letzten Zeile entfernen. Dies wird die Python3-Kompatibilität aufheben, indem 2 Leerzeichen durch ein Tab und 3 durch ein Tab und ein Leerzeichen ersetzt werden
undergroundmonorail

2

Python, 218 217 204 Bytes

Ich bin mir nicht sicher, ob dies weiter nach unten golfen werden kann.

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

Sie ändern können , s.split(' ')um s.split()und 'I|We|You|He|She|It|They'.split('|')auf 'I We You He She It They'.split()das Ersetzen if...elseanderer Stelle mit der gleichen verwendet boolean Liste, ändern t[0]inzu t[0]in, entfernen Sie die spawce um die Rückkehr
Blau

1

GNU sed, 129 Bytes

Ich gebe +1 Byte für das -rFlag ein.

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

Erläuterung

Wenn wir mit einem Lead übereinstimmen, Ispringen wir zum Label:

/^I /b

Wenn wir mit einem der anderen Pronomen übereinstimmen, schreiben wir es in Kleinbuchstaben und springen zum Label:

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

Andernfalls drucken wir die Fehlermeldung und gehen zur nächsten Eingabezeile über:

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

Wenn wir zum Etikett springen, entfernen wir alle abschließenden Satzzeichen:

:
s/[.!]$//

und tauschen Sie die ersten beiden Wörter mit dem Rest des Satzes aus, wobei Sie das neue erste Wort in Großbuchstaben schreiben und dabei die erforderliche Interpunktion hinzufügen:

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

Ihr Programm prüft nicht, ob die Eingabe aus mindestens drei Wörtern besteht. Sätze wie " You arePass First" und "Second Line" stimmen nicht mit dem letzten überein, daher erfolgt die Ausgabe you areanstelle der Fehlermeldung. Fügen Sie ...|They) \S+ \S/\L&/den ersten beiden Zeilen einen Haken hinzu .
Rainer P.

@Rainer - Sie haben Recht (ich beschuldige das Fehlen von Testfällen für kurze Eingaben). Ich werde sehen, wie man das bald überarbeitet.
Toby Speight
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.