Escreva um Censor Não-ambíguo D * mn

16

Os censores são uma ferramenta comum usada nas interwebs. Mas eles frequentemente censuram muito a palavra e, assim, tornam a maldição ambígua para o leitor. E às vezes eles não censuram o suficiente, então as palavras ainda permanecem ofensivas. Sua tarefa é consertar isso.

Sua tarefa

Escreva um programa / função / o que tiver duas listas e uma string. A primeira lista será o dicionário de todas as palavras em sua língua como: ["hello", "goodbye", "belgium", "offensive", "jumping", "hypercool"]. A próxima será subconjunto da primeira lista contendo todas as ofensivas palavras na língua: ["belgium", "offensive"]. As palavras nestas listas são garantidas para conter apenas letras minúsculas do alfabeto.

A string é a frase que você terá que censurar. Será composto de palavras do dicionário, separadas por espaços:"Goodbye offensive belgium"

O valor de retorno será a frase censurada. No entanto, você precisa censurar de uma certa maneira. Especificamente, para cada palavra da lista ofensiva, você deve censurar o máximo de letras possível, permanecendo completamente inequívoco no dicionário principal. Então aqui seria: Goodbye o******** b******.

Esclarecimentos

  • Seu código deve interpretar as palavras sem distinção entre maiúsculas e minúsculas, mas retornar com a capitalização inicial.
  • Se houver várias respostas ótimas, escolha uma delas.
  • Se a censura inequívoca for impossível, censure uma única letra que tenha o menor número de outras interpretações possíveis (se várias forem possíveis, novamente, a escolha é sua).

Casos de teste

["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*"

Este é o pelo que o menor código d * mn em bytes vence!

PS Alguém pegou a referência com a Bélgica? ; P

Maltysen
fonte
Na sua explicação, você diz, ["hello", "goodbye", "belgium", "offensive"] ["belgium", "offensive"] "Goodbye offensive belgium" -> "Goodbye o******** b******"mas os casos de teste dizem ["hello", "goodbye", "belgium", "offensive"] ["belgium", "offensive"] "Goodbye offensive belgium" -> "Goodbye offensive b******" O caso de teste está errado, correto?
Jerry Jeremiah
@JerryJeremiah corrigido.
Maltysen 29/07
5
Agradeço a você por limitar comentários como "B * lgium" a algo artístico.
Histocrat 29/07/2015
2
@ orlp Acho que minha pergunta não é clara o suficiente. O "leitor" dessas mensagens censuradas não está ciente da presença das listas de censores. Eles apenas conhecem o ditado principal.
Maltysen 29/07/2015
11
@ Maltysen - apenas o próprio Zaphod seria descarado o suficiente para usar uma palavra como b ****** em texto simples, mesmo ao explicar o problema. Estou chocado. Você definitivamente não é um idiota!
Alquimista

Respostas:

1

JavaScript ES7, 194 bytes

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

Uma função muito grande. Eu estou supondo que alguns bytes podem ser eliminados, mas não muito, a menos que eu mude completamente a maneira como funciona.

Downgoat
fonte