seu tio ajuda bêbado precisa

10

O tio bêbado (desculpe-me pela AUS pelo bloqueio de região) é um personagem fictício do Saturday Night Live. Ele muitas vezes confunde palavras para outros que soam como elas. Para esse desafio, você precisa converter a fala normal em fala bêbada.

Algoritmo

Traduzir para drunkspeak requer a troca da ordem das palavras no texto. A troca é baseada na semelhança de embriaguez de duas palavras. A similaridade da embriaguez é definida como o número de letras que duas palavras têm nos mesmos índices . No entanto, duas palavras idênticas têm uma semelhança de embriaguez de -1 . Por exemplo, treee friendtêm uma semelhança de embriaguez de 2, porque ambos têm um 'r' no índice 1 e um 'e' no índice 3.

Tudo o que você precisa fazer é encontrar as duas palavras no texto com a maior semelhança de embriaguez e depois trocá-las. Depois de trocar dois termos, eles não se movem mais. Depois, você analisa os termos trocáveis ​​restantes e troca os dois que têm a maior semelhança de embriaguez. Você continua fazendo isso até não poder mais trocar. Em seguida, você gera (ou retorna, para uma função) o texto atualizado.

Específicos

  • Para simplificar, input é uma lista de palavras que consistem em caracteres em [A-Za-z]
  • Cada entrada contém pelo menos uma palavra
  • A correspondência de letras não faz distinção entre maiúsculas e minúsculas: Acorresponde a a( Nota: devido a esta regra Doge dogé idêntica e, portanto, tem um DS de -1)
  • Se vários pares tiverem a maior semelhança de embriaguez:
    1. Das palavras que podem maximizar a semelhança da embriaguez, escolha aquela com o menor índice da lista
    2. Emparelhe essa palavra com a palavra de índice mais baixo que maximize a semelhança de embriaguez

Exemplos

  1. Drunk Uncle needs your help (título)

    • S 1 : Bêbado <=> seu (DS: 1)your Uncle needs Drunk help
    • S 2 : precisa de ajuda == (DS: 1)your Uncle help Drunk needs
    • Resultado: your Uncle help Drunk needs
  2. I love fidget spinners (exemplo chato)

    • S 1 : Eu <=> amo (DS: 0)love I fidget spinners
    • S 2 : fidget <=> spinners (DS: 0)love I spinners fidget
  3. dog eat dog ear

    • S 1 : comer <=> orelha (DS: 2)dog ear dog eat
    • S 2 : cachorro <=> cachorro (DS: -1) dog ear dog eat(essa etapa é apenas formalidade)
  4. Let me tell you a story

    • S 1 : Deixe-me <=> (DS: 1)me Let tell you a story
    • S 2 : informar <=> você (DS: 0)me Let you tell a story
    • S 3 : uma história <=> (DS: 0)me Let you tell story a
  5. Too many money and purple people

    • S 1 : pessoas roxas <=> (DS: 4)Too many money and people purple
    • S 2 : muito <=> dinheiro (DS: 2)Too money many and people purple
    • S 3 : muito <=> e (DS: 0)and money many Too people purple

Deixe-me saber se há mais exemplos que você deseja que eu cubra.

geokavel
fonte
8
Por favor, altere 'eu amo fid-obter spinners' para 'eu odeio FID-obter spinners'
Okx
11
"linguagem natural"
HyperNeutrino

Respostas:

3

JavaScript - 286 279 bytes

f=(a,n=(a=a.split` `).length)=>{for(d=n>>1;w=-2,d--;){for(i=n;i--;)for(j=n;j--;)s=((a,f,v=0)=>{for(u=s=a!=f;(r=a[v])&&(t=f[v++]);s+=(p=a=>a.toLowerCase())(r)==p(t));return u*s-1})(a[i],a[j]),!(f[i]|f[j])&&s>=w&&(w=s,x=i,y=j);f[x]=f[y]=1,[a[x],a[y]]=[a[y],a[x]];}return a.join` `}

Você pode experimentá-lo no JSFiddle .


fonte
Bem-vindo (novamente) ao PPCG :) Bom primeiro envio!
21417 HyperNeutrino
2

Python 3, 285 277 270 267 bytes, não está funcionando

i=input().split();r=range;l=len;t=y=z=-1;n=str.lower
for p in r(l(i)):
 for q in r(p):
  b=min(l(i[p]),l(i[q]));x=0
  for s in r(b):
   if n(i[p][s])==n(i[q][s]):
    x=x+1
  if n(i[p])==n(i[q]):
   x=-1
  if x>t:
   t=x;y=p;z=q
i[y],i[z]=i[z],i[y]
print(" ".join(i))

Tentei fazer a saída corresponder ao desafio, não aos casos de teste, pois alguns deles contradizem o desafio.

Edit: jogou golfe no menor 'coisinha'.

Editar: alteração de divisão ("") para divisão ()

Edit: eu percebi que isso realmente não completa todas as coisas, e embora eu possa ter uma resposta completa, enquanto isso, devo acrescentar que isso só completa uma iteração.

Inofensivo
fonte
11
Você precisa definir quer g = str.lowerou g = lambda s: s.lower()que você então pode usar como este .
ბიმო
@Bruce Forte Obrigado! Isso se livrou de 8 bytes. (Apenas diminuiu para 270, porque eu também tive que consertar algo para fazê-lo, para que ele trocasse palavras, mesmo que a maior semelhança fosse 0; isso acrescentou um byte).
Inofensiva
11
Não tem problema e bem-vindo ao PPCG! Se você ainda não viu, esse tipo de post é muito útil. Btw .split(' ')pode ser substituído por .split().
ბიმო
Espere, em quais casos de teste você mudou e o que havia de errado com eles?
geokavel
Eu não tenho representante suficiente para mudar um post, mas a aparente contradição foi para o primeiro exemplo - a resposta dada para 'tio bêbado precisa de sua ajuda' foi 'seu tio ajuda bêbado precisa' sobre 'seu tio precisa de ajuda bêbado'. Ambas as respostas trocaram palavras com a mesma pontuação de similaridade e ambas seguem seu desempate usando o primeiro par para decidir qual trocar, no sentido de que ambas começam com a primeira palavra. (Percebo agora, enquanto escrevo isso, que a contradição não é realmente isso, mas mais uma ambiguidade). O dado lugar a decide- ficar sem caracteres ver NEXT-
Inofensiva