Compare commits
	
		
			No commits in common. "17944c4d424ee63eb13c98ca7af22cd49503b384" and "b542c22bc2de9036dda9a58e55ffd48bcde48c2d" have entirely different histories.
		
	
	
		
			17944c4d42
			...
			b542c22bc2
		
	
		
					 3 changed files with 1 additions and 222 deletions
				
			
		
							
								
								
									
										44
									
								
								main.cc
									
										
									
									
									
								
							
							
						
						
									
										44
									
								
								main.cc
									
										
									
									
									
								
							|  | @ -1,45 +1,3 @@ | ||||||
| #include <iostream> | #include <iostream> | ||||||
| #include <fstream> |  | ||||||
| #include "ordle.h" |  | ||||||
| 
 | 
 | ||||||
| int main(int argc, char *argv[]) { | int main(int argc, char *argv[]) { std::cout << "Hello, ordle!" << std::endl; } | ||||||
|     if (argc < 2) { |  | ||||||
|         std::cerr << "Usage: " << argv[0] << " <wordlist file>\n"; |  | ||||||
|         return 1; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     std::ifstream file(argv[1]); |  | ||||||
|     if (!file) { |  | ||||||
|         std::cerr << "Could not open file: " << argv[1] << "\n"; |  | ||||||
|         return 1; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     auto candidates = read_candidates(file); |  | ||||||
|     std::string wrong; |  | ||||||
|     letters_and_indices green, yellow; |  | ||||||
| 
 |  | ||||||
|     while (!candidates.empty()) { |  | ||||||
|         std::cout << "Remaining candidates: \n"; |  | ||||||
|         for (const auto &word : candidates) { |  | ||||||
|             std::cout << word << " "; |  | ||||||
|         } |  | ||||||
|         std::cout << "\n\n"; |  | ||||||
| 
 |  | ||||||
|         auto [new_wrong, new_green, new_yellow] = prompt(); |  | ||||||
|         wrong.append(new_wrong); |  | ||||||
|         green.insert(new_green.begin(), new_green.end()); |  | ||||||
|         yellow.insert(new_yellow.begin(), new_yellow.end()); |  | ||||||
| 
 |  | ||||||
|         do_filter(candidates, wrong, green, yellow); |  | ||||||
| 
 |  | ||||||
|         if (candidates.size() <= 1) break; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (candidates.empty()) { |  | ||||||
|         std::cout << "No solution found.\n"; |  | ||||||
|     } else { |  | ||||||
|         std::cout << "Solution: " << candidates.front() << "\n"; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     return 0; |  | ||||||
| } |  | ||||||
|  |  | ||||||
							
								
								
									
										125
									
								
								ordle.cc
									
										
									
									
									
								
							
							
						
						
									
										125
									
								
								ordle.cc
									
										
									
									
									
								
							|  | @ -1,125 +0,0 @@ | ||||||
| #include <iostream> |  | ||||||
| #include <vector> |  | ||||||
| #include <string> |  | ||||||
| #include <algorithm> |  | ||||||
| #include <fstream> |  | ||||||
| #include <sstream> |  | ||||||
| #include <map> |  | ||||||
| 
 |  | ||||||
| // Helper types and aliases
 |  | ||||||
| using size_type = std::string::size_type; |  | ||||||
| using letters_and_indices = std::map<size_type, std::string>; |  | ||||||
| 
 |  | ||||||
| // Function to read candidates from a file
 |  | ||||||
| std::vector<std::string> read_candidates(std::istream &input) { |  | ||||||
|     std::vector<std::string> candidates; |  | ||||||
|     std::string word; |  | ||||||
| 
 |  | ||||||
|     while (input >> word) { |  | ||||||
|         if (word.size() == 5) { |  | ||||||
|             std::transform(word.begin(), word.end(), word.begin(), ::tolower); |  | ||||||
|             candidates.push_back(word); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     // Remove duplicates
 |  | ||||||
|     std::sort(candidates.begin(), candidates.end()); |  | ||||||
|     candidates.erase(std::unique(candidates.begin(), candidates.end()), candidates.end()); |  | ||||||
| 
 |  | ||||||
|     return candidates; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Helper functions
 |  | ||||||
| bool contains_any_of(const std::string &s, const std::string &cs) { |  | ||||||
|     return std::any_of(cs.begin(), cs.end(), [&s](char c) { return s.find(c) != std::string::npos; }); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool contains_at(const std::string &s, char c, size_type pos) { |  | ||||||
|     return pos < s.size() && s[pos] == c; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool contains_but_not_at(const std::string &s, char c, size_type pos) { |  | ||||||
|     return s.find(c) != std::string::npos && !contains_at(s, c, pos); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Functor for wrong letters
 |  | ||||||
| struct wrong_fn { |  | ||||||
|     explicit wrong_fn(const std::string &letters) : l{letters} {} |  | ||||||
| 
 |  | ||||||
|     bool operator()(const std::string &word) const { |  | ||||||
|         return contains_any_of(word, l); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| private: |  | ||||||
|     std::string l; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| // Functor for correct letters
 |  | ||||||
| struct correct_fn { |  | ||||||
|     explicit correct_fn(const letters_and_indices &idxs) : m{idxs} {} |  | ||||||
| 
 |  | ||||||
|     bool operator()(const std::string &word) const { |  | ||||||
|         return std::all_of(m.begin(), m.end(), [&word](const auto &pair) { |  | ||||||
|             return contains_at(word, pair.second[0], pair.first); |  | ||||||
|         }); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| private: |  | ||||||
|     letters_and_indices m; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| // Functor for misplaced letters
 |  | ||||||
| struct misplaced_fn { |  | ||||||
|     explicit misplaced_fn(const letters_and_indices &idxs) : m{idxs} {} |  | ||||||
| 
 |  | ||||||
|     bool operator()(const std::string &word) const { |  | ||||||
|         return std::all_of(m.begin(), m.end(), [&word](const auto &pair) { |  | ||||||
|             return contains_but_not_at(word, pair.second[0], pair.first); |  | ||||||
|         }); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| private: |  | ||||||
|     letters_and_indices m; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| // Function to filter candidates
 |  | ||||||
| void do_filter(std::vector<std::string> &candidates, const std::string &wrong, |  | ||||||
|                const letters_and_indices &green, const letters_and_indices &yellow) { |  | ||||||
|     auto predicate = [&wrong, &green, &yellow](const std::string &word) { |  | ||||||
|         return wrong_fn(wrong)(word) || !correct_fn(green)(word) || !misplaced_fn(yellow)(word); |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     candidates.erase(std::remove_if(candidates.begin(), candidates.end(), predicate), candidates.end()); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // User interaction function
 |  | ||||||
| letters_and_indices build_list(const std::string &line) { |  | ||||||
|     std::istringstream iss(line); |  | ||||||
|     letters_and_indices result; |  | ||||||
|     char letter; |  | ||||||
|     size_type index; |  | ||||||
| 
 |  | ||||||
|     while (iss >> letter >> index) { |  | ||||||
|         result[index] = std::string(1, letter); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     return result; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| std::tuple<std::string, letters_and_indices, letters_and_indices> prompt() { |  | ||||||
|     std::string wrong; |  | ||||||
|     std::cout << "Enter wrong letters:\n"; |  | ||||||
|     std::getline(std::cin, wrong); |  | ||||||
| 
 |  | ||||||
|     std::string correct; |  | ||||||
|     std::cout << "Enter correct letters (letter index)*:\n"; |  | ||||||
|     std::getline(std::cin, correct); |  | ||||||
|     auto green = build_list(correct); |  | ||||||
| 
 |  | ||||||
|     std::string misplaced; |  | ||||||
|     std::cout << "Enter misplaced letters (letter index)*:\n"; |  | ||||||
|     std::getline(std::cin, misplaced); |  | ||||||
|     auto yellow = build_list(misplaced); |  | ||||||
| 
 |  | ||||||
|     return {wrong, green, yellow}; |  | ||||||
| } |  | ||||||
							
								
								
									
										54
									
								
								ordle.h
									
										
									
									
									
								
							
							
						
						
									
										54
									
								
								ordle.h
									
										
									
									
									
								
							|  | @ -1,54 +0,0 @@ | ||||||
| #ifndef ORDLE_H |  | ||||||
| #define ORDLE_H |  | ||||||
| 
 |  | ||||||
| #include <iostream> |  | ||||||
| #include <vector> |  | ||||||
| #include <string> |  | ||||||
| #include <map> |  | ||||||
| #include <algorithm> |  | ||||||
| #include <sstream> |  | ||||||
| #include <tuple> |  | ||||||
| 
 |  | ||||||
| // Helper types and aliases
 |  | ||||||
| using size_type = std::string::size_type; |  | ||||||
| using letters_and_indices = std::map<size_type, std::string>; |  | ||||||
| 
 |  | ||||||
| // Function declarations
 |  | ||||||
| std::vector<std::string> read_candidates(std::istream &input); |  | ||||||
| 
 |  | ||||||
| bool contains_any_of(const std::string &s, const std::string &cs); |  | ||||||
| bool contains_at(const std::string &s, char c, size_type pos); |  | ||||||
| bool contains_but_not_at(const std::string &s, char c, size_type pos); |  | ||||||
| 
 |  | ||||||
| // Functors
 |  | ||||||
| struct wrong_fn { |  | ||||||
|     explicit wrong_fn(const std::string &letters); |  | ||||||
|     bool operator()(const std::string &word) const; |  | ||||||
| 
 |  | ||||||
| private: |  | ||||||
|     std::string l; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| struct correct_fn { |  | ||||||
|     explicit correct_fn(const letters_and_indices &idxs); |  | ||||||
|     bool operator()(const std::string &word) const; |  | ||||||
| 
 |  | ||||||
| private: |  | ||||||
|     letters_and_indices m; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| struct misplaced_fn { |  | ||||||
|     explicit misplaced_fn(const letters_and_indices &idxs); |  | ||||||
|     bool operator()(const std::string &word) const; |  | ||||||
| 
 |  | ||||||
| private: |  | ||||||
|     letters_and_indices m; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| void do_filter(std::vector<std::string> &candidates, const std::string &wrong, |  | ||||||
|                const letters_and_indices &green, const letters_and_indices &yellow); |  | ||||||
| 
 |  | ||||||
| letters_and_indices build_list(const std::string &line); |  | ||||||
| std::tuple<std::string, letters_and_indices, letters_and_indices> prompt(); |  | ||||||
| 
 |  | ||||||
| #endif // ORDLE_H
 |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue