twój wujek pomaga Pijanym

10

Drunk Uncle (przepraszam ME i AUS za blokadę regionu) to fikcyjna postać z Saturday Night Live. Często myli słowa z innymi, które brzmią jak one. Aby sprostać temu wyzwaniu, musisz zamienić normalną mowę na pijany.

Algorytm

Tłumaczenie na drunkspeak wymaga zamiany kolejności słów w tekście. Zamiana opiera się na podobieństwie dwóch słów do pijaństwa . Podobieństwo pijaństwa definiuje się jako liczbę liter, które dwa słowa występują przy tych samych wskaźnikach . Jednak dwa identyczne słowa mają podobieństwo do pijaństwa -1 . Na przykład treei friendmają podobieństwo do pijaństwa 2, ponieważ oba mają „r” przy indeksie 1 i „e” przy indeksie 3.

Wszystko, co musisz zrobić, to znaleźć dwa słowa w tekście o najwyższym podobieństwie do pijaństwa, a następnie zamienić je. Po zamianie dwóch terminów nie będą się one już ruszać. Następnie patrzysz na pozostałe warunki, które możesz zamienić, i zamieniasz te, które mają najwyższe podobieństwo do pijaństwa. Robisz to tak długo, aż nie będziesz mógł już wymieniać. Następnie wyprowadzasz (lub zwracasz, dla funkcji) zaktualizowany tekst.

Specyfika

  • Dla uproszczenia wprowadzanie to lista słów składających się ze znaków w [A-Za-z]
  • Każde wejście zawiera co najmniej jedno słowo
  • W dopasowywaniu liter nie jest rozróżniana wielkość liter: Apasuje do a( Uwaga: Ze względu na tę zasadę Dogi dogsą identyczne, a zatem mają DS równe -1)
  • Jeśli wiele par ma najwyższe podobieństwo pijaństwa:
    1. Ze słów, które mogą zmaksymalizować podobieństwo pijaństwa, wybierz ten z najniższym indeksem na liście
    2. Połącz to słowo ze słowem o najniższym indeksie, który maksymalizuje podobieństwo pijaństwa

Przykłady

  1. Drunk Uncle needs your help (tytuł)

    • S 1 : Pijany <=> twój (DS: 1)your Uncle needs Drunk help
    • S 2 : potrzebuje pomocy <=> (DS: 1)your Uncle help Drunk needs
    • Wynik: your Uncle help Drunk needs
  2. I love fidget spinners (nudny przykład)

    • S 1 : Kocham <=> (DS: 0)love I fidget spinners
    • S 2 : fidget <=> błystki (DS: 0)love I spinners fidget
  3. dog eat dog ear

    • S 1 : zjedz <=> ucho (DS: 2)dog ear dog eat
    • S 2 : pies <=> pies (DS: -1) dog ear dog eat(ten krok to tylko formalność)
  4. Let me tell you a story

    • S 1 : Niech <=> ja (DS: 1)me Let tell you a story
    • S 2 : powiedz <=> ciebie (DS: 0)me Let you tell a story
    • S 3 : historia <=> (DS: 0)me Let you tell story a
  5. Too many money and purple people

    • S 1 : fioletowe <=> osoby (DS: 4)Too many money and people purple
    • S 2 : wiele <=> pieniędzy (DS: 2)Too money many and people purple
    • S 3 : Zbyt <=> i (DS: 0)and money many Too people purple

Daj mi znać, jeśli chcesz podać więcej przykładów.

geokavel
źródło
8
zmień „kocham fid-get błystki” na „nienawidzę fid-get błystki”
Okx,
1
„język naturalny”
HyperNeutrino

Odpowiedzi:

3

JavaScript - 286 279 bajtów

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

Możesz spróbować na JSFiddle .


źródło
Witamy (ponownie) w PPCG :) Ładne pierwsze zgłoszenie!
HyperNeutrino
2

Python 3, 285 277 270 267 Bajtów, nie działa

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

Próbowałem dopasować dane wyjściowe do wyzwania, a nie przypadków testowych, ponieważ kilka przypadków testowych jest sprzecznych z wyzwaniem.

Edycja: grał w golfa w „niższą” rzecz.

Edycja: zmieniono podział („”) na podział ()

Edycja: Zdałem sobie sprawę, że to właściwie nie kończy wszystkich rzeczy i chociaż mogę znaleźć pełną roboczą odpowiedź, w międzyczasie równie dobrze mogę dodać, że to tylko jedna iteracja.

Nieszkodliwy
źródło
1
Musisz zdefiniować jedną z tych opcji g = str.lowerlub g = lambda s: s.lower()użyć jej w ten sposób .
ბიმო
@Bruce Forte Thanks! Pozbyło się to 8 bajtów. (Ale spadł tylko do 270, ponieważ musiałem też coś naprawić, aby zamieniał słowa, nawet jeśli najwyższe podobieństwo wynosi 0; to dodaje bajt).
Nieszkodliwy
1
Nie ma problemu i witamy w PPCG! Jeśli jeszcze tego nie widziałeś, tego rodzaju posty są bardzo pomocne. Btw .split(' ')można zastąpić .split().
ბიმო
Czekaj, które przypadki testowe zmieniłeś i co było z nimi nie tak?
geokavel
Nie mam wystarczającej liczby przedstawicieli, aby zmienić stanowisko, ale widoczna sprzeczność dotyczyła pierwszego przykładu - podana odpowiedź dla „pijanego wuja potrzebuje twojej pomocy” brzmiała „twoja pomoc wuja pijanego potrzebuje” nad „wujkiem potrzebuje pijanej pomocy”. Obie te odpowiedzi zamieniły słowa z tym samym wynikiem podobieństwa i oba podążają za danym rozstrzygnięciem, używając pierwszej z pary, aby zdecydować, które zamienić, w tym sensie, że oba zaczynają się od pierwszego słowa. (Teraz, kiedy to piszę, zdaję sobie sprawę, że sprzeczność tak naprawdę nie jest tym, ale bardziej niejasnością). Podany sposób decydowania - brakujące znaki patrz dalej
Nieszkodliwy