diff options
author | Star Rauchenberger <fefferburbia@gmail.com> | 2023-02-17 11:13:56 -0500 |
---|---|---|
committer | Star Rauchenberger <fefferburbia@gmail.com> | 2023-02-17 11:13:56 -0500 |
commit | 6ce1edf606a384f0722f15ab25caad899c271280 (patch) | |
tree | 70782f24c761179691ea9585987c1e98a3d105cd /generator.cpp | |
parent | 26aa11444ca03571a2bf1ea14d54402094b5c15f (diff) | |
download | lingo-randomizer-6ce1edf606a384f0722f15ab25caad899c271280.tar.gz lingo-randomizer-6ce1edf606a384f0722f15ab25caad899c271280.tar.bz2 lingo-randomizer-6ce1edf606a384f0722f15ab25caad899c271280.zip |
allow_top_expansion
When this flag is unset (which is in most cases), top clues must be distinct from middle clues. also we forgot to have the common word filter lol
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(); |