diff --git a/.gitignore b/.gitignore index 2c9c809..2690f4e 100644 --- a/.gitignore +++ b/.gitignore @@ -34,5 +34,6 @@ # Other find/*.txt find/data/* -multi-find/data/* +multifind/data/* +search/data/* .vscode/ \ No newline at end of file diff --git a/README.md b/README.md index ef8854d..ecef1e8 100644 --- a/README.md +++ b/README.md @@ -34,4 +34,4 @@ replace general - [X] chunking - [X] recursive find in directory -- [ ] parallelization \ No newline at end of file +- [ ] parallelization diff --git a/multi-find/ahoCorasick.h b/multifind/ahoCorasick.h similarity index 100% rename from multi-find/ahoCorasick.h rename to multifind/ahoCorasick.h diff --git a/multi-find/mfind b/multifind/mfind similarity index 100% rename from multi-find/mfind rename to multifind/mfind diff --git a/multi-find/mfind.cpp b/multifind/mfind.cpp similarity index 100% rename from multi-find/mfind.cpp rename to multifind/mfind.cpp diff --git a/search/fuzzy.h b/search/fuzzy.h new file mode 100644 index 0000000..b30cd62 --- /dev/null +++ b/search/fuzzy.h @@ -0,0 +1,32 @@ +#ifndef FUZZY_H +#define FUZZY_H + +#include +#include +#include + +// Check if pattern is a fuzzy subsequence of str +inline bool isFuzzySubsequence(const std::string& pattern, const std::string& str) { + size_t j = 0; + for (size_t i = 0; i < str.size() && j < pattern.size(); ++i) { + if (tolower(str[i]) == tolower(pattern[j])) { + ++j; + } + } + return j == pattern.size(); +} + +// Scoring: 100 down +inline int fuzzyScore(const std::string& pattern, const std::string& str) { + if (!isFuzzySubsequence(pattern, str)) return -1; + + // Boost if match is closer to start or fewer gaps + int lenDiff = str.length() - pattern.length(); + int score = 100 - lenDiff; + if (!str.empty() && tolower(str[0]) == tolower(pattern[0])) { + score += 10; + } + return score; +} + +#endif diff --git a/search/search b/search/search new file mode 100755 index 0000000..7029bdc Binary files /dev/null and b/search/search differ diff --git a/search/search.cpp b/search/search.cpp new file mode 100644 index 0000000..dacb07c --- /dev/null +++ b/search/search.cpp @@ -0,0 +1,36 @@ +#include +#include +#include +#include +#include +#include "../helpers/fileHelper.h" +#include "fuzzy.h" + +int main(int argc, char* argv[]) { + if (argc != 2) { + std::cerr << "Usage: " << argv[0] << " \n"; + return 1; + } + + std::string query = argv[1]; + auto files = getAllFiles("."); + + std::vector> matches; + + for (const auto& file : files) { + int score = fuzzyScore(query, file); + if (score >= 0) { + matches.emplace_back(file, score); + } + } + + std::sort(matches.begin(), matches.end(), [](auto& a, auto& b) { + return a.second > b.second; + }); + + for (const auto& [file, score] : matches) { + std::cout << file << " (score: " << score << ")\n"; + } + + return 0; +}