#include #include #include #include #include "common.hh" namespace param { using namespace ::args; ArgumentParser parser { "converter: aprob -> bmap" }; HelpFlag help { parser, "help", "display this menu", {'h', "help"}, }; ValueFlag mid { parser, "probability", "desired value of alter-probability to select", {"mid"}, 0.5, }; ValueFlag max_dist { parser, "max distance", "maximum distance from mid value", {"max-dist"}, 0.2, }; ValueFlag min_bnum { parser, "number of blocks", "minimum number of blocks to select (prior than max-dist)", {"min-bnum"}, 32, }; } // namespace param static void Exec() { const auto aprob = ReadMatrix(std::cin); const auto mid = args::get(param::mid); const auto max_dist = args::get(param::max_dist); const auto min_bnum = args::get(param::min_bnum); std::vector> vec; for (auto& probs : aprob) { vec.reserve(probs.size()); vec.clear(); for (auto prob : probs) { vec.emplace_back(vec.size(), std::abs(prob-mid)); } std::sort(vec.begin(), vec.end(), [](auto& a, auto& b) { return a.second < b.second; }); Enforce(vec.size() >= min_bnum, "cannot satisfy min-bnum limitation"); for (auto itr = vec.begin(); itr < vec.end(); ++itr) { if (itr >= vec.begin()+min_bnum) { // min-bnum is satisfied if (itr->second > max_dist) break; // max-dist is unsatisfied } std::cout << itr->first << ' '; } std::cout << '\n'; } } int main(int argc, char** argv) try { param::parser.ParseCLI(argc, argv); Exec(); return EXIT_SUCCESS; } catch (const args::Help&) { std::cout << param::parser << std::endl; return EXIT_SUCCESS; } catch (const std::exception& e) { std::cerr << e.what() << std::endl; return EXIT_FAILURE; }