From da36aeaf83548ce6274f08a8f3d5bfe4632831b3 Mon Sep 17 00:00:00 2001 From: Reshi Adavan Date: Fri, 18 Apr 2025 19:16:23 -0400 Subject: [PATCH] SC-05: Fuzzy --- .gitignore | 3 +- README.md | 2 +- {multi-find => multifind}/ahoCorasick.h | 0 {multi-find => multifind}/mfind | Bin {multi-find => multifind}/mfind.cpp | 0 search/fuzzy.h | 32 +++++++++++++++++++++ search/search | Bin 0 -> 190504 bytes search/search.cpp | 36 ++++++++++++++++++++++++ 8 files changed, 71 insertions(+), 2 deletions(-) rename {multi-find => multifind}/ahoCorasick.h (100%) rename {multi-find => multifind}/mfind (100%) rename {multi-find => multifind}/mfind.cpp (100%) create mode 100644 search/fuzzy.h create mode 100755 search/search create mode 100644 search/search.cpp 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 0000000000000000000000000000000000000000..7029bdc053a4f9907c7ed3988ee373a2cbfd30c3 GIT binary patch literal 190504 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 literal 0 HcmV?d00001 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; +}