Napisz D * mn Jednoznaczny Cenzor

16

Cenzory są powszechnym narzędziem stosowanym w interwebach. Ale często cenzurują zbyt wiele słowa, przez co przekleństwa stają się niejednoznaczne dla czytelnika. A czasem nie cenzurują wystarczająco, więc słowa nadal obrażają. Twoim zadaniem jest to naprawić.

Twoje zadanie

Napisz program / funkcję / cokolwiek, co wymaga dwóch list i ciągu. Pierwsza lista będzie słowniku wszystkich słów w swoim języku, takich jak: ["hello", "goodbye", "belgium", "offensive", "jumping", "hypercool"]. Kolejnym będzie podzbiorem pierwszej listy zawierającej wszystkie obraźliwych słów w języku: ["belgium", "offensive"]. Słowa na tych listach z pewnością zawierają tylko małe litery alfabetu.

Ciąg jest frazą, którą będziesz musiał cenzurować. Będzie się składać ze słów ze słownika, oddzielonych spacjami:"Goodbye offensive belgium"

Zwrócona wartość będzie tą cenzurą. Musisz jednak w pewien sposób cenzurować. W szczególności dla każdego słowa na liście ofensywnej musisz cenzurować jak najwięcej liter, pozostając całkowicie jednoznacznym w głównym słowniku. Więc byłoby to: Goodbye o******** b******.

Wyjaśnienia

  • Kod musi interpretować słowa bez rozróżniania wielkości liter, ale zwraca początkową literę.
  • Jeśli istnieje wiele optymalnych odpowiedzi, wybierz jedną z nich.
  • Jeśli jednoznaczna cenzura jest niemożliwa, ocenzuruj pojedynczą literę, która ma najmniejszą liczbę innych możliwych interpretacji (jeśli wielokrotność jest możliwa, to znowu twój wybór).

Przypadki testowe

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

To jest więc wygrywa najkrótszy d * mn kod w bajtach!

PS Ktoś złapał referencję z Belgii? ; P

Maltysen
źródło
W swoim wyjaśnieniu mówisz, ["hello", "goodbye", "belgium", "offensive"] ["belgium", "offensive"] "Goodbye offensive belgium" -> "Goodbye o******** b******"ale przypadki testowe mówią, że ["hello", "goodbye", "belgium", "offensive"] ["belgium", "offensive"] "Goodbye offensive belgium" -> "Goodbye offensive b******" przypadek testowy jest zły, prawda?
Jerry Jeremiah
@JerryJeremiah naprawione.
Maltysen
5
Chciałbym podziękować za ograniczenie uwag typu „B * lgium” do czegoś artystycznego.
histokrata
2
@orlp Myślę, że moje pytanie nie jest wystarczająco jasne. „Czytelnik” tych cenzurowanych wiadomości nie jest świadomy obecności list cenzurujących. Po prostu znają główny dyktat.
Maltysen
1
@Maltysen - tylko sam Zaphod byłby tak bezczelny, aby użyć słowa takiego jak b ****** w zwykłym tekście, nawet podczas wyjaśniania problemu. Jestem zszokowany. Zdecydowanie nie jesteś obrzydliwym owocem!
Alchymist

Odpowiedzi:

1

JavaScript ES7, 194 bajty

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

Bardzo duża funkcja. Zgaduję, że można oddzielić kilka bajtów, ale niewiele, chyba że całkowicie zmienię sposób działania.

Downgoat
źródło