ваш дядько допомога П'яний потребує


10

П'яний дядько (вибачте мене та АУС за блокування регіону) - вигаданий персонаж із Saturday Night Live. Він часто плутає слова для інших, які звучать як вони. Для цього виклику вам потрібно перетворити нормальну мову в п'яний.

Алгоритм

Переклад на п'яний вимовляє потребу замінювати порядок слів у тексті. Обмін базується на схожості пияцтва двох слів. Подібність пияцтва визначається як кількість літер, у яких два слова мають однакові показники . Однак два однакових слова мають схожість на пияцтво -1 . Наприклад, treeі friendмають схожість на пияцтво 2, оскільки вони обидва мають 'r' в індексі 1, а 'e' на індексі 3.

Все, що вам потрібно зробити - це знайти два слова в тексті з найбільшою схожістю на пияцтво, а потім поміняти їх. Після того, як ви поміняєте місцями два терміни, вони більше не рухаються. Потім ви дивитесь на інші терміни, що можна змінити, і поміняйте місцями, які мають найбільшу схожість на пияцтво. Ви продовжуєте це робити, поки не зможете більше поміняти місцями. Потім ви виводите (або повертаєте для функції) оновлений текст.

Особливості

  • Для простоти введення - це список слів, що складається з символів у [A-Za-z]
  • Кожен вхід містить принаймні одне слово
  • Буква відповідності невідчутно до регістру: Aматчі з a( Примітка: У зв'язку з цим правилом Dogі dogє ідентичними, і , отже , мають DS від -1)
  • Якщо кілька пар мають найбільшу схожість на пияцтво:
    1. Зі слів, які можуть збільшити схожість на пияцтво, виберіть одне із найнижчим показником у списку
    2. З'єднайте це слово з найнижчим показником, яке максимально схоже на пияцтво

Приклади

  1. Drunk Uncle needs your help (назва)

    • S 1 : П'яний <=> ваш (DS: 1)your Uncle needs Drunk help
    • S 2 : потрібна <=> допомога (DS: 1)your Uncle help Drunk needs
    • Вихід: your Uncle help Drunk needs
  2. I love fidget spinners (нудний приклад)

    • S 1 : Я <=> любов (DS: 0)love I fidget spinners
    • S 2 : фіджери <=> спінери (DS: 0)love I spinners fidget
  3. dog eat dog ear

    • S 1 : їжте <=> вухо (DS: 2)dog ear dog eat
    • S 2 : собака <=> собака (DS: -1) dog ear dog eat(цей крок просто формальність)
  4. Let me tell you a story

    • S 1 : Нехай <=> мене (DS: 1)me Let tell you a story
    • S 2 : скажіть <=> ви (DS: 0)me Let you tell a story
    • S 3 : історія <=> (DS: 0)me Let you tell story a
  5. Too many money and purple people

    • S 1 : фіолетовий <=> людей (DS: 4)Too many money and people purple
    • S 2 : багато <=> грошей (DS: 2)Too money many and people purple
    • S 3 : Занадто <=> і (DS: 0)and money many Too people purple

Повідомте мене, чи є ще кілька прикладів, які ви хочете висвітлити.


8
будь ласка, змініть "я люблю фіндер-дістати спінерів" на "я ненавиджу фід-отримуй
спінерів

1
"природна мова"
HyperNeutrino

Відповіді:


3

JavaScript - 286 279 байт

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

Ви можете спробувати його на JSFiddle .


Ласкаво просимо (знову) до PPCG :) Приємного першого подання!
HyperNeutrino

2

Python 3, 285 277 270 267 Bytes, не працює

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

Я намагався зробити так, щоб результати відповідали виклику, а не тестовим, оскільки пара тестових випадків суперечить виклику.

Правка: гольф 'нижній' речі.

Редагувати: змінити розділення ("") на розділити ()

Редагувати: Я зрозумів, що це насправді не завершує всі речі, і хоча я можу придумати повну робочу відповідь, тим часом я можу також додати, що це завершує лише одну ітерацію.


1
Вам потрібно визначити або g = str.lowerабо g = lambda s: s.lower()які ви потім можете використовувати як цей .
ბიმო

@Bruce Forte Дякую! Це позбулося 8 байт. (Це знизилося лише до 270, хоча тому, що я також повинен був виправити щось, щоб він мінявся словами, навіть якщо найвища подібність була 0; це додало байт).
Нешкідливий

1
Без проблем і ласкаво просимо до PPCG! Якщо ви ще не бачили, подібні публікації дуже корисні. Btw .split(' ')можна замінити на .split().
ბიმო

Зачекайте, які тестові справи ви змінили, і що було з ними?
геокавель

У мене не вистачає представника, щоб змінити посаду, але очевидне протиріччя було для першого прикладу - дана відповідь "п’яний дядько потребує вашої допомоги" був "дядькові допомога п'яного потребує" над "дядькові потрібна п'яна допомога". Обидва ці відповіді обмінялися словами однаковим балом подібності, і вони обидва слідують за вашим заданим вимикачем, використовуючи перший з пари, щоб вирішити, на що поміняти, в тому сенсі, що вони обидва починають з першого слова. (Я зараз розумію, коли пишу це, що суперечність насправді не це, а більше двозначність). Даний спосіб decide- закінчуються символів см next-
Нешкідливі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.