Написать 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*"

Это поэтому выигрывает самый короткий код в байтах!

PS Кто-нибудь поймал ссылку с Бельгией? ;П

Maltysen
источник
В своем объяснении вы говорите, ["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 исправлено.
Maltysen
5
Я бы хотел поблагодарить вас за то, чтобы ограничить такие замечания, как «B * lgium», чем-нибудь художественным.
гистократ
2
@ или я думаю, мой вопрос недостаточно ясен. «Читатель» этих цензурных сообщений не знает о наличии списков цензоров. Они просто знают главный дикт.
Maltysen
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` `

Очень большая функция. Я предполагаю, что несколько байтов могут быть проиграны, но не намного, если я полностью не изменю способ, которым это работает.

Downgoat
источник