Schreiben Sie einen D * mn-eindeutigen Zensor

16

Zensoren sind ein verbreitetes Werkzeug, das in den Interwebs verwendet wird. Aber sie zensieren oft zu viel des Wortes und machen so den Fluch für den Leser mehrdeutig. Und manchmal zensieren sie nicht genug, sodass die Worte immer noch beleidigend sind. Ihre Aufgabe ist es, das zu beheben.

Deine Aufgabe

Schreiben Sie ein Programm / eine Funktion / was auch immer, das zwei Listen und eine Zeichenfolge benötigt. Die erste Liste wird das Wörterbuch aller Wörter in Ihrer Sprache wie: ["hello", "goodbye", "belgium", "offensive", "jumping", "hypercool"]. Der nächste wird von der ersten Liste Subset werden alle der enthält Offensive Wörter in der Sprache: ["belgium", "offensive"]. Die Wörter in diesen Listen enthalten garantiert nur Kleinbuchstaben des Alphabets.

Die Zeichenfolge ist die Phrase, die Sie zensieren müssen. Es besteht aus Wörtern aus dem Wörterbuch, die durch Leerzeichen getrennt sind:"Goodbye offensive belgium"

Der Rückgabewert ist die zensierte Phrase. Sie müssen jedoch in gewisser Weise zensieren. Insbesondere müssen Sie für jedes Wort in der beleidigenden Liste so viele Buchstaben wie möglich zensieren, während Sie im Hauptwörterbuch völlig eindeutig bleiben. So , hier wäre es: Goodbye o******** b******.

Klarstellungen

  • Ihr Code muss die Wörter unabhängig von Groß- und Kleinschreibung interpretieren, aber mit der anfänglichen Groß- und Kleinschreibung zurückgeben.
  • Wenn es mehrere optimale Antworten gibt, wählen Sie eine aus.
  • Wenn eine eindeutige Zensur nicht möglich ist, zensieren Sie einen einzelnen Buchstaben, der die geringste Anzahl anderer möglicher Interpretationen aufweist (falls mehrere möglich sind, ist dies wiederum Ihre Wahl).

Testfälle

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

Dies ist also gewinnt der kürzeste D * MN-Code in Bytes!

PS Hat jemand die Referenz mit Belgien erwischt? ; P

Maltysen
quelle
In Ihrer Erklärung sagen Sie, ["hello", "goodbye", "belgium", "offensive"] ["belgium", "offensive"] "Goodbye offensive belgium" -> "Goodbye o******** b******"aber die Testfälle sagen, ["hello", "goodbye", "belgium", "offensive"] ["belgium", "offensive"] "Goodbye offensive belgium" -> "Goodbye offensive b******" der Testfall ist falsch, richtig?
Jerry Jeremiah
@ JerryJeremiah behoben.
Maltysen
5
Ich danke Ihnen, dass Sie Bemerkungen wie "B * lgium" auf etwas Künstlerisches beschränken.
Histokrat
2
@orlp Ich denke, meine Frage ist nicht klar genug. Dem "Leser" dieser zensierten Nachrichten ist das Vorhandensein der Zensurlisten nicht bekannt. Sie kennen nur das Hauptgebot.
Maltysen
1
@Maltysen - nur Zaphod selbst wäre dreist genug, um ein Wort wie b ****** im Klartext zu verwenden, selbst wenn er das Problem erklärt. Ich bin schockiert. Du bist definitiv kein Mistkerl!
Alchymist

Antworten:

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

Eine sehr große Funktion. Ich vermute, dass ein paar Bytes entfernt werden können, aber nicht viel, wenn ich nicht die Art und Weise, wie es funktioniert, komplett ändere.

Downgoat
quelle