Ecrire un D * mn Censeur sans ambiguïté

16

Les censeurs sont un outil commun utilisé sur les interwebs. Mais ils censurent trop souvent le mot et rendent ainsi la malédiction ambiguë pour le lecteur. Et parfois, ils ne censurent pas suffisamment, alors les mots restent choquants. Votre tâche consiste à résoudre ce problème.

Ta tâche

Écrivez un programme / une fonction / tout ce qui prend deux listes et une chaîne. La première liste sera le dictionnaire de tous les mots dans votre langue comme: ["hello", "goodbye", "belgium", "offensive", "jumping", "hypercool"]. Le prochain sera sous - ensemble de la première liste contenant toutes les offensives des mots dans la langue: ["belgium", "offensive"]. Les mots de ces listes sont garantis pour ne contenir que des lettres minuscules de l'alphabet.

La chaîne est la phrase que vous devrez censurer. Il sera composé de mots du dictionnaire, séparés par des espaces:"Goodbye offensive belgium"

La valeur de retour sera cette phrase censurée. Cependant, vous devez censurer d'une certaine manière. Plus précisément, pour chaque mot de la liste offensive, vous devez censurer autant de lettres que possible tout en restant complètement sans ambiguïté dans le dictionnaire principal. Voici donc ce serait: Goodbye o******** b******.

Clarifications

  • Votre code doit interpréter les mots sans tenir compte de la casse, mais revenir avec la capitalisation initiale.
  • S'il y a plusieurs réponses optimales, choisissez l'une d'entre elles.
  • Si la censure sans ambiguïté est impossible, censurez une seule lettre contenant le moins d'interprétations possibles (si plusieurs sont possibles, encore une fois, c'est votre choix).

Cas de test

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

C'est le donc le d * mn le plus court en octets gagne!

PS Quelqu'un a attrapé la référence avec la Belgique? ; P

Maltysen
la source
Dans votre explication, vous dites ["hello", "goodbye", "belgium", "offensive"] ["belgium", "offensive"] "Goodbye offensive belgium" -> "Goodbye o******** b******"mais les cas de test disent ["hello", "goodbye", "belgium", "offensive"] ["belgium", "offensive"] "Goodbye offensive belgium" -> "Goodbye offensive b******" Le cas de test est faux, n'est-ce pas?
Jerry Jeremiah
@JerryJeremiah corrigé.
Maltysen
5
Je vous remercie de limiter les remarques comme "B * lgium" à quelque chose d'artistique.
histocrate
2
@orlp Je suppose que ma question n'est pas assez claire. Le "lecteur" de ces messages censurés n'est pas au courant de la présence des listes de censure. Ils connaissent juste le dict principal.
Maltysen
1
@Maltysen - seul Zaphod lui-même serait assez effronté pour utiliser un mot comme b ****** en texte brut, même pour expliquer le problème. Je suis choqué. Vous n'êtes certainement pas un froufrou!
Alchymist

Réponses:

1

JavaScript ES7, 194 octets

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

Une très grande fonction. Je suppose que quelques octets peuvent être joués, mais pas beaucoup à moins que je change complètement la façon dont cela fonctionne.

Downgoat
la source