diff options
Diffstat (limited to 'generator.cpp')
| -rw-r--r-- | generator.cpp | 27 |
1 files changed, 18 insertions, 9 deletions
| diff --git a/generator.cpp b/generator.cpp index c4dd76f..6b6c1be 100644 --- a/generator.cpp +++ b/generator.cpp | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | #include <cctype> | 5 | #include <cctype> |
| 6 | #include <hkutil/string.h> | 6 | #include <hkutil/string.h> |
| 7 | 7 | ||
| 8 | verbly::filter Generator::MakeHintFilter(verbly::filter subfilter, Height height, Colour colour, FilterDirection filter_direction) | 8 | verbly::filter Generator::MakeHintFilter(verbly::filter subfilter, Height height, Colour colour, FilterDirection filter_direction) const |
| 9 | { | 9 | { |
| 10 | switch (colour) { | 10 | switch (colour) { |
| 11 | case kWhite: { | 11 | case kWhite: { |
| @@ -304,7 +304,7 @@ bool Generator::GenerateSinglePanelImpl(std::string name, Height height, Colour | |||
| 304 | if (questions.size() < 1) return false; | 304 | if (questions.size() < 1) return false; |
| 305 | verbly::form question = questions.front();// questions.at(std::uniform_int_distribution<int>(0, questions.size())(rng_)); | 305 | verbly::form question = questions.front();// questions.at(std::uniform_int_distribution<int>(0, questions.size())(rng_)); |
| 306 | 306 | ||
| 307 | if (IsClueTrivial(height, colour, question, solution)) { | 307 | if (IsClueTrivial(height, colour, question, solution, options)) { |
| 308 | return false; | 308 | return false; |
| 309 | } | 309 | } |
| 310 | if (options.max_len_diff >= 0 && std::abs(static_cast<int>(question.getText().size() - solution.getText().size())) > options.max_len_diff) { | 310 | if (options.max_len_diff >= 0 && std::abs(static_cast<int>(question.getText().size() - solution.getText().size())) > options.max_len_diff) { |
| @@ -357,7 +357,7 @@ bool Generator::GenerateDoublePanelImpl(std::string name1, std::string name2, He | |||
| 357 | 357 | ||
| 358 | //std::shuffle(questions.begin(), questions.end(), rng_); | 358 | //std::shuffle(questions.begin(), questions.end(), rng_); |
| 359 | 359 | ||
| 360 | if (IsClueTrivial(height, colour, questions[0], solution) || IsClueTrivial(height, colour, questions[1], solution)) { | 360 | if (IsClueTrivial(height, colour, questions[0], solution, options) || IsClueTrivial(height, colour, questions[1], solution, options)) { |
| 361 | return false; | 361 | return false; |
| 362 | } | 362 | } |
| 363 | if (options.max_len_diff >= 0) { | 363 | if (options.max_len_diff >= 0) { |
| @@ -395,7 +395,8 @@ bool Generator::GenerateCohintedPanelsImpl(std::string name1, std::string name2, | |||
| 395 | 395 | ||
| 396 | //std::shuffle(questions.begin(), questions.end(), rng_); | 396 | //std::shuffle(questions.begin(), questions.end(), rng_); |
| 397 | 397 | ||
| 398 | if (IsClueTrivial(height, colour, question, solutions[0]) || IsClueTrivial(height, colour, question, solutions[1])) { | 398 | if (IsClueTrivial(height, colour, question, solutions[0], options) |
| 399 | || IsClueTrivial(height, colour, question, solutions[1], options)) { | ||
| 399 | return false; | 400 | return false; |
| 400 | } | 401 | } |
| 401 | if (options.max_len_diff >= 0) { | 402 | if (options.max_len_diff >= 0) { |
| @@ -428,7 +429,7 @@ bool Generator::GeneratePairedPanelsImpl(std::string name1, std::string name2, H | |||
| 428 | if (questions.size() < 1) return false; | 429 | if (questions.size() < 1) return false; |
| 429 | verbly::form question = questions.front();// questions.at(std::uniform_int_distribution<int>(0, questions.size())(rng_)); | 430 | verbly::form question = questions.front();// questions.at(std::uniform_int_distribution<int>(0, questions.size())(rng_)); |
| 430 | 431 | ||
| 431 | if (IsClueTrivial(height, effectiveColour, question, solution)) { | 432 | if (IsClueTrivial(height, effectiveColour, question, solution, options)) { |
| 432 | return false; | 433 | return false; |
| 433 | } | 434 | } |
| 434 | 435 | ||
| @@ -506,7 +507,7 @@ bool Generator::GeneratePanelStackImpl(std::string top_name, Colour top_colour, | |||
| 506 | if (questions.empty()) return false; | 507 | if (questions.empty()) return false; |
| 507 | top_hint = questions.front().getText(); | 508 | top_hint = questions.front().getText(); |
| 508 | 509 | ||
| 509 | if (IsClueTrivial(kTop, top_colour, questions.front(), solution)) { | 510 | if (IsClueTrivial(kTop, top_colour, questions.front(), solution, options)) { |
| 510 | return false; | 511 | return false; |
| 511 | } | 512 | } |
| 512 | } | 513 | } |
| @@ -517,7 +518,7 @@ bool Generator::GeneratePanelStackImpl(std::string top_name, Colour top_colour, | |||
| 517 | if (questions.empty()) return false; | 518 | if (questions.empty()) return false; |
| 518 | middle_hint = questions.front().getText(); | 519 | middle_hint = questions.front().getText(); |
| 519 | 520 | ||
| 520 | if (IsClueTrivial(kMiddle, middle_colour, questions.front(), solution)) { | 521 | if (IsClueTrivial(kMiddle, middle_colour, questions.front(), solution, options)) { |
| 521 | return false; | 522 | return false; |
| 522 | } | 523 | } |
| 523 | } | 524 | } |
| @@ -528,7 +529,7 @@ bool Generator::GeneratePanelStackImpl(std::string top_name, Colour top_colour, | |||
| 528 | if (questions.empty()) return false; | 529 | if (questions.empty()) return false; |
| 529 | bottom_hint = questions.front().getText(); | 530 | bottom_hint = questions.front().getText(); |
| 530 | 531 | ||
| 531 | if (IsClueTrivial(kBottom, bottom_colour, questions.front(), solution)) { | 532 | if (IsClueTrivial(kBottom, bottom_colour, questions.front(), solution, options)) { |
| 532 | return false; | 533 | return false; |
| 533 | } | 534 | } |
| 534 | } | 535 | } |
| @@ -708,6 +709,7 @@ verbly::filter Generator::GetWordFilter(FilterDirection dir, GenerateOptions opt | |||
| 708 | wordFilter &= (verbly::form::complexity == 2); | 709 | wordFilter &= (verbly::form::complexity == 2); |
| 709 | } else { | 710 | } else { |
| 710 | wordFilter &= (verbly::form::complexity == 1); | 711 | wordFilter &= (verbly::form::complexity == 1); |
| 712 | wordFilter &= (verbly::form::frequency > 2000000); | ||
| 711 | } | 713 | } |
| 712 | } else { | 714 | } else { |
| 713 | wordFilter &= ((verbly::form::complexity > 1) || (verbly::form::frequency > 2000000)); | 715 | wordFilter &= ((verbly::form::complexity > 1) || (verbly::form::frequency > 2000000)); |
| @@ -720,8 +722,15 @@ bool isDigitWrapper(unsigned char ch) { | |||
| 720 | return std::isdigit(ch); | 722 | return std::isdigit(ch); |
| 721 | } | 723 | } |
| 722 | 724 | ||
| 723 | bool Generator::IsClueTrivial(Height height, Colour colour, const verbly::form& clue, const verbly::form& solution) const | 725 | bool Generator::IsClueTrivial(Height height, Colour colour, const verbly::form& clue, const verbly::form& solution, GenerateOptions options) const |
| 724 | { | 726 | { |
| 727 | if (!options.allow_top_expansion && height == kTop) { | ||
| 728 | verbly::filter questionFilter = MakeHintFilter(solution, kMiddle, colour, kTowardQuestion) && clue; | ||
| 729 | if (!database_->forms(questionFilter).all().empty()) { | ||
| 730 | return true; | ||
| 731 | } | ||
| 732 | } | ||
| 733 | |||
| 725 | if (height == kTop && colour == kWhite) | 734 | if (height == kTop && colour == kWhite) |
| 726 | { | 735 | { |
| 727 | return !database_->forms((verbly::filter)clue && (verbly::word::synonyms %= solution)).all().empty(); | 736 | return !database_->forms((verbly::filter)clue && (verbly::word::synonyms %= solution)).all().empty(); |
