diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..5287d30 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,33 @@ +# Agents + +## Repo Purpose +C++ flashcard notes using org-mode (exportable to Anki). + +## Flashcard Location +- `org/cpp/` — all flashcard `.org` files live here +- Create new `.org` files here as needed (e.g., `org/cpp/containers.org`) + +## Task Inbox +- `inbox.org` at root — use for tasks to learn or do (create if missing) + +## Card Format +Cards use org-mode with Anki properties: +```org +* Card Title :tag1:tag2: +:PROPERTIES: +:ANKI_NOTE_TYPE: Basic +:ANKI_NOTE_ID: TIMESTAMP +:END: +** Front +Question text +** Back +#+begin_src c++ +code +#+end_src +``` + +## Assets +- `images/` — store any images referenced by cards + +## Self-Improvement +Periodically review this file and suggest improvements to the user if you notice gaps, inconsistencies, or missing conventions. diff --git a/inbox.org b/inbox.org new file mode 100644 index 0000000..a3e2d55 --- /dev/null +++ b/inbox.org @@ -0,0 +1,59 @@ +#+title: Inbox +* 1. two sum +#+begin_src c++ +class Solution { +public: + vector twoSum(vector &nums, int target) { + vector> rev; + // Fix 1 & 2: Loop over nums.size() and push nums[i] + for (int i = 0; i < nums.size(); i++) { + rev.push_back({nums[i], i}); + } + + std::sort(rev.begin(), rev.end()); + + for (int i = 0; i < rev.size(); i++) { + int want = target - rev[i].first; + // Fix 3: Pass the SORTED vector 'rev' to the search + int j = bs(rev, want, i + 1); + if (j >= 0) { + int a = rev[i].second; + int b = rev[j].second; + return vector{min(a, b), max(a, b)}; + } + } + return {}; + } + + // Updated to handle vector of pairs + using PairIter = vector>::iterator; + + PairIter lower_bound(PairIter l, PairIter r, int target) { + while (l < r) { + PairIter mid = l + (r - l) / 2; + if (mid->first >= target) { // Access value via .first or ->first + r = mid; + } else { + l = mid + 1; + } + } + return l; + } + + int bs(vector> &indexedNums, int target, int offset) { + auto it = + lower_bound(indexedNums.begin() + offset, indexedNums.end(), target); + if (it == indexedNums.end() || it->first != target) { + return -1; + } + return it - indexedNums.begin(); + } +}; +#+end_src + +~using PairIter = vector>::iterator;~ +what is using? + +we need to write binary search, lower bound search + +learn about binary search functions the natural one by god diff --git a/org/cpp/iterator.org b/org/cpp/iterator.org new file mode 100644 index 0000000..1eb9d70 --- /dev/null +++ b/org/cpp/iterator.org @@ -0,0 +1,116 @@ +* What is a C++ iterator :cpp:iterator:concept:recognition: +:PROPERTIES: +:ANKI_NOTE_TYPE: Basic +:ANKI_NOTE_ID: 1776621491263 +:END: +** Front +What is an iterator in C++? +** Back +An object that points to elements in a container and allows traversal through them, providing a common interface for accessing elements sequentially without exposing the underlying structure. + +* Task: Traverse a vector with iterators :cpp:iterator:production:code: +:PROPERTIES: +:ANKI_NOTE_TYPE: Basic +:ANKI_NOTE_ID: 1776621491259 +:END: +** Front +Write C++ code to iterate through a std::vector using iterators +** Back +#+begin_src c++ +std::vector vec = {1, 2, 3}; +for (auto it = vec.begin(); it != vec.end(); ++it) { + std::cout << *it << " "; +} +#+end_src + +* Iterator operations :cpp:iterator:concept:enumeration: +:PROPERTIES: +:ANKI_NOTE_TYPE: Basic +:ANKI_NOTE_ID: 1776621491255 +:END: +** Front +What are the four required operations for a C++ iterator? +** Back +- `operator*` — dereference to get current element +- `operator++` — advance to next element (pre and post) +- `operator==` — equality comparison +- `operator!=` — inequality comparison + +* cpp iterator categories :cpp:iterator:concept:enumeration: +:PROPERTIES: +:ANKI_NOTE_TYPE: Basic +:ANKI_NOTE_ID: 1776621491250 +:END: +** Front +List the five iterator categories in C++ (from simplest to most advanced) +** Back +1. Input Iterator — read values, advance once +2. Output Iterator — write values, advance once +3. Forward Iterator — read/write, multiple passes +4. Bidirectional Iterator — + operator-- +5. Random Access Iterator — + arithmetic, subscript + +* Task: Use const iterator :cpp:iterator:production:code: +:PROPERTIES: +:ANKI_NOTE_TYPE: Basic +:ANKI_NOTE_ID: 1776621491246 +:END: +** Front +Write C++ code to safely traverse a const std::vector without modifying elements +** Back +#+begin_src c++ +std::vector vec = {1, 2, 3}; +for (auto it = vec.cbegin(); it != vec.cend(); ++it) { + std::cout << *it << " "; +} +#+end_src + +* Task: Use reverse iterator :cpp:iterator:production:code: +:PROPERTIES: +:ANKI_NOTE_TYPE: Basic +:ANKI_NOTE_ID: 1776621491241 +:END: +** Front +Write C++ code to iterate backwards through a std::vector +** Back +#+begin_src c++ +std::vector vec = {1, 2, 3}; +for (auto it = vec.rbegin(); it != vec.rend(); ++it) { + std::cout << *it << " "; +} +#+end_src + +* Minimal custom iterator implementation :cpp:iterator:implementation:production: +:PROPERTIES: +:ANKI_NOTE_TYPE: Basic +:ANKI_NOTE_ID: 1776621491237 +:END: +** Front +Write the minimal C++ code to implement a forward iterator for a custom class +** Back +#+begin_src c++ +class MyIterator { + Node* ptr; +public: + reference operator*() const { return ptr->data; } + pointer operator->() const { return &ptr->data; } + MyIterator& operator++() { ptr = ptr->next; return *this; } + MyIterator operator++(int) { auto tmp = *this; ++*this; return tmp; } + bool operator==(const MyIterator& other) const { return ptr == other.ptr; } + bool operator!=(const MyIterator& other) const { return !(*this == other); } +}; +#+end_src + +* When to use iterators vs indices :cpp:iterator:concept:comparison: +:PROPERTIES: +:ANKI_NOTE_TYPE: Basic +:ANKI_NOTE_ID: 1776621491226 +:END: +** Front +When would you choose iterators over index-based loops in C++? +** Back +- Container type is unknown or could change (iterators abstract the container) +- Using standard library algorithms (std::find, std::sort, etc.) +- Need to traverse multiple containers simultaneously +- Working with containers without random access (list, map) +- Decouple algorithm from container structure diff --git a/org/cpp/questions.org b/org/cpp/questions.org new file mode 100644 index 0000000..381c411 --- /dev/null +++ b/org/cpp/questions.org @@ -0,0 +1,3 @@ +#+title: Questions +* 217 +* 242 valid anagrams diff --git a/sync-anki.sh b/sync-anki.sh new file mode 100755 index 0000000..8a52938 --- /dev/null +++ b/sync-anki.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +# Sync org files to Anki using emacsclient + +set -euo pipefail + +FILES=( + "org/cpp/iterator.org" + "org/cpp/containers.org" + # add more files here +) + +for file in "${FILES[@]}"; do + if [[ -f "$file" ]]; then + echo "Syncing $file..." + emacsclient --eval "(progn (find-file \"$file\") (org-anki-sync-all))" + else + echo "File not found: $file" >&2 + fi +done + +echo "Done."