From: Foster B. <fos...@us...> - 2006-02-03 18:20:59
|
Update of /cvsroot/adobe-source/adobe-source/adobe/test/sudoku In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1031/adobe/test/sudoku Modified Files: main.cpp sudoku.hpp sudoku_utilities.hpp sudokus.txt Log Message: asl 1.0.13 Index: sudoku_utilities.hpp =================================================================== RCS file: /cvsroot/adobe-source/adobe-source/adobe/test/sudoku/sudoku_utilities.hpp,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** sudoku_utilities.hpp 6 Jan 2006 18:35:26 -0000 1.2 --- sudoku_utilities.hpp 3 Feb 2006 18:20:49 -0000 1.3 *************** *** 1,6 **** /* ! Copyright 2005-2006 Adobe Systems Incorporated ! Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt ! or a copy at http://opensource.adobe.com/licenses.html) */ --- 1,6 ---- /* ! Copyright 2005-2006 Adobe Systems Incorporated ! Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt [...2703 lines suppressed...] ! timer.accrue(); #if 1 ! double last_split(timer.last_split()); ! std::cout << "Solved a puzzle with " << num_solutions << " solution(s) in " ! << last_split << " miliseconds (" << (last_split / 1e3) << " seconds)" ! << std::endl; #endif ! } ! double total_time(timer.accrued_total()); ! double avg_time(timer.accrued_average()); ! std::cout << "Solved all puzzles in " << total_time << " miliseconds (" ! << (total_time / 1e3) << " seconds)" << std::endl ! << "Average puzzle solve time " << avg_time << " miliseconds (" ! << (avg_time / 1e3) << " seconds)" << std::endl; } Index: main.cpp =================================================================== RCS file: /cvsroot/adobe-source/adobe-source/adobe/test/sudoku/main.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** main.cpp 6 Jan 2006 18:35:26 -0000 1.2 --- main.cpp 3 Feb 2006 18:20:49 -0000 1.3 *************** *** 1,6 **** /* ! Copyright 2005-2006 Adobe Systems Incorporated ! Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt ! or a copy at http://opensource.adobe.com/licenses.html) */ --- 1,6 ---- /* ! Copyright 2005-2006 Adobe Systems Incorporated ! Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt ! or a copy at http://opensource.adobe.com/licenses.html) */ *************** *** 37,83 **** class application_t { ! typedef std::vector<sudoku::sudoku_t> sudoku_set_t; ! typedef std::size_t (*solver_proc_t)(sudoku::sudoku_t&); public: ! enum ! { ! setting_detailed_printout_k = 0, ! setting_use_lone_candidate_k, ! setting_use_unique_candidate_k, ! setting_use_disjoint_subset_k, ! setting_use_unique_subset_k, ! setting_use_intersection_k, ! setting_set_size ! }; ! explicit application_t(bfs::path prefs_path) : ! prefs_path_m(prefs_path) ! { ! for (std::size_t i(0); i < setting_set_size; ++i) ! solver_usage_m[i] = true; ! solver_usage_m[setting_detailed_printout_k] = false; ! } ! void run(); private: ! void import_preferences(); ! void menu(); ! void solve_puzzle(); ! std::size_t deductive_step(solver_proc_t proc); ! void modify_settings(); ! void pick_new_puzzle(); ! bfs::path prefs_path_m; ! sudoku_set_t sudoku_set_m; ! sudoku::sudoku_t puzzle_m; ! boost::array<bool, setting_set_size> solver_usage_m; }; --- 37,83 ---- class application_t { ! typedef std::vector<sudoku::sudoku_t> sudoku_set_t; ! typedef std::size_t (*solver_proc_t)(sudoku::sudoku_t&); public: ! enum ! { ! setting_detailed_printout_k = 0, ! setting_use_lone_candidate_k, ! setting_use_unique_candidate_k, ! setting_use_disjoint_subset_k, ! setting_use_unique_subset_k, ! setting_use_intersection_k, ! setting_set_size ! }; ! explicit application_t(bfs::path prefs_path) : ! prefs_path_m(prefs_path) ! { ! for (std::size_t i(0); i < setting_set_size; ++i) ! solver_usage_m[i] = true; ! solver_usage_m[setting_detailed_printout_k] = false; ! } ! void run(); private: ! void import_preferences(); ! void menu(); ! void solve_puzzle(); ! std::size_t deductive_step(solver_proc_t proc); ! void modify_settings(); ! void pick_new_puzzle(); ! bfs::path prefs_path_m; ! sudoku_set_t sudoku_set_m; ! sudoku::sudoku_t puzzle_m; ! boost::array<bool, setting_set_size> solver_usage_m; }; *************** *** 86,137 **** void application_t::import_preferences() { ! char buffer[1024]; ! bfs::ifstream input(prefs_path_m, std::ios_base::in | std::ios_base::binary); ! if (input.fail()) ! { ! std::cerr << "Could not open preferences file." << std::endl; ! puzzle_m = sudoku::generate_puzzle(); ! return; ! } ! input.unsetf(std::ios_base::skipws); ! while (!input.eof()) ! { ! sudoku::sudoku_t cur; ! int count(0); ! input.getline(&buffer[0], 1024); ! std::size_t readsize(static_cast<std::size_t>(input.gcount())); ! if (readsize < 81) continue; ! while (true) ! { ! char c(buffer[count]); ! if (c == '\t') break; ! if (c == '.' || c >= '1' && c <= '9') ! { ! if (c != '.') ! cur.square(count / 9, count % 9).value_m = c - '0'; ! ++count; ! } ! } ! if (readsize <= 81) break; ! ++count; // to get past the tab between the name and the ! cur.name_m = std::string(&buffer[count], &buffer[readsize]); ! sudoku_set_m.push_back(cur); ! } } --- 86,137 ---- void application_t::import_preferences() { ! char buffer[1024]; ! bfs::ifstream input(prefs_path_m, std::ios_base::in | std::ios_base::binary); ! if (input.fail()) ! { ! std::cerr << "Could not open preferences file." << std::endl; ! puzzle_m = sudoku::generate_puzzle(); ! return; ! } ! input.unsetf(std::ios_base::skipws); ! while (!input.eof()) ! { ! sudoku::sudoku_t cur; ! int count(0); ! input.getline(&buffer[0], 1024); ! std::size_t readsize(static_cast<std::size_t>(input.gcount())); ! if (readsize < 81) continue; ! while (true) ! { ! char c(buffer[count]); ! if (c == '\t') break; ! if (c == '.' || c >= '1' && c <= '9') ! { ! if (c != '.') ! cur.square(count / 9, count % 9).value_m = c - '0'; ! ++count; ! } ! } ! if (readsize <= 81) break; ! ++count; // to get past the tab between the name and the ! cur.name_m = std::string(&buffer[count], &buffer[readsize]); ! sudoku_set_m.push_back(cur); ! } } *************** *** 140,153 **** const char* solver_enum_to_string(int solver_enum) { ! switch (solver_enum) ! { ! case application_t::setting_detailed_printout_k: return "Iterative Puzzle Printout"; ! case application_t::setting_use_lone_candidate_k: return "Lone Candidate Selection"; ! case application_t::setting_use_unique_candidate_k: return "Unique Candidate Selection"; ! case application_t::setting_use_disjoint_subset_k: return "Disjoint Subset Reduction"; ! case application_t::setting_use_unique_subset_k: return "Unique Subset Reduction"; ! case application_t::setting_use_intersection_k: return "Box/Row/Col Intersection Reduction"; ! default: return "Unknown Setting"; ! }; } --- 140,153 ---- const char* solver_enum_to_string(int solver_enum) { ! switch (solver_enum) ! { ! case application_t::setting_detailed_printout_k: return "Iterative Puzzle Printout"; ! case application_t::setting_use_lone_candidate_k: return "Lone Candidate Selection"; ! case application_t::setting_use_unique_candidate_k: return "Unique Candidate Selection"; ! case application_t::setting_use_disjoint_subset_k: return "Disjoint Subset Reduction"; ! case application_t::setting_use_unique_subset_k: return "Unique Subset Reduction"; ! case application_t::setting_use_intersection_k: return "Box/Row/Col Intersection Reduction"; ! default: return "Unknown Setting"; ! }; } *************** *** 156,180 **** void application_t::modify_settings() { ! while (true) ! { ! std::cout << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=" << std::endl; ! std::cout << "Please toggle settings" << std::endl; ! for (int count(0); count < setting_set_size; ++count) ! std::cout << count+1 << ". Use " << solver_enum_to_string(count) << ": " ! << (solver_usage_m[count] ? "On" : "Off") << std::endl; ! std::cout << std::endl; ! std::cout << "(0 to exit) ?> "; ! std::size_t choice; ! std::cin >> choice; ! if (choice <= 0 || choice > setting_set_size) ! break; ! else ! solver_usage_m[choice - 1] = !solver_usage_m[choice - 1]; ! } } --- 156,180 ---- void application_t::modify_settings() { ! while (true) ! { ! std::cout << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=" << std::endl; ! std::cout << "Please toggle settings" << std::endl; ! for (int count(0); count < setting_set_size; ++count) ! std::cout << count+1 << ". Use " << solver_enum_to_string(count) << ": " ! << (solver_usage_m[count] ? "On" : "Off") << std::endl; ! std::cout << std::endl; ! std::cout << "(0 to exit) ?> "; ! std::size_t choice; ! std::cin >> choice; ! if (choice <= 0 || choice > setting_set_size) ! break; ! else ! solver_usage_m[choice - 1] = !solver_usage_m[choice - 1]; ! } } *************** *** 183,207 **** void application_t::pick_new_puzzle() { ! std::cout << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=" << std::endl; ! std::cout << "Please pick a new puzzle" << std::endl; ! std::size_t count(0); ! for (sudoku_set_t::iterator first(sudoku_set_m.begin()), ! last(sudoku_set_m.end()); first != last; ++first) ! { ! std::cout << " " << ++count << ". " << first->name_m << std::endl; ! } ! std::cout << std::endl; ! std::cout << "?> "; ! std::size_t choice; ! std::cin >> choice; ! if (choice <= 0 || choice > sudoku_set_m.size()) ! std::cerr << "Choice is not viable. Aborting." << std::endl; ! else ! puzzle_m = sudoku_set_m[choice - 1]; } --- 183,207 ---- void application_t::pick_new_puzzle() { ! std::cout << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=" << std::endl; ! std::cout << "Please pick a new puzzle" << std::endl; ! std::size_t count(0); ! for (sudoku_set_t::iterator first(sudoku_set_m.begin()), ! last(sudoku_set_m.end()); first != last; ++first) ! { ! std::cout << " " << ++count << ". " << first->name_m << std::endl; ! } ! std::cout << std::endl; ! std::cout << "?> "; ! std::size_t choice; ! std::cin >> choice; ! if (choice <= 0 || choice > sudoku_set_m.size()) ! std::cerr << "Choice is not viable. Aborting." << std::endl; ! else ! puzzle_m = sudoku_set_m[choice - 1]; } *************** *** 210,224 **** std::size_t application_t::deductive_step(solver_proc_t proc) { ! std::size_t usages(proc(puzzle_m)); ! if (usages != 0) ! { ! sudoku::pinned_reduction(puzzle_m); ! if (!verify_integrity(puzzle_m)) ! throw std::runtime_error("Puzzle integrity check failed"); ! } ! return usages; } --- 210,224 ---- std::size_t application_t::deductive_step(solver_proc_t proc) { ! std::size_t usages(proc(puzzle_m)); ! if (usages != 0) ! { ! sudoku::pinned_reduction(puzzle_m); ! if (!verify_integrity(puzzle_m)) ! throw std::runtime_error("Puzzle integrity check failed"); ! } ! return usages; } *************** *** 227,276 **** void application_t::solve_puzzle() { ! // do a pinned reduction first before we start on the puzzle ! // to make sure the possibility sets are legit to begin with ! sudoku::pinned_reduction(puzzle_m); ! while (true) ! { ! std::size_t usages(0); ! try ! { ! if (solver_usage_m[setting_use_lone_candidate_k]) ! usages += deductive_step(sudoku::lone_candidate_reduction); ! if (solver_usage_m[setting_use_unique_candidate_k]) ! usages += deductive_step(sudoku::unique_candidate_reduction); ! if (solver_usage_m[setting_use_disjoint_subset_k]) ! usages += deductive_step(sudoku::disjoint_subset_reduction); ! if (solver_usage_m[setting_use_unique_subset_k]) ! usages += deductive_step(sudoku::unique_subset_reduction); ! if (solver_usage_m[setting_use_intersection_k]) ! usages += deductive_step(sudoku::intersection_reduction); ! } ! catch (const std::exception& doh) ! { ! std::cerr << "Exception: " << doh.what() << std::endl; ! break; ! } ! catch (...) ! { ! std::cerr << "Exception: Unknown" << std::endl; ! break; ! } ! if (usages == 0) ! break; ! else if (solver_usage_m[setting_detailed_printout_k]) ! detailed_status(puzzle_m); ! } ! std::cout << "No more squares can be solved" << std::endl; ! std::cout << puzzle_m; } --- 227,276 ---- void application_t::solve_puzzle() { ! // do a pinned reduction first before we start on the puzzle ! // to make sure the possibility sets are legit to begin with ! sudoku::pinned_reduction(puzzle_m); ! while (true) ! { ! std::size_t usages(0); ! try ! { ! if (solver_usage_m[setting_use_lone_candidate_k]) ! usages += deductive_step(sudoku::lone_candidate_reduction); ! if (solver_usage_m[setting_use_unique_candidate_k]) ! usages += deductive_step(sudoku::unique_candidate_reduction); ! if (solver_usage_m[setting_use_disjoint_subset_k]) ! usages += deductive_step(sudoku::disjoint_subset_reduction); ! if (solver_usage_m[setting_use_unique_subset_k]) ! usages += deductive_step(sudoku::unique_subset_reduction); ! if (solver_usage_m[setting_use_intersection_k]) ! usages += deductive_step(sudoku::intersection_reduction); ! } ! catch (const std::exception& doh) ! { ! std::cerr << "Exception: " << doh.what() << std::endl; ! break; ! } ! catch (...) ! { ! std::cerr << "Exception: Unknown" << std::endl; ! break; ! } ! if (usages == 0) ! break; ! else if (solver_usage_m[setting_detailed_printout_k]) ! detailed_status(puzzle_m); ! } ! std::cout << "No more squares can be solved" << std::endl; ! std::cout << puzzle_m; } *************** *** 279,381 **** void application_t::menu() { ! while (true) ! { ! std::cout << std::endl; ! std::cout << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=" << std::endl; ! std::cout << "Adobe Sudoku Test App " << ADOBE_VERSION_MAJOR << '.' << ADOBE_VERSION_MINOR ! << '.' << ADOBE_VERSION_SUBMINOR << std::endl; ! std::cout << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=" << std::endl; ! std::cout << sudoku_set_m.size() << " puzzles loaded. \""; ! std::cout << puzzle_m.name_m << "\" is the current puzzle" << std::endl; ! std::cout << " 1. Solve current puzzle" << std::endl; ! std::cout << " 2. Change solver techniques used" << std::endl; ! std::cout << " 3. Print current puzzle (simple)" << std::endl; ! std::cout << " 4. Print current puzzle (detailed)" << std::endl; ! std::cout << " 5. Switch to another puzzle" << std::endl; ! std::cout << " 6. Import a new puzzle (unimp.)" << std::endl; ! std::cout << " 7. Save puzzle database (unimp.)" << std::endl; ! std::cout << " 8. Generate random puzzle" << std::endl; ! std::cout << " 9. Brute-force solve current puzzle" << std::endl; ! std::cout << " R. Rate current puzzle" << std::endl; ! std::cout << " M. Mass puzzle generation" << std::endl; ! std::cout << " C. Count number of solutions to current puzzle" << std::endl; ! std::cout << " P. Dancing links performance benchmarking" << std::endl; ! std::cout << std::endl; ! std::cout << " Q. Quit" << std::endl; ! std::cout << std::endl; ! std::cout << "?> "; ! char choice(0); ! std::cin >> choice; ! std::cout << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=" << std::endl; ! std::cout << std::endl; ! switch (choice) ! { ! case '1': ! solve_puzzle(); ! break; ! case '2': ! modify_settings(); ! break; ! case '3': ! std::cout << puzzle_m; ! break; ! case '4': ! sudoku::pinned_reduction(puzzle_m); ! sudoku::detailed_status(puzzle_m); ! break; ! case '5': ! pick_new_puzzle(); ! break; ! case '6': ! case '7': ! std::cout << "not implemented yet, sorry." << std::endl; ! break; ! case '8': ! puzzle_m = sudoku::generate_puzzle(); ! break; ! case '9': ! sudoku::timed_solve(puzzle_m); ! break; ! case 'R': ! case 'r': ! sudoku::rate_puzzle(puzzle_m); ! break; ! case 'M': ! case 'm': ! sudoku::mass_puzzle_generation(); ! break; ! case 'C': ! case 'c': ! sudoku::count_solutions(puzzle_m); ! break; ! case 'P': ! case 'p': ! sudoku::performance_benchmark(); ! break; ! case 'Q': ! case 'q': ! return; ! default: ! std::cerr << "Invalid choice. Please choose again." << std::endl; ! break; ! } ! } } --- 279,381 ---- void application_t::menu() { ! while (true) ! { ! std::cout << std::endl; ! std::cout << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=" << std::endl; ! std::cout << "Adobe Sudoku Test App " << ADOBE_VERSION_MAJOR << '.' << ADOBE_VERSION_MINOR ! << '.' << ADOBE_VERSION_SUBMINOR << std::endl; ! std::cout << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=" << std::endl; ! std::cout << sudoku_set_m.size() << " puzzles loaded. \""; ! std::cout << puzzle_m.name_m << "\" is the current puzzle" << std::endl; ! std::cout << " 1. Solve current puzzle" << std::endl; ! std::cout << " 2. Change solver techniques used" << std::endl; ! std::cout << " 3. Print current puzzle (simple)" << std::endl; ! std::cout << " 4. Print current puzzle (detailed)" << std::endl; ! std::cout << " 5. Switch to another puzzle" << std::endl; ! std::cout << " 6. Import a new puzzle (unimp.)" << std::endl; ! std::cout << " 7. Save puzzle database (unimp.)" << std::endl; ! std::cout << " 8. Generate random puzzle" << std::endl; ! std::cout << " 9. Brute-force solve current puzzle" << std::endl; ! std::cout << " R. Rate current puzzle" << std::endl; ! std::cout << " M. Mass puzzle generation" << std::endl; ! std::cout << " C. Count number of solutions to current puzzle" << std::endl; ! std::cout << " P. Dancing links performance benchmarking" << std::endl; ! std::cout << std::endl; ! std::cout << " Q. Quit" << std::endl; ! std::cout << std::endl; ! std::cout << "?> "; ! char choice(0); ! std::cin >> choice; ! std::cout << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=" << std::endl; ! std::cout << std::endl; ! switch (choice) ! { ! case '1': ! solve_puzzle(); ! break; ! case '2': ! modify_settings(); ! break; ! case '3': ! std::cout << puzzle_m; ! break; ! case '4': ! sudoku::pinned_reduction(puzzle_m); ! sudoku::detailed_status(puzzle_m); ! break; ! case '5': ! pick_new_puzzle(); ! break; ! case '6': ! case '7': ! std::cout << "not implemented yet, sorry." << std::endl; ! break; ! case '8': ! puzzle_m = sudoku::generate_puzzle(); ! break; ! case '9': ! sudoku::timed_solve(puzzle_m); ! break; ! case 'R': ! case 'r': ! sudoku::rate_puzzle(puzzle_m); ! break; ! case 'M': ! case 'm': ! sudoku::mass_puzzle_generation(); ! break; ! case 'C': ! case 'c': ! sudoku::count_solutions(puzzle_m); ! break; ! case 'P': ! case 'p': ! sudoku::performance_benchmark(); ! break; ! case 'Q': ! case 'q': ! return; ! default: ! std::cerr << "Invalid choice. Please choose again." << std::endl; ! break; ! } ! } } *************** *** 384,392 **** void application_t::run() { ! import_preferences(); ! if (!sudoku_set_m.empty()) puzzle_m = sudoku_set_m[0]; ! menu(); } --- 384,392 ---- void application_t::run() { ! import_preferences(); ! if (!sudoku_set_m.empty()) puzzle_m = sudoku_set_m[0]; ! menu(); } *************** *** 399,414 **** int main(int argc, char** argv) { ! std::srand(std::time(0)); ! std::string db_name("sudokus.txt"); ! if (argc > 1) db_name.assign(argv[1]); ! bfs::path filepath(db_name.c_str(), argc > 1 ? bfs::native : bfs::portable_name); ! { ! application_t(filepath).run(); ! } ! return 0; } --- 399,414 ---- int main(int argc, char** argv) { ! std::srand(std::time(0)); ! std::string db_name("sudokus.txt"); ! if (argc > 1) db_name.assign(argv[1]); ! bfs::path filepath(db_name.c_str(), argc > 1 ? bfs::native : bfs::portable_name); ! { ! application_t(filepath).run(); ! } ! return 0; } Index: sudoku.hpp =================================================================== RCS file: /cvsroot/adobe-source/adobe-source/adobe/test/sudoku/sudoku.hpp,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** sudoku.hpp 6 Jan 2006 18:35:26 -0000 1.3 --- sudoku.hpp 3 Feb 2006 18:20:49 -0000 1.4 *************** *** 1,6 **** /* ! Copyright 2005-2006 Adobe Systems Incorporated ! Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt ! or a copy at http://opensource.adobe.com/licenses.html) */ #include <adobe/config.hpp> --- 1,6 ---- /* ! Copyright 2005-2006 Adobe Systems Incorporated ! Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt [...1003 lines suppressed...] ! ++col_count; ! if (col_count % 9 == 0) ! { ! ++row_count; ! if (row_count == 3 || row_count == 6) ! s << std::endl << hr; ! s << std::endl; ! } ! else if (col_count % 3 == 0) ! s << " | "; ! else ! s << ' '; ! } ! return s; } Index: sudokus.txt =================================================================== RCS file: /cvsroot/adobe-source/adobe-source/adobe/test/sudoku/sudokus.txt,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** sudokus.txt 6 Oct 2005 20:43:19 -0000 1.1 --- sudokus.txt 3 Feb 2006 18:20:49 -0000 1.2 *************** *** 1,54 **** ! .2.6..9.7..1...5.....3..68...7.9...8.4.....5.9...7.1...56..1.....2...3..1.8..7.9. beyond wicked puzzle (652) ! ...91....7..5...1..8...4...5...4.18....7.8....46.5...3...8...7..3...6..4....32... hard puzzle (372) ! .3..1.6.......549..4.2....5213....7.57.....36.6....5413....8.6..287.......7.5..8. unbelievably wicked puzzle (971) ! .9.741.35...356.21....92..6....3..1...9...5...8..1....3..46....67.529...95.183.6. unbelievably wicked puzzle (931) ! ..5.1......7..961.3..6..2.71......82.........85......15.2..7..8.314..5......9.4.. unbelievably wicked puzzle (878) ! ...6.1.5....4..8.131.....62.7..6.....25...78.....1..9.63.....459.4..2....8.5.6... nearly diabolical puzzle (401) ! .5...8.72..4...6...1.9....57....381.4.......7.864....99....7.8...1...9..54.6...2. nearly difficult puzzle (258) ! .....6..5...9...879....3..6.3..425.845.3.8.618.976..2.3..6....227...9...1..4..... unbelievably wicked puzzle (931) ! .4.6.9.738...5.......1..2..6......4.2.8...9.5.7......2..9..6.......7...871.2.5.3. unbelievably wicked puzzle (758) ! ....3..5...69.2...3....46....7..5..9.61...34.8..2..7....35....1...6.82...8..9.... beyond diabolical puzzle (462) ! ..267845.4.5231..981.5.4...1.4..6..73.......67..4..9.5...3.9.786..8451.2.837126.. unbelievably wicked puzzle (976) ! ...5...9.7...4.1...5.3.926..71...524.8.2.3.7.692...38..471.5.3...3.9...5.1...7... unbelievably wicked puzzle (916) ! ..3...8.4....8.......7..291..7.3864..2.....5..8564.9..162..7.......9....5.9...1.. tricky puzzle (204) ! .51.3.6.48..6.42.5......397.6..2.8.1.........5.3.1..2.692......3.58.9..21.4.6.73. tricky puzzle (224) ! .....2.4..........48.61.9..34.....7296.....5881.....69..4.58.17..........3.9..... nearly wicked puzzle (485) ! ..6.42...7.36.9..2.4.5.3...3....8.69.........62.7....3...2.4.7.2..3.15.4...89.6.. unbelievably wicked puzzle (893) ! .2.......9.7....8..3.2.6.918.4.5..73.........17..6.2.835.8.9.1..1....8.5.......2. beyond tricky puzzle (240) ! ..9..6...1.58....386.93.4..6...1..7....2.4....3..9...1..3.25.465....91.2...6..9.. nearly difficult puzzle (269) ! ...1.2.....9.5.....2...4618.72...8..4986.5273..3...19.7518...3.....7.5.....5.1... unbelievably wicked puzzle (973) ! ...6....4...78..2.21..5.....45..7.8...6...3...2.1..75.....6..37.9..34...5....1... nearly hard puzzle (336) ! ........28..2..4...3..68..1218.9..3434.....7567..3.2989..14..2...1..9..67........ unbelievably wicked puzzle (972) ! ......96.9....34.15..1...7..9..2.8.78.......56.4.3..2..1...8..62.97....3.56...... unbelievably wicked puzzle (883) ! ......426...4....36...139.8.35.4.6.19.......58.2.5.34.2.369...44....7...187...... beyond tricky puzzle (229) ! .1.823......6..1..5....73....8.4..6..5.3.8.9..4..5.8....75....2..6..1......986.4. nearly diabolical puzzle (403) ! ..6.3.21...9..17...3.2.........62.8..4.....6..9.18.........7.3...34..5...71.5.8.. unbelievably wicked puzzle (888) ! .759.4.2.1..7...4.86..2...39......3.6.2...8.4.1......94...7..96.8...9..7.9.4.628. beyond tricky puzzle (236) ! .25.3.......1....747..98.3..8......1.........2......4..1.58..236....2.......4.98. nearly wicked puzzle (496) ! ......3.......6.15...2154.987..91.....6...1.....68..272.7458...31.7.......4...... beyond diabolical puzzle (452) ! .4.8...6.9..7..2...1.3.....1.6...78.48.....26.52...1.4.....6.3...9..7..8.2...1.5. diabolical puzzle (425) ! ....6...7..5..9..83..5..2......9..8.74.3.5.19.9..4......3..1..66..2..8..2...5.... nearly wicked puzzle (493) ! .5..9.2..8.45.3.6.9..............1...819.472...3..............7.3.4.78.9..9.6..3. diabolical puzzle (435) ! ..5..83.24.3..1..6.....4...9.4....3.86.....75.5....4.9...2.....5..4..8.32.75..9.. nearly diabolical puzzle (411) ! ..1..9.62..6.1397......84..237.....4.........6.....721..39......9463.2..56.1..3.. diabolical puzzle (448) ! ..7.9.2.......56.8...2...7..7....4....58.79....2....3..3...4...8.43.......1.2.7.. beyond wicked puzzle (545) ! ........9...4..37.1....8.5.....45.1.3..8.6..2.4.13.....3.2....4.65..1...8........ beyond wicked puzzle (573) ! ..4........85.9.346..18....9......5.37.....21.8......9....32..742.7.85........8.. nearly wicked puzzle (499) ! .....89..5.4.3...781..9.3.5....261...7.....9...294....1.9.5..723...6.5.9..58..... nearly wicked puzzle (496) ! .4..18..97..2...1....6.5....56.2..98.........89..7.13....3.2....1...7..56..49..2. diabolical puzzle (447) ! ..78....6...29.75.....6..8.......49....7.1....12.......4..3.....38.74...9....28.. nearly wicked puzzle (482) ! .5..27.4....5.....9...6...7.21..6.7.78.....93.4.8..16.1...5...4.....8....9.71..5. unbelievably wicked puzzle (542) ! .....2.1....49...5...8...29.7..6.2...18...65...3.2..7.63...1...5...74....2.3..... unbelievably wicked puzzle (628) ! .2....7..9.6..1...7..8....1.....86..45.1.6.28..79.....5....9..3...4..9.2..2....8. unbelievably wicked puzzle (735) ! .8..42.36....1..285.....14965..9.................5..73865.....434..2....19.68..5. unbelievably wicked puzzle (549) ! .3...2........93...2..5.7.6..8.4..2...1...9...6..7.5..7.2.1..5...68........5...8. unbelievably wicked puzzle (740) ! .......3...534...2...17...6.1..683..3..9.1..5..653..7.9...52...2...176...6....... unbelievably wicked puzzle (707) ! .6..5.38.....7........319.25.9....2...........2....6.78.241........2.....73.8..5. beyond wicked puzzle (624) ! .6...3.92.....81.....91.3..2.4....78.........89....2.5..8.34.....56.....91.8...6. wicked puzzle (518) ! ....61.5....97.......3..186....2.3...7.5.6.2...1.9....456..7.......35....3.14.... beyond wicked puzzle (528) ! .4.382.7.9.............1..38......9.4.69.73.8.1......26..4.............1.2.876.5. beyond wicked puzzle (712) ! .6......17..9..3.........2..74.2...69513.62473...4.18..3.........8..5..92......1. beyond wicked puzzle (723) ! ..9....5....5...6..3...2..93...8.....481.937.....2...64..7...1..5...3....8....7.. beyond wicked puzzle (610) ! 5.6.2.9.3..8...5...........6..285..9...9.3...8..761..4...........4...3..2.1.5.6.7 1,905 solutions ! 536.2.9....8...............6..285..9...9.3...8..761..4...........4......2.1.....7 957,263 solutions ! .94...13..............76..2.8..1.....32.........2.........5.4.......8..7..63.4..8 r1s7 has size 1 but all rc have size > 1 --- 1,54 ---- ! .2.6..9.7..1...5.....3..68...7.9...8.4.....5.9...7.1...56..1.....2...3..1.8..7.9. beyond wicked puzzle (652) ! ...91....7..5...1..8...4...5...4.18....7.8....46.5...3...8...7..3...6..4....32... hard puzzle (372) ! .3..1.6.......549..4.2....5213....7.57.....36.6....5413....8.6..287.......7.5..8. unbelievably wicked puzzle (971) ! .9.741.35...356.21....92..6....3..1...9...5...8..1....3..46....67.529...95.183.6. unbelievably wicked puzzle (931) ! ..5.1......7..961.3..6..2.71......82.........85......15.2..7..8.314..5......9.4.. unbelievably wicked puzzle (878) ! ...6.1.5....4..8.131.....62.7..6.....25...78.....1..9.63.....459.4..2....8.5.6... nearly diabolical puzzle (401) ! .5...8.72..4...6...1.9....57....381.4.......7.864....99....7.8...1...9..54.6...2. nearly difficult puzzle (258) ! .....6..5...9...879....3..6.3..425.845.3.8.618.976..2.3..6....227...9...1..4..... unbelievably wicked puzzle (931) ! .4.6.9.738...5.......1..2..6......4.2.8...9.5.7......2..9..6.......7...871.2.5.3. unbelievably wicked puzzle (758) ! ....3..5...69.2...3....46....7..5..9.61...34.8..2..7....35....1...6.82...8..9.... beyond diabolical puzzle (462) ! ..267845.4.5231..981.5.4...1.4..6..73.......67..4..9.5...3.9.786..8451.2.837126.. unbelievably wicked puzzle (976) ! ...5...9.7...4.1...5.3.926..71...524.8.2.3.7.692...38..471.5.3...3.9...5.1...7... unbelievably wicked puzzle (916) ! ..3...8.4....8.......7..291..7.3864..2.....5..8564.9..162..7.......9....5.9...1.. tricky puzzle (204) ! .51.3.6.48..6.42.5......397.6..2.8.1.........5.3.1..2.692......3.58.9..21.4.6.73. tricky puzzle (224) ! .....2.4..........48.61.9..34.....7296.....5881.....69..4.58.17..........3.9..... nearly wicked puzzle (485) ! ..6.42...7.36.9..2.4.5.3...3....8.69.........62.7....3...2.4.7.2..3.15.4...89.6.. unbelievably wicked puzzle (893) ! .2.......9.7....8..3.2.6.918.4.5..73.........17..6.2.835.8.9.1..1....8.5.......2. beyond tricky puzzle (240) ! ..9..6...1.58....386.93.4..6...1..7....2.4....3..9...1..3.25.465....91.2...6..9.. nearly difficult puzzle (269) ! ...1.2.....9.5.....2...4618.72...8..4986.5273..3...19.7518...3.....7.5.....5.1... unbelievably wicked puzzle (973) ! ...6....4...78..2.21..5.....45..7.8...6...3...2.1..75.....6..37.9..34...5....1... nearly hard puzzle (336) ! ........28..2..4...3..68..1218.9..3434.....7567..3.2989..14..2...1..9..67........ unbelievably wicked puzzle (972) ! ......96.9....34.15..1...7..9..2.8.78.......56.4.3..2..1...8..62.97....3.56...... unbelievably wicked puzzle (883) ! ......426...4....36...139.8.35.4.6.19.......58.2.5.34.2.369...44....7...187...... beyond tricky puzzle (229) ! .1.823......6..1..5....73....8.4..6..5.3.8.9..4..5.8....75....2..6..1......986.4. nearly diabolical puzzle (403) ! ..6.3.21...9..17...3.2.........62.8..4.....6..9.18.........7.3...34..5...71.5.8.. unbelievably wicked puzzle (888) ! .759.4.2.1..7...4.86..2...39......3.6.2...8.4.1......94...7..96.8...9..7.9.4.628. beyond tricky puzzle (236) ! .25.3.......1....747..98.3..8......1.........2......4..1.58..236....2.......4.98. nearly wicked puzzle (496) ! ......3.......6.15...2154.987..91.....6...1.....68..272.7458...31.7.......4...... beyond diabolical puzzle (452) ! .4.8...6.9..7..2...1.3.....1.6...78.48.....26.52...1.4.....6.3...9..7..8.2...1.5. diabolical puzzle (425) ! ....6...7..5..9..83..5..2......9..8.74.3.5.19.9..4......3..1..66..2..8..2...5.... nearly wicked puzzle (493) ! .5..9.2..8.45.3.6.9..............1...819.472...3..............7.3.4.78.9..9.6..3. diabolical puzzle (435) ! ..5..83.24.3..1..6.....4...9.4....3.86.....75.5....4.9...2.....5..4..8.32.75..9.. nearly diabolical puzzle (411) ! ..1..9.62..6.1397......84..237.....4.........6.....721..39......9463.2..56.1..3.. diabolical puzzle (448) ! ..7.9.2.......56.8...2...7..7....4....58.79....2....3..3...4...8.43.......1.2.7.. beyond wicked puzzle (545) ! ........9...4..37.1....8.5.....45.1.3..8.6..2.4.13.....3.2....4.65..1...8........ beyond wicked puzzle (573) ! ..4........85.9.346..18....9......5.37.....21.8......9....32..742.7.85........8.. nearly wicked puzzle (499) ! .....89..5.4.3...781..9.3.5....261...7.....9...294....1.9.5..723...6.5.9..58..... nearly wicked puzzle (496) ! .4..18..97..2...1....6.5....56.2..98.........89..7.13....3.2....1...7..56..49..2. diabolical puzzle (447) ! ..78....6...29.75.....6..8.......49....7.1....12.......4..3.....38.74...9....28.. nearly wicked puzzle (482) ! .5..27.4....5.....9...6...7.21..6.7.78.....93.4.8..16.1...5...4.....8....9.71..5. unbelievably wicked puzzle (542) ! .....2.1....49...5...8...29.7..6.2...18...65...3.2..7.63...1...5...74....2.3..... unbelievably wicked puzzle (628) ! .2....7..9.6..1...7..8....1.....86..45.1.6.28..79.....5....9..3...4..9.2..2....8. unbelievably wicked puzzle (735) ! .8..42.36....1..285.....14965..9.................5..73865.....434..2....19.68..5. unbelievably wicked puzzle (549) ! .3...2........93...2..5.7.6..8.4..2...1...9...6..7.5..7.2.1..5...68........5...8. unbelievably wicked puzzle (740) ! .......3...534...2...17...6.1..683..3..9.1..5..653..7.9...52...2...176...6....... unbelievably wicked puzzle (707) ! .6..5.38.....7........319.25.9....2...........2....6.78.241........2.....73.8..5. beyond wicked puzzle (624) ! .6...3.92.....81.....91.3..2.4....78.........89....2.5..8.34.....56.....91.8...6. wicked puzzle (518) ! ....61.5....97.......3..186....2.3...7.5.6.2...1.9....456..7.......35....3.14.... beyond wicked puzzle (528) ! .4.382.7.9.............1..38......9.4.69.73.8.1......26..4.............1.2.876.5. beyond wicked puzzle (712) ! .6......17..9..3.........2..74.2...69513.62473...4.18..3.........8..5..92......1. beyond wicked puzzle (723) ! ..9....5....5...6..3...2..93...8.....481.937.....2...64..7...1..5...3....8....7.. beyond wicked puzzle (610) ! 5.6.2.9.3..8...5...........6..285..9...9.3...8..761..4...........4...3..2.1.5.6.7 1,905 solutions ! 536.2.9....8...............6..285..9...9.3...8..761..4...........4......2.1.....7 957,263 solutions ! .94...13..............76..2.8..1.....32.........2.........5.4.......8..7..63.4..8 r1s7 has size 1 but all rc have size > 1 |