Ihr Onkel hilft Betrunkenen braucht


10

Drunk Onkel (sorry ME und AUS für Region Lock) ist eine fiktive Figur aus Saturday Night Live. Er verwechselt oft Wörter mit anderen, die wie sie klingen. Für diese Herausforderung müssen Sie normale Sprache in betrunkene Sprache umwandeln.

Algorithmus

Das Übersetzen in Drunkspeak erfordert das Vertauschen der Wortreihenfolge im Text. Das Tauschen basiert auf der Ähnlichkeit zweier Wörter mit Trunkenheit . Die Ähnlichkeit der Trunkenheit ist definiert als die Anzahl der Buchstaben, die zwei Wörter an denselben Indizes haben . Doch zwei identische Wörter haben eine Trunkenheit Ähnlichkeit von -1 . Zum Beispiel treeund friendhaben eine Trunkenheitsähnlichkeit von 2, weil beide ein 'r' bei Index 1 und ein 'e' bei Index 3 haben.

Alles, was Sie tun müssen, ist, die beiden Wörter im Text mit der höchsten Ähnlichkeit der Trunkenheit zu finden und sie dann auszutauschen. Sobald Sie zwei Begriffe vertauscht haben, bewegen sie sich nicht mehr. Dann schauen Sie sich die verbleibenden austauschbaren Begriffe an und tauschen die beiden aus, die die höchste Ähnlichkeit mit Trunkenheit aufweisen. Sie machen so lange weiter, bis Sie nicht mehr tauschen können. Dann geben Sie den aktualisierten Text aus (oder geben ihn für eine Funktion zurück).

Besonderheiten

  • Der Einfachheit halber ist die Eingabe eine Liste von Wörtern, die aus Zeichen in [A-Za-z] bestehen.
  • Jede Eingabe enthält mindestens ein Wort
  • Schreiben Anpassung ist Groß- und Kleinschreibung: ABegegnungen mit a( Hinweis: Aufgrund dieser Regel Dogund dogsind identisch und haben somit einen DS von -1)
  • Wenn mehrere Paare die höchste Trunkenheitsähnlichkeit aufweisen:
    1. Wählen Sie aus den Wörtern, die die Ähnlichkeit der Trunkenheit maximieren können, das Wort mit dem niedrigsten Index in der Liste aus
    2. Kombinieren Sie dieses Wort mit dem Wort mit dem niedrigsten Index, das die Ähnlichkeit der Trunkenheit maximiert

Beispiele

  1. Drunk Uncle needs your help (Titel)

    • S 1 : Betrunken <=> dein (DS: 1)your Uncle needs Drunk help
    • S 2 : braucht <=> Hilfe (DS: 1)your Uncle help Drunk needs
    • Ausgabe: your Uncle help Drunk needs
  2. I love fidget spinners (langweiliges Beispiel)

    • S 1 : Ich liebe <=> (DS: 0)love I fidget spinners
    • S 2 : zappeln <=> Spinner (DS: 0)love I spinners fidget
  3. dog eat dog ear

    • S 1 : <=> Ohr essen (DS: 2)dog ear dog eat
    • S 2 : Hund <=> Hund (DS: -1) dog ear dog eat(dieser Schritt nur Formalität)
  4. Let me tell you a story

    • S 1 : Lass mich <=> (DS: 1)me Let tell you a story
    • S 2 : Sag <=> dir (DS: 0)me Let you tell a story
    • S 3 : eine <=> Geschichte (DS: 0)me Let you tell story a
  5. Too many money and purple people

    • S 1 : lila <=> Personen (DS: 4)Too many money and people purple
    • S 2 : viel <=> Geld (DS: 2)Too money many and people purple
    • S 3 : Zu <=> und (DS: 0)and money many Too people purple

Lassen Sie mich wissen, ob es weitere Beispiele gibt, die ich behandeln soll.


8
Bitte ändern Sie "Ich liebe Fid-Get-Spinner" in "Ich hasse Fid-Get-Spinner"
Okx

1
"natürliche Sprache"
HyperNeutrino

Antworten:


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

Sie können es auf JSFiddle versuchen .


Willkommen (wieder) bei PPCG :) Schöne erste Einreichung!
HyperNeutrino

2

Python 3, 285 277 270 267 Bytes, funktioniert nicht

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

Ich habe versucht, die Ausgabe an die Herausforderung anzupassen, nicht an die Testfälle, da einige der Testfälle der Herausforderung widersprechen.

Bearbeiten: Golf das "untere" Ding.

Bearbeiten: Split ("") in Split () geändert

Bearbeiten: Ich habe festgestellt, dass dies nicht alle Dinge vervollständigt, und obwohl ich möglicherweise eine vollständige Antwort gefunden habe, kann ich in der Zwischenzeit genauso gut hinzufügen, dass dies nur eine Iteration abschließt.


1
Sie müssen entweder definieren g = str.loweroder g = lambda s: s.lower()welche Sie dann so verwenden können .
9.

@ Bruce Forte Danke! Dadurch wurden 8 Bytes entfernt. (Es ging jedoch nur auf 270 zurück, weil ich auch etwas reparieren musste, um es so zu machen, dass es Wörter austauscht, selbst wenn die höchste Ähnlichkeit 0 ist; dies fügte ein Byte hinzu).
Harmlos

1
Kein Problem und willkommen bei PPCG! Wenn Sie noch nicht gesehen haben, sind diese Art von Beiträgen sehr hilfreich. Übrigens .split(' ')kann durch ersetzt werden .split().
9.

Warten Sie, welche Testfälle haben Sie geändert und was war daran falsch?
Geokavel

Ich habe nicht genug Repräsentanten, um einen Beitrag zu ändern, aber der offensichtliche Widerspruch war für das erste Beispiel - die gegebene Antwort für "betrunkener Onkel braucht deine Hilfe" war "dein Onkel hilft betrunken" über "dein Onkel braucht betrunkene Hilfe". Beide Antworten tauschten Wörter mit der gleichen Ähnlichkeitsbewertung aus, und beide folgen Ihrem gegebenen Gleichstand, indem sie den ersten des Paares verwenden, um zu entscheiden, welcher ausgetauscht werden soll, in dem Sinne, dass beide mit dem ersten Wort beginnen. (Ich merke jetzt, während ich das schreibe, dass der Widerspruch nicht wirklich das ist, sondern eher eine Mehrdeutigkeit). Der gegebene Weg, um zu entscheiden, dass die Zeichen ausgehen, siehe weiter
Harmless
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.