Una sfida che parla Yoda, questo è


44

La sfida

Beh, penso che sia abbastanza chiaro, no? Devi creare una funzione o un programma che accetta una stringa come argomento e genera il corrispondente linguaggio Yoda.

Questo è , quindi vince il numero minimo di byte.

L'input

L'input potrebbe essere qualsiasi stringa senza avanzamento di riga. Puoi tradurre una stringa se è composta in questo modo:

Oggetto + Verbo + Qualcos'altro.

Dove soggetto è un pronome personale (io, tu, lui, lei, esso, noi, loro). Non devi riconoscere che la seconda parola è un verbo.

Se la prima parola non è un pronome, l'input è valido ma lo sarà Too difficult, this sentence is.

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

L'input può terminare con una lettera, a. o un!, non con un?.

Inoltre, le stringhe possono contenere Non-Ascii, Parentesi, virgole, due punti ...

L'output

Nel caso di una frase traducibile, l'output è la stessa frase, con l'oggetto e il verbo alla fine della frase.

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

Virgola, punto e minuscolo sul pronome sono obbligatori. (Tranne, ovviamente, se il pronome è I).

Come affermato in precedenza, se non è traducibile, è necessario generare la stringa Too difficult, this sentence is.

Esempi

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
Da un punto di vista senza domande, anche gli infiniti non dovrebbero essere mossi? Ad esempio, You have to win this code challengedovrebbe essere This code challenge, you have to win.
Addison Crump

9
"Per vincere questa sfida del codice, hai." sembra davvero strano.
nicael

3
L'input può contenere virgole? Cosa succede se l'input non termina in una lettera, punto o !? È garantito che ciò non accada o dovremmo gestirlo e stampare la stessa cosa di quando non c'è un pronome principale. L'input può contenere avanzamenti di riga? Apostrophes? Colons / parentesi / apici inversi? Caratteri non ASCII? Dici che "l'input potrebbe essere qualsiasi stringa", ma i tuoi casi di test coprono solo tipi di stringhe molto specifici.
Martin Ender,

4
"devo" è una strana costruzione di un verbo helper peculiare dell'inglese; è improbabile che Yoda lo userebbe. "Questa sfida del codice, vinci, devi." D'altra parte, Yoda ha le sue costruzioni di verbi helper che tende a usare: "Questa sfida del codice, ha vinto, l'ha fatto." Non riesco a immaginare Yoda che dice "Questa sfida di codice, ha vinto" o "Per vincere questa sfida di codice, hai".
LindaJeanne,

4
Le risposte non hanno bisogno di più 'Mmmmm?
Steve Ives,

Risposte:


17

Retina, 162 137 145 134 131 129

La punteggiatura multipla ora è gestita correttamente. Caso di prova:You will not win this challenge...! -> Not win this challenge..., you will.

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

Descrizione:

Se alla fine è presente la punteggiatura, eliminala.

[.!]$

^empty line

Trasforma il pronome in minuscolo, tranne che per I.

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

Filtra qualsiasi riga che non corrisponde <Pronoun><space><word><space><word>...

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

Suddiviso in pronoun + verb, remainder. Quindi riorganizzare.

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

Trasforma il primo carattere in maiuscolo.

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

Se il risultato è vuoto, non ha passato il filtro sopra. Stampa un messaggio di errore.

^$
Too difficult, this sentence is.

Le classi di caratteri in modalità traslitterazione non usano parentesi quadre.
Martin Ender,

1
Inoltre, [^ ]può probabilmente essere sostituito con \Sovunque, e nel primo regex [^ ]+può essere sostituito con .+. Nelle classi di personaggi non è necessario scappare, .quindi [.!]funziona bene. Inoltre, poiché non si scambia l'ordine di $1e $2nella terza fase, è possibile acquisirli in un singolo gruppo e salvare 5 byte.
Martin Ender,

([^I]|It)può essere abbreviato in^\w\w
Martin Ender il

Wow, che carico di miglioramenti. Grazie.
Rainer P.

Penso che I|Itpossa diventare I?, se Retina lo sostiene
Conor O'Brien il

7

ES6, 212

Questo può probabilmente essere ulteriormente risolto:

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 (richiede un browser aggiornato come Chrome) o eseguirlo tramite 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.";
}

Test interrotto: I think they’ll add new features-> ritorna They, I think.su Google Chrome 47.0.2526.106 m. Inoltre, non gli piace I love constants like π. Per aggiungere ciò, I made a fantastic code challenge (I hope)restituisce A fantastic code challenge , I made.inveceA fantastic code challenge (I hope), I made.
Ismael Miguel il

@IsmaelMiguel Risolto, ma ho anche ricevuto 3 caratteri in meno a causa di un altro bug che ho anche corretto
Helco

Ha risolto tutti i problemi, tutti i test sembrano a posto. Molto bene! Hai ottenuto il mio voto.
Ismael Miguel,

3
Devi aggiungere ^all'inizio della tua regex, altrimenti una frase con qualsiasi testo prima che il pronome venga comunque analizzato come valido.
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."

Spiegazione

È quasi doloroso quanti byte capitalizzano la prima lettera di una stringa in 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

Il test non utilizza l'assegnazione destrutturante per renderla più compatibile con più browser.


162 caratteri: 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()}.: "Troppo difficile, questa frase è."
Wally,

@wally Grazie, ma sfortunatamente quel regex rimarrebbe Itcapitalizzato e corrisponderebbe anche al Sheyposto di She.
user81655

Ah, i miei test non sono stati sufficienti! Sì, capisco perché ... Ah bene.
Wally,

3

Python, 261 byte

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 scopre che cose come b[-1]in".!"Next giocherò di più con l'oggetto match, se nessuno me lo batte :)


Penso che puoi rimuovere uno spazio nella b=b[:-1]parte.
Conor O'Brien,

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

3
puoi mettere b=b[:-1]alla fine della riga con il if. puoi rimuovere lo spazio dopo il ritorno sull'ultima riga. questo romperà la compatibilità di python3 sostituendo 2 spazi con una scheda e 3 con una scheda e uno spazio
undergroundmonorail

2

Python, 218 217 204 byte

Non sono sicuro se questo può essere ulteriormente ridotto.

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

puoi cambiare s.split(' ')in s.split()e 'I|We|You|He|She|It|They'.split('|')to 'I We You He She It They'.split(), sostituire il if...elsecon lo stesso elenco booleano utilizzato altrove, cambiare t[0]inin t[0]in, rimuovere lo spawce attorno al ritorno
Blue

1

GNU sed, 129 byte

Sto includendo +1 byte per la -rbandiera.

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

Spiegazione

Se abbiniamo un vantaggio, Ipassiamo all'etichetta:

/^I /b

Se abbiniamo uno degli altri pronomi, lo downcase, quindi passiamo all'etichetta:

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

Altrimenti stampiamo il messaggio di errore e passiamo alla riga di input successiva:

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

Se passiamo all'etichetta, rimuoviamo la punteggiatura finale:

:
s/[.!]$//

e scambia le prime due parole con il resto della frase, mettendo in maiuscolo la nuova prima parola e aggiungendo la punteggiatura richiesta mentre lo facciamo:

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

Il tuo programma non controlla se l'input è composto da almeno tre parole. Le frasi come You arepassano prima e seconda riga ma non corrispondono all'ultima, quindi l'output è you areinvece del messaggio di errore. Aggiungi un segno di spunta come ...|They) \S+ \S/\L&/alle prime due righe.
Rainer P.

@Rainer - Hai ragione (biasimo la mancanza di casi di test per input brevi). Vedrò presto come rielaborarlo.
Toby Speight,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.