#include #include #include #include #include #include #include class Word_Filter { public: virtual ~Word_Filter() = default; virtual bool approve(std::string const& word) const = 0; }; class Wordlist_Filter : public Word_Filter { public: Wordlist_Filter(std::string const& file) : word_list{} { std::ifstream iff{file}; std::string word; while ( iff >> word ) { word_list.insert(word); } } bool approve(std::string const& word) const override { return word_list.count(word) == 0; } private: std::set word_list; }; class Four_Letter_Filter : public Word_Filter { public: bool approve(std::string const& word) const override { return word.length() != 4; } }; class Allcaps_Filter : public Word_Filter { public: bool approve(std::string const& word) const override { return ! std::all_of(begin(word), end(word), ::isupper); } }; using namespace std; class Filter { public: Filter() : v{} { } ~Filter() { for ( auto && f : v ) delete f; } bool approve(std::string const& word) const { bool approve{true}; for ( auto const& f : v ) { approve = approve && f->approve(word); } return approve; } void add(Word_Filter* f) { v.push_back(f); } private: vector v; }; int main() { Filter f; f.add(new Wordlist_Filter{"CENSUR.TXT"}); f.add(new Four_Letter_Filter{}); f.add(new Allcaps_Filter{}); cout << setfill('*'); string word; while ( cin >> word ) { if ( f.approve(word) ) cout << word; else cout << setw(word.length()) << "*"; cout << " "; } cout << endl; return 0; }