Напишіть D * mn Однозначний цензор


16

Цензори - це звичайний інструмент, який використовується на інтербетах. Але вони часто цензурують занадто багато слова, і, таким чином, роблять прокляття неоднозначним для читача. І іноді вони недостатньо цензурують, тому слова все ще залишаються ображаючими. Ваше завдання - це виправити.

Ваше завдання

Напишіть програму / функцію / все, що містить два списки та рядок. Перший список буде словник усіх слів на вашій мові , як: ["hello", "goodbye", "belgium", "offensive", "jumping", "hypercool"]. Наступний буде підмножина першого списку , що містить всі образливих слів в мові: ["belgium", "offensive"]. Слова в цих списках гарантовано містять лише малі літери алфавіту.

Рядок - це фраза, яку доведеться цензурувати. Він буде складатися зі слів зі словника, розділених пробілами:"Goodbye offensive belgium"

Поверненим значенням буде ця фраза, цензурована. Однак вам доведеться певним чином цензурувати. Зокрема, для кожного слова у списку образливих ви повинні цензувати якомога більше букв, залишаючись абсолютно однозначним у головному словнику. Так ось це було б: Goodbye o******** b******.

Роз'яснення

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

Випробування

["hello", "goodbye", "belgium", "offensive", "jumping", "hypercool"] ["belgium", "offensive"] "Goodbye offensive belgium" -> "Goodbye o******** b******"
["word"] ["word"] "word" -> "****"
["hot", "hat", "bat", "had"] ["hat"] "hat" -> "*at" or "h*t" or "ha*"
https://gist.github.com/deekayen/4148741 ["quart"] "I am a quart" -> "I am a q**r*"

Це тому найкоротший d * mn код у байтах виграє!

PS Хтось зловив посилання на бельгію? ; P


У своєму поясненні ви говорите, ["hello", "goodbye", "belgium", "offensive"] ["belgium", "offensive"] "Goodbye offensive belgium" -> "Goodbye o******** b******"але тестові випадки говорять ["hello", "goodbye", "belgium", "offensive"] ["belgium", "offensive"] "Goodbye offensive belgium" -> "Goodbye offensive b******" Тестовий випадок неправильний, правильно?
Джеррі Єремія

@JerryJeremiah виправлено.
Мальтісен

5
Я б вам вдячний обмежити зауваження на зразок "B * lgium" чимось художнім.
гістократ

2
@orlp Я думаю, моє питання недостатньо зрозуміле. "Читач" цих цензурованих повідомлень не знає про наявність цензурних списків. Вони просто знають головний дикт.
Малтісен

1
@Maltysen - лише сам Зафод був би досить нахабним, щоб використовувати таке слово, як b ****** у простому тексті, навіть коли пояснював проблему. Я в шоці. Ви, безумовно, не хапі-фуд!
Алхімік

Відповіді:


1

JavaScript ES7, 194 байт

(d,c,s,g=(a,b)=>[...b].reduce((z,l,i)=>z+(a[i]==l?1:0),0))=>[for(s of s.split` `)~d.indexOf(s)?[...c[(x=[for(i of c)g(i,s)]).indexOf(Math.max(...x))]].map((l,i)=>l!=s[i]?`*`:l).join``:s].join` `

Дуже велика функція. Я здогадуюсь, що кілька байтів можна відіграти в гольф, але не дуже, якщо я повністю не зміню спосіб його роботи.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.