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.