O desafio
Bem, acho que é bem claro, não é? Você precisa criar uma função ou um programa que use uma string como argumento e produza a correspondente fala Yoda.
Isso é código-golfe , portanto, o menor número de bytes vence.
A entrada
A entrada pode ser qualquer sequência sem avanço de linha. Você pode traduzir uma string se for composta assim:
Assunto + Verbo + Algo mais.
Onde Assunto é um pronome pessoal (eu, você, ele, ela, nós, eles). Você não precisa reconhecer que a segunda palavra é um verbo.
Se a primeira palavra não for um pronome, a entrada é válida, mas a saída será Too difficult, this sentence is.
You have to win this code challenge -> Translatable
Luke has to win this code challenge -> Untranslatable
A entrada pode terminar com uma letra, a. ou a!, não com a?.
Além disso, as strings podem conter Não-Ascii, Parênteses, vírgulas, dois pontos ...
A saída
No caso de uma frase traduzível, a saída é a mesma frase, com o sujeito e o verbo no final da frase.
You have to win this code challenge -> To win this code challenge, you have.
Vírgula, ponto e minúscula no pronome são obrigatórios. (Exceto, é claro, se o pronome for I).
Como afirmado anteriormente, se não for traduzível, você deverá gerar a string Too difficult, this sentence is.
Exemplos
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.
fonte
You have to win this code challenge
deve serThis code challenge, you have to win
.!
? Isso garante que isso não aconteça ou devemos lidar com isso e imprimir a mesma coisa que quando não há pronome inicial. A entrada pode conter feeds de linha? Apóstrofes? Dois pontos / parênteses / reticulares? Caracteres não ASCII? Você diz que "a entrada pode ser qualquer string", mas seus casos de teste cobrem apenas tipos muito específicos de strings.Respostas:
Retina,
162137145134131129Agora a pontuação múltipla é tratada corretamente. Caso de teste:
You will not win this challenge...! -> Not win this challenge..., you will.
Experimente Online!
Descrição:
Se houver pontuação no final, exclua-a.
Transforme o pronome em minúscula, exceto que eu.
Filtrar qualquer linha que não corresponda
<Pronoun><space><word><space><word>...
Quebrar em
pronoun + verb
,remainder
. Em seguida, reorganize.Transforme o primeiro caractere em maiúscula.
Se o resultado estiver vazio, ele não passou no filtro acima. Imprima uma mensagem de erro.
fonte
[^ ]
provavelmente pode ser substituído por\S
qualquer lugar, e no primeiro regex[^ ]+
pode ser substituído por.+
. Nas classes de personagem você não precisa escapar,.
então[.!]
funciona bem. Além disso, como você não troca a ordem de$1
e$2
no terceiro estágio, é possível capturá-los em um único grupo e salvar 5 bytes.([^I]|It)
pode ser reduzido para^\w\w
I|It
pode se tornarI?
, se Retina apoiar isso #ES6, 212
Provavelmente isso pode ser um pouco mais complicado:
JSFiddle (requer um navegador atualizado como o Chrome) ou execute-o via node.js
Ungolfed:
fonte
I think they’ll add new features
-> retornaThey, I think.
no Google Chrome 47.0.2526.106 m. Além disso, não gostaI love constants like π
. Para adicionar isso,I made a fantastic code challenge (I hope)
retorna emA fantastic code challenge , I made.
vez deA fantastic code challenge (I hope), I made.
^
ao início de sua regex, caso contrário, uma frase com qualquer texto antes que o pronome ainda seja analisado como válido.JavaScript (ES6), 164 bytes
Explicação
É quase doloroso quantos bytes em maiúscula a primeira letra de uma string leva em JavaScript ...
Teste
O teste não usa a atribuição de desestruturação para torná-lo mais compatível com vários navegadores.
Mostrar snippet de código
fonte
^(((It?)|You|[HW]e|[ST]hey) \\S+) (.*?)[.!]?$
)? P [4] [0] .toUpperCase () + p [4] .slice (1) +, ${p[3]?p[1]:p[1].toLowerCase()}.
: "Muito difícil, esta frase é."It
capitalização e também corresponderia emShey
vez deShe
.Python, 261 bytes
Acontece que o Python não se importa com coisas como
b[-1]in".!"
Next. Vou brincar mais com o objeto match, se ninguém me bater nele :)fonte
b=b[:-1]
peça.b=b[:-1]
no final da linha com oif
. você pode remover o espaço após o retorno na última linha. isso vai quebrar a compatibilidade python3 substituindo 2 lugares com um guia e 3 com um guia e um espaçoPython,
218217204 bytesNão tenho certeza se isso pode ser ainda mais jogado.
Ungolfed:
fonte
s.split(' ')
paras.split()
e'I|We|You|He|She|It|They'.split('|')
para'I We You He She It They'.split()
, substitua oif...else
com a mesma lista boolean usado em outro lugar, a mudançat[0]in
parat[0]in
, remova o spawce ao redor do retornoGNU sed, 129 bytes
Estou incluindo +1 byte para a
-r
bandeira.Explicação
Se correspondermos a um líder
I
, saltaremos para o rótulo:Se correspondermos a um dos outros pronomes, colocaremos em minúsculas e depois pularemos para o rótulo:
Caso contrário, imprimimos a mensagem de falha e passamos para a próxima linha de entrada:
Se pularmos para o rótulo, removeremos qualquer pontuação final:
e troque as duas primeiras palavras pelo restante da frase, colocando em maiúscula a nova primeira palavra e adicionando a pontuação necessária à medida que o fazemos:
fonte
You are
passar pela primeira e segunda linha, mas não coincidem com a última, portanto, a saída é emyou are
vez da mensagem de erro. Adicione um cheque como...|They) \S+ \S/\L&/
nas duas primeiras linhas.