This is an old revision of the document!
🌾 Simulare Fermă - Maximizare Profit 🚜
Gestionează o fermă virtuală și maximizează profitul prin plantare strategică și rotație culturilor!
Autor: Trifu Marius-Constantin
Tehnologii:
Cerințe:
.h / .cppmakeSimulați gestionarea unei ferme pe mai multe zile. Scopul este să maximizați suma finală de bani prin plantarea și vânzarea legumelor, respectând reguli de rotație a culturilor și constrângeri financiare.
🎯 Obiectiv: Maximizează SUMA_FINALA = bani_inițiali + venituri - cheltuieli
🚫 Rotație Culturi Identice:
În același pătrat NU poți planta două culturi identice una după alta.
Exemplu: Dacă în pătratul 00×00 ai plantat morcov la ziua 1 și l-ai cules la ziua 4, nu poți planta din nou morcov în același pătrat imediat după.
Regula: Trebuie să aștepți cel puțin 3 zile de la culegere.
✅ Plante Prietenoase:
Unele legume pot fi plantate doar după alte legume specifice.
Exemplu:
Aceste relații sunt definite în secțiunea ROTATIE.
💰 Constrângeri Financiare:
📝 Atenție la format! Respectați exact structura specificată.
Format general:
| ferma.txt |
|---|
L L ZILE BANI N nume_leguma1 timp_cultivare1 cost1 pret_vanzare1 nume_leguma2 timp_cultivare2 cost2 pret_vanzare2 ... ROTATIE M leguma1 N/A leguma2 leguma1 leguma3 leguma2 leguma4 leguma1 ... |
Explicații câmpuri:
Restricții:
| ferma.txt |
|---|
3 3 10 500 4 morcov 3 50 200 ceapa 2 30 150 castravete 4 80 300 roșie 5 100 400 ROTATIE 4 morcov ceapa ceapa N/A castravete N/A roșie morcov |
Interpretare exemplu:
Format general:
| ferma.out |
|---|
ZI ACTIUNE PATRAT LEGUMA ZI ACTIUNE PATRAT LEGUMA ... SUMA_FINALA: suma |
Tipuri de acțiuni:
Format linie acțiune:
Reguli de numerotare pătrate:
| ferma.out |
|---|
1 planteaza 00x00 ceapa 1 planteaza 00x01 ceapa 3 culege 00x00 3 culege 00x01 4 planteaza 00x00 morcov 4 planteaza 00x01 morcov 7 culege 00x00 7 culege 00x01 SUMA_FINALA: 740 |
Explicație exemplu:
Programul vostru trebuie să respecte următoarele constrângeri. Scriptul de verificare verifică automat fiecare regulă!
❌ Nu poți planta aceeași legumă imediat după culegere!
| Situație | Zi Culegere | Când poți replanta aceeași legumă? |
|---|---|---|
Culegi morcov din 00×00 | Ziua 4 | Ziua 8 sau mai târziu (după 3 zile) |
Culegi ceapă din 01×01 | Ziua 10 | Ziua 14 sau mai târziu |
Regulă: Dacă culegi leguma X din pătratul P la ziua Z, NU poți planta X în P în zilele Z, Z+1, Z+2.
✅ Poți planta: altă legumă (dacă respectă ROTATIE) sau aceeași legumă după minim 3 zile.
✅ Respectă relațiile din secțiunea ROTATIE!
Exemplu:
ROTATIE 2 morcov ceapa ← Morcov poate fi plantat doar după ceapă ceapa N/A ← Ceapă poate fi plantată după orice
| Pătrat | Legumă Culeasă | Ce poți planta după? |
|---|---|---|
00×00 | ceapă (zi 3) | morcov (zi 4+) sau ceapă (zi 7+, după 3 zile) |
00×01 | morcov (zi 7) | ceapă (zi 8+, are N/A) |
Reguli:
morcov ceapa) → poate fi plantată doar după legumele specificate
Când e un pătrat LIBER pentru plantare?
| Status Pătrat | Condiții |
|---|---|
| 🆕 Niciodată folosit | Poți planta doar legume cu N/A în ROTATIE |
| ✅ După culegere | A trecut ≥1 zi + respectă rotația (regula 2) + respectă 3 zile pentru aceeași legumă (regula 1) |
| ❌ Ocupat | Așteaptă până la culegere! |
Formula sumei finale:
SUMA_FINALA = BANI_INIȚIALI + VENITURI - CHELTUIELI Unde: VENITURI = Σ (preț_vânzare pentru fiecare legumă culeasă) CHELTUIELI = Σ (cost pentru fiecare legumă plantată)
Constrângeri:
bani_curent < cost_legumăCând poți culege o legumă?
| Legumă | Timp Cultivare | Plantată Ziua | Gata de Cules Ziua |
|---|---|---|---|
| Ceapă | 2 zile | 1 | 3 (1 + 2) |
| Morcov | 3 zile | 4 | 7 (4 + 3) |
| Roșie | 5 zile | 1 | 6 (1 + 5) |
Regulă: zi_culegere ≥ zi_plantare + timp_cultivare
Argumente linie de comandă:
teste/limite_minime.txt - conține minimul de bani necesar pentru fiecare test
==== 5.2 Fișier README.md (1p) ====
* Nume și grupă
* OS și IDE folosit
* Explicația organizării funcției int main
* Strategia de maximizare a sumei finale (2-3 propoziții)
==== 5.3 Punctaj Bonus - Clasament (până la 5p) ====
Clasament Live: rezultate.eu
Actualizare automată la fiecare push în GitHub!
Puncte bonus pentru top 20 în clasament (bazat pe scorul total de bani):
^ Poziție ^ Puncte Bonus ^
| 🥇 Locul 1 | +5p |
| 🥈 Locurile 2-3 | +4p |
| 🥉 Locurile 4-5 | +3p |
| Locurile 6-10 | +2p |
| Locurile 11-20 | +1p |
Cum funcționează:
* Clasamentul se calculează după suma totală de bani obținută pe toate cele 18 teste
* Doar studenții apar în clasamentul principal
* Nickname-ul tău e generat automat (ex: “BraveDragon”, “MightyFalcon”)
* Poți edita nickname-ul cu o cheie unică (vezi secțiunea 6.3)
<note important>
Notă: Dacă tema nu compilează sau nu trece niciun test, va fi notată cu 0 puncte.
</note>
===== 6. Depunctări =====
Depunctări la temă dacă:
* Nu redenumești corect repository-ul: -0.5p
* Codul nu trece verificarea cu Valgrind (va fi verificat manual la final deadline): -1p
* Codul nu este împărțit în fișiere separate (.h / .cpp): -0.5p
* Cod scris fără comentarii, cu sintaxă neclară, variabile numite random: maxim -1p
<note warning>
Foarte important: După ce dați accept la repository, schimbați numele din Settings în formatul:
* tema2-32XAB-Nume-Prenume
* Exemplu: tema2-322AB-Trifu-Marius
Cum redenumești:
- Intră în repository pe GitHub
- Click pe Settings (sus-dreapta)
- Secțiunea General → Repository name
- Schimbă în tema2-32XAB-Nume-Prenume
- Click Rename
</note>
===== 7. Încărcare și Testare =====
==== 7.1 Accept Assignment ====
<note>
Link GitHub Classroom: https://classroom.github.com/a/rgoi0BWr
</note>
După accept:
- Se creează repository-ul tău: Laborator-POO-2025-2026/tema2-USERNAME
- IMPORTANT: Redenumește repository-ul în tema2-32XAB-Nume-Prenume (vezi secțiunea 6)
- Clonează: git clone https://github.com/Laborator-POO-2025-2026/tema2-USERNAME.git
- Intră în folder: cd tema2-USERNAME
==== 7.2 Compilare și Rulare ====
Comenzi disponibile:
<code bash>
make # Compilează și rulează toate cele 18 teste
make build # Doar compilează (creează executabilul)
make run # Compilează și rulează ferma.txt (trebuie să existe în folder!)
make clean # Curăță fișierele generate
</code>
Testare individuală:
<code bash>
make test1 # Rulează doar testul 1
make test5 # Rulează doar testul 5
make test-all # Rulează toate testele (același cu make)
</code>
Când rulezi un test individual (ex: make test1), vei primi:
* ✓ Mesaj detaliat cu eroarea dacă testul a picat (linia exactă și motivul)
* ✓ Suma finală de bani obținută
* ✓ Limita minimă necesară pentru a trece testul
* Fișierul teste/limite_minime.txt conține minimul de bani pentru fiecare test
==== 7.3 Clasament și Nickname ====
Clasament Live: Accesează rezultate.eu pentru a vedea clasamentul în timp real.
Nickname auto-generat:
* La prima trimitere (git push), primești un nickname random (ex: “SwiftFalcon”, “BraveDragon”)
* Mesajul de trimitere îți arată nickname-ul: 🎯 Nickname-ul tău: BraveDragon
Editare nickname (opțional):
<code bash>
make key # Generează o cheie unică în teste/scripturi/key.txt
# Dacă cheia există deja, o afișează (nu generează alta)
# Apoi:
git add teste/scripturi/key.txt
git commit -m “Add personal key”
git push
# Pe rezultate.eu:
# 1. Găsește-te în clasament
# 2. Click pe ✏️ lângă numele tău
# 3. Introdu cheia din teste/scripturi/key.txt
# 4. Alege un nickname nou (3-30 caractere, alfanumeric + . _)
</code>
<note tip>
Dacă rulezi make key oricând ulterior, îți va afișa cheia generată anterior (nu creează una nouă).
</note>
==== 7.4 GitHub Actions - Testare Automată ====
✨ Testare și trimitere automată la fiecare git push!
Ce se întâmplă când faci push:
- 1️⃣ GitHub Actions pornește automat
- 2️⃣ Compilează programul (make build)
- 3️⃣ Rulează toate cele 18 teste
- 4️⃣ Trimite rezultatele la rezultate.eu
- 5️⃣ Actualizează clasamentul live
Vezi rezultatele:
* GitHub: Tab “Actions” în repository
* Live: rezultate.eu
Output GitHub Actions:
<code>
✓ VERIFICARE REUSITA 🎉
Fisierul este valid!
Suma finala: 10 702 303 RON
✓ Rezultate trimise cu succes la server!
🎯 Nickname-ul tău: BraveDragon
Vezi clasamentul pe: https://rezultate.eu
</code>
===== 8. Exemplu Complet =====
^ ferma.txt ^
| <code>
2 2 10 300 2
morcov 3 50 200
ceapa 2 40 160
ROTATIE 2
morcov ceapa
ceapa N/A
</code> |
Strategie optimă:
^ ferma.out ^
| <code>
1 planteaza 00×00 ceapa
1 planteaza 00×01 ceapa
3 culege 00×00
3 culege 00×01
4 planteaza 00×00 morcov
4 planteaza 00×01 morcov
7 culege 00×00
7 culege 00×01
8 planteaza 00×00 ceapa
8 planteaza 00×01 ceapa
10 culege 00×00
10 culege 00×01
SUMA_FINALA: 1080
</code> |
Calcul sumă finală:
* Cheltuieli: 2×40 (cepe zi 1) + 2×50 (morcovi zi 4) + 2×40 (cepe zi 8) = 80 + 100 + 80 = 260 RON
* Venituri: 2×160 (cepe zi 3) + 2×200 (morcovi zi 7) + 2×160 (cepe zi 10) = 320 + 400 + 320 = 1040 RON
* Suma finală: 300 (inițial) + 1040 - 260 = 1080 RON
===== 9. Tips & Tricks =====
⚡ Strategii de Maximizare:
* ✅ Calculează profit/zi pentru fiecare legumă: (preț_vânzare - cost) / timp_cultivare
* ✅ Prioritizează legumele cu profit/zi ridicat
* ✅ Incearcă să folosești toate pătratele disponibile dacă e optim
* ✅ NU planta legume care nu ajung la maturitate înainte de finalul simulării
* ✅ Respectă rotațiile pentru a maximiza utilizarea pătratelor
* ✅ Gestionează bugetul prudent - nu rămâne fără bani!
✅ Checklist Înainte de Submit:
- Compilează fără erori (make build)
- Trece toate testele local (make)
- README.md completat
- Commit + push pe GitHub
- Verificat clasament pe rezultate.eu
📁 Fișiere Importante:
* teste/limite_minime.txt - limite minime pentru fiecare test
* teste/scripturi/key.txt - cheia ta unică (opțional, pentru editare nickname)
* Makefile - comenzi de compilare și testare
🔗 Link-uri Utile:**—