Un défi parlant Yoda, c’est

44

Le défi

Eh bien, je pense que c'est assez clair, n'est-ce pas? Vous devez créer une fonction ou un programme qui prend une chaîne en tant qu'argument et génère le correspondant correspondant, Yoda.

C'est le , donc le moins d'octets gagne.

L'entrée

L'entrée peut être n'importe quelle chaîne sans saut de ligne. Vous pouvez traduire une chaîne si elle est composée comme ceci:

Sujet + Verbe + Quelque chose d'autre.

Subject est un pronom personnel (moi, vous, il, elle, elle, nous, eux). Vous n'êtes pas obligé de reconnaître que le deuxième mot est un verbe.

Si le premier mot n'est pas un pronom, l'entrée est valide mais la sortie sera Too difficult, this sentence is.

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

La saisie peut se terminer par une lettre, a. ou un!, pas avec un?.

De plus, les chaînes peuvent contenir des caractères non-ASCII, des parenthèses, des virgules, des deux-points, etc.

Le résultat

Dans le cas d'une phrase traduisible, le résultat est la même phrase, avec le sujet et le verbe à la fin de la phrase.

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

Les virgules, les points et les minuscules du pronom sont obligatoires. (Sauf, bien sûr, si le pronom est I).

Comme indiqué précédemment, s'il est intraduisible, vous devez générer la chaîne Too difficult, this sentence is.

Exemples

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
la source
9
D'un point de vue non discutable, les infinitifs ne devraient-ils pas être déplacés également? Par exemple, le You have to win this code challengedevrait être This code challenge, you have to win.
Addison Crump
9
"Pour remporter ce défi de code, vous avez." semble vraiment étrange.
nicael
3
L'entrée peut-elle contenir des virgules? Que se passe-t-il si l'entrée ne se termine pas par une lettre, un point ou !? Est-ce garanti que cela ne se produira pas ou devrions-nous nous en occuper et imprimer la même chose que lorsqu'il n'y a pas de pronom principal. L'entrée peut-elle contenir des sauts de ligne? Apostrophes? Colons / parenthèses / backticks? Caractères non-ASCII? Vous dites que "l'entrée peut être n'importe quelle chaîne", mais vos scénarios de test ne couvrent que des types de chaînes très spécifiques.
Martin Ender
4
«avoir à» est une étrange construction de verbe helper-verbe particulière à l'anglais; il est peu probable que Yoda l'utilise. "Ce code défi, gagne, tu dois." D'autre part, Yoda a ses propres constructions de verbe d'assistance qu'il tend à utiliser: "Ce défi de code, a gagné, il l'a fait." Je ne peux pas imaginer que Yoda dise "Ce défi de code, il a gagné" ou "Pour remporter ce défi de code, vous avez".
LindaJeanne
4
Les réponses n'ont-elles pas besoin de plus de 'Mmmmm's?
Steve Ives

Réponses:

17

Retina, 162 137 145 134 131 129

La ponctuation multiple est maintenant gérée correctement. Cas de test:You will not win this challenge...! -> Not win this challenge..., you will.

Essayez-le en ligne!

[.!]$

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.

La description:

S'il y a ponctuation à la fin, supprimez-le.

[.!]$

^empty line

Transforme le pronom en minuscule, sauf que c'est I.

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

Filtrer toute ligne qui ne correspond pas <Pronoun><space><word><space><word>...

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

Divisé en pronoun + verb, remainder. Puis réorganiser.

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

Transforme le premier caractère en majuscule.

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

Si le résultat est vide, le filtre ci-dessus n'est pas passé. Imprimer un message d'erreur.

^$
Too difficult, this sentence is.
Rainer P.
la source
Les classes de caractères en mode translittération n'utilisent pas de crochets.
Martin Ender
1
Aussi, [^ ]peut probablement être remplacé par \Spartout, et dans la première expression rationnelle [^ ]+peut être remplacé par .+. Dans les classes de caractères, vous n'avez pas besoin de vous échapper, .alors tout [.!]fonctionne bien. De plus, comme vous n'échangez pas l'ordre de $1et $2dans la troisième étape, vous pouvez les capturer dans un seul groupe et économiser 5 octets.
Martin Ender
([^I]|It)peut être raccourci à^\w\w
Martin Ender
Wow, quelle charge d'amélioration. Merci.
Rainer P.
Je pense que cela I|Itpeut devenir I?, si Retina le soutient
Conor O'Brien
7

ES6, 212

Cela peut probablement être un peu plus compliqué:

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 (nécessite un navigateur à jour tel que Chrome) ou l'exécuter via 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
la source
Test rompu: I think they’ll add new features-> renvoie They, I think.sur Google Chrome 47.0.2526.106 m. En outre, il n'aime pas I love constants like π. Pour ajouter à cela, I made a fantastic code challenge (I hope)retourne A fantastic code challenge , I made.au lieu deA fantastic code challenge (I hope), I made.
Ismael Miguel
@IsmaelMiguel Corrigé, mais a même eu 3 caractères de moins à cause d'un autre bug que j'ai aussi corrigé
Helco
Il a résolu tous les problèmes, tous les tests semblent bons. Bien joué! Vous avez mon vote positif.
Ismael Miguel
3
Vous devez ajouter ^au début de votre regex sinon une phrase avec n'importe quel texte avant le pronom sera toujours considérée comme valide.
user81655
6

JavaScript (ES6), 164 octets

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

Explication

C'est presque douloureux combien d'octets en majuscule la première lettre d'une chaîne prend en 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."

Tester

Test n'utilise pas d'attribution de déstructuration pour le rendre plus compatible avec tous les navigateurs.

utilisateur81655
la source
162 caractères: 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()}.: "Trop difficile, cette phrase est."
Wally
@wally Merci, mais malheureusement, cette expression rationnelle ferait Itrester majuscule et correspondrait Sheyau lieu de She.
user81655
Ah, mes tests étaient insuffisants! Oui je peux voir pourquoi ... Ah bien.
Wally
3

Python, 261 octets

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

Il s'avère que Python ne s'inquiète pas de choses comme b[-1]in".!"Next, je vais jouer plus souvent avec l'objet match, si personne ne me bat dessus :)

Robert Grant
la source
Je pense que vous pouvez supprimer un espace dans la b=b[:-1]pièce.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ merci!
Robert Grant
3
vous pouvez mettre b=b[:-1]au bout de la ligne avec le if. vous pouvez supprimer l'espace après le retour sur la dernière ligne. cela rompra la compatibilité avec python3 en remplaçant 2 espaces par un onglet et 3 par un onglet et un espace
undergroundmonorail
2

Python, 218 217 204 octets

Je ne sais pas si cela peut encore être joué.

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
la source
vous pouvez changer s.split(' ')à s.split()et 'I|We|You|He|She|It|They'.split('|')à 'I We You He She It They'.split(), remplacer le if...elseavec la même liste booléenne utilisée ailleurs, le changement t[0]inà t[0]in, enlever le spawce autour du retour
Bleu
1

GNU sed, 129 octets

J'inclus +1 octet pour le -rdrapeau.

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

Explication

Si nous correspondons à un leader, Inous sautons au label:

/^I /b

Si nous correspondons à l'un des autres pronoms, nous le minimisons, puis passons à l'étiquette:

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

Sinon, nous imprimons le message d'échec et passons à la ligne de saisie suivante:

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

Si nous sautons à l'étiquette, nous supprimons toute ponctuation finale:

:
s/[.!]$//

et permutez les deux premiers mots avec le reste de la phrase, en capitalisant le nouveau premier mot et en ajoutant la ponctuation requise en procédant ainsi:

s/^([^ ]+ [^ ]+) (.*)/\u\2, \1./
Toby Speight
la source
Votre programme ne vérifie pas si l'entrée est composée d'au moins trois mots. Des phrases comme You arepassent la première et la deuxième ligne mais ne correspondent pas sur la dernière. Le résultat est donc à la you areplace du message d'erreur. Ajouter un chèque comme ...|They) \S+ \S/\L&/pour les deux premières lignes.
Rainer P.
@ Rainer - Vous avez raison (je blâme le manque de cas de test pour les entrées courtes). Je vais regarder comment retravailler ceci bientôt.
Toby Speight