Escribir un D * mn Censor inequívoco

16

Los censores son una herramienta común utilizada en las interwebs. Pero a menudo censuran demasiado la palabra y, por lo tanto, hacen que la maldición sea ambigua para el lector. Y a veces no censuran lo suficiente, por lo que las palabras siguen siendo ofensivas. Tu tarea es arreglar eso.

Tu tarea

Escriba un programa / función / lo que sea que requiera dos listas y una cadena. La primera lista será el diccionario de todas las palabras en su idioma como: ["hello", "goodbye", "belgium", "offensive", "jumping", "hypercool"]. El próximo se subconjunto de la primera lista que contiene todas las ofensivas palabras en la lengua: ["belgium", "offensive"]. Se garantiza que las palabras en estas listas contienen solo letras minúsculas del alfabeto.

La cadena es la frase que tendrás que censurar. Estará compuesto por palabras del diccionario, separadas por espacios:"Goodbye offensive belgium"

El valor de retorno será esa frase censurada. Sin embargo, tienes que censurar de cierta manera. Específicamente, para cada palabra en la lista ofensiva, debe censurar tantas letras como sea posible mientras permanece completamente inequívoco en el diccionario principal. Así que aquí sería: Goodbye o******** b******.

Aclaraciones

  • Su código tiene que interpretar las palabras sin distinción entre mayúsculas y minúsculas, pero regresa con las mayúsculas iniciales.
  • Si hay múltiples respuestas óptimas, elija cualquiera de ellas.
  • Si la censura inequívoca es imposible, censure una sola letra que tenga el menor número posible de otras interpretaciones posibles (si es posible múltiples, nuevamente, es su elección).

Casos de prueba

["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 es el d * mn más corto en bytes gana!

PD: ¿Alguien captó la referencia con Bélgica? ;PAG

Maltysen
fuente
En su explicación, usted dice, ["hello", "goodbye", "belgium", "offensive"] ["belgium", "offensive"] "Goodbye offensive belgium" -> "Goodbye o******** b******"pero los casos de prueba dicen: ["hello", "goodbye", "belgium", "offensive"] ["belgium", "offensive"] "Goodbye offensive belgium" -> "Goodbye offensive b******" El caso de prueba está mal, ¿correcto?
Jerry Jeremiah
@JerryJeremiah arreglado.
Maltysen
55
Le agradecería que limite los comentarios como "B * lgium" a algo artístico.
histocrat
2
@orlp Supongo que mi pregunta no es lo suficientemente clara. El "lector" de estos mensajes censurados no es consciente de la presencia de las listas de censura. Solo conocen el dict principal.
Maltysen
1
@Maltysen: solo el propio Zaphod sería lo suficientemente descarado como para usar una palabra como b ****** en texto plano, incluso al explicar el problema. Estoy sorprendido ¡Definitivamente no eres un hoopy frood!
Alchymist

Respuestas:

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

Una función muy grande. Supongo que algunos bytes se pueden eliminar pero no mucho a menos que cambie por completo la forma en que funciona.

Downgoat
fuente