Um desafio que fala Yoda, este é

44

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 é , 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.
Simone Chelo
fonte
9
De um ponto de vista não questionável, os infinitivos não deveriam ser movidos também? Por exemplo, o You have to win this code challengedeve ser This code challenge, you have to win.
precisa saber é o seguinte
9
"Para vencer este desafio de código, você tem." parece realmente estranho.
Nicael
3
A entrada pode conter vírgulas? E se a entrada não terminar em uma letra, ponto final ou !? 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.
Martin Ender
4
'have to' é uma construção estranha de verbo auxiliar peculiar ao inglês; é improvável que Yoda o use. "Este desafio de código, vença, você deve." Por outro lado, Yoda tem suas próprias construções de verbo auxiliar que ele tende a usar: "Esse desafio de código ganhou, ele ganhou". Não consigo imaginar Yoda dizendo "Este desafio de código, ele venceu" ou "para vencer este desafio de código, você tem".
precisa saber é o seguinte
4
As respostas não precisam de mais 'Mmmmm'?
21316 Steve Ives

Respostas:

17

Retina, 162 137 145 134 131 129

Agora a pontuação múltipla é tratada corretamente. Caso de teste:You will not win this challenge...! -> Not win this challenge..., you will.

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

Descrição:

Se houver pontuação no final, exclua-a.

[.!]$

^empty line

Transforme o pronome em minúscula, exceto que eu.

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

Filtrar qualquer linha que não corresponda <Pronoun><space><word><space><word>...

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

Quebrar em pronoun + verb, remainder. Em seguida, reorganize.

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

Transforme o primeiro caractere em maiúscula.

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

Se o resultado estiver vazio, ele não passou no filtro acima. Imprima uma mensagem de erro.

^$
Too difficult, this sentence is.
Rainer P.
fonte
As classes de caracteres no modo transliteração não usam colchetes.
Martin Ender
1
Além disso, [^ ]provavelmente pode ser substituído por \Squalquer 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 $1e $2no terceiro estágio, é possível capturá-los em um único grupo e salvar 5 bytes.
Martin Ender
([^I]|It)pode ser reduzido para^\w\w
Martin Ender
Uau, que carga de melhorias. Obrigado.
Rainer P.
Eu acho que I|Itpode se tornar I?, se Retina apoiar isso #
Conor O'Brien
7

ES6, 212

Provavelmente isso pode ser um pouco mais complicado:

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 (requer um navegador atualizado como o Chrome) ou execute-o via 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.";
}
Helco
fonte
Teste quebrado: I think they’ll add new features-> retorna They, I think.no Google Chrome 47.0.2526.106 m. Além disso, não gosta I love constants like π. Para adicionar isso, I made a fantastic code challenge (I hope)retorna em A fantastic code challenge , I made.vez deA fantastic code challenge (I hope), I made.
Ismael Miguel
@IsmaelMiguel Corrigido, mas até consegui 3 caracteres a menos devido a outro bug que também
corrigi
Resolveu todos os problemas, todos os testes parecem bons. Bem feito! Você recebeu meu voto.
Ismael Miguel
3
Você precisa adicionar ^ao início de sua regex, caso contrário, uma frase com qualquer texto antes que o pronome ainda seja analisado 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."

Explicação

É quase doloroso quantos bytes em maiúscula a primeira letra de uma string leva em 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."

Teste

O teste não usa a atribuição de desestruturação para torná-lo mais compatível com vários navegadores.

user81655
fonte
162 caracteres: solução 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()}.: "Muito difícil, esta frase é."
wally
@wally Obrigado, mas infelizmente essa regex tornaria a Itcapitalização e também corresponderia em Sheyvez de She.
user81655
Ah, meus testes foram insuficientes! Sim, eu posso ver o porquê ... Ah, bem.
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."

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 :)

Robert Grant
fonte
Eu acho que você pode remover um espaço na b=b[:-1]peça.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ obrigado!
Robert Grant
3
você pode colocar b=b[:-1]no final da linha com o if. 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ço
undergroundmonorail
2

Python, 218 217 204 bytes

Não tenho certeza se isso pode ser ainda mais jogado.

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()]
Zenadix
fonte
você pode mudar s.split(' ')para s.split()e 'I|We|You|He|She|It|They'.split('|')para 'I We You He She It They'.split(), substitua o if...elsecom a mesma lista boolean usado em outro lugar, a mudança t[0]inpara t[0]in, remova o spawce ao redor do retorno
Azul
1

GNU sed, 129 bytes

Estou incluindo +1 byte para a -rbandeira.

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

Explicação

Se correspondermos a um líder I, saltaremos para o rótulo:

/^I /b

Se correspondermos a um dos outros pronomes, colocaremos em minúsculas e depois pularemos para o rótulo:

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

Caso contrário, imprimimos a mensagem de falha e passamos para a próxima linha de entrada:

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

Se pularmos para o rótulo, removeremos qualquer pontuação final:

:
s/[.!]$//

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:

s/^([^ ]+ [^ ]+) (.*)/\u\2, \1./
Toby Speight
fonte
Seu programa não verifica se a entrada consiste em pelo menos três palavras. Frases como You arepassar pela primeira e segunda linha, mas não coincidem com a última, portanto, a saída é em you arevez da mensagem de erro. Adicione um cheque como ...|They) \S+ \S/\L&/nas duas primeiras linhas.
Rainer P.
@Rainer - Você está certo (eu culpo a falta de casos de teste por pequenas entradas). Vou ver como retrabalhar isso em breve.
precisa saber é o seguinte