Un desafío para hablar Yoda, esto es


44

El reto

Bueno, creo que está bastante claro, ¿no? Debe crear una función o un programa que tome una cadena como argumento y genere el correspondiente Yoda-talking.

Esto es , por lo que gana el menor número de bytes.

La entrada

La entrada podría ser cualquier cadena sin salto de línea. Puede traducir una cadena si está compuesta así:

Tema + Verbo + Algo más.

Donde sujeto es un pronombre personal (yo, tú, él, ella, eso, nosotros, ellos). No tienes que reconocer que la segunda palabra es un verbo.

Si la primera palabra no es un pronombre, la entrada es válida pero la salida será Too difficult, this sentence is.

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

La entrada puede terminar con una letra, a. o a!, no con un?.

Además, las cadenas pueden contener no ascii, paréntesis, comas, dos puntos ...

La salida

En el caso de una oración traducible, la salida es la misma oración, con el sujeto y el verbo al final de la oración.

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

La coma, punto y minúscula en el pronombre son obligatorios. (Excepto, por supuesto, si el pronombre es I).

Como se indicó anteriormente, si no es traducible, debe generar la cadena Too difficult, this sentence is.

Ejemplos

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.

99
Desde un punto de vista no cuestionable, ¿no deberían moverse también los infinitivos? Por ejemplo, el You have to win this code challengedebería ser This code challenge, you have to win.
Addison Crump

99
"Para ganar este desafío de código, tienes". Suena realmente extraño.
nicael

3
¿La entrada puede contener comas? ¿Qué pasa si la entrada no termina en una letra, punto o !? ¿Se garantiza que eso no sucederá o deberíamos manejar eso e imprimir lo mismo que cuando no hay un pronombre principal? ¿Puede la entrada contener saltos de línea? Apóstrofos? Dos puntos / paréntesis / backticks? ¿Caracteres no ASCII? Usted dice que "la entrada podría ser cualquier cadena", pero sus casos de prueba solo cubren tipos muy específicos de cadenas.
Martin Ender

44
'have to' es una extraña construcción de verbo auxiliar peculiar del inglés; es poco probable que Yoda lo use. "Este desafío de código, gana, debes hacerlo". Por otro lado, Yoda tiene sus propias construcciones de verbos auxiliares que tiende a usar: "Este desafío de código, ganó, lo hizo". No puedo imaginarme a Yoda diciendo "Este desafío de código, ganó" o "para ganar este desafío de código, tienes".
LindaJeanne

44
¿Las respuestas no necesitan más 'Mmmmm's?
Steve Ives el

Respuestas:


17

Retina, 162 137 145 134 131 129

La puntuación múltiple ahora se maneja correctamente. Caso de prueba:You will not win this challenge...! -> Not win this challenge..., you will.

Pruébalo en línea!

[.!]$

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.

Descripción:

Si hay puntuación al final, elimínela.

[.!]$

^empty line

Transforma el pronombre a minúsculas, excepto que es I.

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

Filtre cualquier línea que no coincida <Pronoun><space><word><space><word>...

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

Dividir en pronoun + verb, remainder. Luego reorganizar.

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

Transforma el primer carácter a mayúsculas.

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

Si el resultado está vacío, no pasó el filtro anterior. Imprime un mensaje de error.

^$
Too difficult, this sentence is.

Las clases de caracteres en modo transliteración no usan corchetes.
Martin Ender

1
Además, [^ ]probablemente se puede reemplazar por \Stodas partes, y en la primera expresión regular [^ ]+se puede reemplazar por .+. En las clases de personajes no necesitas escapar, .así que [.!]funciona bien. Además, dado que no intercambia el orden de $1y $2en la tercera etapa, puede capturarlos en un solo grupo y guardar 5 bytes.
Martin Ender

([^I]|It)se puede acortar a^\w\w
Martin Ender

Wow, qué carga de mejoras. Gracias.
Rainer P.

Creo que I|Itpuede convertirse I?, si Retina lo respalda
Conor O'Brien

7

ES6, 212

Esto probablemente puede jugar un poco más:

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 (requiere un navegador actualizado como Chrome) o ejecútelo a través de node.js

Sin golf:

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

Prueba rota: I think they’ll add new features-> regresa They, I think.en Google Chrome 47.0.2526.106 m. Además, no le gusta I love constants like π. Para agregar eso, I made a fantastic code challenge (I hope)regresa en A fantastic code challenge , I made.lugar deA fantastic code challenge (I hope), I made.
Ismael Miguel

@IsmaelMiguel Reparado, pero incluso obtuve 3 caracteres menos debido a otro error que también solucioné
Helco

Resolvió todos los problemas, todas las pruebas parecen estar bien. ¡Bien hecho! Tienes mi voto a favor.
Ismael Miguel

3
Debe agregar ^al comienzo de su expresión regular, de lo contrario, una oración con cualquier texto antes de que el pronombre aún se analice como válido.
user81655

6

JavaScript (ES6), 164 bytes

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

Explicación

Es casi doloroso la cantidad de bytes que usa mayúscula para la primera letra de una cadena 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."

Prueba

La prueba no utiliza la asignación de desestructuración para que sea más compatible con varios navegadores.


162 caracteres: solución var = 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()}.: "Demasiado difícil, esta oración es".
wally

@wally Gracias, pero desafortunadamente esa expresión regular haría que se Itmantuviera en mayúscula y también coincidiera en Sheylugar de She.
user81655

¡Ah, mi prueba fue insuficiente! Sí, puedo ver por qué ... Ah, bueno.
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."

Resulta que a Python no le importan cosas como b[-1]in".!"Siguiente. Jugaré más con el objeto coincidente, si nadie me gana :)


Creo que puedes eliminar un espacio en la b=b[:-1]parte.
Conor O'Brien

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

3
puedes poner b=b[:-1]al final de la línea con el if. puede eliminar el espacio después del retorno en la última línea. esto romperá la compatibilidad con python3 al reemplazar 2 espacios con una pestaña y 3 con una pestaña y un espacio
undergroundmonorail

2

Python, 218 217 204 bytes

No estoy seguro de si esto se puede seguir jugando al golf.

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

Sin golf:

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

puede cambiar s.split(' ')a s.split()y 'I|We|You|He|She|It|They'.split('|')a 'I We You He She It They'.split(), reemplazar el if...elsecon la misma lista booleana usada en otros lugares, el cambio t[0]ina t[0]in, quitar el spawce alrededor de la vuelta
Azul

1

GNU sed, 129 bytes

Incluyo +1 byte para la -rbandera.

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

Explicación

Si hacemos coincidir un líder I, saltamos a la etiqueta:

/^I /b

Si hacemos coincidir uno de los otros pronombres, lo minimizamos y luego saltamos a la etiqueta:

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

De lo contrario, imprimimos el mensaje de error y pasamos a la siguiente línea de entrada:

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

Si saltamos a la etiqueta, eliminamos cualquier puntuación final:

:
s/[.!]$//

e intercambie las dos primeras palabras con el resto de la oración, capitalizando la nueva primera palabra y agregando la puntuación requerida a medida que lo hacemos:

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

Su programa no verifica si la entrada consta de al menos tres palabras. Las oraciones You arepasan como primera y segunda línea pero no coinciden en la última, por lo que la salida es en you arelugar del mensaje de error. Agregue un cheque como ...|They) \S+ \S/\L&/a las dos primeras líneas.
Rainer P.

@Rainer - Tienes razón (culpo a la falta de casos de prueba por entradas cortas). Veré cómo reelaborar esto pronto.
Toby Speight
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.