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 código golf , 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.
fuente
You have to win this code challenge
debería serThis code challenge, you have to win
.!
? ¿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.Respuestas:
Retina,
162137145134131129La 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!
Descripción:
Si hay puntuación al final, elimínela.
Transforma el pronombre a minúsculas, excepto que es I.
Filtre cualquier línea que no coincida
<Pronoun><space><word><space><word>...
Dividir en
pronoun + verb
,remainder
. Luego reorganizar.Transforma el primer carácter a mayúsculas.
Si el resultado está vacío, no pasó el filtro anterior. Imprime un mensaje de error.
fuente
[^ ]
probablemente se puede reemplazar por\S
todas 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$1
y$2
en la tercera etapa, puede capturarlos en un solo grupo y guardar 5 bytes.([^I]|It)
se puede acortar a^\w\w
I|It
puede convertirseI?
, si Retina lo respaldaES6, 212
Esto probablemente puede jugar un poco más:
JSFiddle (requiere un navegador actualizado como Chrome) o ejecútelo a través de node.js
Sin golf:
fuente
I think they’ll add new features
-> regresaThey, I think.
en Google Chrome 47.0.2526.106 m. Además, no le gustaI love constants like π
. Para agregar eso,I made a fantastic code challenge (I hope)
regresa enA fantastic code challenge , I made.
lugar deA fantastic code challenge (I hope), I made.
^
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.JavaScript (ES6), 164 bytes
Explicación
Es casi doloroso la cantidad de bytes que usa mayúscula para la primera letra de una cadena en JavaScript ...
Prueba
La prueba no utiliza la asignación de desestructuración para que sea más compatible con varios navegadores.
Mostrar fragmento de código
fuente
^(((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".It
mantuviera en mayúscula y también coincidiera enShey
lugar deShe
.Python, 261 bytes
Resulta que a Python no le importan cosas como
b[-1]in".!"
Siguiente. Jugaré más con el objeto coincidente, si nadie me gana :)fuente
b=b[:-1]
parte.b=b[:-1]
al final de la línea con elif
. 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 espacioPython,
218217204 bytesNo estoy seguro de si esto se puede seguir jugando al golf.
Sin golf:
fuente
s.split(' ')
as.split()
y'I|We|You|He|She|It|They'.split('|')
a'I We You He She It They'.split()
, reemplazar elif...else
con la misma lista booleana usada en otros lugares, el cambiot[0]in
at[0]in
, quitar el spawce alrededor de la vueltaGNU sed, 129 bytes
Incluyo +1 byte para la
-r
bandera.Explicación
Si hacemos coincidir un líder
I
, saltamos a la etiqueta:Si hacemos coincidir uno de los otros pronombres, lo minimizamos y luego saltamos a la etiqueta:
De lo contrario, imprimimos el mensaje de error y pasamos a la siguiente línea de entrada:
Si saltamos a la etiqueta, eliminamos cualquier puntuación final:
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:
fuente
You are
pasan como primera y segunda línea pero no coinciden en la última, por lo que la salida es enyou are
lugar del mensaje de error. Agregue un cheque como...|They) \S+ \S/\L&/
a las dos primeras líneas.