votre oncle aide les besoins de l'ivresse

10

Drunk Uncle (désolé ME et AUS pour le verrouillage de la région) est un personnage fictif de Saturday Night Live. Il confond souvent les mots pour d'autres qui leur ressemblent. Pour ce défi, vous devez convertir la parole normale en ivresse.

Algorithme

La traduction en drunkspeak nécessite l'échange de l'ordre des mots dans le texte. L'échange est basé sur la similitude de l' ivresse de deux mots. La similitude d'ivresse est définie comme le nombre de lettres que deux mots ont survenant aux mêmes indices . Cependant, deux mots identiques ont une similitude d'ivresse de -1 . Par exemple, treeet friendont une similitude d'ivresse de 2, car ils ont tous les deux un «r» à l'indice 1 et un «e» à l'indice 3.

Tout ce que vous avez à faire est de trouver les deux mots dans le texte avec la plus grande similitude d'ivresse, puis de les échanger. Une fois que vous avez échangé deux termes, ils ne bougent plus. Ensuite, vous regardez les termes échangeables restants et échangez les deux qui ont la plus grande similitude d'ivresse. Vous continuez ainsi jusqu'à ce que vous ne puissiez plus échanger. Ensuite, vous affichez (ou renvoyez, pour une fonction) le texte mis à jour.

Détails

  • Par souci de simplicité, l'entrée est une liste de mots composés de caractères en [A-Za-z]
  • Chaque entrée contient au moins un mot
  • La correspondance des lettres est insensible à la casse: Acorrespond à a( Remarque: En raison de cette règle Doget dogsont identiques, et ont donc un DS de -1)
  • Si plusieurs paires ont la similitude d'ivresse la plus élevée:
    1. Parmi les mots qui peuvent maximiser la similitude de l'ivresse, choisissez celui dont l'indice est le plus bas dans la liste.
    2. Associez ce mot avec le mot d'index le plus bas qui maximise la similitude de l'ivresse

Exemples

  1. Drunk Uncle needs your help (Titre)

    • S 1 : Ivre <=> votre (DS: 1)your Uncle needs Drunk help
    • S 2 : nécessite <=> de l'aide (DS: 1)your Uncle help Drunk needs
    • Production: your Uncle help Drunk needs
  2. I love fidget spinners (exemple ennuyeux)

    • S 1 : J'aime <=> (DS: 0)love I fidget spinners
    • S 2 : fidget <=> filateurs (DS: 0)love I spinners fidget
  3. dog eat dog ear

    • S 1 : manger <=> oreille (DS: 2)dog ear dog eat
    • S 2 : chien <=> chien (DS: -1) dog ear dog eat(cette étape n'est qu'une formalité)
  4. Let me tell you a story

    • S 1 : Laissez-moi <=> (DS: 1)me Let tell you a story
    • S 2 : dites à <=> que vous (DS: 0)me Let you tell a story
    • S 3 : une <=> histoire (DS: 0)me Let you tell story a
  5. Too many money and purple people

    • S 1 : violet <=> personnes (DS: 4)Too many money and people purple
    • S 2 : beaucoup <=> d'argent (DS: 2)Too money many and people purple
    • S 3 : Trop <=> et (DS: 0)and money many Too people purple

Faites-moi savoir s'il y a d'autres exemples que vous souhaitez que je couvre.

geokavel
la source
8
veuillez changer «j'aime les filateurs fid-get» en «je déteste les filateurs fid-get»
Okx
1
"langage naturel"
HyperNeutrino

Réponses:

3

JavaScript - 286 279 octets

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

Vous pouvez l'essayer sur JSFiddle .


la source
Bienvenue (encore) à PPCG :) Belle première soumission!
HyperNeutrino
2

Python 3, 285 277 270 267 octets, ne fonctionne pas

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

J'ai essayé de faire en sorte que la sortie corresponde au défi, pas aux cas de test, car quelques cas de test contredisent le défi.

Edit: golfé le truc «inférieur».

Modifier: changé le split ("") en split ()

Edit: J'ai réalisé que cela ne complète pas tous les trucs, et bien que je puisse trouver une réponse complète, en attendant, je pourrais aussi bien ajouter que cela ne termine qu'une seule itération.

Sans danger
la source
1
Vous devez définir l'un g = str.lowerou l' autre g = lambda s: s.lower()que vous pouvez ensuite utiliser comme ceci .
ბიმო
@Bruce Forte Merci! Cela s'est débarrassé de 8 octets. (Il n'est descendu à 270 que parce que j'ai aussi dû réparer quelque chose pour qu'il permette d'échanger des mots même si la plus grande similitude était 0; cela a ajouté un octet).
Inoffensif
1
Pas de problème et bienvenue chez PPCG! Si vous ne l'avez pas déjà vu, ce type de messages est très utile. Btw .split(' ')peut être remplacé par .split().
ბიმო
Attendez, quels cas de test avez-vous modifiés et qu'est-ce qui n'allait pas?
geokavel
Je n'ai pas assez de représentant pour changer un poste, mais la contradiction apparente était pour le premier exemple - la réponse donnée pour `` l'oncle ivre a besoin de votre aide '' était `` votre oncle a besoin d'aide ivre '' sur `` votre oncle a besoin d'aide ivre ''. Ces deux réponses ont échangé des mots avec le même score de similitude, et elles suivent toutes les deux le bris d'égalité donné en utilisant la première de la paire pour décider laquelle échanger, dans le sens où elles commencent toutes les deux par le premier mot. (Je réalise maintenant en écrivant ceci que la contradiction n'est pas vraiment cela, mais plutôt une ambiguïté). La manière donnée de décider - à court de caractères, voir ensuite
Inoffensif