# Contribution Guide — কীভাবে এই repo-তে note যোগ করবে

> এই repo মূলত একটা personal learning repository, কিন্তু GitHub-এ publish করার মতো করে সাজানো। তুমি নিজে নতুন note যোগ করবে (বা কেউ contribute করতে চাইলে) — এই guide সেই নিয়মগুলো এক জায়গায় রাখে, যাতে সব note একই রকম মানসম্পন্ন আর legally পরিষ্কার থাকে।

---

## সোনালি নিয়ম

প্রতিটা note-এর একটাই লক্ষ্য: **কীভাবে ভাবতে হয় শেখানো — শুধু উত্তর দেওয়া নয়।** শুধু সংজ্ঞা বা শুধু code যথেষ্ট নয়। ভাবনার পথটা (brute force → কেন slow → optimized intuition → thinking tweak) দেখাতেই হবে।

---

## একটা নতুন problem note যোগ করার ধাপ

1. **ঠিক করো এটা কোন folder-এ।** Math problem হলে `01-math-based-programming-fundamentals/<level>/problems/`; data-structure problem হলে সেই topic-এর `problems/` folder।
2. **Template copy করো।**
   - Math problem → [templates/math-problem-note-template.md](templates/math-problem-note-template.md) (২০টা section)।
   - Data-structure problem → [templates/ds-problem-note-template.md](templates/ds-problem-note-template.md) (২৪টা section)।
3. **File নাম দাও** `NNN-kebab-case-title.md` ছাঁচে — যেমন `042-ncr-pascal-triangle.md`। নম্বরটা সেই folder-এর `problems/README.md` tracker-এর `#` কলামের সাথে মিলবে।
4. **প্রতিটা section পূরণ করো** — কোনো section ফাঁকা বা "TODO" রেখো না। ভাবনাটা যেন প্রতিটা ধাপে দেখা যায়।
5. **Python code চালিয়ে দেখো** — code block-এর সমাধান আসলেই চলে কিনা, অন্তত ২-৩টা test/assert দিয়ে নিশ্চিত করো।
6. **Tracker update করো** — সেই folder-এর `problems/README.md`-তে row-এর `Status` `planned` → `done` (বা নতুন problem হলে নতুন row যোগ করো)।
7. **Source map update করো** — folder-এর `source-map.md`-তে কোথা থেকে ধারণা/link নিয়েছ তা যোগ করো (নিচে দেখো)।

---

## লেখার ভাষা ও style

- **ব্যাখ্যা বাংলায়** (বন্ধুসুলভ, তুমি-form), কিন্তু **technical term, problem name, platform name, URL, code identifier, table-এর column header English-এ** — যেভাবে আসল কাজেও থাকে। যেমন: "এই problem-এ একটা `hash map` লাগবে, কারণ আমরা O(1)-এ lookup চাই।"
- সংখ্যা Arabic numeral-এ (1, 2, 3)।
- **ছবি দিয়ে বোঝাও** — graph/flow-এর জন্য `mermaid`, নির্দিষ্ট মানের বাক্সের জন্য `text` fence, আর একাধিক ধাপের জন্য Markdown table ব্যবহার করো। ছবির আগে input ও পরে ফলের ব্যাখ্যা দাও। বাংলা যুক্তাক্ষরকে space দিয়ে বাক্সের সঙ্গে align করার চেষ্টা কোরো না; বাংলা label graph-এ বা ছবির বাইরের caption-এ রাখো।
- **সম্পূর্ণ উদাহরণ দাও** — ছোট input বেছে সব state দেখাও। মাঝের ধাপ বা code `...` দিয়ে বাদ দিও না। সাধারণ অসীম sequence বোঝাতে ellipsis ব্যবহার করা যায়, কিন্তু worked example-এ নয়।
- **ব্যবহারটি নির্দিষ্ট করো** — যেমন শুধু “real-world use” নয়: “কাজের priority বদলালে scheduler-এ heap থেকে পরের কাজ বাছা”, সঙ্গে কখন সেই structure উপযুক্ত নয় তা বলো।
- **Link আলাদা করো** — problem নাম থেকে স্থানীয় `.md` note, আর platform নাম/ID থেকে official task page। Self-practice হলে তা স্পষ্ট লেখো; generic catalog-কে নির্দিষ্ট problem-এর link বলে দেখিও না।
- **Code সব Python-এ**, ` ```python ` fence-এ, beginner-friendly ও heavily-commented।
- Markdown পরিচ্ছন্ন রাখো: প্রতিটা list-এর আগে আর header-এর পরে একটা ফাঁকা লাইন।
- প্রতিটা note-এ একটা **thinking tweak** থাকবেই — সেই ছোট্ট মানসিক shift যেটা problem-টা খুলে দেয়।

---

## Legal ও sourcing নিয়ম (বাধ্যতামূলক)

বিস্তারিত নীতি: [00-books-and-learning-sources/legal-resource-policy.md](00-books-and-learning-sources/legal-resource-policy.md)। সংক্ষেপে:

- **কখনো pirated বই ব্যবহার বা download কোরো না।**
- **কোনো problem statement বা editorial হুবহু copy কোরো না** — সবসময় নিজের ভাষায় নতুন করে লেখো, শুধু attribution-এর জন্য official link রাখো।
- বই copyright-এ থাকলে শুধু **recommended reading** হিসেবে নাম + কী কাজে লাগে বলো; content paste কোরো না।
- **কখনো দাবি কোরো না** কোনো problem "Google/Amazon/Microsoft-এ জিজ্ঞেস করা হয়েছিল।** নিরাপদ শব্দ ব্যবহার করো: "common interview pattern", "Google-style pattern", "frequently seen interview pattern"।
- শুধু সেই link দাও যেটার অস্তিত্ব নিয়ে নিশ্চিত (official problem/doc page)। নিশ্চিত না হলে platform-এর নাম + problem নাম + platform-এর root link দাও — **কখনো URL বা problem ID বানিয়ে লিখো না।**

---

## `source-map.md`-এর ছাঁচ

প্রতিটা folder-এ একটা `source-map.md` থাকে এই কলামগুলো নিয়ে:

| Concept / Problem | Source Type | Source Name | Link | How it is used | Copying status |
| --- | --- | --- | --- | --- | --- |

`Copying status` কলামে শুধু এই মানগুলোর একটা বসবে:

- `original explanation` — সম্পূর্ণ নিজের ব্যাখ্যা
- `inspired by source` — ধারণা কোনো source থেকে, কিন্তু নিজের ভাষায়
- `rewritten problem` — problem নিজের ভাষায় নতুন করে লেখা
- `official link only` — শুধু attribution-এর link, content নেওয়া হয়নি
- `user-provided resource` — ব্যবহারকারীর দেওয়া material

পূর্ণ ব্যাখ্যা ও উদাহরণ: [00-books-and-learning-sources/source-map-template.md](00-books-and-learning-sources/source-map-template.md)।

---

## Folder-এর গঠন (consistency)

Data-structure topic folder-এর সাধারণ গঠন: `README.md`, `concept.md`, `visual-explanation.md`, `operations.md`/`patterns.md`, `implementation.py`, `source-map.md`, `problems/`। নতুন topic README লিখতে [templates/topic-readme-template.md](templates/topic-readme-template.md) ব্যবহার করো।

Math level folder-এর গঠন: `README.md`, `concept-notes.md`, `visualization-ideas.md`, `source-map.md`, `problems/`।

---

## একটা ছোট checklist (commit করার আগে)

Problem note-এ ছয়টি মূল ভাগ রাখুন: প্রশ্ন ও উদাহরণ, ভিত্তির ধারণা, ধাপে ধাপে সমাধান,
কোড ও ব্যাখ্যা, খরচ ও সাধারণ ভুল, শেখা ও পরের অনুশীলন। ছোট প্রশ্ন বা ব্যাখ্যা উপশিরোনাম হবে।
পুরোনো নোট সাজানোর সময় heading-এর `{#anchor}` রাখুন, যাতে আগের link কাজ করে।

Array, stack, queue, linked list বা grid বোঝাতে `dsa` fence ব্যবহার করা যায়।
এটি সাইটে আসল box ও pointer হিসেবে দেখায়; JavaScript লাগে না। Graph ও tree-তে Mermaid ব্যবহার করুন।
সংখ্যার হিসাব বা iteration log-এর জন্য Markdown table যথেষ্ট। চলার মতো code শুধু code block-এ রাখুন।

````markdown
```dsa
kind: array
title: দুই pointer-এর বর্তমান অবস্থান
steps:
  - label: প্রথম ধাপ
    values: [2, 4, 7, 9]
    active: [0, 3]
    pointers: {L: 0, R: 3}
    note: 2 + 9 = 11; target 13 হলে L এক ঘর ডানে যাবে।
```
````

`kind` হবে `array`, `queue`, `stack`, `linked-list` বা `grid`। Stack-এর `values` নিচ থেকে ওপরের ক্রমে;
queue-তে বাঁ দিক front। Linked list-এর শেষে প্রয়োজন হলে `None` আলাদা value হিসেবে দিন।
Grid-এ `values`-এর বদলে `rows: [[1, 2], [3, 4]]` এবং `active: [[0, 1]]` লিখুন।
`muted` দিয়ে ফাঁকা/বাদ যাওয়া ঘর দেখানো যায়; `indices: false` দিয়ে index আড়াল করা যায়।
Caption ও note-এ plain text লিখুন। `dsa`-এর graphical rendering এই সাইটের সুবিধা;
ডাউনলোড করা Markdown-এ একই diagram-এর data থাকে।

- [ ] সঠিক template-এর সব section পূরণ হয়েছে
- [ ] একটা স্পষ্ট thinking tweak আছে
- [ ] Python code চলে, test/assert pass করে
- [ ] কোনো copy-করা statement/editorial নেই, সব নিজের ভাষায়
- [ ] Link গুলো আসল ও official; কোনো বানানো URL নেই
- [ ] "asked by Google/Amazon" দাবি নেই
- [ ] tracker (`problems/README.md`) আর `source-map.md` update হয়েছে
- [ ] Markdown পরিচ্ছন্ন (list/header-এর চারপাশে ফাঁকা লাইন)
- [ ] `python -m mkdocs build --strict` এবং `python scripts/check_site.py` সফল
- [ ] `python -m unittest discover -s tests -v` সফল
- [ ] Desktop ও mobile preview-এ বাংলা, diagram, table ও download link পড়া/ব্যবহার করা যায়
