Scrivi un D * mn Unambiguous Censor


16

I censori sono uno strumento comune utilizzato negli interwebs. Ma spesso censurano troppo la parola, e quindi rendono la maledizione ambigua al lettore. E a volte non censurano abbastanza, quindi le parole rimangono ancora offensive. Il tuo compito è risolverlo.

Il tuo compito

Scrivi un programma / funzione / qualunque cosa richieda due liste e una stringa. Il primo elenco sarà il dizionario di tutte le parole nella tua lingua come: ["hello", "goodbye", "belgium", "offensive", "jumping", "hypercool"]. Il prossimo sarà sottoinsieme del primo elenco contenente tutte le offensive parole nella lingua: ["belgium", "offensive"]. Le parole in questi elenchi sono garantite per contenere solo lettere minuscole dell'alfabeto.

La stringa è la frase che dovrai censurare. Sarà composto da parole del dizionario, separate da spazi:"Goodbye offensive belgium"

Il valore restituito sarà quella frase censurata. Tuttavia, devi censurare in un certo modo. In particolare, per ogni parola nella lista offensiva, devi censurare quante più lettere possibile rimanendo completamente inequivocabile nel dizionario principale. Così qui sarebbe: Goodbye o******** b******.

chiarimenti

  • Il codice deve interpretare le parole senza distinzione tra maiuscole e minuscole, ma restituire con la maiuscola iniziale.
  • Se ci sono più risposte ottimali, scegline una qualsiasi.
  • Se la censura inequivocabile è impossibile, censurare una singola lettera che ha il minor numero di altre interpretazioni possibili (se sono possibili più multipli, di nuovo, è una tua scelta).

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

Questo è quindi vince il codice d * mn più breve in byte!

PS Qualcuno ha colto il riferimento con il Belgio? ; P


Nella tua spiegazione dici ["hello", "goodbye", "belgium", "offensive"] ["belgium", "offensive"] "Goodbye offensive belgium" -> "Goodbye o******** b******"ma i casi di test dicono ["hello", "goodbye", "belgium", "offensive"] ["belgium", "offensive"] "Goodbye offensive belgium" -> "Goodbye offensive b******" Il caso di test è sbagliato, giusto?
Jerry Jeremiah,

@JerryJeremiah fixed.
Maltysen,

5
Ti ringrazio per limitare le osservazioni come "B * lgium" a qualcosa di artistico.
istocratico

2
@orlp Immagino che la mia domanda non sia abbastanza chiara. Il "lettore" di questi messaggi censurati non è a conoscenza della presenza degli elenchi dei censori. Conoscono solo il detto principale.
Maltysen,

1
@Maltysen - solo Zaphod stesso sarebbe abbastanza sfacciato da usare una parola come b ****** in testo semplice, anche quando si spiega il problema. Sono scioccato. Sicuramente non sei un frode hoop!
Alchymist

Risposte:


1

JavaScript ES7, 194 byte

(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 funzione molto grande. Immagino che alcuni byte possano essere eliminati ma non molto a meno che non cambi completamente il modo in cui funziona.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.