tu tío ayuda borracho necesita

10

Drunk Uncle (lo siento ME y AUS por el bloqueo regional) es un personaje ficticio de Saturday Night Live. A menudo confunde palabras para otros que suenan como ellas. Para este desafío, debe convertir el habla normal en lenguaje borracho.

Algoritmo

Traducir a drunkspeak requiere intercambiar el orden de las palabras en el texto. El intercambio se basa en la similitud de embriaguez de dos palabras. La similitud de borrachera se define como el número de letras que dos palabras tienen en los mismos índices . Sin embargo, dos palabras idénticas tienen una similitud de embriaguez de -1 . Por ejemplo, treey friendtienen una similitud de embriaguez de 2, porque ambos tienen una 'r' en el índice 1 y una 'e' en el índice 3.

Todo lo que tiene que hacer es encontrar las dos palabras en el texto con la mayor similitud de borrachera, luego intercambiarlas. Una vez que intercambias dos términos, ya no se mueven. Luego observa los términos intercambiables restantes e intercambia los dos que tienen la mayor similitud de borrachera. Sigue haciendo esto hasta que no puedas cambiar más. Luego saca (o devuelve, para una función) el texto actualizado.

Detalles específicos

  • Para simplificar, la entrada es una lista de palabras que consta de caracteres en [A-Za-z]
  • Cada entrada contiene al menos una palabra
  • La coincidencia de letras no distingue entre mayúsculas y minúsculas: Acoincide con a( Nota: debido a esta regla Dogy dogson idénticas, y por lo tanto tienen un DS de -1)
  • Si varios pares tienen la mayor similitud de borrachera:
    1. De las palabras, que pueden maximizar la similitud de borrachera, elija la que tenga el índice más bajo en la lista
    2. Empareje esa palabra con la palabra de índice más bajo que maximice la similitud de embriaguez

Ejemplos

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

    • S 1 : Borracho <=> tu (DS: 1)your Uncle needs Drunk help
    • S 2 : necesita <=> ayuda (DS: 1)your Uncle help Drunk needs
    • Salida: your Uncle help Drunk needs
  2. I love fidget spinners (ejemplo aburrido)

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

    • S 1 : comer <=> oreja (DS: 2)dog ear dog eat
    • S 2 : perro <=> perro (DS: -1) dog ear dog eat(este paso solo formalidad)
  4. Let me tell you a story

    • S 1 : Déjame <=> (DS: 1)me Let tell you a story
    • S 2 : decirte <=> (DS: 0)me Let you tell a story
    • S 3 : una historia <=> (DS: 0)me Let you tell story a
  5. Too many money and purple people

    • S 1 : púrpura <=> personas (DS: 4)Too many money and people purple
    • S 2 : muchos <=> dinero (DS: 2)Too money many and people purple
    • S 3 : Demasiado <=> y ​​(DS: 0)and money many Too people purple

Avíseme si hay más ejemplos que desea que cubra.

geokavel
fuente
8
cambie 'me encantan los hiladores de fid-get' a 'odio los hiladores de fid-get'
Okx
1
"lenguaje natural"
HyperNeutrino

Respuestas:

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` `}

Puedes probarlo en JSFiddle .


fuente
Bienvenido (de nuevo) a PPCG :) ¡Buena presentación!
HyperNeutrino
2

Python 3, 285 277 270 267 Bytes, no funciona

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

Traté de hacer que la salida coincidiera con el desafío, no con los casos de prueba, ya que un par de casos de prueba contradicen el desafío.

Editar: golfed la cosita 'inferior'.

Editar: cambio de división ("") a división ()

Editar: me di cuenta de que esto en realidad no completa todas las cosas, y aunque podría llegar a una respuesta de trabajo completa, mientras tanto, también podría agregar que esto solo completa una iteración.

Inofensivo
fuente
1
Debe definir cualquiera g = str.lowero g = lambda s: s.lower()qué puede usar de esta manera .
ბიმო
@Bruce Forte Gracias! Esto eliminó 8 bytes. (Sin embargo, solo bajó a 270 porque también tuve que arreglar algo para que intercambiara palabras incluso si la mayor similitud era 0; esto agregó un byte).
Inofensivo el
1
No hay problema y bienvenido a PPCG! Si aún no lo ha visto, este tipo de publicaciones son muy útiles. Btw .split(' ')puede ser reemplazado por .split().
ბიმო
Espera, ¿qué casos de prueba cambiaste y qué les pasaba?
geokavel
No tengo suficiente representante para cambiar una publicación, pero la aparente contradicción fue para el primer ejemplo: la respuesta dada para 'tío borracho necesita tu ayuda' fue 'tu tío ayuda borracho necesita' sobre 'tu tío necesita ayuda borracha'. Ambas respuestas intercambiaron palabras con el mismo puntaje de similitud, y ambas siguen el desempate dado usando el primero de la pareja para decidir cuál intercambiar, en el sentido de que ambas comienzan con la primera palabra. (Ahora que escribo esto me doy cuenta de que la contradicción no es realmente eso, sino más bien una ambigüedad). La forma dada para decidir, quedando sin caracteres, ver a continuación
Inofensivo el