Table of Contents

Tema 2 – Simulare Fermă (C++)

🌾 Simulare Fermă - Maximizare Profit 🚜

Gestionează o fermă virtuală și maximizează profitul prin plantare strategică și rotație culturilor!

📅 Publicare: 02.11.2024
Deadline: 16.11.2024, ora 23:59
🎯 Punctaj Total: 10p (9p teste + 1p README + până la 5p bonus clasament)
🏆 Clasament Live: rezultate.eu
📝 Accept Assignment: Classroom Link

Autor: Trifu Marius-Constantin

Informații Generale

Tehnologii:

Cerințe:

1. Descriere

Simulaț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

Reguli Importante

🚫 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:

2. Formate Fișiere

📝 Atenție la format! Respectați exact structura specificată.

2.1 Fișier de Intrare: ferma.txt

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:

2.2 Fișier de ieșire: ferma.out

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:

Observații:

  • Acțiunile trebuie să fie valide: nu poți planta dacă nu ai bani sau dacă pătratul este ocupat.
  • Nu poți culege o legumă care nu este matură sau care nu există.
  • Verificați regulile de validare pentru detalii despre rotație.

3. Reguli de Validare

Programul vostru trebuie să respecte următoarele constrângeri. Scriptul de verificare verifică automat fiecare regulă!

🔄 Regula 1: Rotație Culturi Identice

❌ 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.

🌱 Regula 2: Rotație Legume Prietenoase

✅ 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:

Atenție la pătratele noi! Într-un pătrat care nu a fost plantat niciodată, poți planta doar legume cu N/A în ROTATIE!

📦 Regula 3: Disponibilitate Pătrat

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!

💰 Regula 4: Gestionare Bani

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:

⏰ Regula 5: Maturitate Legume

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

Sfat: NU planta legume care nu ajung la maturitate înainte de finalul simulării!

4. Implementare

Argumente linie de comandă:

5. Punctaj (10p + până la 5p bonus)

5.1 Punctaj Teste (9p)

5.2 Fișier README.md (1p)

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ă:

Notă: Dacă tema nu compilează sau nu trece niciun test, va fi notată cu 0 puncte.

6. Depunctări

Depunctări la temă dacă:

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:

  1. Intră în repository pe GitHub
  2. Click pe Settings (sus-dreapta)
  3. Secțiunea GeneralRepository name
  4. Schimbă în tema2-32XAB-Nume-Prenume
  5. Click Rename

7. Încărcare și Testare

7.1 Accept Assignment

După accept:

  1. Se creează repository-ul tău: Laborator-POO-2025-2026/tema2-USERNAME
  2. IMPORTANT: Redenumește repository-ul în tema2-32XAB-Nume-Prenume (vezi secțiunea 6)
  3. Intră în folder: cd tema2-USERNAME

7.2 Compilare și Rulare

Comenzi disponibile:

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

Testare individuală:

make test1        # Rulează doar testul 1
make test5        # Rulează doar testul 5
make test-all     # Rulează toate testele (același cu make)

Când rulezi un test individual (ex: make test1), vei primi:

7.3 Clasament și Nickname

Clasament Live: Accesează rezultate.eu pentru a vedea clasamentul în timp real.

Nickname auto-generat:

Editare nickname (opțional):

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 + . _)

Dacă rulezi make key oricând ulterior, îți va afișa cheia generată anterior (nu creează una nouă).

7.4 GitHub Actions - Testare Automată

Testare și trimitere automată la fiecare git push!

Ce se întâmplă când faci push:

  1. 1️⃣ GitHub Actions pornește automat
  2. 2️⃣ Compilează programul (make build)
  3. 3️⃣ Rulează toate cele 18 teste
  4. 4️⃣ Trimite rezultatele la rezultate.eu
  5. 5️⃣ Actualizează clasamentul live

Vezi rezultatele:

Output GitHub Actions:

✓ 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

8. Exemplu Complet

ferma.txt
2 2 10 300 2
morcov 3 50 200
ceapa 2 40 160
ROTATIE 2
morcov ceapa
ceapa N/A

Strategie optimă:

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
8 planteaza 00x00 ceapa
8 planteaza 00x01 ceapa
10 culege 00x00
10 culege 00x01
SUMA_FINALA: 1040

Calcul sumă finală:

8. Tips & Tricks

⚡ Strategii de Maximizare:

✅ Checklist Înainte de Submit:

  1. [ ] Compilează fără erori (make build)
  2. [ ] Trece toate testele local (make)
  3. [ ] README.md completat
  4. [ ] Commit + push pe GitHub
  5. [ ] Verificat clasament pe rezultate.eu

📁 Fișiere Importante:

🔗 Link-uri Utile: