твой дядя поможет пьяным

10

Пьяный дядя (извините меня и AUS за блокировку региона) - вымышленный персонаж из Saturday Night Live. Он часто путает слова для других, которые звучат как они. Для этого задания вам необходимо преобразовать обычную речь в пьяный.

Алгоритм

Для перевода в drunkspeak требуется поменять порядок слов в тексте. Обмен основан на сходстве пьянства двух слов. Сходство с пьянством определяется как количество букв, встречающихся у двух слов с одинаковыми показателями . Тем не менее, два идентичных слова имеют сходство пьянства -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

Дайте мне знать, если вы хотите, чтобы я привел еще несколько примеров.

geokavel
источник
8
пожалуйста, поменяйте «я люблю вращатели fid-get» на «я ненавижу вращатели fid-get»
Okx
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 байт, не работает

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

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

Редактировать: игра в гольф "нижняя" вещь

Изменить: изменил split ("") на split ()

Изменить: я понял, что это на самом деле не завершает все вещи, и хотя я мог бы получить полный рабочий ответ, тем временем я мог бы также добавить, что это завершает только одну итерацию.

безвредный
источник
1
Вам нужно определить g = str.lowerили то, g = lambda s: s.lower()что вы можете использовать таким образом .
ბიმო
@ Брюс Форте Спасибо! Это избавилось от 8 байтов. (Он только уменьшился до 270, потому что мне также пришлось исправить вещь, чтобы сделать так, чтобы она поменялась словами, даже если наибольшее сходство было 0; это добавило байт).
Безобидный
1
Нет проблем и добро пожаловать в PPCG! Если вы еще не видели, такие сообщения очень полезны. Кстати .split(' ')можно заменить .split().
ბიმო
Подождите, какие тестовые примеры вы изменили, и что с ними не так?
геокавель
У меня недостаточно представителя, чтобы сменить пост, но очевидное противоречие было для первого примера: ответ «пьяный дядя нуждается в вашей помощи» был «ваш дядя помогает пьяным», а не «ваш дядя нуждается в пьяной помощи». Оба из этих ответов поменялись местами с одинаковым показателем сходства, и они оба следуют вашему заданному тай-брейку, используя первый из пары, чтобы решить, какой обмен поменять, в том смысле, что оба они начинаются с первого слова. (Теперь, когда я пишу это, я осознаю, что противоречие на самом деле не в этом, а в большей степени двусмысленность). Данный способ решить - закончились символы, см. Далее
Безвредный