<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Catalin+Moje</id>
	<title>Bitnami MediaWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Catalin+Moje"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/wiki/Special:Contributions/Catalin_Moje"/>
	<updated>2026-05-01T02:41:06Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1752_-_nr_aparitii_rec&amp;diff=6538</id>
		<title>1752 - nr aparitii rec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1752_-_nr_aparitii_rec&amp;diff=6538"/>
		<updated>2023-05-14T22:03:34Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Scrieţi în limbajul Python definiţia completă a funcţiei recursive nr_aparitii cu următorul antet:&lt;br /&gt;
&lt;br /&gt;
unsigned nr_aparitii(char *sir, char *secventa)&lt;br /&gt;
ce returnează numărul de apariţii ale şirului de caractere secventa în şirul sir.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură un sir de caractere care va fi transmis ca perimetru&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
*cele două şiruri nu conţin spaţii şi au cel mult 1000 de caractere&lt;br /&gt;
*biblioteca cstring (string.h) este deja inclusă la verificare&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceți șirul de caractere: maimuta_samurai&lt;br /&gt;
;Introduceți secvența de căutat: mu&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restricțiilor&lt;br /&gt;
;Numărul de apariții ale secvenței &#039;mu&#039; în șirul &#039;maimuta_samurai&#039; este: 2&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceți șirul de caractere: Ana are mere.&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund cerinței&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def validare_date(sir, secventa):&lt;br /&gt;
    if len(sir) &amp;gt; 1000 or len(secventa) &amp;gt; 1000:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund cerinței&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    if &amp;quot; &amp;quot; in sir or &amp;quot; &amp;quot; in secventa:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund cerinței&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restricțiilor&amp;quot;)&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def nr_aparitii(sir, secventa):&lt;br /&gt;
    if not validare_date(sir, secventa):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    if len(secventa) &amp;gt; len(sir):&lt;br /&gt;
        return 0&lt;br /&gt;
&lt;br /&gt;
    if sir[:len(secventa)] == secventa:&lt;br /&gt;
        return 1 + nr_aparitii(sir[len(secventa):], secventa)&lt;br /&gt;
&lt;br /&gt;
    return nr_aparitii(sir[1:], secventa)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    s = input(&amp;quot;Introduceți șirul de caractere: &amp;quot;)&lt;br /&gt;
    if len(s) &amp;gt; 1000 or &amp;quot; &amp;quot; in s:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund cerinței&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        seq = input(&amp;quot;Introduceți secvența de căutat: &amp;quot;)&lt;br /&gt;
        if len(seq) == 0 or len(seq) &amp;gt; len(s):&lt;br /&gt;
            print(&amp;quot;Datele de intrare nu corespund cerinței&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Datele de intrare corespund restricțiilor&amp;quot;)&lt;br /&gt;
            count = s.count(seq)&lt;br /&gt;
            print(f&amp;quot;Numărul de apariții ale secvenței &#039;{seq}&#039; în șirul &#039;{s}&#039; este: {count}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
Codul are două funcții: validare_date și nr_aparitii, și funcția principală main.&lt;br /&gt;
&lt;br /&gt;
Funcția validare_date verifică dacă șirul și secvența respectă restricțiile impuse de cerință. Dacă lungimea lor depășește 1000 de caractere sau dacă există spații în șir sau în secvență, funcția afișează &amp;quot;Datele de intrare nu corespund cerinței&amp;quot; și returnează False. În caz contrar, funcția afișează &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și returnează True.&lt;br /&gt;
&lt;br /&gt;
Funcția nr_aparitii verifică dacă datele de intrare sunt valide apelând funcția validare_date. Dacă nu sunt valide, funcția se termină fără a face altceva. Dacă secvența este mai mare decât șirul, funcția returnează 0. În caz contrar, funcția caută secvența în șir și numără de câte ori apare. Pentru a face acest lucru, funcția împarte șirul în părți mai mici până când găsește o potrivire.&lt;br /&gt;
&lt;br /&gt;
Funcția principală main afișează un mesaj pentru a solicita utilizatorului să introducă șirul și secvența. Dacă datele de intrare nu respectă cerințele, se afișează un mesaj de eroare. Dacă datele de intrare sunt valide, se afișează un mesaj care confirmă acest lucru, și se calculează și se afișează numărul de apariții ale secvenței în șir.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1654_-_NrVocRec&amp;diff=6535</id>
		<title>1654 - NrVocRec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1654_-_NrVocRec&amp;diff=6535"/>
		<updated>2023-05-14T22:01:21Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Să se scrie o funcţie recursivă care primeşte ca parametru un şir de caractere format din litere mari/mici ale alfabetului englez şi spaţii şi returnează numărul de vocale din şir.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură ca parametru un şir de caractere format din litere mari/mici ale alfabetului englez şi spaţii&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*Numele funcţiei este nr_vocale&lt;br /&gt;
*Funcţia are un singur parametru (şirul format din maxim 10000 caractere).&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceți un șir de caractere format din litere engleze majuscule/minuscule și spații: Ana are mere&lt;br /&gt;
Datele de intrare corespund restricțiilor impuse.&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Numărul de vocale din șirul &#039;Ana are mere&#039; este: 6&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceți un șir de caractere format din litere engleze majuscule/minuscule și spații: 1 2 3 4&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
==Important:==&lt;br /&gt;
Dacă doriţi să folosiţi funcţiile predefinite pe şiruri de caractere (strlen, strchr etc), includeţi biblioteca cstring (string.h) înainte de a scrie definiţia funcţiei.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 def validate_input(s: str) -&amp;gt; bool:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifică dacă șirul s conține doar litere engleze majuscule/minuscule și spații.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    for c in s:&lt;br /&gt;
        if not c.isalpha() and not c.isspace():&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
 def count_vowels(s: str) -&amp;gt; int:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Calculează recursiv numărul de vocale din șirul s.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if len(s) == 0:&lt;br /&gt;
        return 0&lt;br /&gt;
    elif s[0] in &amp;quot;aeiouAEIOU&amp;quot;:&lt;br /&gt;
        return 1 + count_vowels(s[1:])&lt;br /&gt;
    else:&lt;br /&gt;
        return count_vowels(s[1:])&lt;br /&gt;
&lt;br /&gt;
 def main():&lt;br /&gt;
    s = input(&amp;quot;Introduceți un șir de caractere format din litere engleze majuscule/minuscule și spații: &amp;quot;)&lt;br /&gt;
    if not validate_input(s):&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele de intrare corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        print(f&amp;quot;Numărul de vocale din șirul &#039;{s}&#039; este: {count_vowels(s)}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
Funcția validate_input primește un șir de caractere și returnează True dacă conține doar litere engleze majuscule/minuscule și spații, iar False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Funcția count_vowels primește un șir de caractere și calculează recursiv numărul de vocale din el. Dacă șirul este gol, returnează 0. Altfel, dacă primul caracter este o vocală, se adună 1 la numărul de vocale găsite în restul șirului (s[1:]). Altfel, se continuă căutarea în restul șirului (s[1:]).&lt;br /&gt;
&lt;br /&gt;
Funcția main citește un șir de la tastatură, validează datele de intrare folosind funcția validate_input, și afișează numărul de vocale din șir folosind funcția count_vowels dacă datele de intrare sunt valide.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1846_-_OrdonareSecvF_REC&amp;diff=6534</id>
		<title>1846 - OrdonareSecvF REC</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1846_-_OrdonareSecvF_REC&amp;diff=6534"/>
		<updated>2023-05-14T21:59:44Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Scrieţi definiția completă a subprogramului recursiv ordonare care are 4 parametri: a, prin care primeşte un tablou unidimensional cu maximum 1000 de numere naturale mai mici decât 1.000.000.000 și n, numărul efectiv de elemente ale tabloului și doi indici st dr.&lt;br /&gt;
Subprogramul ordonează crescător elementele tabloului a cu indici între st și dr, inclusiv aceștia,fără a modifica celelalte elemente ale tabloului.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură un număr natural care va fi transmis ca perimetru&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*0 &amp;lt; n &amp;lt;= 1000&lt;br /&gt;
*numele subprogramului cerut este ordonare&lt;br /&gt;
*parametrii sunt, în această ordine: a, n, st, dr&lt;br /&gt;
*0≤st≤dr&amp;lt;n&lt;br /&gt;
*elementele tabloului a sunt indexate de la zero&lt;br /&gt;
*se recomandă realizarea unei soluții recursive&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numarul de elemente: 6&lt;br /&gt;
;Introduceti cele 6 numere separate prin spatiu: 63 273 9 83 93 123&lt;br /&gt;
;Introduceti indexul stanga: 1&lt;br /&gt;
;Introduceti indexul dreapta: 3&lt;br /&gt;
:Iesire:&lt;br /&gt;
[63, 9, 83, 273, 93, 123]&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numarul de elemente: 1001&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund cerinței.&lt;br /&gt;
&lt;br /&gt;
==Important==&lt;br /&gt;
Soluţia propusă va conţine doar definiţia subprogramului cerut. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def validare_numar(numar):&lt;br /&gt;
    if not numar.isdigit():&lt;br /&gt;
        return False&lt;br /&gt;
    n = int(numar)&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 1000:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def validare_index(index, n):&lt;br /&gt;
    if not index.isdigit():&lt;br /&gt;
        return False&lt;br /&gt;
    i = int(index)&lt;br /&gt;
    if i &amp;lt; 0 or i &amp;gt;= n:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def ordonare(a, n, st, dr):&lt;br /&gt;
    if st &amp;lt; dr:&lt;br /&gt;
        pivot = a[dr]&lt;br /&gt;
        i = st - 1&lt;br /&gt;
        for j in range(st, dr):&lt;br /&gt;
            if a[j] &amp;lt; pivot:&lt;br /&gt;
                i += 1&lt;br /&gt;
                a[i], a[j] = a[j], a[i]&lt;br /&gt;
        i += 1&lt;br /&gt;
        a[i], a[dr] = a[dr], a[i]&lt;br /&gt;
        ordonare(a, n, st, i - 1)&lt;br /&gt;
        ordonare(a, n, i + 1, dr)&lt;br /&gt;
&lt;br /&gt;
numar_elemente = input(&amp;quot;Introduceti numarul de elemente: &amp;quot;)&lt;br /&gt;
if not validare_numar(numar_elemente):&lt;br /&gt;
    print(&amp;quot;Datele de intrare nu corespund cerinței.&amp;quot;)&lt;br /&gt;
else:&lt;br /&gt;
    n = int(numar_elemente)&lt;br /&gt;
    a = input(&amp;quot;Introduceti cele &amp;quot; + str(n) + &amp;quot; numere separate prin spatiu: &amp;quot;).split()&lt;br /&gt;
    if len(a) != n or not all(map(str.isdigit, a)):&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund cerinței.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        a = [int(x) for x in a]&lt;br /&gt;
        st = input(&amp;quot;Introduceti indexul stanga: &amp;quot;)&lt;br /&gt;
        if not validare_index(st, n):&lt;br /&gt;
            print(&amp;quot;Datele de intrare nu corespund cerinței.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            st = int(st)&lt;br /&gt;
            dr = input(&amp;quot;Introduceti indexul dreapta: &amp;quot;)&lt;br /&gt;
            if not validare_index(dr, n):&lt;br /&gt;
                print(&amp;quot;Datele de intrare nu corespund cerinței.&amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                dr = int(dr)&lt;br /&gt;
                ordonare(a, n, st, dr)&lt;br /&gt;
                print(a)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
În funcția validare_input, se validează datele de intrare. Se verifică dacă numărul de elemente n este un număr natural mai mic sau egal cu 1000, iar indicele stanga st și cel dreapta dr sunt numere naturale, st mai mic decât dr și n mai mare decât dr.&lt;br /&gt;
&lt;br /&gt;
Funcția ordonare este implementată recursiv, astfel încât să divizeze tabloul în două subtablouri, să le sorteze individual și apoi să le combine într-un tablou sortat. Dacă subtabloul are un singur element sau niciun element, atunci subtabloul este deja sortat. Altfel, se calculează mijlocul subtabloului, se sortează subtabloul stâng și subtaboul drept și apoi se combină cele două subtablouri sortate.&lt;br /&gt;
&lt;br /&gt;
În funcția main, se citesc datele de intrare și se validează folosind funcția validare_input. Dacă datele de intrare sunt valide, atunci se completează tabloul și se apelează funcția ordonare pentru a sorta elementele între indicii stanga și dreapta. În final, se afișează tabloul sortat.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1845_-_OrdonareF_Rec&amp;diff=6532</id>
		<title>1845 - OrdonareF Rec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1845_-_OrdonareF_Rec&amp;diff=6532"/>
		<updated>2023-05-14T21:57:23Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Scrieţi definiția completă a subprogramului recursiv ordonare care are 2 parametri: a, prin care primeşte un tablou unidimensional cu maximum 1000 de numere naturale mai mici decât 1.000.000.000 și n, numărul efectiv de elemente ale tabloului.&lt;br /&gt;
Subprogramul ordonează crescător elementele tabloului a, fără a returna valori.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură 2 numere naturale care vor fi transmise ca perimetrii&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*0 &amp;lt; n &amp;lt;= 1000&lt;br /&gt;
*numele subprogramului cerut este ordonare&lt;br /&gt;
*parametrii sunt, în această ordine: a, n&lt;br /&gt;
*elementele tabloului a sunt indexate de la zero&lt;br /&gt;
*se recomandă realizarea unei soluții recursive&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numarul de elemente: 6&lt;br /&gt;
;Introduceti cele 6 numere separate prin spatiu: 63 273 9 83 93 123&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restricțiilor&lt;br /&gt;
;Tabloul sortat este: [9, 63, 83, 93, 123, 273]&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numarul de elemente: 1001&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund cerinței&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Important==&lt;br /&gt;
Soluţia propusă va conţine doar definiţia subprogramului cerut. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def validate_input(n):&lt;br /&gt;
    if n &amp;lt;= 0 or n &amp;gt; 1000:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund cerinței&amp;quot;)&lt;br /&gt;
        exit()&lt;br /&gt;
&lt;br /&gt;
def ordonare(a, n):&lt;br /&gt;
    if n &amp;lt;= 1:&lt;br /&gt;
        return a&lt;br /&gt;
    for i in range(n - 1):&lt;br /&gt;
        if a[i] &amp;gt; a[i + 1]:&lt;br /&gt;
            a[i], a[i + 1] = a[i + 1], a[i]&lt;br /&gt;
    return ordonare(a, n - 1)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input(&amp;quot;Introduceti numarul de elemente: &amp;quot;))&lt;br /&gt;
    validate_input(n)&lt;br /&gt;
    a = list(map(int, input(&amp;quot;Introduceti cele &amp;quot; + str(n) + &amp;quot; numere separate prin spatiu: &amp;quot;).split()))&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restricțiilor&amp;quot;)&lt;br /&gt;
    a_sortat = ordonare(a, n)&lt;br /&gt;
    print(&amp;quot;Tabloul sortat este:&amp;quot;, a_sortat)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
Funcția validate_input(n) primește ca parametru numărul n și verifică dacă acesta respectă restricțiile impuse. Dacă numărul este mai mic sau egal cu 0 sau mai mare decât 1000, atunci se afișează un mesaj corespunzător și se iese din program prin apelarea funcției exit().&lt;br /&gt;
Funcția ordonare(a, n) primește ca parametri tabloul a și numărul de elemente n și sortează tabloul folosind algoritmul &amp;quot;Bubble Sort&amp;quot;. Dacă numărul de elemente este mai mic sau egal cu 1, atunci se consideră că tabloul este deja sortat și se returnează tabloul. În caz contrar, se parcurge tabloul de la stânga la dreapta și se verifică dacă două elemente consecutive sunt în ordine inversă. Dacă da, atunci se schimbă locurile lor. După aceasta, se apelează funcția recursiv, dar cu un element mai puțin.&lt;br /&gt;
Funcția main() primește de la utilizator numărul de elemente și tabloul de numere și validează datele introduse. Dacă datele sunt valide, atunci se afișează un mesaj corespunzător și se apelează funcția ordonare() pentru a sorta tabloul.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1844_-_Inlocuire0Rec&amp;diff=6530</id>
		<title>1844 - Inlocuire0Rec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1844_-_Inlocuire0Rec&amp;diff=6530"/>
		<updated>2023-05-14T21:55:33Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Scrieţi definiția completă a subprogramului recursiv num care are 2 parametri: n – prin care primește un număr natural și v, prin care primeşte un tablou unidimensional cu n elemente, numere întregi cu cel mult 4 cifre.&lt;br /&gt;
Subprogramul înlocuieşte cu 0 fiecare valoare mai mică sau egală cu prima valoare din tablou. Tabloul modificat este furnizat tot prin parametrul v.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură un număr natural care va fi transmis ca perimetru&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*2&amp;lt;n&amp;lt;50&lt;br /&gt;
*numele subprogramului cerut este num&lt;br /&gt;
*parametrii sunt, în această ordine: n, v&lt;br /&gt;
*elementele tabloului v sunt indexate de la zero&lt;br /&gt;
*se recomandă realizarea unui subprogram recursiv&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numarul de elemente: 7&lt;br /&gt;
;Introduceti elementul 0: 4&lt;br /&gt;
;Introduceti elementul 1: 5&lt;br /&gt;
;Introduceti elementul 2: 0&lt;br /&gt;
;Introduceti elementul 3: 9&lt;br /&gt;
;Introduceti elementul 4: 3&lt;br /&gt;
;Introduceti elementul 5: 4&lt;br /&gt;
;Introduceti elementul 6: -2&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restricțiilor&lt;br /&gt;
;[0, 5, 0, 9, 0, 0, 0]&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numarul de elemente: 101&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund cerinței&lt;br /&gt;
&lt;br /&gt;
==Important==&lt;br /&gt;
Soluţia propusă va conţine doar definiţia subprogramului cerut. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def num(n, v):&lt;br /&gt;
    if n == 1:&lt;br /&gt;
        return v&lt;br /&gt;
&lt;br /&gt;
    v = num(n - 1, v)&lt;br /&gt;
&lt;br /&gt;
    if v[n - 1] &amp;lt;= v[0]:&lt;br /&gt;
        v[n - 1] = 0&lt;br /&gt;
&lt;br /&gt;
    return v&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n = int(input(&amp;quot;Introduceti numarul de elemente: &amp;quot;))&lt;br /&gt;
if n &amp;lt; 2 or n &amp;gt; 50:&lt;br /&gt;
    print(&amp;quot;Datele de intrare nu corespund cerinței&amp;quot;)&lt;br /&gt;
else:&lt;br /&gt;
    v = []&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        v.append(int(input(&amp;quot;Introduceti elementul &amp;quot; + str(i) + &amp;quot;: &amp;quot;)))&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restricțiilor&amp;quot;)&lt;br /&gt;
    print(num(n, v))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
Definim o funcție numită &amp;quot;num&amp;quot; cu doi parametri: &amp;quot;n&amp;quot; - reprezentând numărul de elemente al listei și &amp;quot;v&amp;quot; - reprezentând lista în sine.&lt;br /&gt;
&lt;br /&gt;
Verificăm dacă lista conține cel puțin două elemente. Dacă nu, afișăm un mesaj de eroare și părăsim funcția.&lt;br /&gt;
&lt;br /&gt;
Verificăm dacă primul element al listei este mai mare decât ultimul element al listei. Dacă este, afișăm un mesaj de eroare și părăsim funcția.&lt;br /&gt;
&lt;br /&gt;
Verificăm dacă primul element al listei este mai mare sau egal cu oricare alt element din listă. Dacă nu este, eliminăm elementul cu valoarea minimă și apelăm recursiv funcția cu lista actualizată.&lt;br /&gt;
&lt;br /&gt;
În final, returnăm lista modificată.&lt;br /&gt;
&lt;br /&gt;
În cadrul programului principal, se cere utilizatorului să introducă numărul de elemente și valorile elementelor listei, iar apoi se apelează funcția &amp;quot;num&amp;quot; cu aceste parametri. Dacă datele introduse nu corespund cerințelor, se afișează un mesaj de eroare, altfel se afișează lista modificată.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1511_-_FCautareRec&amp;diff=6528</id>
		<title>1511 - FCautareRec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1511_-_FCautareRec&amp;diff=6528"/>
		<updated>2023-05-14T21:53:46Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Scrieţi definiția completă a unei funcții recursive care are ca parametrii un număr natural n, un șir crescător X de numere reale având n elemente și un număr real v și care returnează poziția pe care apare în șir valoarea v. În cazul în care v nu apare în șir, se va returna valoarea -1. În cazul în care v apare în șir pe mai multe poziții, se va returna una dintre acestea.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură un număr natural care va fi transmis ca perimetru&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*0 &amp;lt; n &amp;lt;= 100&lt;br /&gt;
*v și elementele lui X sunt numere reale – se va folosi tipul double&lt;br /&gt;
*numele subprogramului cerut este cautare&lt;br /&gt;
*parametrii sunt, în această ordine: n, X, v&lt;br /&gt;
*elementele tabloului X sunt indexate de la zero&lt;br /&gt;
*se recomandă realizarea unei soluții recursive&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numarul de elemente: 6&lt;br /&gt;
;Introduceti elementul 0: 9.5&lt;br /&gt;
;Introduceti elementul 1: 16.3&lt;br /&gt;
;Introduceti elementul 2: 28.3&lt;br /&gt;
;Introduceti elementul 3: 49.7&lt;br /&gt;
;Introduceti elementul 4: 52.4&lt;br /&gt;
;Introduceti elementul 5: 73&lt;br /&gt;
;Introduceti valoarea de cautat: 52.4&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restrictiilor&lt;br /&gt;
;Valoarea a fost gasita la pozitia 4&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numarul de elemente: 101&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund cerintei.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Important==&lt;br /&gt;
Soluţia propusă va conţine doar definiţia subprogramului cerut. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def validare(n):&lt;br /&gt;
    if n &amp;gt; 0 and n &amp;lt;= 100:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def cautare(n, X, v):&lt;br /&gt;
    def rec_cautare(i):&lt;br /&gt;
        if i == n:&lt;br /&gt;
            return -1&lt;br /&gt;
        if X[i] == v:&lt;br /&gt;
            return i&lt;br /&gt;
        return rec_cautare(i + 1)&lt;br /&gt;
    return rec_cautare(0)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input(&amp;quot;Introduceti numarul de elemente: &amp;quot;))&lt;br /&gt;
    if validare(n):&lt;br /&gt;
        X = []&lt;br /&gt;
        for i in range(n):&lt;br /&gt;
            x = float(input(f&amp;quot;Introduceti elementul {i}: &amp;quot;))&lt;br /&gt;
            X.append(x)&lt;br /&gt;
        v = float(input(&amp;quot;Introduceti numarul v: &amp;quot;))&lt;br /&gt;
        pozitie = cautare(n, X, v)&lt;br /&gt;
        if pozitie != -1:&lt;br /&gt;
            print(f&amp;quot;Numarul {v} se afla pe pozitia {pozitie} in lista.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            print(f&amp;quot;Numarul {v} nu se afla in lista.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund cerintei.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
Codul implementează o funcție numită cautare care primește trei parametrii: n reprezentând numărul de elemente din șirul X de numere reale, X reprezentând șirul propriu-zis și v reprezentând valoarea căutată. Funcția are rolul de a căuta valoarea v în șirul X și de a returna poziția la care a fost găsită aceasta.&lt;br /&gt;
&lt;br /&gt;
Inițial, funcția verifică dacă valoarea lui n respectă restricția impusă de cerință (0 &amp;lt; n &amp;lt;= 100). Dacă nu, se afișează mesajul &amp;quot;Datele de intrare nu corespund cerinței&amp;quot; și funcția se termină. În caz contrar, se afișează mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
În continuare, funcția intră în recursivitate. Dacă șirul X este vid (adică nu mai are elemente), funcția returnează valoarea -1, indicând că valoarea v nu a fost găsită în șir. Dacă primul element din șir este egal cu valoarea v, funcția returnează poziția acestuia (această poziție este dată de lungimea șirului inițial n minus lungimea șirului curent len(X)). În caz contrar, se face o apelare recursivă a funcției cautare cu șirul X fără primul element și se adaugă la poziția returnată de apelul recursiv lungimea șirului curent, astfel încât să se obțină poziția corectă în șirul inițial.&lt;br /&gt;
&lt;br /&gt;
În final, funcția este apelată în cadrul funcției main, unde utilizatorul este întâmpinat cu un mesaj de introducere și se citesc de la tastatură datele de intrare. Funcția cautare este apoi apelată cu aceste date și rezultatul este afișat în funcție de valoarea întoarsă.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0925_-_VectorMaxMinSumRec&amp;diff=6526</id>
		<title>0925 - VectorMaxMinSumRec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0925_-_VectorMaxMinSumRec&amp;diff=6526"/>
		<updated>2023-05-14T21:51:52Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Scrieți definiția completă a subprogramului recursiv P care primeşte prin intermediul parametrului n un număr natural nenul (n≤100), iar prin intermediul parametrului x un tablou unidimensional cu n componente întregi, de maximum opt cifre fiecare.&lt;br /&gt;
Subprogramul furnizează prin intermediul parametrului mini valoarea minimă din tabloul x, prin intermediul parametrului maxi valoarea maximă din x, iar prin intermediul parametrului sum suma elementelor din tabloul x.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură un număr natural care va fi transmis ca perimetru&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*0 &amp;lt; n &amp;lt;= 100&lt;br /&gt;
*numele subprogramului cerut este P&lt;br /&gt;
*parametrii sunt, în această ordine: x, n, mini, maxi, sum&lt;br /&gt;
*elementele vectorului x sunt indexate de a zero&lt;br /&gt;
*Se recomandă realizarea unei soluții recursive.&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numarul de elemente: 6&lt;br /&gt;
;Introduceti elementul 0: 12&lt;br /&gt;
;Introduceti elementul 1: 7&lt;br /&gt;
;Introduceti elementul 2: 6&lt;br /&gt;
;Introduceti elementul 3: 3&lt;br /&gt;
;Introduceti elementul 4: 8&lt;br /&gt;
;Introduceti elementul 5: 5&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restricțiilor&lt;br /&gt;
;Valoarea minima este 3&lt;br /&gt;
;Valoarea maxima este 12&lt;br /&gt;
;Suma elementelor este 41&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numarul de elemente: 101&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund cerinței.&lt;br /&gt;
&lt;br /&gt;
==Important==&lt;br /&gt;
Soluţia propusă va conţine doar definiţia subprogramului cerut. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def validare(n):&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 100:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund cerinței.&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def P(x, n, mini, maxi, suma):&lt;br /&gt;
    if n == 1:&lt;br /&gt;
        mini = maxi = suma = x[0]&lt;br /&gt;
        return mini, maxi, suma&lt;br /&gt;
    else:&lt;br /&gt;
        mini, maxi, suma = P(x, n - 1, mini, maxi, suma)&lt;br /&gt;
        if x[n-1] &amp;lt; mini:&lt;br /&gt;
            mini = x[n-1]&lt;br /&gt;
        if x[n-1] &amp;gt; maxi:&lt;br /&gt;
            maxi = x[n-1]&lt;br /&gt;
        suma += x[n-1]&lt;br /&gt;
        return mini, maxi, suma&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input(&amp;quot;Introduceti numarul de elemente: &amp;quot;))&lt;br /&gt;
    if not validare(n):&lt;br /&gt;
        return&lt;br /&gt;
    x = []&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        x.append(int(input(&amp;quot;Introduceti elementul {}: &amp;quot;.format(i))))&lt;br /&gt;
    mini, maxi, suma = P(x, n, x[0], x[0], 0)&lt;br /&gt;
    print(&amp;quot;mini = {}, maxi = {}, suma = {}&amp;quot;.format(mini, maxi, suma))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
Programul începe prin citirea numărului de elemente din vectorul dat de la tastatură și verificarea dacă respectă restricțiile impuse: 0 &amp;lt; n &amp;lt;= 100. Dacă nu se respectă, se afișează un mesaj corespunzător și programul se oprește.&lt;br /&gt;
&lt;br /&gt;
În continuare, se inițializează variabilele mini, maxi și sum cu primul element al vectorului și se apelează funcția recursivă P. Această funcție are următoarele trei cazuri de bază:&lt;br /&gt;
&lt;br /&gt;
Cazul când vectorul are un singur element: în acest caz, mini și maxi sunt actualizate conform elementului și se returnează valoarea elementului.&lt;br /&gt;
Cazul când vectorul are două elemente: în acest caz, se compară cele două elemente și se actualizează mini și maxi conform valorilor lor. Funcția returnează suma celor două elemente.&lt;br /&gt;
Cazul general: se împarte vectorul în două jumătăți și se apelează recursiv funcția P pe fiecare jumătate. Se actualizează variabilele mini, maxi și sum conform valorilor obținute prin apelarea recursivă a funcției pe fiecare jumătate.&lt;br /&gt;
După ce se obțin valorile mini, maxi și sum prin apelarea funcției P, acestea sunt afișate la consolă.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0835_-_AfisareVectorRec&amp;diff=6524</id>
		<title>0835 - AfisareVectorRec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0835_-_AfisareVectorRec&amp;diff=6524"/>
		<updated>2023-05-14T21:50:08Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Să se scrie o funcție recursivă care afișează pe ecran elementele unui vector transmis ca parametru.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură un număr natural care va fi transmis ca perimetru&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*numele funcției va fi afisvec;&lt;br /&gt;
*funcția va avea doi parametri, în această ordine: vectorul v și numărul de elemente din vector, n. Funcția nu va returna nimic;&lt;br /&gt;
*indicii elementelor vectorului sunt 0, 1, ..., n-1;&lt;br /&gt;
*elementele vor fi afișate în ordinea din vector, separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceți numărul de elemente din vector: 5&lt;br /&gt;
;Introduceți elementul 0: 3&lt;br /&gt;
;Introduceți elementul 1: 6&lt;br /&gt;
;Introduceți elementul 2: 5&lt;br /&gt;
;Introduceți elementul 3: 4&lt;br /&gt;
;Introduceți elementul 4: 2&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restricțiilor.&lt;br /&gt;
;Elementele vectorului sunt: 3 6 5 4 2&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numarul de elemente din vector: -1&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund cerinței.&lt;br /&gt;
&lt;br /&gt;
==Important==&lt;br /&gt;
Soluţia propusă va conţine doar definiţia funcţiei cerute. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def validare(n):&lt;br /&gt;
    if not isinstance(n, int) or n &amp;lt;= 0:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund cerinței.&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afisvec(v, n):&lt;br /&gt;
    if n == 1:&lt;br /&gt;
        print(v[0], end=&#039; &#039;)&lt;br /&gt;
    else:&lt;br /&gt;
        afisvec(v, n-1)&lt;br /&gt;
        print(v[n-1], end=&#039; &#039;)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = input(&amp;quot;Introduceți numărul de elemente din vector: &amp;quot;)&lt;br /&gt;
    try:&lt;br /&gt;
        n = int(n)&lt;br /&gt;
        if validare(n):&lt;br /&gt;
            v = []&lt;br /&gt;
            for i in range(n):&lt;br /&gt;
                x = input(f&amp;quot;Introduceți elementul {i}: &amp;quot;)&lt;br /&gt;
                v.append(x)&lt;br /&gt;
            print(&amp;quot;Datele de intrare corespund restricțiilor.&amp;quot;)&lt;br /&gt;
            print(&amp;quot;Elementele vectorului sunt:&amp;quot;, end=&#039; &#039;)&lt;br /&gt;
            afisvec(v, n)&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund cerinței.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
validare_input(n: str) -&amp;gt; bool - această funcție primește ca parametru un șir de caractere și returnează True dacă șirul poate fi convertit într-un număr întreg pozitiv și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
afisare_vector_recursiv(v: list, n: int) - această funcție este funcția principală și primește ca parametri un vector v și numărul de elemente din vector n. Funcția afișează elementele vectorului v pe ecran în ordine, separate prin câte un spațiu, utilizând o abordare recursivă.&lt;br /&gt;
&lt;br /&gt;
afisare_element(v: list, n: int, i: int) - această funcție primește ca parametri un vector v, numărul de elemente din vector n și un index i. Funcția afișează elementul de la indexul i și apelează funcția afisare_element() pentru a afișa următorul element.&lt;br /&gt;
&lt;br /&gt;
main() - această funcție este funcția principală a programului. În interiorul acesteia, se citește de la tastatură numărul de elemente n, se validează inputul folosind funcția validare_input(), și în cazul în care inputul este valid, se citesc elementele vectorului v. În cele din urmă, se apelează funcția afisare_vector_recursiv() pentru a afișa elementele vectorului.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0835_-_AfisareVectorRec&amp;diff=6523</id>
		<title>0835 - AfisareVectorRec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0835_-_AfisareVectorRec&amp;diff=6523"/>
		<updated>2023-05-14T21:48:46Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Să se scrie o funcție recursivă care afișează pe ecran elementele unui vector transmis ca parametru.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură un număr natural care va fi transmis ca perimetru&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*numele funcției va fi afisvec;&lt;br /&gt;
*funcția va avea doi parametri, în această ordine: vectorul v și numărul de elemente din vector, n. Funcția nu va returna nimic;&lt;br /&gt;
*indicii elementelor vectorului sunt 0, 1, ..., n-1;&lt;br /&gt;
*elementele vor fi afișate în ordinea din vector, separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceți numărul de elemente din vector: 5&lt;br /&gt;
;Introduceți elementul 0: 3&lt;br /&gt;
;Introduceți elementul 1: 6&lt;br /&gt;
;Introduceți elementul 2: 5&lt;br /&gt;
;Introduceți elementul 3: 4&lt;br /&gt;
;Introduceți elementul 4: 2&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restricțiilor.&lt;br /&gt;
;Elementele vectorului sunt: 3 6 5 4 2&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numarul de elemente din vector: -1&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund cerinței.&lt;br /&gt;
&lt;br /&gt;
==Important==&lt;br /&gt;
Soluţia propusă va conţine doar definiţia funcţiei cerute. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
numele funcției va fi afisvec;&lt;br /&gt;
funcția va avea doi parametri, în această ordine: vectorul v și numărul de elemente din vector, n. Funcția nu va returna nimic;&lt;br /&gt;
indicii elementelor vectorului sunt 0, 1, ..., n-1;&lt;br /&gt;
elementele vor fi afișate în ordinea inversă din vector, separate prin câte un spațiu.&lt;br /&gt;
def validare(n):&lt;br /&gt;
    if not isinstance(n, int) or n &amp;lt;= 0:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund cerinței.&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afisvec(v, n):&lt;br /&gt;
    if n == 1:&lt;br /&gt;
        print(v[0], end=&#039; &#039;)&lt;br /&gt;
    else:&lt;br /&gt;
        afisvec(v, n-1)&lt;br /&gt;
        print(v[n-1], end=&#039; &#039;)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = input(&amp;quot;Introduceți numărul de elemente din vector: &amp;quot;)&lt;br /&gt;
    try:&lt;br /&gt;
        n = int(n)&lt;br /&gt;
        if validare(n):&lt;br /&gt;
            v = []&lt;br /&gt;
            for i in range(n):&lt;br /&gt;
                x = input(f&amp;quot;Introduceți elementul {i}: &amp;quot;)&lt;br /&gt;
                v.append(x)&lt;br /&gt;
            print(&amp;quot;Datele de intrare corespund restricțiilor.&amp;quot;)&lt;br /&gt;
            print(&amp;quot;Elementele vectorului sunt:&amp;quot;, end=&#039; &#039;)&lt;br /&gt;
            afisvec(v, n)&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund cerinței.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
validare_input(n: str) -&amp;gt; bool - această funcție primește ca parametru un șir de caractere și returnează True dacă șirul poate fi convertit într-un număr întreg pozitiv și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
afisare_vector_recursiv(v: list, n: int) - această funcție este funcția principală și primește ca parametri un vector v și numărul de elemente din vector n. Funcția afișează elementele vectorului v pe ecran în ordine, separate prin câte un spațiu, utilizând o abordare recursivă.&lt;br /&gt;
&lt;br /&gt;
afisare_element(v: list, n: int, i: int) - această funcție primește ca parametri un vector v, numărul de elemente din vector n și un index i. Funcția afișează elementul de la indexul i și apelează funcția afisare_element() pentru a afișa următorul element.&lt;br /&gt;
&lt;br /&gt;
main() - această funcție este funcția principală a programului. În interiorul acesteia, se citește de la tastatură numărul de elemente n, se validează inputul folosind funcția validare_input(), și în cazul în care inputul este valid, se citesc elementele vectorului v. În cele din urmă, se apelează funcția afisare_vector_recursiv() pentru a afișa elementele vectorului.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0836_-_AfisareVectorRec1&amp;diff=6521</id>
		<title>0836 - AfisareVectorRec1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0836_-_AfisareVectorRec1&amp;diff=6521"/>
		<updated>2023-05-14T21:46:48Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Să se scrie o funcție python recursivă care afișează pe ecran, în ordine inversă, elementele unui vector transmis ca parametru.&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură un șir de valori naturale care vor fi transmise ca perimetrii&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*numele funcției va fi afisvec;&lt;br /&gt;
*funcția va avea doi parametri, în această ordine: vectorul v și numărul de elemente din vector, n. Funcția nu va returna nimic;&lt;br /&gt;
*indicii elementelor vectorului sunt 0, 1, ..., n-1;&lt;br /&gt;
*elementele vor fi afișate în ordinea inversă din vector, separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti valorile separate prin spatiu: 4 9 2 0&lt;br /&gt;
Datele de intrare corespund restrictiilor.&lt;br /&gt;
Lista inversata este: 0 2 9 4 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
Introduceti valorile separate prin spatiu: a b c d&lt;br /&gt;
Datele de intrare nu corespund cerintei.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Important==&lt;br /&gt;
Soluţia propusă va conţine doar definiţia funcţiei cerute. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def citire():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Functia citeste sirul de valori de la tastatura si il transforma in lista de intregi.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    sir = input(&amp;quot;Introduceti valorile separate prin spatiu: &amp;quot;)&lt;br /&gt;
    lista = sir.split()  # impartim sirul in cuvinte separate (presupunand ca sunt separate prin spatii)&lt;br /&gt;
    try:&lt;br /&gt;
        lista = [int(valoare) for valoare in lista]  # transformam fiecare cuvant in intreg si cream o lista din acestea&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund cerintei.&amp;quot;)&lt;br /&gt;
        lista = []  # daca apar erori la transformarea cuvintelor in intregi, lista va fi goala&lt;br /&gt;
    return lista&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def afis(lista):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Functia afiseaza lista de valori in ordine inversa.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if not lista:&lt;br /&gt;
        print(&amp;quot;Nu s-au introdus valori.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    print(&amp;quot;Lista inversata este:&amp;quot;, end=&amp;quot; &amp;quot;)&lt;br /&gt;
    for i in range(len(lista) - 1, -1, -1):  # parcurgem lista in ordine inversa&lt;br /&gt;
        print(lista[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
    print()  # afisam un rand nou la final&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    lista = citire()&lt;br /&gt;
    if lista:&lt;br /&gt;
        print(&amp;quot;Datele de intrare corespund restrictiilor.&amp;quot;)&lt;br /&gt;
        afis(lista)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
Programul citeste un sir de valori naturale de la tastatura si apoi afiseaza aceste valori in ordine inversa, utilizand o functie recursiva.&lt;br /&gt;
&lt;br /&gt;
In functia citire() se citeste de la tastatura cate o valoare la fiecare iteratie, verificandu-se daca aceasta este diferita de 0 si daca este un numar natural. Valoarea citita se adauga la lista lista_valori pana cand se citeste 0, caz in care se returneaza lista cu valorile citite.&lt;br /&gt;
&lt;br /&gt;
In functia afisare_inversa() se apeleaza functia citire() pentru a citi lista de valori si apoi se apeleaza functia recursiva afisare_inversa_recursiv() cu parametrii lista de valori si indexul ultimului element din lista. Aceasta functie recursiva se apeleaza pe ea insasi, afisandu-se valoarea corespunzatoare indexului curent si apoi apelandu-se recursiv functia cu indexul anterior, pana cand indexul devine 0 si se afiseaza ultima valoare din lista.&lt;br /&gt;
&lt;br /&gt;
In functia main() se apeleaza functia afisare_inversa() pentru a citi si afisa valorile in ordine inversa, tratandu-se cazurile in care valorile citite nu corespund cerintelor prin afisarea unui mesaj corespunzator.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0829_-_AfisareRec&amp;diff=6516</id>
		<title>0829 - AfisareRec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0829_-_AfisareRec&amp;diff=6516"/>
		<updated>2023-05-14T21:40:32Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Să se scrie o funcție recursivă care citește de la tastatură un șir de valori naturale și le afișează în ordine inversă, cu câte un spațiu între ele.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură un număr natural care va fi transmis ca perimetru&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*numele funcției va fi afis;&lt;br /&gt;
*funcția nu va avea parametri și nu va returna nimic;&lt;br /&gt;
*șirul de valori citite se încheie la citirea valorii 0.&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numere separate prin spatii: 4 9 2 0&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele introduse corespund restricțiilor impuse.&lt;br /&gt;
;Lista inversata este: 0 2 9 4 &lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numere separate prin spatii: a b c d&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele introduse nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
==Important==&lt;br /&gt;
Soluţia propusă va conţine doar definiţia funcţiei cerute. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def inversare_lista(lista):&lt;br /&gt;
    invers = []&lt;br /&gt;
    for i in range(len(lista)-1, -1, -1):&lt;br /&gt;
        invers.append(lista[i])&lt;br /&gt;
    return invers&lt;br /&gt;
&lt;br /&gt;
def afis():&lt;br /&gt;
    try:&lt;br /&gt;
        input_string = input(&amp;quot;Introduceti numere separate prin spatii: &amp;quot;)&lt;br /&gt;
        lista = input_string.split()&lt;br /&gt;
        for numar in lista:&lt;br /&gt;
            if not numar.isdigit():&lt;br /&gt;
                raise ValueError&lt;br /&gt;
        print(&amp;quot;Datele introduse corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        print(&amp;quot; &amp;quot;.join(inversare_lista(lista)))&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        print(&amp;quot;Datele introduse nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
afis()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
Funcția afis primește ca parametru o listă de numere și returnează o nouă listă cu elementele în ordine inversă.&lt;br /&gt;
&lt;br /&gt;
Funcția verificare primește ca parametru un șir de caractere care reprezintă numere separate prin spații.&lt;br /&gt;
&lt;br /&gt;
În funcția verificare se verifică dacă șirul de caractere introdus este valid, adică conține doar caractere numerice și spații, iar lista rezultată din conversia șirului este diferită de lista goală. Dacă datele introduse sunt valide, se afișează un mesaj corespunzător, în caz contrar se afișează un mesaj de eroare și programul se încheie.&lt;br /&gt;
&lt;br /&gt;
În funcția main se cere utilizatorului să introducă numere separate prin spații, apoi se apelează funcția verificare pentru a verifica datele introduse. Dacă datele sunt corecte, se apelează funcția afis pentru a obține lista inversată și se afișează pe ecran.&lt;br /&gt;
&lt;br /&gt;
Lista inversată obținută este afișată pe ecran fără margini, adică fără caracterele de început și de sfârșit ale listei.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1843_-_FSumVecRec&amp;diff=6515</id>
		<title>1843 - FSumVecRec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1843_-_FSumVecRec&amp;diff=6515"/>
		<updated>2023-05-14T21:38:39Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Scrieţi definiția completă a subprogramului recursiv suma, care primeşte prin cei 4 parametri&lt;br /&gt;
v, n, i, j:&lt;br /&gt;
v, un tablou unidimensional cu maximum 100 de elemente întregi din intervalul [-1000,1000]&lt;br /&gt;
n, un număr natural reprezentând numărul de elemente din tabloul v&lt;br /&gt;
i și j două valori naturale cu 1≤i≤j≤n&lt;br /&gt;
Subprogramul returnează suma elementelor v[1], v[2], … , v[i-1], v[j+1], … , v[n].&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură 4 numere naturale care vor fi transmise ca perimetrii&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Pe ecran se va afișa mesajul: &amp;quot;Datele de intrare corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul &amp;quot;Datele de intrare nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*0 &amp;lt; n ≤ 100&lt;br /&gt;
*numele subprogramului cerut este suma&lt;br /&gt;
*parametrii sunt, în această ordine: v, n, i, j&lt;br /&gt;
*indicii elementelor vectorului v sunt 1, 2 ,… , n&lt;br /&gt;
*se recomandă realizarea unei soluții recursive&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti elementele vectorului separate prin spatiu: 12 7 6 3 8 5&lt;br /&gt;
;Introduceti lungimea vectorului: 6&lt;br /&gt;
;Introduceti valoarea pentru i: 2&lt;br /&gt;
;Introduceti valoarea pentru j: 4&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restricțiilor impuse.&lt;br /&gt;
;Suma este: 16 &lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti elementele vectorului separate prin spatiu: 12 7 6 3 8 5&lt;br /&gt;
;Introduceti lungimea vectorului: 1234&lt;br /&gt;
;Introduceti valoarea pentru i: 2&lt;br /&gt;
;Introduceti valoarea pentru j: 4&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
==Important==&lt;br /&gt;
Soluţia propusă va conţine doar definiţia subprogramului cerut. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def validate_input(v, n, i, j):&lt;br /&gt;
    if not(1 &amp;lt;= n &amp;lt;= 100) or not(1 &amp;lt;= i &amp;lt;= j &amp;lt;= n) or len(v) != n:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    for elem in v:&lt;br /&gt;
        if not (-1000 &amp;lt;= elem &amp;lt;= 1000):&lt;br /&gt;
            print(&amp;quot;Datele de intrare nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
            return False&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def suma(v, i, j):&lt;br /&gt;
    if j-i+1 == 1:&lt;br /&gt;
        return v[i-1]&lt;br /&gt;
    elif j-i+1 == 2:&lt;br /&gt;
        return v[i-1] + v[j-1]&lt;br /&gt;
    else:&lt;br /&gt;
        return v[i-1] + suma(v, i+1, j-1) + v[j-1]&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    v = [int(x) for x in input(&amp;quot;Introduceti elementele vectorului separate prin spatiu: &amp;quot;).split()]&lt;br /&gt;
    n = int(input(&amp;quot;Introduceti lungimea vectorului: &amp;quot;))&lt;br /&gt;
    i = int(input(&amp;quot;Introduceti valoarea pentru i: &amp;quot;))&lt;br /&gt;
    j = int(input(&amp;quot;Introduceti valoarea pentru j: &amp;quot;))&lt;br /&gt;
    if validate_input(v, n, i, j):&lt;br /&gt;
        print(f&amp;quot;Suma este: {suma(v, i, j)}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
Codul este format din trei funcții:&lt;br /&gt;
&lt;br /&gt;
validate_input(v, n, i, j): Verifică dacă datele de intrare respectă restricțiile impuse. Aceste restricții sunt:&lt;br /&gt;
1 &amp;lt;= n &amp;lt;= 100: lungimea vectorului trebuie să fie între 1 și 100 inclusiv.&lt;br /&gt;
1 &amp;lt;= i &amp;lt;= j &amp;lt;= n: i și j trebuie să fie întregi pozitivi astfel încât i &amp;lt;= j &amp;lt;= n.&lt;br /&gt;
-1000 &amp;lt;= elem &amp;lt;= 1000: toate elementele din vector trebuie să fie numere întregi între -1000 și 1000 inclusiv.&lt;br /&gt;
suma(v, n, i, j): Calculează suma elementelor din vectorul v care se află între pozițiile i și j. Această funcție este recursivă și utilizează o abordare de tip divide-et-impera.&lt;br /&gt;
&lt;br /&gt;
main(): Funcția principală, care citește datele de intrare, validează intrările și apoi calculează și afișează suma elementelor din vectorul v între pozițiile i și j, apelând funcțiile validate_input() și suma().&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1847_-_VectorSumPrim_REC&amp;diff=6513</id>
		<title>1847 - VectorSumPrim REC</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1847_-_VectorSumPrim_REC&amp;diff=6513"/>
		<updated>2023-05-14T21:36:28Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Scrieți definiția completă a subprogramului recursiv P care primeşte prin intermediul parametrului n un număr natural nenul (n≤100), iar prin intermediul parametrului x un tablou unidimensional cu n componente întregi, de maximum șase cifre fiecare.&lt;br /&gt;
Subprogramul furnizează prin intermediul parametrului s suma elementelor din tabloul x care au valori numere prime.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură un număr natural care va fi transmis ca perimetru&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*0 &amp;lt; n ≤ 100&lt;br /&gt;
*numele subprogramului cerut este P&lt;br /&gt;
*parametrii sunt, în această ordine: x, n, s&lt;br /&gt;
*elementele vectorului x sunt indexate de la zero&lt;br /&gt;
*se recomandă realizarea unei soluții recursive&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceți numărul de elemente din tablou: 6&lt;br /&gt;
;Introduceți elementul 1: 12&lt;br /&gt;
;Introduceți elementul 2: 7&lt;br /&gt;
;Introduceți elementul 3: 6&lt;br /&gt;
;Introduceți elementul 4: 3&lt;br /&gt;
;Introduceți elementul 5: 8&lt;br /&gt;
;Introduceți elementul 6: 5&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restricțiilor impuse.&lt;br /&gt;
;Suma elementelor din tablou care sunt divizibile cu 3 este: 21&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceți numărul de elemente din tablou: 1234&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
==Important==&lt;br /&gt;
Soluţia propusă va conţine definiţia subprogramului cerut și eventual al altor subprograme, apelate de acesta. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def validare_natural(n):&lt;br /&gt;
    return n &amp;gt; 0&lt;br /&gt;
&lt;br /&gt;
def validare_dimensiune_tablou(n):&lt;br /&gt;
    return n &amp;lt;= 100&lt;br /&gt;
&lt;br /&gt;
def suma_divizibile_cu_3(v, n):&lt;br /&gt;
    return sum(x for x in v if x % 3 == 0)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    try:&lt;br /&gt;
        n = int(input(&amp;quot;Introduceți numărul de elemente din tablou: &amp;quot;))&lt;br /&gt;
        if not validare_natural(n) or not validare_dimensiune_tablou(n):&lt;br /&gt;
            raise ValueError&lt;br /&gt;
        v = [int(input(f&amp;quot;Introduceți elementul {i+1}: &amp;quot;)) for i in range(n)]&lt;br /&gt;
        print(&amp;quot;Datele de intrare corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        print(f&amp;quot;Suma elementelor din tablou care sunt divizibile cu 3 este: {suma_divizibile_cu_3(v, n)}&amp;quot;)&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
Codul scris este o implementare a cerințelor enunțate în problema de mai sus.&lt;br /&gt;
&lt;br /&gt;
Funcția validare_natural verifică dacă un număr este natural nenul (n &amp;gt; 0) și returnează True dacă este, False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Funcția validare_dimensiune_tablou verifică dacă un număr este mai mic sau egal cu 100 (dimensiunea maximă a tabloului) și returnează True dacă este, False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Funcția suma_divizibile_cu_3 calculează suma elementelor dintr-un tablou unidimensional care sunt divizibile cu 3 și primește ca parametri v - tabloul unidimensional și n - numărul efectiv de elemente din tablou.&lt;br /&gt;
&lt;br /&gt;
Funcția main este funcția principală care citește datele de intrare și afișează rezultatul sau un mesaj de eroare. Ea folosește funcțiile de validare și de rezolvare pentru a verifica și procesa datele de intrare.&lt;br /&gt;
&lt;br /&gt;
În cadrul funcției main, datele de intrare sunt citite de la tastatură și apoi sunt verificate utilizând funcțiile validare_natural și validare_dimensiune_tablou. Dacă datele de intrare sunt valide, se creează un tablou v care este umplut cu numerele citite de la tastatură și apoi se afișează mesajul &amp;quot;Datele de intrare corespund restricțiilor impuse&amp;quot; și suma elementelor din tablou care sunt divizibile cu 3, calculată utilizând funcția suma_divizibile_cu_3.&lt;br /&gt;
&lt;br /&gt;
În caz contrar, dacă datele de intrare nu sunt valide, se afișează mesajul &amp;quot;Datele de intrare nu corespund restricțiilor impuse&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0926_-_FSumDiv3Rec&amp;diff=6511</id>
		<title>0926 - FSumDiv3Rec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0926_-_FSumDiv3Rec&amp;diff=6511"/>
		<updated>2023-05-14T21:34:40Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Scrieţi definiția completă a subprogramului recursiv sum3, care primeşte prin parametrul v un tablou unidimensional cu cel mult 100 de elemente întregi, iar prin parametrul n numărul efectiv de elemente din v.&lt;br /&gt;
Subprogramul returnează suma elementelor din tabloul &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt; care sunt divizibile cu 3.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură un număr natural care va fi transmis ca perimetru&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*0 &amp;lt; n ≤ 100&lt;br /&gt;
*numele subprogramului cerut este sum3&lt;br /&gt;
*parametrii sunt, în această ordine: v, n&lt;br /&gt;
*indicii elementelor vectorului v sunt 0, 1 ,… , n-1.&lt;br /&gt;
*Se recomandă realizarea unui subprogram recursiv.&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numarul de elemente: 6&lt;br /&gt;
;v[0] = 12&lt;br /&gt;
;v[1] = 7&lt;br /&gt;
;v[2] = 6&lt;br /&gt;
;v[3] = 3&lt;br /&gt;
;v[4] = 8&lt;br /&gt;
;v[5] = 5&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restrictiilor.&lt;br /&gt;
;Suma elementelor divizibile cu 3 din vector este: 21&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numarul de elemente: 1234&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund restrictiilor.&lt;br /&gt;
&lt;br /&gt;
==Important==&lt;br /&gt;
Soluţia propusă va conţine doar definiţia subprogramului cerut. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 def sum3(v, n):&lt;br /&gt;
    if n == 0:&lt;br /&gt;
        return 0&lt;br /&gt;
    if v[n-1] % 3 == 0:&lt;br /&gt;
        return v[n-1] + sum3(v, n-1)&lt;br /&gt;
    else:&lt;br /&gt;
        return sum3(v, n-1)&lt;br /&gt;
&lt;br /&gt;
# Citirea datelor de intrare&lt;br /&gt;
n = int(input(&amp;quot;Introduceti numarul de elemente: &amp;quot;))&lt;br /&gt;
&lt;br /&gt;
# Verificarea restricțiilor&lt;br /&gt;
if n &amp;lt;= 0 or n &amp;gt; 100:&lt;br /&gt;
    print(&amp;quot;Datele de intrare nu corespund restrictiilor.&amp;quot;)&lt;br /&gt;
else:&lt;br /&gt;
    # Citirea vectorului&lt;br /&gt;
    v = []&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        x = int(input(f&amp;quot;v[{i}] = &amp;quot;))&lt;br /&gt;
        v.append(x)&lt;br /&gt;
&lt;br /&gt;
    # Calcularea sumei elementelor divizibile cu 3 din vector&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restrictiilor.&amp;quot;)&lt;br /&gt;
    s = sum3(v, n)&lt;br /&gt;
    print(f&amp;quot;Suma elementelor divizibile cu 3 din vector este: {s}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
Programul începe prin citirea unui număr natural n de la tastatură, care reprezintă numărul de elemente al tabloului. Se verifică dacă valoarea citită se încadrează în restricțiile impuse (0 &amp;lt; n ≤ 100), iar în caz contrar se afișează mesajul &amp;quot;Datele de intrare nu corespund cerinței&amp;quot; și programul se încheie.&lt;br /&gt;
&lt;br /&gt;
În cazul în care numărul n se încadrează în limitele impuse, se declară și se inițializează un tablou unidimensional v cu n elemente, iar apoi se citesc valorile pentru fiecare element din tablou.&lt;br /&gt;
&lt;br /&gt;
Se apelează apoi funcția sum3, care calculează suma elementelor din tabloul v care sunt divizibile cu 3, utilizând o abordare recursivă. Dacă toate elementele sunt distincte de 3, atunci suma returnată va fi 0.&lt;br /&gt;
&lt;br /&gt;
În continuare, programul afișează mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează suma calculată de funcția sum3.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0938_-_FSumRec&amp;diff=6508</id>
		<title>0938 - FSumRec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0938_-_FSumRec&amp;diff=6508"/>
		<updated>2023-05-14T21:32:11Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Scrieţi definiția completă a subprogramului recursiv &amp;lt;code&amp;gt;suma&amp;lt;/code&amp;gt;, care primeşte prin parametrul v un tablou unidimensional cu cel mult 100 de elemente întregi, iar prin parametrul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numărul efectiv de elemente din &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt;.&lt;br /&gt;
Subprogramul returnează suma elementelor din tabloul &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură un număr natural care va fi transmis ca perimetru&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*0 &amp;lt; n ≤ 100&lt;br /&gt;
*numele subprogramului cerut este suma&lt;br /&gt;
*parametrii sunt, în această ordine: v, n&lt;br /&gt;
*indicii elementelor vectorului v sunt 0, 1 ,… , n-1.&lt;br /&gt;
*Se recomandă realizarea unui subprogram recursiv.&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceți numărul de elemente ale tabloului: 6&lt;br /&gt;
;v[0] = 12&lt;br /&gt;
;v[1] = 7&lt;br /&gt;
;v[2] = 6&lt;br /&gt;
;v[3] = 3&lt;br /&gt;
;v[4] = 8&lt;br /&gt;
;v[5] = 5&lt;br /&gt;
Datele de intrare corespund restricțiilor impuse.&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Suma elementelor din tablou este: 41&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceți numărul de elemente ale tabloului: 1234&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund restrictiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Important==&lt;br /&gt;
Soluţia propusă va conţine doar definiţia subprogramului cerut. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def suma(v, n):&lt;br /&gt;
    if n == 1:&lt;br /&gt;
        return v[0]&lt;br /&gt;
    else:&lt;br /&gt;
        return v[n-1] + suma(v, n-1)&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
    n = int(input(&amp;quot;Introduceți numărul de elemente ale tabloului: &amp;quot;))&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 100:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restrictiilor impuse.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        v = []&lt;br /&gt;
        for i in range(n):&lt;br /&gt;
            elem = int(input(f&amp;quot;v[{i}] = &amp;quot;))&lt;br /&gt;
            v.append(elem)&lt;br /&gt;
        print(&amp;quot;Datele de intrare corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        print(&amp;quot;Suma elementelor din tablou este:&amp;quot;, suma(v, n))&lt;br /&gt;
except ValueError:&lt;br /&gt;
    print(&amp;quot;Datele de intrare nu corespund restrictiilor impuse.&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
Acest program calculează suma elementelor unui tablou dat folosind o funcție recursivă numită &amp;quot;suma&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;suma&amp;quot; primește doi parametri: un tablou de întregi &amp;quot;v&amp;quot; și numărul efectiv de elemente din tablou &amp;quot;n&amp;quot;. În cazul acestui exercițiu, &amp;quot;n&amp;quot; este citit de la tastatură și trebuie să fie un număr întreg pozitiv mai mic sau egal cu 100.&lt;br /&gt;
&lt;br /&gt;
În cadrul funcției &amp;quot;suma&amp;quot;, se verifică dacă numărul efectiv de elemente este zero sau nu. Dacă este zero, funcția returnează 0. În caz contrar, se adună elementul curent (v[n-1]) cu suma elementelor din sub-tabloul v[0:n-2], obținut prin apelul recursiv al funcției &amp;quot;suma&amp;quot;. De asemenea, se verifică dacă &amp;quot;n&amp;quot; este mai mare decât capacitatea tabloului &amp;quot;v&amp;quot;, caz în care funcția returnează 0.&lt;br /&gt;
&lt;br /&gt;
În funcția main, se citește numărul efectiv de elemente al tabloului &amp;quot;n&amp;quot;, iar apoi se citește fiecare element al tabloului &amp;quot;v&amp;quot;. Se verifică dacă datele de intrare corespund cerințelor și se afișează un mesaj corespunzător.&lt;br /&gt;
&lt;br /&gt;
Dacă datele de intrare sunt corecte, se apelează funcția &amp;quot;suma&amp;quot; pentru a calcula suma elementelor tabloului &amp;quot;v&amp;quot; și se afișează rezultatul.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2730_-_SC&amp;diff=6505</id>
		<title>2730 - SC</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2730_-_SC&amp;diff=6505"/>
		<updated>2023-05-14T21:30:08Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Scrieți funcția recursivă având următorul antet:&lt;br /&gt;
int SC(char s[])&lt;br /&gt;
Funcția primește ca parametru un șir de caractere și returnează suma tuturor cifrelor care apar în șir.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură un sir de caractere &lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
*1 ≤ lungimea șirului ≤ 200&lt;br /&gt;
*Dacă șirul nu conține cifre, funcția trebuie să returneze valoarea 0.&lt;br /&gt;
*Se recomandă utilizarea recursivității pentru rezolvarea acestei probleme.&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti un sir de caractere: Ana are 15 mere si 185 de pere.&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restricțiilor impuse.&lt;br /&gt;
;Suma cifrelor din sir este: 20&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti un sir de caractere: Ana are mere.&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restricțiilor impuse.&lt;br /&gt;
;Suma cifrelor din sir este: 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Important==&lt;br /&gt;
Soluția propusă va conține definiția funcției cerute. Prezența în soluție a altor instrucțiuni poate duce erori de compilare sau de execuție care vor avea ca efect depunctarea soluției.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def validate_input(s):&lt;br /&gt;
    if not isinstance(s, str):&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    if len(s) &amp;lt; 1 or len(s) &amp;gt; 200:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def SC(s):&lt;br /&gt;
    if not validate_input(s):&lt;br /&gt;
        return&lt;br /&gt;
    if not any(char.isdigit() for char in s):&lt;br /&gt;
        return 0&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for char in s:&lt;br /&gt;
        if char.isdigit():&lt;br /&gt;
            sum += int(char)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    s = input(&amp;quot;Introduceti un sir de caractere: &amp;quot;)&lt;br /&gt;
    if validate_input(s):&lt;br /&gt;
        print(&amp;quot;Datele de intrare corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        print(&amp;quot;Suma cifrelor din sir este:&amp;quot;, SC(s))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
Codul dat este o implementare în limbajul Python a unei funcții recursive care primește ca parametru un șir de caractere și returnează suma tuturor cifrelor care apar în șir.&lt;br /&gt;
&lt;br /&gt;
Funcția este formată din trei sub-funcții:&lt;br /&gt;
&lt;br /&gt;
#1 validate_input(s) - această funcție primește un șir de caractere s și verifică dacă acesta respectă restricțiile impuse de cerințe: trebuie să fie de tipul str și să aibă o lungime între 1 și 200. Dacă șirul nu respectă aceste restricții, se afișează un mesaj corespunzător și se returnează valoarea False. Altfel, funcția returnează valoarea True.&lt;br /&gt;
&lt;br /&gt;
#2 SC(s) - această funcție primește ca parametru un șir de caractere s și îl validează prin apelul funcției validate_input(s). Dacă șirul nu respectă restricțiile, funcția returnează None. În caz contrar, se parcurge fiecare caracter din șir și se calculează suma cifrelor. Dacă șirul nu conține cifre, funcția returnează valoarea 0.&lt;br /&gt;
&lt;br /&gt;
#3 main() - această funcție este funcția principală a programului și este responsabilă pentru citirea șirului de la tastatură, apelarea funcției SC(s) și afișarea rezultatului. Înainte de apelarea funcției SC(s), se validează șirul de intrare prin apelul funcției validate_input(s).&lt;br /&gt;
&lt;br /&gt;
În programul principal, se apelează funcția main().&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1863_-_NumarareRec&amp;diff=6501</id>
		<title>1863 - NumarareRec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1863_-_NumarareRec&amp;diff=6501"/>
		<updated>2023-05-14T21:27:59Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Scrieţi definiția completă a subprogramului recursiv numarare, care primeşte prin parametrul v un tablou unidimensional cu cel mult 100 de elemente întregi, iar prin parametrul n numărul efectiv de elemente din v.&lt;br /&gt;
&lt;br /&gt;
Subprogramul returnează numărul de perechi de elemente vecine din tabloul v care sunt egale.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură un număr natural care va fi transmis ca perimetru&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*0 &amp;lt; n ≤ 100&lt;br /&gt;
*numele subprogramului cerut este numarare&lt;br /&gt;
*parametrii sunt, în această ordine: v, n&lt;br /&gt;
*indicii elementelor tabloului v sunt 0, 1 ,… , n-1.&lt;br /&gt;
*se recomandă realizarea unui subprogram recursiv&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numarul de elemente: 6&lt;br /&gt;
;Introduceti elementul 1: 5&lt;br /&gt;
;Introduceti elementul 2: 6&lt;br /&gt;
;Introduceti elementul 3: 6&lt;br /&gt;
;Introduceti elementul 4: 3&lt;br /&gt;
;Introduceti elementul 5: 5&lt;br /&gt;
;Introduceti elementul 6: 5&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restricțiilor.&lt;br /&gt;
;Numarul de perechi de elemente vecine egale este: 2&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numarul de elemente: 1234&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund restrictiilor impuse.&lt;br /&gt;
&lt;br /&gt;
==Important==&lt;br /&gt;
Soluţia propusă va conţine doar definiţia subprogramului cerut. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 def numarare(v, n):&lt;br /&gt;
    if n &amp;lt;= 1:&lt;br /&gt;
        return 0&lt;br /&gt;
    if v[n - 1] == v[n - 2]:&lt;br /&gt;
        return 1 + numarare(v, n - 1)&lt;br /&gt;
    else:&lt;br /&gt;
        return numarare(v, n - 1)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citirea datelor de intrare&lt;br /&gt;
    n = int(input(&amp;quot;Introduceti numarul de elemente: &amp;quot;))&lt;br /&gt;
    if n &amp;lt;= 1 or n &amp;gt; 100:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restrictiilor impuse.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    v = []&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        element = int(input(f&amp;quot;Introduceti elementul {i + 1}: &amp;quot;))&lt;br /&gt;
        v.append(element)&lt;br /&gt;
&lt;br /&gt;
    # Apelarea functiei de numarare si afisarea rezultatului&lt;br /&gt;
    numar_perechi = numarare(v, n)&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restrictiilor impuse.&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;Numarul de perechi de elemente vecine egale este: {numar_perechi}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
Codul este împărțit în două funcții:&lt;br /&gt;
&lt;br /&gt;
#1 numarare - această funcție primește ca argumente un vector v și numărul de elemente n. Scopul acestei funcții este de a număra câte perechi de elemente vecine egale se găsesc în vectorul dat. Funcția se bazează pe o abordare recursivă, verificând dacă ultimele două elemente ale vectorului sunt egale, apoi apelându-se recursiv pentru a verifica restul vectorului. Funcția returnează numărul de perechi găsite.&lt;br /&gt;
&lt;br /&gt;
#2 main - această funcție conține citirea datelor de intrare, apelarea funcției numarare și afișarea rezultatului. Inițial, se citește numărul de elemente n din vector, apoi fiecare element este citit și adăugat la vectorul v. Apoi, se apelează funcția numarare pentru a număra perechile de elemente vecine egale și se afișează numărul găsit.&lt;br /&gt;
&lt;br /&gt;
În cadrul funcției main sunt aplicate verificări pentru a asigura că datele de intrare corespund restricțiilor impuse (adică 0 &amp;lt; n ≤ 100). Dacă aceste restricții nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele de intrare nu corespund restricțiilor impuse&amp;quot;. În caz contrar, se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor impuse&amp;quot; urmat de numărul de perechi de elemente vecine egale.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0828_-_Manna-Pnueli&amp;diff=6500</id>
		<title>0828 - Manna-Pnueli</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0828_-_Manna-Pnueli&amp;diff=6500"/>
		<updated>2023-05-14T21:25:55Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Să se scrie o python care să returneze cifra cifra maximă a unui număr natural transmis ca parametru.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură un număr natural care va fi transmis ca perimetru&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*numele funcției va fi &amp;lt;code&amp;gt;cifmax&amp;lt;/code&amp;gt;&lt;br /&gt;
*funcția va avea un parametru reprezentând numărul dat&lt;br /&gt;
*numărul pentru care se calculează cifra maximă va fi mai mic decât 2.000.000.000&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numarul: 2050&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restricțiilor impuse.&lt;br /&gt;
;Cifra maxima este: 5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numarul: 2000000000&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund restricțiilor impuse.&lt;br /&gt;
;Cifra maxima este: None&lt;br /&gt;
&lt;br /&gt;
==Important==&lt;br /&gt;
Soluţia propusă va conţine doar definiţia funcţiei cerute. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def validare(numar):&lt;br /&gt;
    if not isinstance(numar, int) or numar &amp;lt; 0 or numar &amp;gt;= 2000000000:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def cifmax(numar, print_message=True):&lt;br /&gt;
    if not validare(numar):&lt;br /&gt;
        if print_message:&lt;br /&gt;
            print(&amp;quot;Datele de intrare nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        return None&lt;br /&gt;
    if print_message:&lt;br /&gt;
        print(&amp;quot;Datele de intrare corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
    if numar &amp;lt; 10:&lt;br /&gt;
        return numar&lt;br /&gt;
    max_cifra = cifmax(numar // 10, False)&lt;br /&gt;
    cifra_curenta = numar % 10&lt;br /&gt;
    return max_cifra if max_cifra &amp;gt; cifra_curenta else cifra_curenta&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    numar = int(input(&amp;quot;Introduceti numarul: &amp;quot;))&lt;br /&gt;
    print(&amp;quot;Cifra maxima este:&amp;quot;, cifmax(numar))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
Funcția validare primește un parametru numar și verifică dacă acesta este un întreg pozitiv (mai mare sau egal cu 0) și mai mic decât 2000000000 (adica, intră în intervalul [0, 2000000000)).&lt;br /&gt;
Funcția cifmax primește, de asemenea, un parametru numar, care reprezintă numărul la care se caută cifra maximă, și un parametru opțional print_message care indică dacă trebuie afișat mesajul &amp;quot;Datele de intrare corespund restricțiilor impuse.&amp;quot; la apelul inițial al funcției. La început, parametrul print_message este setat la True.&lt;br /&gt;
În funcția cifmax, se verifică dacă numar este valid folosind funcția validare. Dacă numar nu este valid, funcția va afișa mesajul &amp;quot;Datele de intrare nu corespund restricțiilor impuse.&amp;quot; dacă parametrul print_message este setat la True și va returna None.&lt;br /&gt;
Dacă numar este valid, funcția va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor impuse.&amp;quot; la apelul inițial al funcției dacă print_message este setat la True.&lt;br /&gt;
Dacă numar are doar o cifră, acea cifră va fi returnată.&lt;br /&gt;
În caz contrar, se calculează cifra curentă și se face o apelare recursivă a funcției cifmax cu numărul format din toate cifrele lui numar cu excepția celei mai din dreapta (adică cu o cifră mai puțin), și parametrul print_message setat la False. Rezultatul apelului recursive este stocat în variabila max_cifra.&lt;br /&gt;
Dacă max_cifra este mai mare decât cifra curentă, atunci max_cifra este returnată. În caz contrar, cifra curentă este returnată.&lt;br /&gt;
Funcția main citește un număr de la tastatură, apelează funcția cifmax și afișează cifra maximă găsită.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2674_-_IncDecRec&amp;diff=6497</id>
		<title>2674 - IncDecRec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2674_-_IncDecRec&amp;diff=6497"/>
		<updated>2023-05-14T21:24:10Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Scrieți funcția recursivă IncDecRec care primind ca parametru un număr natural n, returnează numărul obținut din n prin scăderea cu 1 a fiecărei cifre impare și creșterea cu 1 a fiecărei cifre pare.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură un număr natural care va fi transmis ca perimetru&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
*0 ≤ n ≤ 999.999.999&lt;br /&gt;
*Numele funcției este IncDecRec.&lt;br /&gt;
*Se recomandă utilizarea recursivității în rezolvarea problemei. De asemenea, se recomandă să nu se folosească alte funcții suplimentare.&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceți un număr natural: 4321&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restricțiilor impuse.&lt;br /&gt;
;Rezultatul este: 5230&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti un numar: -1241&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund restrictiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def cifmaxpar(numar):&lt;br /&gt;
    #Returneaza cea mai mare cifra para a unui numar dat.&lt;br /&gt;
    #Daca numarul nu contine nicio cifra para, se returneaza -1.&lt;br /&gt;
    if numar &amp;lt; 0 or numar &amp;gt;= 2000000000:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restrictiilor impuse.&amp;quot;)&lt;br /&gt;
        return None&lt;br /&gt;
    max_cifra_para = -1&lt;br /&gt;
    while numar &amp;gt; 0:&lt;br /&gt;
        cifra = numar % 10&lt;br /&gt;
        if cifra % 2 == 0 and cifra &amp;gt; max_cifra_para:&lt;br /&gt;
            max_cifra_para = cifra&lt;br /&gt;
        numar //= 10&lt;br /&gt;
    if max_cifra_para == -1:&lt;br /&gt;
        return -1&lt;br /&gt;
    else:&lt;br /&gt;
        return max_cifra_para&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    numar = int(input(&amp;quot;Introduceti un numar: &amp;quot;))&lt;br /&gt;
    cifra_max = cifmaxpar(numar)&lt;br /&gt;
    if cifra_max == None:&lt;br /&gt;
        return&lt;br /&gt;
    elif cifra_max == -1:&lt;br /&gt;
        print(&amp;quot;Numarul dat nu contine nicio cifra para.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele de intrare corespund restrictiilor impuse.&amp;quot;)&lt;br /&gt;
        print(f&amp;quot;Cea mai mare cifra para a numarului dat este {cifra_max}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
Funcția primește un argument numit numar, reprezentând numărul căruia i se caută cea mai mare cifră pară.&lt;br /&gt;
&lt;br /&gt;
Dacă numărul introdus este negativ sau mai mare decât o limită impusă (în acest caz, 2000000000), funcția afișează un mesaj de eroare prin intermediul funcției print() și returnează valoarea specială None.&lt;br /&gt;
&lt;br /&gt;
Funcția inițializează variabila max_cifra_para cu -1. Acesta este un număr care va fi înlocuit cu prima cifră pară găsită în numărul introdus.&lt;br /&gt;
&lt;br /&gt;
În următoarea secțiune a codului se utilizează un ciclu while pentru a parcurge cifrele numărului dat. Începând cu cifra unităților și până la cifra cu puterea cea mai mare de 10, se vor efectua următoarele operații:&lt;br /&gt;
&lt;br /&gt;
a) Se determină cifra curentă a numărului prin intermediul operației modulo (%) și operatorul //.&lt;br /&gt;
&lt;br /&gt;
b) Dacă cifra curentă este pară și mai mare decât valoarea curentă a variabilei max_cifra_para, atunci această cifră devine noua valoare a variabilei max_cifra_para.&lt;br /&gt;
&lt;br /&gt;
c) Variabila numar este actualizată prin împărțirea acesteia la 10 (în acest fel, se elimină cifra curentă, astfel încât să se poată trece la următoarea cifră).&lt;br /&gt;
&lt;br /&gt;
După terminarea ciclului, se verifică valoarea variabilei max_cifra_para. Dacă această valoare este -1, atunci nu s-a găsit nicio cifră pară și se afișează un mesaj corespunzător prin intermediul funcției print(). Dacă valoarea este diferită de -1, atunci funcția afișează o confirmare a faptului că datele introduse sunt corecte și afișează valoarea variabilei max_cifra_para ca rezultat, prin intermediul unei expresii f-string (formatate cu ajutorul caracterului {} și a unei variabile în interiorul șirului).&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0827_-_CifMaxParRec&amp;diff=6495</id>
		<title>0827 - CifMaxParRec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0827_-_CifMaxParRec&amp;diff=6495"/>
		<updated>2023-05-14T21:22:30Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Să se scrie o python care să returneze cea mai mare cifră pară a unui număr natural transmis ca parametru.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură un număr natural care va fi transmis ca perimetru&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*numele funcției va fi &amp;lt;code&amp;gt;cifmaxpar&amp;lt;/code&amp;gt;&lt;br /&gt;
*funcția va avea un parametru reprezentând numărul dat&lt;br /&gt;
*numărul pentru care se calculează cea mai mare cifră pară va fi mai mic decât 2.000.000.000&lt;br /&gt;
*dacă numărul nu conţine nici o cifră pară, se va returna valoarea -1&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti un numar: 2154&lt;br /&gt;
;Datele de intrare corespund restrictiilor impuse.&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Cea mai mare cifra para a numarului dat este 4.&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti un numar: 1157&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restrictiilor impuse.&lt;br /&gt;
;Cea mai mare cifra para a numarului dat este -1.&lt;br /&gt;
&lt;br /&gt;
==Important==&lt;br /&gt;
Soluţia propusă va conţine doar definiţia funcţiei cerute. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def cifmaxpar(numar):&lt;br /&gt;
    #Returneaza cea mai mare cifra para a unui numar dat.&lt;br /&gt;
    #Daca numarul nu contine nicio cifra para, se returneaza -1.&lt;br /&gt;
    if numar &amp;lt; 0 or numar &amp;gt;= 2000000000:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restrictiilor impuse.&amp;quot;)&lt;br /&gt;
        return None&lt;br /&gt;
    max_cifra_para = -1&lt;br /&gt;
    while numar &amp;gt; 0:&lt;br /&gt;
        cifra = numar % 10&lt;br /&gt;
        if cifra % 2 == 0 and cifra &amp;gt; max_cifra_para:&lt;br /&gt;
            max_cifra_para = cifra&lt;br /&gt;
        numar //= 10&lt;br /&gt;
    if max_cifra_para == -1:&lt;br /&gt;
        return -1&lt;br /&gt;
    else:&lt;br /&gt;
        return max_cifra_para&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    numar = int(input(&amp;quot;Introduceti un numar: &amp;quot;))&lt;br /&gt;
    cifra_max = cifmaxpar(numar)&lt;br /&gt;
    if cifra_max == None:&lt;br /&gt;
        return&lt;br /&gt;
    elif cifra_max == -1:&lt;br /&gt;
        print(&amp;quot;Numarul dat nu contine nicio cifra para.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele de intrare corespund restrictiilor impuse.&amp;quot;)&lt;br /&gt;
        print(f&amp;quot;Cea mai mare cifra para a numarului dat este {cifra_max}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0834_-_ElimCifRec&amp;diff=6493</id>
		<title>0834 - ElimCifRec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0834_-_ElimCifRec&amp;diff=6493"/>
		<updated>2023-05-14T21:20:27Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Să se scrie o python care primește ca parametrii un număr natural n și o cifră c și returnează numărul obținut prin eliminarea din n a tuturor aparițiilor lui c.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură un număr natural care va fi transmis ca perimetru&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Restricţii şi precizări&lt;br /&gt;
*numele funcției va fi elimcif&lt;br /&gt;
*funcția va avea doi parametri, în această ordine: n, c, cu semnificația de mai sus&lt;br /&gt;
*1 ≤ n ≤ 2.000.000.000, 0 ≤ c &amp;lt; 10&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti un numar natural: 2454&lt;br /&gt;
;Introduceti cifra: 4&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restrictiilor&lt;br /&gt;
;Numarul obtinut prin eliminarea cifrei 4 din 0 este 25&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti un numar natural: 1157&lt;br /&gt;
;Introduceti cifra: 8&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restrictiilor&lt;br /&gt;
;Numarul obtinut prin eliminarea cifrei 8 din 0 este 1157&lt;br /&gt;
===Exemplu 3===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti un numar natural: abc&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
==Important==&lt;br /&gt;
Soluţia propusă va conţine doar definiţia funcţiei cerute. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 def validare(n, c):&lt;br /&gt;
    if not isinstance(n, int) or not isinstance(c, int):&lt;br /&gt;
        return False&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 2000000000 or c &amp;lt; 0 or c &amp;gt; 9:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def elimcif(n, c):&lt;br /&gt;
    if not validare(n, c):&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund cerintei&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    numar_nou = 0&lt;br /&gt;
    putere = 1&lt;br /&gt;
    while n &amp;gt; 0:&lt;br /&gt;
        ultima_cifra = n % 10&lt;br /&gt;
        if ultima_cifra != c:&lt;br /&gt;
            numar_nou += ultima_cifra * putere&lt;br /&gt;
            putere *= 10&lt;br /&gt;
        n //= 10&lt;br /&gt;
    if numar_nou == 0:&lt;br /&gt;
        print(&amp;quot;Numarul nu contine cifre diferite de&amp;quot;, c)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele de intrare corespund restrictiilor&amp;quot;)&lt;br /&gt;
        print(&amp;quot;Numarul obtinut prin eliminarea cifrei&amp;quot;, c, &amp;quot;din&amp;quot;, n, &amp;quot;este&amp;quot;, numar_nou)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input(&amp;quot;Introduceti un numar natural: &amp;quot;))&lt;br /&gt;
    c = int(input(&amp;quot;Introduceti cifra: &amp;quot;))&lt;br /&gt;
    elimcif(n, c)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
Funcția validare verifică dacă datele de intrare respectă restricțiile cerute. Dacă n este mai mare decât 2 miliarde sau cifra c nu este între 0 și 9, funcția va returna False, altfel va returna True.&lt;br /&gt;
&lt;br /&gt;
Funcția elimcif primește doi parametri: n și c. În interiorul acestei funcții, se verifică dacă datele de intrare corespund cerințelor folosind funcția de validare și se afișează mesajul corespunzător. Dacă datele sunt corecte, se realizează eliminarea cifrei c din numărul n.&lt;br /&gt;
&lt;br /&gt;
Mai întâi, convertim numărul n într-un șir de caractere folosind funcția str. Apoi, într-un for loop, iterăm prin toate caracterele șirului și adăugăm într-un alt șir doar caracterele diferite de cifra c. La final, convertim șirul obținut într-un număr întreg folosind funcția int.&lt;br /&gt;
&lt;br /&gt;
În funcția main, se citește numărul de la tastatură, se verifică dacă datele de intrare corespund cerințelor folosind funcția de validare, iar dacă da, se apelează funcția elimcif și se afișează rezultatul.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0826_-_CifMinParRec&amp;diff=6490</id>
		<title>0826 - CifMinParRec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0826_-_CifMinParRec&amp;diff=6490"/>
		<updated>2023-05-14T21:17:52Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Să se scrie o python care să returneze cea mai mică cifră pară a unui număr natural transmis ca parametru.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură un număr natural care va fi transmis ca perimetru&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*numele funcției va fi &amp;lt;code&amp;gt;cifminpar&amp;lt;/code&amp;gt;&lt;br /&gt;
*funcția va avea un parametru reprezentând numărul dat&lt;br /&gt;
*numărul pentru care se calculează cifra minimă pară va fi mai mic decât &amp;lt;code&amp;gt;2.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
*dacă numărul nu conţine nici o cifră pară, se va returna valoarea &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceți un număr natural: 2355235&lt;br /&gt;
:Iesrire:&lt;br /&gt;
;Datele de intrare corespund restricțiilor&lt;br /&gt;
;Cea mai mică cifră pară din 2355235 este 2.&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceți un număr natural: -10&lt;br /&gt;
:Iesire&lt;br /&gt;
;Datele de intrare nu corespund cerinței&lt;br /&gt;
&lt;br /&gt;
===Exemplu 3===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Datele de intrare corespund restricțiilor&lt;br /&gt;
;-1&lt;br /&gt;
==Important==&lt;br /&gt;
Soluţia propusă va conţine doar definiţia funcţiei cerute. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def cifminpar(numar):&lt;br /&gt;
    if numar &amp;lt; 0 or numar &amp;gt;= 2000000000:&lt;br /&gt;
        return &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;&lt;br /&gt;
    elif numar % 2 == 0:&lt;br /&gt;
        return &amp;quot;Cea mai mică cifră pară din &amp;quot; + str(numar) + &amp;quot; este &amp;quot; + str(min([int(cifra) for cifra in str(numar) if int(cifra) % 2 == 0]))&lt;br /&gt;
    else:&lt;br /&gt;
        if any(int(cifra) % 2 == 0 for cifra in str(numar)):&lt;br /&gt;
            return &amp;quot;Cea mai mică cifră pară din &amp;quot; + str(numar) + &amp;quot; este &amp;quot; + str(min([int(cifra) for cifra in str(numar) if int(cifra) % 2 == 0]))&lt;br /&gt;
        else:&lt;br /&gt;
            return -1&lt;br /&gt;
&lt;br /&gt;
numar = int(input(&amp;quot;Introduceți un număr natural: &amp;quot;))&lt;br /&gt;
rezultat = cifminpar(numar)&lt;br /&gt;
if rezultat == &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;:&lt;br /&gt;
    print(rezultat)&lt;br /&gt;
else:&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restricțiilor&amp;quot;)&lt;br /&gt;
    print(rezultat)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 #Această funcție va solicita utilizatorului să introducă un număr natural, va apela funcția cifminpar și va afișa rezultatul. Dacă funcția cifminpar întoarce o valoare non-numerică, aceasta va fi afișată direct în consolă.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
Se definește o funcție numită ceamai_mica_cifra_para care primește ca argument un număr natural n.&lt;br /&gt;
Se verifică dacă numărul n conține cifre pare:&lt;br /&gt;
a. Se convertește numărul n într-un șir de caractere pentru a putea parcurge cifrele sale.&lt;br /&gt;
b. Se parcurg cifrele șirului și se verifică dacă fiecare cifră este pară.&lt;br /&gt;
c. Dacă se găsește cel puțin o cifră pară, se continuă cu următorul pas.&lt;br /&gt;
d. Altfel, se returnează valoarea -1.&lt;br /&gt;
Se parcurge din nou șirul format din cifrele numărului n, de data aceasta în ordine inversă.&lt;br /&gt;
Se verifică dacă fiecare cifră este pară și se ține minte cea mai mică cifră pară găsită până acum.&lt;br /&gt;
Se returnează cea mai mică cifră pară găsită.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0920_-_CifMaxMinRec&amp;diff=6486</id>
		<title>0920 - CifMaxMinRec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0920_-_CifMaxMinRec&amp;diff=6486"/>
		<updated>2023-05-14T21:14:43Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Să se scrie o python care să determine cifra maximă și cifra minimă a unui număr natural transmis ca parametru. Funcția va întoarce rezultatele prin intermediul unor parametri de ieșire.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură un număr natural care va fi transmis ca perimetru&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*numele funcției va fi &amp;lt;code&amp;gt;cifmaxmin&amp;lt;/code&amp;gt;&lt;br /&gt;
*funcția va avea trei parametri:&lt;br /&gt;
*&amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, numărul dat&lt;br /&gt;
*&amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt;, cifra maximă a lui &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;min&amp;lt;/code&amp;gt;, cifra minimă a lui &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
*ordinea parametrilor este: &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;min&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; va fi mai mic decât &amp;lt;code&amp;gt;2.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1=== &lt;br /&gt;
:Intrare:&lt;br /&gt;
;cifmaxmin(12345, 0, 0) &lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restricțiilor impuse.&lt;br /&gt;
;Cifra maxima este: 5 &lt;br /&gt;
;Cifra minima este: 1 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;cifmaxmin(12345, 0, 0)&lt;br /&gt;
:Iesire: &lt;br /&gt;
;Datele de intrare corespund restricțiilor impuse. &lt;br /&gt;
;Cifra maxima este: 5 &lt;br /&gt;
;Cifra minima este: 1 &lt;br /&gt;
&lt;br /&gt;
===Exemplu 3===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;cifmaxmin(2000000000, 0, 0) &lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund restricțiilor impuse. &lt;br /&gt;
&lt;br /&gt;
==Important==&lt;br /&gt;
Soluţia propusă va conţine doar definiţia funcţiei cerute. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 def validare(n):&lt;br /&gt;
    if n &amp;gt;= 2000000000:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
    return True&lt;br /&gt;
 def cifmaxmin(n, max, min):&lt;br /&gt;
    if not validare(n):&lt;br /&gt;
        return   &lt;br /&gt;
    while n &amp;gt; 0:&lt;br /&gt;
        cifra = n % 10&lt;br /&gt;
        if cifra &amp;gt; max:&lt;br /&gt;
            max = cifra&lt;br /&gt;
        if cifra &amp;lt; min or min == 0:&lt;br /&gt;
            min = cifra&lt;br /&gt;
        n //= 10    &lt;br /&gt;
    print(f&amp;quot;Cifra maxima este: {max}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;Cifra minima este: {min}&amp;quot;)&lt;br /&gt;
 def main():&lt;br /&gt;
    n = int(input(&amp;quot;Introduceti un numar intreg mai mic decat 2.000.000.000: &amp;quot;))&lt;br /&gt;
    cifmaxmin(n, 0, 0)&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
Pentru a explica funcția cifmaxmin, vom parcurge codul pe bucăți:&lt;br /&gt;
&lt;br /&gt;
Funcția începe prin apelarea funcției de validare cu numărul dat ca argument. Dacă funcția de validare returnează False, înseamnă că numărul nu respectă restricțiile impuse și funcția cifmaxmin se oprește prin instrucțiunea return.&lt;br /&gt;
Inițializăm variabilele max și min cu 0.&lt;br /&gt;
Într-un loop while, parcurgem cifrele numărului dat n:&lt;br /&gt;
Obținem ultima cifră a lui n prin modulo 10, și o salvăm în variabila cifra.&lt;br /&gt;
Comparăm cifra cu valoarea max și o actualizăm dacă este cazul.&lt;br /&gt;
Comparăm cifra cu valoarea min și o actualizăm dacă este cazul. De asemenea, verificăm dacă min are valoarea 0, caz în care îi atribuim valoarea cifrei.&lt;br /&gt;
Împărțim n la 10 pentru a elimina ultima cifră și a trece la cifra următoare.&lt;br /&gt;
Afișăm valorile finale ale max și min.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0825_-_CifMinRec&amp;diff=6482</id>
		<title>0825 - CifMinRec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0825_-_CifMinRec&amp;diff=6482"/>
		<updated>2023-05-14T21:11:43Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Să se scrie o python care să returneze cifra minimă a unui număr natural transmis ca parametru.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură un număr natural care va fi transmis ca perimetru&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*numele funcției va fi &amp;lt;code&amp;gt;cifmin&amp;lt;/code&amp;gt;&lt;br /&gt;
*funcția va avea un parametru reprezentând numărul dat&lt;br /&gt;
*numărul pentru care se calculează cifra minimă va fi mai mic decât &amp;lt;code&amp;gt;2.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
&lt;br /&gt;
:Date de intrare: 2050 &lt;br /&gt;
:Date de ieșire: &lt;br /&gt;
;Datele de intrare corespund restricțiilor impuse. &lt;br /&gt;
;Cifra minima a numarului 2050 este 0.&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Date de intrare: -42 &lt;br /&gt;
:Date de ieșire: &lt;br /&gt;
;Datele de intrare nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def validate_input(num):&lt;br /&gt;
    if isinstance(num, int) and num &amp;gt;= 0 and num &amp;lt; 2000000000:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def cifmin(num):&lt;br /&gt;
    if not validate_input(num):&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    else:&lt;br /&gt;
        digits = [int(i) for i in str(num)]&lt;br /&gt;
        min_digit = min(digits)&lt;br /&gt;
        print(&amp;quot;Datele de intrare corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        print(f&amp;quot;Cifra minima a numarului {num} este {min_digit}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    num = input(&amp;quot;Introduceti un numar intreg mai mic decat 2.000.000.000: &amp;quot;)&lt;br /&gt;
    try:&lt;br /&gt;
        num = int(num)&lt;br /&gt;
        cifmin(num)&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        print(&amp;quot;Inputul trebuie sa fie un numar intreg.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
Funcția validare_numar primește un argument numar și returnează True dacă acesta este un număr natural mai mic decât 2.000.000.000 și False în caz contrar.&lt;br /&gt;
Funcția cifmin primește un argument numar și începe prin a apela funcția validare_numar pentru a verifica dacă argumentul este valid. Dacă este invalid, afișează un mesaj corespunzător și returnează None. În caz contrar, transformă numărul într-un șir de caractere și apoi extrage fiecare cifră din șir și o adaugă la o listă de cifre. Apoi returnează cifra minimă din lista de cifre folosind funcția min.&lt;br /&gt;
Funcția main citește un număr de la tastatură folosind funcția input și îl transmite funcției cifmin pentru a-i determina cifra minimă. Apoi afișează cifra minimă calculată sau un mesaj de eroare dacă argumentul nu este valid.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1428_-_Sume1&amp;diff=6480</id>
		<title>1428 - Sume1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1428_-_Sume1&amp;diff=6480"/>
		<updated>2023-05-14T21:08:37Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dă un număr natural N. Să se calculeze expresia:&lt;br /&gt;
&lt;br /&gt;
E=(20+21+22+23+…+2N)%1000000007&lt;br /&gt;
unde x % y reprezintă restul împărţirii lui x la y.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare sume1.in conține pe prima linie numărul N.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire sume1.out va conține pe prima linie rezultatul expresiei E.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
&lt;br /&gt;
*1 ≤ N ≤ 1017&lt;br /&gt;
*1000000007 este număr prim.&lt;br /&gt;
*Pentru 30% din teste, N ≤ 106&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;sume1.in&lt;br /&gt;
:4&lt;br /&gt;
:Iesire:&lt;br /&gt;
;sume1.out&lt;br /&gt;
:Datele introduse sunt corecte!&lt;br /&gt;
:31&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
def validare(N):&lt;br /&gt;
    if N &amp;lt; 1 or N &amp;gt; 10 ** 17:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolvare(N):&lt;br /&gt;
    mod = 1000000007&lt;br /&gt;
    S = 0&lt;br /&gt;
    for i in range(N+1):&lt;br /&gt;
        S += 2**i&lt;br /&gt;
    E = S % mod&lt;br /&gt;
    return E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;sume1.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        N = int(f.readline().strip())&lt;br /&gt;
&lt;br /&gt;
    if not validare(N):&lt;br /&gt;
        print(&amp;quot;Datele introduse sunt incorecte!&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    S = rezolvare(N)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;sume1.out&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        f.write(&amp;quot;Datele introduse sunt corecte!\n&amp;quot;)&lt;br /&gt;
        f.write(str(S))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații ==&lt;br /&gt;
&lt;br /&gt;
Codul se descompune în următoarele etape:&lt;br /&gt;
&lt;br /&gt;
#Se deschide fișierul &amp;quot;sume1.in&amp;quot; și se citeste valoarea lui N de pe prima linie.&lt;br /&gt;
#Se validează valoarea lui N: trebuie să fie un număr întreg pozitiv și mai mic sau egal cu 10^17. Dacă N nu respectă aceste condiții, se afișează mesajul &amp;quot;Datele introduse sunt incorecte!&amp;quot; și se oprește executarea programului. Altfel, se continuă executarea programului.&lt;br /&gt;
#Se calculează valoarea lui S, care reprezintă suma primei progresii geometrice cu raportul 2 și cu primul termen 2 la puterea N+1. Formula utilizată este (2^(N+1))-2.&lt;br /&gt;
#Se calculează valoarea lui E, care reprezintă suma primei progresii aritmetice cu primul termen S și cu diferența 20. Formula utilizată este S+20.&lt;br /&gt;
#Se deschide fișierul &amp;quot;sume1.out&amp;quot; și se scrie mesajul &amp;quot;Datele introduse sunt corecte!&amp;quot; pe prima linie, urmat de valoarea lui E pe a doua linie.&lt;br /&gt;
#Executia programului se termină.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2251_-_Pereti&amp;diff=6478</id>
		<title>2251 - Pereti</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2251_-_Pereti&amp;diff=6478"/>
		<updated>2023-05-14T21:07:31Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Enunț==&lt;br /&gt;
Localitatea Târgovişte este în plină modernizare. Primăria decide să inventarieze toate clădirile din oraş pentru a renova faţadele acestora. În acest sens analizează harta oraşului şi constată că toţi pereţii sunt aşezaţi doar pe direcţia Nord Sud sau Est Vest. Pereţii vizibili de către turiști sunt doar aceia la care se poate ajunge din exteriorul orașului prin deplasarea pe cele două direcţii date, în oricare din cele patru sensuri (N, E, S, V). Harta oraşului este întocmită pe un caroiaj format din pătrate cu latura 1.&lt;br /&gt;
&lt;br /&gt;
==Cerința==&lt;br /&gt;
Cunoscându-se harta oraşului, determinaţi lungimea pereţilor vizibili ce urmează a fi zugrăviţi.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare pereti.in are pe prima linie dimensiunile m (numărul de linii), n (numărul de coloane) ale hărţii. Pe fiecare dintre următoarele m linii există n numere naturale de la 0 la 15, separate prin câte un spaţiu, cu semnificaţia: reprezentarea binară a numărului pe 4 cifre semnifică, începând de la stânga spre dreapta, existenţa unui perete spre direcţiile N, E, S, V. (1- există perete, 0 – nu există perete, explicaţii în figura de mai jos). De exemplu valoarea 13 se reprezintă în binar 1101, deci în mod corespunzător, de la stânga spre dreapta, vom avea pereţi spre N, E şi V.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire pereti.out va conţine pe prima linie numărul natural k reprezentând lungimea pereților ce vor fi zugrăviți.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
&lt;br /&gt;
*1 ≤ m, n ≤ 100&lt;br /&gt;
*Pereţii aflaţi la marginea hărţii sunt pereţi vizibili.&lt;br /&gt;
*Datele de intrare sunt considerate corecte.&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;pereti.in&lt;br /&gt;
;5 4&lt;br /&gt;
;0 6 13 1&lt;br /&gt;
;4 15 5 1&lt;br /&gt;
;0 14 7 1&lt;br /&gt;
;4 15 9 0&lt;br /&gt;
;0 12 5 7&lt;br /&gt;
:Iesire:&lt;br /&gt;
;pereti.out&lt;br /&gt;
;22&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
from collections import deque&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def validate_input(m, n, harta):&lt;br /&gt;
    if not (1 &amp;lt;= m &amp;lt;= 100 and 1 &amp;lt;= n &amp;lt;= 100):&lt;br /&gt;
        return False&lt;br /&gt;
    for linie in harta:&lt;br /&gt;
        for valoare in linie:&lt;br /&gt;
            if not (0 &amp;lt;= valoare &amp;lt;= 15):&lt;br /&gt;
                return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolvare(m, n, harta):&lt;br /&gt;
    # lista cu directiile in care se poate merge&lt;br /&gt;
    directii = [(0, 1), (1, 0), (0, -1), (-1, 0)]&lt;br /&gt;
    # codurile pentru peretii dintre directiile din lista&lt;br /&gt;
    coduri = [1, 2, 4, 8]&lt;br /&gt;
&lt;br /&gt;
    pereti = 0&lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        for j in range(n):&lt;br /&gt;
            for idx, d in enumerate(directii):&lt;br /&gt;
                # verifica daca pozitia vecina este valida&lt;br /&gt;
                if i + d[0] &amp;gt;= 0 and i + d[0] &amp;lt; m and j + d[1] &amp;gt;= 0 and j + d[1] &amp;lt; n:&lt;br /&gt;
                    # verifica daca peretele face parte din perimetrul exterior&lt;br /&gt;
                    if i == 0 and idx == 3 or i == m - 1 and idx == 1 or j == 0 and idx == 2 or j == n - 1 and idx == 0:&lt;br /&gt;
                        continue&lt;br /&gt;
                    # calculeaza codul peretelui dintre cele doua pozitii&lt;br /&gt;
                    p1 = harta[i][j]&lt;br /&gt;
                    p2 = harta[i + d[0]][j + d[1]]&lt;br /&gt;
                    cod = coduri[idx]&lt;br /&gt;
                    if p1 &amp;amp; cod == 0 and p2 &amp;amp; coduri[(idx + 2) % 4] == 0:&lt;br /&gt;
                        # daca cele doua pereti sunt nevopsiti, ii vopsim&lt;br /&gt;
                        pereti += 2&lt;br /&gt;
                        harta[i][j] += cod&lt;br /&gt;
                        harta[i + d[0]][j + d[1]] += coduri[(idx + 2) % 4]&lt;br /&gt;
&lt;br /&gt;
    # Afisare harta si variabile de debug&lt;br /&gt;
    for linie in harta:&lt;br /&gt;
        print(linie)&lt;br /&gt;
    print(pereti)&lt;br /&gt;
&lt;br /&gt;
    # returneaza numarul de pereti vopsiti&lt;br /&gt;
    return pereti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;pereti.in&amp;quot;) as f:&lt;br /&gt;
        m, n = map(int, f.readline().split())&lt;br /&gt;
        harta = []&lt;br /&gt;
        for i in range(m):&lt;br /&gt;
            harta.append(list(map(int, f.readline().split())))&lt;br /&gt;
    lungime = rezolvare(m, n, harta)&lt;br /&gt;
    with open(&amp;quot;pereti.out&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        f.write(str(lungime) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații ==&lt;br /&gt;
Funcția rezolvare primește dimensiunile labirintului m și n și o matrice harta reprezentând labirintul cu m linii și n coloane. Scopul funcției este de a determina numărul total de pereți ce trebuie vopsiți astfel încât să se poată ieși din labirint.&lt;br /&gt;
&lt;br /&gt;
În primul rând, se definesc toate direcțiile posibile în care se poate mișca în labirint, reprezentate sub forma unei liste de tupluri de forma (dx, dy) cu dx și dy reprezentând deplasarea pe axa OX, respectiv OY.&lt;br /&gt;
&lt;br /&gt;
În continuare, se parcurge fiecare celulă din labirint și se verifică dacă există un perete nevopsit între aceasta și fiecare celulă vecină. Pentru fiecare astfel de perete, se calculează codul acestuia și se verifică dacă peretele corespunzător din celula vecină este și el nevopsit. Dacă aceste condiții sunt îndeplinite, atunci cele două perete sunt vopsite și numărul total de pereti vopsiți este incrementat cu 2.&lt;br /&gt;
&lt;br /&gt;
În final, se afișează matricea harta și numărul total de pereti vopsiți, iar apoi acesta este returnat.&lt;br /&gt;
&lt;br /&gt;
În funcția main, se deschide fișierul de intrare pereti.in și se citesc dimensiunile labirintului și matricea harta. Se apelează funcția rezolvare și se obține numărul de pereti vopsiți, care este apoi scris în fișierul de ieșire pereti.out.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3487_-_Dealuri&amp;diff=6477</id>
		<title>3487 - Dealuri</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3487_-_Dealuri&amp;diff=6477"/>
		<updated>2023-05-14T21:05:50Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/3658/nrtriplete NrTriplete]&lt;br /&gt;
----&lt;br /&gt;
==Cerinţă==&lt;br /&gt;
Fie un șir de numere oarecare. Un subșir de numere se numește deal dacă valorile din care este alcătuit sunt în ordine crescătoare. După fiecare deal urmează o prăpastie – o valoare mai mică decât precedenta – de unde poate începe un nou deal.&lt;br /&gt;
&lt;br /&gt;
Fiind data o secvență oarecare de numere ce se termină cu valoarea zero, să se afișeze valorile din care este alcătuit fiecare deal în ordine inversă apariției. Dupa ce s-a terminat primul deal în ordinea dorită, se va afișa al doilea, apoi al treilea, etc.&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul va citi de la tastatură mai multe valori, până la intâlnirea valorii 0.&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele introduse sunt corecte!&amp;quot;, apoi se va afișa se vor afișa dealurie în ordine inversă celei de introducere, separate prin exact un spațiu.. În cazul în care datele nu respectă restricțiile, se va afișa mesajul &amp;quot;Datele introduse nu sunt corecte!&amp;quot;.&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*Un deal nu are mai mult de 10.000 de elemente.&lt;br /&gt;
*Valorile din care sunt formate dealurile sunt numere naturale nenune mai mici decât 263.&lt;br /&gt;
==Exemple==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
:Intrare&lt;br /&gt;
:Introduceti numerele separate prin spatiu: 1 2 5 3 7 2 4 8 123456789101112 4 0&lt;br /&gt;
:Ieșire&lt;br /&gt;
:Datele de intrare sunt valide!&lt;br /&gt;
:5 2 1 7 3 123456789101112 8 4 2 4&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def validare(lst):&lt;br /&gt;
    for i in lst:&lt;br /&gt;
        if not i.isdigit():&lt;br /&gt;
            print(&amp;quot;Datele de intrare sunt invalide!&amp;quot;)&lt;br /&gt;
            return False&lt;br /&gt;
    print(&amp;quot;Datele de intrare sunt valide!&amp;quot;)&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def rezolvare(lst):&lt;br /&gt;
    deals = []&lt;br /&gt;
    deal = []&lt;br /&gt;
    for i in lst:&lt;br /&gt;
        if i == 0:&lt;br /&gt;
            break&lt;br /&gt;
        if len(deal) == 0 or i &amp;gt; deal[-1]:&lt;br /&gt;
            deal.append(i)&lt;br /&gt;
        else:&lt;br /&gt;
            deals.append(deal[::-1])&lt;br /&gt;
            deal = [i]&lt;br /&gt;
    if len(deal) &amp;gt; 0:&lt;br /&gt;
        deals.append(deal[::-1])&lt;br /&gt;
    return [num for deal in deals for num in deal]&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    lst = input(&amp;quot;Introduceti numerele separate prin spatiu: &amp;quot;).split()&lt;br /&gt;
    if validare(lst):&lt;br /&gt;
        deals = rezolvare(list(map(int, lst)))&lt;br /&gt;
        print(&amp;quot; &amp;quot;.join(str(num) for num in deals))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Explicație rezolvare==&lt;br /&gt;
&lt;br /&gt;
#1 Funcția de validare&lt;br /&gt;
Funcția validare() verifică dacă datele de intrare sunt valide, adică respectă restricțiile specificate în enunțul problemei. În cazul acestei probleme, singura restricție este ca numerele să fie naturale nenule, dar și mai mici decât 2^63, deci nu am implementat o validare complexă. Dacă datele sunt valide, se afișează mesajul &amp;quot;Datele de intrare sunt valide!&amp;quot;, iar funcția returnează valoarea True. Dacă datele nu sunt valide, se afișează mesajul &amp;quot;Datele de intrare sunt invalide!&amp;quot; și funcția returnează valoarea False.&lt;br /&gt;
&lt;br /&gt;
#2 Funcția de rezolvare&lt;br /&gt;
Funcția rezolvare() primește un șir de numere și îl parcurge, identificând dealurile și afișându-le în ordinea cerută. Pentru aceasta, am folosit un buclă while care se execută până când se întâlnește valoarea 0 (semnificând sfârșitul șirului). În interiorul buclei, am inițializat o variabilă deal cu primul număr din șir. Apoi am parcurs șirul până am găsit o prăpastie (adica un număr mai mic decât precedenta). În momentul în care am găsit prăpastia, am afișat dealul curent în ordine inversă și am inițializat o nouă variabilă deal cu numărul găsit. După ce am parcurs întregul șir, mai rămâne de afișat ultimul deal, care nu a fost afișat în bucla while, deoarece nu a fost urmat de nicio prăpastie.&lt;br /&gt;
&lt;br /&gt;
#3 Funcția main&lt;br /&gt;
Funcția main() primește input-ul de la utilizator, îl validează folosind funcția validare(), și apoi îl prelucrează folosind funcția rezolvare(). În final, afișează soluția pe o singură linie, separată prin spații.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3487_-_Dealuri&amp;diff=6476</id>
		<title>3487 - Dealuri</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3487_-_Dealuri&amp;diff=6476"/>
		<updated>2023-05-14T21:05:27Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/3658/nrtriplete NrTriplete]&lt;br /&gt;
----&lt;br /&gt;
==Cerinţă==&lt;br /&gt;
Fie un șir de numere oarecare. Un subșir de numere se numește deal dacă valorile din care este alcătuit sunt în ordine crescătoare. După fiecare deal urmează o prăpastie – o valoare mai mică decât precedenta – de unde poate începe un nou deal.&lt;br /&gt;
&lt;br /&gt;
Fiind data o secvență oarecare de numere ce se termină cu valoarea zero, să se afișeze valorile din care este alcătuit fiecare deal în ordine inversă apariției. Dupa ce s-a terminat primul deal în ordinea dorită, se va afișa al doilea, apoi al treilea, etc.&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul va citi de la tastatură mai multe valori, până la intâlnirea valorii 0.&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele introduse sunt corecte!&amp;quot;, apoi se va afișa se vor afișa dealurie în ordine inversă celei de introducere, separate prin exact un spațiu.. În cazul în care datele nu respectă restricțiile, se va afișa mesajul &amp;quot;Datele introduse nu sunt corecte!&amp;quot;.&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*Un deal nu are mai mult de 10.000 de elemente.&lt;br /&gt;
*Valorile din care sunt formate dealurile sunt numere naturale nenune mai mici decât 263.&lt;br /&gt;
==Exemple==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
:Intrare&lt;br /&gt;
:Introduceti numerele separate prin spatiu: 1 2 5 3 7 2 4 8 123456789101112 4 0&lt;br /&gt;
:Ieșire&lt;br /&gt;
:Datele de intrare sunt valide!&lt;br /&gt;
:5 2 1 7 3 123456789101112 8 4 2 4&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def validare(lst):&lt;br /&gt;
    for i in lst:&lt;br /&gt;
        if not i.isdigit():&lt;br /&gt;
            print(&amp;quot;Datele de intrare sunt invalide!&amp;quot;)&lt;br /&gt;
            return False&lt;br /&gt;
    print(&amp;quot;Datele de intrare sunt valide!&amp;quot;)&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def rezolvare(lst):&lt;br /&gt;
    deals = []&lt;br /&gt;
    deal = []&lt;br /&gt;
    for i in lst:&lt;br /&gt;
        if i == 0:&lt;br /&gt;
            break&lt;br /&gt;
        if len(deal) == 0 or i &amp;gt; deal[-1]:&lt;br /&gt;
            deal.append(i)&lt;br /&gt;
        else:&lt;br /&gt;
            deals.append(deal[::-1])&lt;br /&gt;
            deal = [i]&lt;br /&gt;
    if len(deal) &amp;gt; 0:&lt;br /&gt;
        deals.append(deal[::-1])&lt;br /&gt;
    return [num for deal in deals for num in deal]&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    lst = input(&amp;quot;Introduceti numerele separate prin spatiu: &amp;quot;).split()&lt;br /&gt;
    if validare(lst):&lt;br /&gt;
        deals = rezolvare(list(map(int, lst)))&lt;br /&gt;
        print(&amp;quot; &amp;quot;.join(str(num) for num in deals))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Explicație rezolvare==&lt;br /&gt;
&lt;br /&gt;
#Funcția de validare&lt;br /&gt;
Funcția validare() verifică dacă datele de intrare sunt valide, adică respectă restricțiile specificate în enunțul problemei. În cazul acestei probleme, singura restricție este ca numerele să fie naturale nenule, dar și mai mici decât 2^63, deci nu am implementat o validare complexă. Dacă datele sunt valide, se afișează mesajul &amp;quot;Datele de intrare sunt valide!&amp;quot;, iar funcția returnează valoarea True. Dacă datele nu sunt valide, se afișează mesajul &amp;quot;Datele de intrare sunt invalide!&amp;quot; și funcția returnează valoarea False.&lt;br /&gt;
&lt;br /&gt;
#Funcția de rezolvare&lt;br /&gt;
Funcția rezolvare() primește un șir de numere și îl parcurge, identificând dealurile și afișându-le în ordinea cerută. Pentru aceasta, am folosit un buclă while care se execută până când se întâlnește valoarea 0 (semnificând sfârșitul șirului). În interiorul buclei, am inițializat o variabilă deal cu primul număr din șir. Apoi am parcurs șirul până am găsit o prăpastie (adica un număr mai mic decât precedenta). În momentul în care am găsit prăpastia, am afișat dealul curent în ordine inversă și am inițializat o nouă variabilă deal cu numărul găsit. După ce am parcurs întregul șir, mai rămâne de afișat ultimul deal, care nu a fost afișat în bucla while, deoarece nu a fost urmat de nicio prăpastie.&lt;br /&gt;
&lt;br /&gt;
#Funcția main&lt;br /&gt;
Funcția main() primește input-ul de la utilizator, îl validează folosind funcția validare(), și apoi îl prelucrează folosind funcția rezolvare(). În final, afișează soluția pe o singură linie, separată prin spații.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0841_-_Bomber&amp;diff=6475</id>
		<title>0841 - Bomber</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0841_-_Bomber&amp;diff=6475"/>
		<updated>2023-05-14T21:04:40Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se consideră un poligon militar, pe care este stabilit un sistem de axe de coordonate xOy. Se dau n bombe, numerotate de la 1 la n, pentru fiecare cunoscându-se coordonatele x y și puterea de distrugere p. La explozia unei bombe de putere p se va distruge totul în interiorul și pe cercul de centru x y și rază p, iar dacă există alte bombe în această zonă, vor exploda la rândul lor.&lt;br /&gt;
&lt;br /&gt;
Dându-se numărul de ordine I al unei bombe care explodează, să se determine câte bombe rămân intacte la finalul șirului de explozii declanșate.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
ișierul de intrare bomber.in conține pe prima linie numerele n I, fiecare dintre următoarele n linii conține câte trei numere x y p, cu semnificația din enunț.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire bomber.out va conține pe prima linie numărul C, reprezentând numărul de bombe rămase neexplodate.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
&lt;br /&gt;
*1 ≤ n ≤ 100&lt;br /&gt;
*1 ≤ I ≤ n&lt;br /&gt;
*coordonatele x y sunt numere întregi, iar puterile p sunt numere naturale&lt;br /&gt;
*-200 ≤ x , y ≤ 200&lt;br /&gt;
* 1 ≤ p ≤ 30&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu1===&lt;br /&gt;
:Intrare: &lt;br /&gt;
;bomber.in&lt;br /&gt;
;9 5&lt;br /&gt;
;0 3 2&lt;br /&gt;
;-1 1 3&lt;br /&gt;
;1 4 1&lt;br /&gt;
;3 4 4&lt;br /&gt;
;-1 -2 3&lt;br /&gt;
;3 1 3&lt;br /&gt;
;0 -4 2&lt;br /&gt;
;3 -2 5&lt;br /&gt;
;4 -1 2&lt;br /&gt;
&lt;br /&gt;
;bomber.out&lt;br /&gt;
;4&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
def validare(n, i, bombe):&lt;br /&gt;
    # Verifica daca valorile de intrare sunt valide&lt;br /&gt;
    if not 1 &amp;lt;= n &amp;lt;= 100:&lt;br /&gt;
        return False&lt;br /&gt;
    if not 1 &amp;lt;= i &amp;lt;= n:&lt;br /&gt;
        return False&lt;br /&gt;
    for x, y, p in bombe:&lt;br /&gt;
        if not -200 &amp;lt;= x &amp;lt;= 200 or not -200 &amp;lt;= y &amp;lt;= 200:&lt;br /&gt;
            return False&lt;br /&gt;
        if not 1 &amp;lt;= p &amp;lt;= 30:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def rezolvare(n, i, bombe):&lt;br /&gt;
    # Initializeaza lista de bombe explodate cu bomba i&lt;br /&gt;
    explodate = [i]&lt;br /&gt;
    while True:&lt;br /&gt;
        # Gaseste bombele care trebuie sa explodeze in runda curenta&lt;br /&gt;
        de_explodat = []&lt;br /&gt;
        for j, (x, y, p) in enumerate(bombe, start=1):&lt;br /&gt;
            if j not in explodate and any((x-x0)**2 + (y-y0)**2 &amp;lt;= p0**2 for x0, y0, p0 in (bombe[k-1] for k in explodate)):&lt;br /&gt;
                de_explodat.append(j)&lt;br /&gt;
        # Iesirea din bucla while daca nu mai exista bombe de explodat&lt;br /&gt;
        if not de_explodat:&lt;br /&gt;
            break&lt;br /&gt;
        # Adauga bombele care trebuie sa explodeze la lista de bombe explodate&lt;br /&gt;
        explodate += de_explodat&lt;br /&gt;
    # Returneaza numarul de bombe neexplodate&lt;br /&gt;
    return n - len(explodate)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citeste valorile de intrare din fisierul bomber.in&lt;br /&gt;
    with open(&#039;bomber.in&#039;) as f:&lt;br /&gt;
        n, i = map(int, f.readline().split())&lt;br /&gt;
        bombe = [tuple(map(int, line.split())) for line in f]&lt;br /&gt;
&lt;br /&gt;
    # Valideaza datele de intrare&lt;br /&gt;
    if not validare(n, i, bombe):&lt;br /&gt;
        print(&#039;Date de intrare invalide&#039;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Rezolva problema si afiseaza rezultatul in fisierul bomber.out&lt;br /&gt;
    with open(&#039;bomber.out&#039;, &#039;w&#039;) as f:&lt;br /&gt;
        f.write(str(rezolvare(n, i, bombe)) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații ==&lt;br /&gt;
În primul rând, codul nostru are nevoie de 3 funcții: validare(), rezolvare() și main(). În funcția validare() se va verifica dacă datele de intrare sunt valide, adică respectă constrângerile problemei. În funcția rezolvare() se va realiza logica necesară pentru a determina numărul de bombe care rămân neexplodate la final. În funcția main() se va apela cele două funcții de mai sus, precum și citirea datelor de intrare și scrierea rezultatului în fișierul de ieșire.&lt;br /&gt;
&lt;br /&gt;
Pasul 1: Validarea datelor de intrare&lt;br /&gt;
În funcția validare() se va citi numărul total de bombe, n, și numărul bombei care va exploda prima, i. Dacă datele de intrare nu sunt valide, se va afișa un mesaj corespunzător și se va opri programul. În caz contrar, se va returna True.&lt;br /&gt;
&lt;br /&gt;
Pasul 2: Rezolvarea problemei&lt;br /&gt;
În funcția rezolvare() se vor citi coordonatele și puterile de distrugere ale tuturor bombelor, apoi se va construi o listă bombs cu informațiile despre fiecare bombă. Fiecare element din listă va fi o pereche de forma (x, y, p, alive), unde x și y sunt coordonatele bombelor, p este puterea de distrugere a bombei, iar alive este o variabilă booleană care indică dacă bomba este încă în viață sau a fost deja distrusă de o altă bombă.&lt;br /&gt;
&lt;br /&gt;
Apoi se va parcurge lista de bombe și se va verifica dacă fiecare bombă este în raza de acțiune a bombei i care a fost declanșată prima. Dacă da, se va seta variabila alive a respectivei bombe pe False, pentru a indica că aceasta a fost distrusă. Apoi se va parcurge din nou lista de bombe și se va verifica dacă o bombă distrusă poate afecta și alte bombe care se află în raza sa de acțiune. Acest proces se va repeta până când nu mai există nicio bombă care să fi fost distrusă într-o iterație.&lt;br /&gt;
&lt;br /&gt;
La final, se va returna numărul de bombe rămase în viață.&lt;br /&gt;
&lt;br /&gt;
Pasul 3: Citirea datelor de intrare și scrierea rezultatului&lt;br /&gt;
În funcția main() se va apela funcția validare() pentru a verifica datele de intrare, apoi se va citi numărul total de bombe, n, și numărul bombei care va exploda prima, i. Apoi se vor citi coordonatele și puterile de distrugere ale tuturor bombelor. După aceea se va apela funcția rezolvare() pentru a determina numărul de bombe rămase în viață, iar rezultatul va fi scris în fișier&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1576_-_zona3&amp;diff=6473</id>
		<title>1576 - zona3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1576_-_zona3&amp;diff=6473"/>
		<updated>2023-05-14T21:02:59Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se consideră o matrice cu n linii și m coloane. Spunem că o poziție este liberă dacă elementul de pe linia i și coloana j este egal cu 0 și 1 în caz contrar. Spunem despre mai multe elemente ocupate că formează o zonă, dacă elementele se învecinează pe cele patru direcții (sus, jos, dreapta, stânga).&lt;br /&gt;
&lt;br /&gt;
Calculați pentru fiecare zonă numărul de elemente și afișați noua matrice formată prin înlocuirea elementelor egale cu 1 cu numărul de elemente pe care îl are zona din care face parte elementul respectiv.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
e pe prima linie a fișierului zona3.in se citesc două numere naturale n și m. Următoarele n linii conțin câte m valori 0 sau 1.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Scrieți în fișierul zona3.out matricea care rezultă din operațiile specificate în cerință.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
&lt;br /&gt;
*2 ≤ n, m ≤ 100&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;zona3.in&lt;br /&gt;
;6 8&lt;br /&gt;
;1 1 0 0 1 1 1 0&lt;br /&gt;
;0 0 0 1 1 1 0 0&lt;br /&gt;
;1 1 0 0 0 1 0 0&lt;br /&gt;
;0 0 0 0 1 1 0 0&lt;br /&gt;
;1 1 0 1 0 0 0 1&lt;br /&gt;
:Iesire:&lt;br /&gt;
;zona3.out&lt;br /&gt;
;2 2 0 0 7 7 7 0&lt;br /&gt;
;0 0 0 7 7 7 0 0&lt;br /&gt;
;8 8 0 0 0 7 0 0&lt;br /&gt;
;0 8 8 8 8 0 0 0&lt;br /&gt;
;0 0 0 0 8 8 0 0&lt;br /&gt;
;2 2 0 1 0 0 0 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
def validare(n, m, matrice):&lt;br /&gt;
    # validarea datelor de intrare&lt;br /&gt;
    if not (2 &amp;lt;= n &amp;lt;= 100 and 2 &amp;lt;= m &amp;lt;= 100):&lt;br /&gt;
        raise ValueError(&amp;quot;Dimensiunile matricei trebuie sa fie cuprinse intre 2 si 100&amp;quot;)&lt;br /&gt;
    if not all(len(linie) == m for linie in matrice):&lt;br /&gt;
        raise ValueError(&amp;quot;Toate liniile matricei trebuie sa aiba aceeasi lungime&amp;quot;)&lt;br /&gt;
    for linie in matrice:&lt;br /&gt;
        for element in linie:&lt;br /&gt;
            if element not in (0, 1):&lt;br /&gt;
                raise ValueError(&amp;quot;Matricea trebuie sa contina doar elemente 0 sau 1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolvare(n, m, matrice):&lt;br /&gt;
    # implementarea cerintei&lt;br /&gt;
    def calculeaza_zona(i, j):&lt;br /&gt;
        # calculeaza dimensiunea zonei din care face parte elementul de pe pozitia (i, j)&lt;br /&gt;
        if matrice[i][j] != 1:&lt;br /&gt;
            return 0&lt;br /&gt;
        zona = 0&lt;br /&gt;
        stack = [(i, j)]&lt;br /&gt;
        while stack:&lt;br /&gt;
            x, y = stack.pop()&lt;br /&gt;
            if matrice[x][y] == 1:&lt;br /&gt;
                zona += 1&lt;br /&gt;
                matrice[x][y] = -1&lt;br /&gt;
                if x &amp;gt; 0 and matrice[x - 1][y] == 1:&lt;br /&gt;
                    stack.append((x - 1, y))&lt;br /&gt;
                if x &amp;lt; n - 1 and matrice[x + 1][y] == 1:&lt;br /&gt;
                    stack.append((x + 1, y))&lt;br /&gt;
                if y &amp;gt; 0 and matrice[x][y - 1] == 1:&lt;br /&gt;
                    stack.append((x, y - 1))&lt;br /&gt;
                if y &amp;lt; m - 1 and matrice[x][y + 1] == 1:&lt;br /&gt;
                    stack.append((x, y + 1))&lt;br /&gt;
        return zona&lt;br /&gt;
&lt;br /&gt;
    # calculeaza dimensiunea fiecarei zone si inlocuieste valorile cu numarul de elemente din zona&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            if matrice[i][j] == 1:&lt;br /&gt;
                zona = calculeaza_zona(i, j)&lt;br /&gt;
                for x in range(n):&lt;br /&gt;
                    for y in range(m):&lt;br /&gt;
                        if matrice[x][y] == -1:&lt;br /&gt;
                            matrice[x][y] = zona&lt;br /&gt;
                matrice[i][j] = zona&lt;br /&gt;
&lt;br /&gt;
    return matrice&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # citim datele de intrare&lt;br /&gt;
    with open(&amp;quot;zona3.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        n, m = map(int, f.readline().split())&lt;br /&gt;
        matrice = [list(map(int, f.readline().split())) for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
    # validam datele de intrare&lt;br /&gt;
    validare(n, m, matrice)&lt;br /&gt;
&lt;br /&gt;
    # rezolvam problema&lt;br /&gt;
    rezultat = rezolvare(n, m, matrice)&lt;br /&gt;
&lt;br /&gt;
    # afisam rezultatul in fisierul de iesire&lt;br /&gt;
    with open(&amp;quot;zona3.out&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        for linie in rezultat:&lt;br /&gt;
            f.write(&amp;quot; &amp;quot;.join(str(x) for x in linie))&lt;br /&gt;
            f.write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații ==&lt;br /&gt;
Codul citeste datele din fisierul &amp;quot;zona3.in&amp;quot;, care contine o matrice de 0 si 1 de dimensiune n x m. Scopul este de a gasi toate zonele formate din 1 si de a inlocui fiecare element 1 cu numarul de elemente din zona din care face parte.&lt;br /&gt;
&lt;br /&gt;
#1 In functia validare se verifica daca datele de intrare sunt in limitele impuse de cerinta: n si m sunt intre 2 si 100. Daca aceasta conditie nu este indeplinita, functia arunca o exceptie cu mesajul corespunzator.&lt;br /&gt;
&lt;br /&gt;
#2 Functia rezolvare are doua obiective principale: sa gaseasca zonele formate din 1 si sa inlocuiasca fiecare element 1 cu numarul de elemente din zona din care face parte. Acest lucru se realizeaza prin parcurgerea matricei si identificarea tuturor elementelor care sunt egale cu 1. Dupa aceea, se calculeaza numarul de elemente din zona din care face parte fiecare element 1 si se inlocuieste valoarea cu aceasta. Pentru a gasi numarul de elemente dintr-o zona, se foloseste o functie auxiliara gaseste_zona, care cauta toate elementele vecine ale unui element 1 si le adauga intr-o zona. Procesul continua pana cand nu mai exista niciun element vecin de adaugat.&lt;br /&gt;
&lt;br /&gt;
#3 Functia main citeste datele de intrare, verifica daca sunt valide, aplica functia rezolvare si afiseaza matricea rezultata in fisierul &amp;quot;zona3.out&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1369_-_Parcela&amp;diff=6470</id>
		<title>1369 - Parcela</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1369_-_Parcela&amp;diff=6470"/>
		<updated>2023-05-14T21:01:20Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Cerința&lt;br /&gt;
Se dau n și m reprezentând dimensiunile unui tablou bidimensional format din elementele 0 si 1. Se definește o parcelă ca fiind o grupare de elemente vecine cu valoarea 1, condiția de vecinătate dintre două elemente fiind ca, luat unul dintre ele ca referință, celălalt să fie deasupra, dedesupt, în stânga sau în dreapta acestuia. Parcele se numerotează parcurgând matricea de sus în jos și de la stânga la dreapta, astfel:&lt;br /&gt;
&lt;br /&gt;
primul element din matrice egal cu 1 face parte din parcela numărul 1&lt;br /&gt;
primul element din matrice care este egal cu 1 și nu face face parte din parcela 1 face parte din parcela 2;&lt;br /&gt;
primul element din matrice care este egal cu 1 și nu face face parte din parcelele 1 și 2 face parte din parcela 3;&lt;br /&gt;
etc.&lt;br /&gt;
Să se determine numărul de parcele nr, aria maximă a unei parcele amax și respectiv numărul parcelei cu arie maximă pmax.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare parcela.in conține pe prima linie numerele n și m, iar pe a doua linie un tablou bidimensional cu n×m elemente.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire parcela.out va conține pe prima linie numerele nr amax pmax cu semnificațiile din enunț, separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
&lt;br /&gt;
*1 ≤ n,m ≤ 100&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;parcela.in&lt;br /&gt;
;5 6&lt;br /&gt;
;0 1 1 1 0 1&lt;br /&gt;
;0 0 1 0 0 1&lt;br /&gt;
;0 1 0 0 0 1&lt;br /&gt;
;0 0 0 0 1 1&lt;br /&gt;
;1 1 1 0 0 1&lt;br /&gt;
:Iesire:&lt;br /&gt;
;parcela.out&lt;br /&gt;
;4 6 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
def validare(n: int, m: int, matrice: list[list[int]]) -&amp;gt; bool:&lt;br /&gt;
    if n &amp;lt; 1 or m &amp;lt; 1 or n &amp;gt; 100 or m &amp;gt; 100:&lt;br /&gt;
        return False&lt;br /&gt;
    if len(matrice) != n:&lt;br /&gt;
        return False&lt;br /&gt;
    for linie in matrice:&lt;br /&gt;
        if len(linie) != m:&lt;br /&gt;
            return False&lt;br /&gt;
        for element in linie:&lt;br /&gt;
            if element != 0 and element != 1:&lt;br /&gt;
                return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolvare(n: int, m: int, matrice: list[list[int]]) -&amp;gt; tuple[int, int, int]:&lt;br /&gt;
    nr_parcele = 0&lt;br /&gt;
    max_aria = 0&lt;br /&gt;
    parcela_max_aria = 0&lt;br /&gt;
    parcurs = [[False for _ in range(m)] for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
    def parcurgere(linie: int, coloana: int, numar_parcela: int):&lt;br /&gt;
        if linie &amp;lt; 0 or coloana &amp;lt; 0 or linie &amp;gt;= n or coloana &amp;gt;= m:&lt;br /&gt;
            return&lt;br /&gt;
        if matrice[linie][coloana] == 0 or parcurs[linie][coloana]:&lt;br /&gt;
            return&lt;br /&gt;
        nonlocal nr_parcele&lt;br /&gt;
        nonlocal max_aria&lt;br /&gt;
        nonlocal parcela_max_aria&lt;br /&gt;
        nr_parcele += 1&lt;br /&gt;
        aria = 0&lt;br /&gt;
        coada = [(linie, coloana)]&lt;br /&gt;
        while coada:&lt;br /&gt;
            x, y = coada.pop(0)&lt;br /&gt;
            if x &amp;lt; 0 or y &amp;lt; 0 or x &amp;gt;= n or y &amp;gt;= m:&lt;br /&gt;
                continue&lt;br /&gt;
            if matrice[x][y] == 0 or parcurs[x][y]:&lt;br /&gt;
                continue&lt;br /&gt;
            parcurs[x][y] = True&lt;br /&gt;
            aria += 1&lt;br /&gt;
            if aria &amp;gt; max_aria:&lt;br /&gt;
                max_aria = aria&lt;br /&gt;
                parcela_max_aria = numar_parcela&lt;br /&gt;
            coada.append((x - 1, y))&lt;br /&gt;
            coada.append((x + 1, y))&lt;br /&gt;
            coada.append((x, y - 1))&lt;br /&gt;
            coada.append((x, y + 1))&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            if matrice[i][j] == 1 and not parcurs[i][j]:&lt;br /&gt;
                parcurgere(i, j, nr_parcele + 1)&lt;br /&gt;
&lt;br /&gt;
    return nr_parcele, max_aria, parcela_max_aria&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    with open(&#039;parcela.in&#039;, &#039;r&#039;) as f:&lt;br /&gt;
        n, m = map(int, f.readline().split())&lt;br /&gt;
        matrice = [list(map(int, f.readline().split())) for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
    if not validare(n, m, matrice):&lt;br /&gt;
        with open(&#039;parcela.out&#039;, &#039;w&#039;) as f:&lt;br /&gt;
            f.write(&amp;quot;Date de intrare invalide.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        nr_parcele, max_aria, parcela_max_aria = rezolvare(n, m, matrice)&lt;br /&gt;
        with open(&#039;parcela.out&#039;, &#039;w&#039;) as f:&lt;br /&gt;
            f.write(f&amp;quot;{nr_parcele} {max_aria} {parcela_max_aria}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații ==&lt;br /&gt;
Acest cod rezolvă problema numită &amp;quot;Parcela&amp;quot;, în care trebuie să determinăm numărul de parcele de teren și aria maxima a unei parcele dintr-o matrice 2D cu valori de 0 și 1. Mai precis, programul citeste datele de intrare din fișierul &amp;quot;parcela.in&amp;quot;, validează datele, determină numărul de parcele, aria maximă și numărul parcelei cu aria maximă, și afișează aceste valori în fișierul &amp;quot;parcela.out&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
#1 Funcția validare primește 3 argumente: n - numărul de linii al matricei, m - numărul de coloane al matricei, și matrice - matricea propriu-zisă. Această funcție validează datele de intrare, verificând dacă dimensiunile matricei sunt valide și dacă toate valorile matricei sunt 0 sau 1.&lt;br /&gt;
&lt;br /&gt;
#2 Funcția rezolvare primește aceeași 3 argumente ca și funcția validare, și calculează numărul de parcele, aria maximă și numărul parcelei cu aria maximă. Pentru a face acest lucru, funcția folosește o metodă de parcurgere a matricei, care verifică fiecare celulă din matrice și verifică dacă aceasta face parte dintr-o parcelă sau nu. Pentru fiecare parcelă găsită, funcția calculează aria acesteia, și ține evidența parcelei cu aria maximă.&lt;br /&gt;
&lt;br /&gt;
#3 În funcția main, programul citeste datele de intrare din fișierul &amp;quot;parcela.in&amp;quot;, validează datele folosind funcția validare, și, dacă datele sunt valide, calculează valorile dorite folosind funcția rezolvare. Dupa ce valorile sunt calculate, acestea sunt afișate în fișierul &amp;quot;parcela.out&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1507_-_grupuri&amp;diff=6467</id>
		<title>1507 - grupuri</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1507_-_grupuri&amp;diff=6467"/>
		<updated>2023-05-14T20:59:52Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Scrieţi un program care citeşte din fişierul de intrare un număr natural n şi o matrice pătratică A de dimensiune n x n, elementele acesteia putând avea doar valorile 0 sau 1. Două elemente A[i1][j1] şi A[i2][j2] sunt adiacente dacă sunt “vecine” pe o aceeaşi linie sau coloană: (i1 = i2 şi |j1-j2|=1) sau (j1=j2 şi |i1-i2|=1). Un grup reprezintă fie un singur element al matricii având valoarea 1, neadiacent cu niciun alt element cu valoarea 1, fie o mulţime de elemente având valoarea 1, fiecare dintre ele fiind adiacent cu cel puţin un alt element din mulţimea respectivă şi neadiacent cu niciun alt element din alt grup. Programul afişează în fişierul de ieşire numărul de grupuri conţinute de matrice.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare grupuri.in conține pe prima linie numărul n, iar pe următoarele n linii câte n numere naturale 0 sau 1, reprezentând elementele matricei A.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire grupuri.out va conține pe prima linie numărul de grupuri prezente în matricea din fişierul de intrare.&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
&lt;br /&gt;
*2 ≤ n ≤ 100&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;grupuri.in&lt;br /&gt;
;4&lt;br /&gt;
;1 0 0 1&lt;br /&gt;
;0 0 1 1&lt;br /&gt;
;0 1 0 1&lt;br /&gt;
;1 1 0 0&lt;br /&gt;
:Iesire:&lt;br /&gt;
;grupuri.out&lt;br /&gt;
;3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
def validare(n: int, a: list[list[int]]) -&amp;gt; bool:&lt;br /&gt;
    # Verificăm dacă matricea are dimensiunea n x n&lt;br /&gt;
    if len(a) != n:&lt;br /&gt;
        return False&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        # Verificăm dacă fiecare linie are dimensiunea n și dacă fiecare element are valoarea 0 sau 1&lt;br /&gt;
        if len(a[i]) != n or any(val != 0 and val != 1 for val in a[i]):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def dfs(a: list[list[int]], i: int, j: int, visited: set[tuple[int, int]]) -&amp;gt; None:&lt;br /&gt;
    # Adăugăm elementul (i, j) la grup și îl marcam ca vizitat&lt;br /&gt;
    visited.add((i, j))&lt;br /&gt;
    # Căutăm toate elementele cu valoarea 1 adiacente cu elementul (i, j) și le adăugăm la grup&lt;br /&gt;
    for di, dj in [(0, 1), (1, 0), (0, -1), (-1, 0)]:&lt;br /&gt;
        ni, nj = i + di, j + dj&lt;br /&gt;
        if 0 &amp;lt;= ni &amp;lt; len(a) and 0 &amp;lt;= nj &amp;lt; len(a) and a[ni][nj] == 1 and (ni, nj) not in visited:&lt;br /&gt;
            dfs(a, ni, nj, visited)&lt;br /&gt;
&lt;br /&gt;
def rezolvare(n: int, a: list[list[int]]) -&amp;gt; int:&lt;br /&gt;
    groups = 0&lt;br /&gt;
    visited = set()&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(n):&lt;br /&gt;
            if a[i][j] == 1 and (i, j) not in visited:&lt;br /&gt;
                # Am găsit un nou grup de elemente cu valoarea 1&lt;br /&gt;
                dfs(a, i, j, visited)&lt;br /&gt;
                groups += 1&lt;br /&gt;
    return groups&lt;br /&gt;
&lt;br /&gt;
def main() -&amp;gt; None:&lt;br /&gt;
    with open(&amp;quot;grupuri.in&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;grupuri.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        n = int(fin.readline())&lt;br /&gt;
        a = [list(map(int, fin.readline().split())) for _ in range(n)]&lt;br /&gt;
        if not validare(n, a):&lt;br /&gt;
            fout.write(&amp;quot;Matricea de intrare nu este valida\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
        fout.write(str(rezolvare(n, a)) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații ==&lt;br /&gt;
#1 Funcția validare verifică dacă matricea dată este validă, adică dacă are dimensiunea n x n și dacă toate elementele sale sunt 0 sau 1. Funcția returnează True dacă matricea este validă și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
#2 Funcția dfs implementează o căutare în adâncime (DFS) pentru a identifica toate elementele din același grup cu elementul (i, j). Funcția primește matricea dată a, poziția inițială a elementului (i, j), și un set de tupluri visited care conține toate pozițiile marcate ca vizitate în timpul căutării. Funcția parcurge toate elementele adiacente cu (i, j) care au valoarea 1 și le adaugă la grup și le marchează ca vizitate, apoi apelează recursiv dfs pe fiecare element adiacent, pentru a adăuga toate elementele din același grup.&lt;br /&gt;
&lt;br /&gt;
#3Funcția principală rezolvare implementează algoritmul de rezolvare a problemei, care primește matricea dată și returnează numărul de grupuri de elemente cu valoarea 1 din matrice. Algoritmul utilizează o metodă greedy pentru a căuta fiecare grup de elemente cu valoarea 1. Algoritmul parcurge fiecare element din matrice și, dacă găsește un element cu valoarea 1 care nu a fost deja adăugat la un grup, apelează funcția dfs pentru a identifica toate elementele din același grup cu elementul respectiv.&lt;br /&gt;
&lt;br /&gt;
#4 Funcția main citeste datele din fișierul grupuri.in, apelează funcția validare pentru a verifica dacă matricea de intrare este validă, apoi apelează funcția rezolvare pentru a număra grupurile de elemente cu valoarea 1. Dacă matricea nu este validă, scrie un mesaj de eroare în fișierul de ieșire grupuri.out, în caz contrar scrie numărul de grupuri de elemente cu valoarea 1 în fișierul grupuri.out.&lt;br /&gt;
&lt;br /&gt;
#5 În ultima linie, __name__ ==&amp;quot;main&amp;quot; verifică dacă fișierul curent este fișierul principal, apoi apelează funcția main dacă acesta este cazul.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1507_-_grupuri&amp;diff=6466</id>
		<title>1507 - grupuri</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1507_-_grupuri&amp;diff=6466"/>
		<updated>2023-05-14T20:59:11Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Scrieţi un program care citeşte din fişierul de intrare un număr natural n şi o matrice pătratică A de dimensiune n x n, elementele acesteia putând avea doar valorile 0 sau 1. Două elemente A[i1][j1] şi A[i2][j2] sunt adiacente dacă sunt “vecine” pe o aceeaşi linie sau coloană: (i1 = i2 şi |j1-j2|=1) sau (j1=j2 şi |i1-i2|=1). Un grup reprezintă fie un singur element al matricii având valoarea 1, neadiacent cu niciun alt element cu valoarea 1, fie o mulţime de elemente având valoarea 1, fiecare dintre ele fiind adiacent cu cel puţin un alt element din mulţimea respectivă şi neadiacent cu niciun alt element din alt grup. Programul afişează în fişierul de ieşire numărul de grupuri conţinute de matrice.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare grupuri.in conține pe prima linie numărul n, iar pe următoarele n linii câte n numere naturale 0 sau 1, reprezentând elementele matricei A.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire grupuri.out va conține pe prima linie numărul de grupuri prezente în matricea din fişierul de intrare.&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
&lt;br /&gt;
*2 ≤ n ≤ 100&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;grupuri.in&lt;br /&gt;
;4&lt;br /&gt;
;1 0 0 1&lt;br /&gt;
;0 0 1 1&lt;br /&gt;
;0 1 0 1&lt;br /&gt;
;1 1 0 0&lt;br /&gt;
:Iesire:&lt;br /&gt;
;grupuri.out&lt;br /&gt;
;3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
def validare(n: int, a: list[list[int]]) -&amp;gt; bool:&lt;br /&gt;
    # Verificăm dacă matricea are dimensiunea n x n&lt;br /&gt;
    if len(a) != n:&lt;br /&gt;
        return False&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        # Verificăm dacă fiecare linie are dimensiunea n și dacă fiecare element are valoarea 0 sau 1&lt;br /&gt;
        if len(a[i]) != n or any(val != 0 and val != 1 for val in a[i]):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def dfs(a: list[list[int]], i: int, j: int, visited: set[tuple[int, int]]) -&amp;gt; None:&lt;br /&gt;
    # Adăugăm elementul (i, j) la grup și îl marcam ca vizitat&lt;br /&gt;
    visited.add((i, j))&lt;br /&gt;
    # Căutăm toate elementele cu valoarea 1 adiacente cu elementul (i, j) și le adăugăm la grup&lt;br /&gt;
    for di, dj in [(0, 1), (1, 0), (0, -1), (-1, 0)]:&lt;br /&gt;
        ni, nj = i + di, j + dj&lt;br /&gt;
        if 0 &amp;lt;= ni &amp;lt; len(a) and 0 &amp;lt;= nj &amp;lt; len(a) and a[ni][nj] == 1 and (ni, nj) not in visited:&lt;br /&gt;
            dfs(a, ni, nj, visited)&lt;br /&gt;
&lt;br /&gt;
def rezolvare(n: int, a: list[list[int]]) -&amp;gt; int:&lt;br /&gt;
    groups = 0&lt;br /&gt;
    visited = set()&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(n):&lt;br /&gt;
            if a[i][j] == 1 and (i, j) not in visited:&lt;br /&gt;
                # Am găsit un nou grup de elemente cu valoarea 1&lt;br /&gt;
                dfs(a, i, j, visited)&lt;br /&gt;
                groups += 1&lt;br /&gt;
    return groups&lt;br /&gt;
&lt;br /&gt;
def main() -&amp;gt; None:&lt;br /&gt;
    with open(&amp;quot;grupuri.in&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;grupuri.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        n = int(fin.readline())&lt;br /&gt;
        a = [list(map(int, fin.readline().split())) for _ in range(n)]&lt;br /&gt;
        if not validare(n, a):&lt;br /&gt;
            fout.write(&amp;quot;Matricea de intrare nu este valida\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
        fout.write(str(rezolvare(n, a)) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații ==&lt;br /&gt;
#1 Funcția validare verifică dacă matricea dată este validă, adică dacă are dimensiunea n x n și dacă toate elementele sale sunt 0 sau 1. Funcția returnează True dacă matricea este validă și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
#2 Funcția dfs implementează o căutare în adâncime (DFS) pentru a identifica toate elementele din același grup cu elementul (i, j). Funcția primește matricea dată a, poziția inițială a elementului (i, j), și un set de tupluri visited care conține toate pozițiile marcate ca vizitate în timpul căutării. Funcția parcurge toate elementele adiacente cu (i, j) care au valoarea 1 și le adaugă la grup și le marchează ca vizitate, apoi apelează recursiv dfs pe fiecare element adiacent, pentru a adăuga toate elementele din același grup.&lt;br /&gt;
&lt;br /&gt;
Funcția principală rezolvare implementează algoritmul de rezolvare a problemei, care primește matricea dată și returnează numărul de grupuri de elemente cu valoarea 1 din matrice. Algoritmul utilizează o metodă greedy pentru a căuta fiecare grup de elemente cu valoarea 1. Algoritmul parcurge fiecare element din matrice și, dacă găsește un element cu valoarea 1 care nu a fost deja adăugat la un grup, apelează funcția dfs pentru a identifica toate elementele din același grup cu elementul respectiv.&lt;br /&gt;
&lt;br /&gt;
#3 Funcția main citeste datele din fișierul grupuri.in, apelează funcția validare pentru a verifica dacă matricea de intrare este validă, apoi apelează funcția rezolvare pentru a număra grupurile de elemente cu valoarea 1. Dacă matricea nu este validă, scrie un mesaj de eroare în fișierul de ieșire grupuri.out, în caz contrar scrie numărul de grupuri de elemente cu valoarea 1 în fișierul grupuri.out.&lt;br /&gt;
&lt;br /&gt;
#4 În ultima linie, __name__ ==&amp;quot;main&amp;quot; verifică dacă fișierul curent este fișierul principal, apoi apelează funcția main dacă acesta este cazul.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0844_-_Croco1&amp;diff=6464</id>
		<title>0844 - Croco1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0844_-_Croco1&amp;diff=6464"/>
		<updated>2023-05-14T20:57:08Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dă o matrice cu n linii și m coloane și elemente 0 sau 1, care reprezintă harta unui lac, în care 0 înseamnă uscat, iar 1 înseamnă apă.&lt;br /&gt;
&lt;br /&gt;
Se dorește plasarea pe fiecare zonă cu uscat a unui crocodil sau a unui elefant astfel încât să nu fie două animale din aceeași specie în zone învecinate. În plus, se dorește ca numărul de crocodil să fie cât mai mare.&lt;br /&gt;
&lt;br /&gt;
Să se determine câți crocodili și câți elefanți se pot plasa pe lac, astfel încât numărul de crocodili să fie cât mai mare.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
ișierul de intrare croco1.in conține pe prima linie numerele n m. Următoarele n linii conțin câte m elemente, 0 sau 1, cu semnificația din enunț.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire croco1.out va conține pe prima linie numerele C E, reprezentând numărul de crocodili, respectiv numărul de elefanți care pot fi plasați în condițiile precizate, astfel încât numărul de crocodili să fie cât mai mare.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
&lt;br /&gt;
 *≤ n , m ≤ 100&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;croco1.in&lt;br /&gt;
;3 5&lt;br /&gt;
;0 0 0 1 0&lt;br /&gt;
;0 0 1 0 0&lt;br /&gt;
;1 0 0 1 0&lt;br /&gt;
:Iesire:&lt;br /&gt;
;croco1.out&lt;br /&gt;
;7 4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
def valideaza_matrice(matrice):&lt;br /&gt;
    for linie in matrice:&lt;br /&gt;
        if len(linie) != len(matrice[0]):&lt;br /&gt;
            return False&lt;br /&gt;
        for element in linie:&lt;br /&gt;
            if element != 0 and element != 1:&lt;br /&gt;
                return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolva_crocodili(matrice):&lt;br /&gt;
    nr_crocodili = 0&lt;br /&gt;
    nr_elefanti = 0&lt;br /&gt;
    directii = [(0, -1), (-1, 0), (0, 1), (1, 0)]&lt;br /&gt;
    for i in range(len(matrice)):&lt;br /&gt;
        for j in range(len(matrice[0])):&lt;br /&gt;
            if matrice[i][j] == 0:&lt;br /&gt;
                poate_fi_croc = True&lt;br /&gt;
                for dx, dy in directii:&lt;br /&gt;
                    x, y = i + dx, j + dy&lt;br /&gt;
                    if 0 &amp;lt;= x &amp;lt; len(matrice) and 0 &amp;lt;= y &amp;lt; len(matrice[0]):&lt;br /&gt;
                        if matrice[x][y] == 2:&lt;br /&gt;
                            poate_fi_croc = False&lt;br /&gt;
                            break&lt;br /&gt;
                if poate_fi_croc:&lt;br /&gt;
                    matrice[i][j] = 2&lt;br /&gt;
                    nr_crocodili += 1&lt;br /&gt;
    nr_elefanti = sum(linie.count(0) for linie in matrice)&lt;br /&gt;
    return nr_crocodili, nr_elefanti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;croco1.in&amp;quot;) as f:&lt;br /&gt;
        n, m = map(int, f.readline().split())&lt;br /&gt;
        matrice = [list(map(int, f.readline().split())) for _ in range(n)]&lt;br /&gt;
    if not valideaza_matrice(matrice):&lt;br /&gt;
        print(&amp;quot;Matricea data nu este valida.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    nr_crocodili, nr_elefanti = rezolva_crocodili(matrice)&lt;br /&gt;
    with open(&amp;quot;croco1.out&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        f.write(f&amp;quot;{nr_crocodili} {nr_elefanti}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații ==&lt;br /&gt;
#1 Funcția validare() verifică dacă matricea dată este validă conform cerințelor problemei și returnează False dacă matricea nu respectă restricțiile sau conține elemente care nu sunt 0 sau 1. &lt;br /&gt;
#2 Funcția rezolva_crocodili() implementează algoritmul greedy pentru a plasa crocodili în zonele de uscat ale matricei. Algoritmul începe parcurgerea matricei de la stânga sus și verifică dacă fiecare element este 0 (adica este uscat). Dacă este, atunci verifică dacă elementul poate fi ocupat de un crocodil. Un element poate fi ocupat de un crocodil dacă toate elementele vecine imediate ale sale (în sus, jos, stânga și dreapta) nu sunt ocupate de crocodili. Dacă elementul poate fi ocupat de un crocodil, atunci se marchează elementul ca fiind ocupat de un crocodil și se crește numărul de crocodili cu 1. După ce s-au plasat toți crocodilii, numărul de elefanți se poate determina prin numărarea elementelor rămase neocupate din matrice.&lt;br /&gt;
&lt;br /&gt;
#3 Funcția main() deschide fișierul de intrare, citește dimensiunile matricei și matricea însăși, validează matricea cu ajutorul funcției validare(), rezolvă problema cu ajutorul funcției rezolva_crocodili(), și scrie rezultatele în fișierul de ieșire.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0840_-_Croco&amp;diff=6463</id>
		<title>0840 - Croco</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0840_-_Croco&amp;diff=6463"/>
		<updated>2023-05-14T20:54:36Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dă o matrice cu n linii și m coloane și elemente 0 sau 1, care reprezintă harta unui lac, în care 1 înseamnă uscat, iar 0 înseamnă apă.&lt;br /&gt;
&lt;br /&gt;
Să se plaseze pe fiecare zonă cu uscat un crocodil sau un elefant astfel încât să nu fie două animale din aceeași specie în zone învecinate.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare croco.in conține pe prima linie numerele n m. Următoarele n linii conțin câte m elemente, 0 sau 1, cu semnificația din enunț.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire croco.out va conține n linii, fiecare cu câte m caractere din mulțimea {A, C, E}, separate prin câte un spațiu, după cum în zona corespunzătoare a lacului este apa, crocodil sau elefant.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
&lt;br /&gt;
*1 ≤ n , m ≤ 100&lt;br /&gt;
*se acceptă orice soluție corectă&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;croco.in&lt;br /&gt;
;3 5&lt;br /&gt;
;1 1 1 0 1&lt;br /&gt;
;1 1 0 1 1&lt;br /&gt;
;0 1 1 0 1&lt;br /&gt;
:Iesire:&lt;br /&gt;
;croco.out&lt;br /&gt;
;C E C A C&lt;br /&gt;
;E C A C E&lt;br /&gt;
;A E C A C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
def valideaza_intrare(n, m, matrice):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100 and 1 &amp;lt;= m &amp;lt;= 100):&lt;br /&gt;
        return False&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        if len(matrice[i]) != m:&lt;br /&gt;
            return False&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            if matrice[i][j] not in [&#039;0&#039;, &#039;1&#039;]:&lt;br /&gt;
                return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def rezolva(n, m, matrice):&lt;br /&gt;
    animale = [&#039;C&#039;, &#039;E&#039;]&lt;br /&gt;
    animal_curent = 0&lt;br /&gt;
    rezultat = [[&#039;&#039; for _ in range(m)] for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            if matrice[i][j] == &#039;0&#039;:&lt;br /&gt;
                rezultat[i][j] = &#039;A&#039;&lt;br /&gt;
            else:&lt;br /&gt;
                for animal in animale:&lt;br /&gt;
                    if (i &amp;gt; 0 and rezultat[i-1][j] == animal) or \&lt;br /&gt;
                       (j &amp;gt; 0 and rezultat[i][j-1] == animal) or \&lt;br /&gt;
                       (i &amp;lt; n-1 and rezultat[i+1][j] == animal) or \&lt;br /&gt;
                       (j &amp;lt; m-1 and rezultat[i][j+1] == animal):&lt;br /&gt;
                        continue&lt;br /&gt;
                    else:&lt;br /&gt;
                        rezultat[i][j] = animal&lt;br /&gt;
                        break&lt;br /&gt;
                else:&lt;br /&gt;
                    animal_curent = (animal_curent + 1) % 2&lt;br /&gt;
                    rezultat[i][j] = animale[animal_curent]&lt;br /&gt;
&lt;br /&gt;
    return rezultat&lt;br /&gt;
&lt;br /&gt;
def afiseaza_rezultat(rezultat):&lt;br /&gt;
    with open(&#039;croco.out&#039;, &#039;w&#039;) as f:&lt;br /&gt;
        for row in rezultat:&lt;br /&gt;
            f.write(&#039; &#039;.join(row) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    with open(&#039;croco.in&#039;, &#039;r&#039;) as f:&lt;br /&gt;
        n, m = map(int, f.readline().strip().split())&lt;br /&gt;
        matrice = [list(f.readline().strip().split()) for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
    if not valideaza_intrare(n, m, matrice):&lt;br /&gt;
        print(&#039;Date invalide!&#039;)&lt;br /&gt;
    else:&lt;br /&gt;
        rezultat = rezolva(n, m, matrice)&lt;br /&gt;
        afiseaza_rezultat(rezultat)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații ==&lt;br /&gt;
În prima parte a codului, avem funcția validate_input(n, m, matrix) care primește dimensiunile matricei și matricea însăși și verifică dacă intrările sunt valide. Această funcție verifică dacă n și m sunt între 1 și 100, iar matricea este o matrice binară de dimensiune n x m. Dacă intrările sunt invalide, funcția returnează False, altfel returnează True.&lt;br /&gt;
&lt;br /&gt;
#1 În funcția solve(n, m, matrix), începem prin a defini lista animals care conține animalele pe care le putem atribui unei celule: C și E. Variabila current_animal este folosită pentru a urmări ultima animală atribuită și pentru a alterna între cele două animale. Lista rezultat result este inițializată cu caracterele goale.&lt;br /&gt;
&lt;br /&gt;
#2 Următorul pas este de a parcurge matricea, de la stânga la dreapta și de sus în jos. Dacă întâlnim o celulă cu valoarea 0, atribuim caracterul A în acea celulă. În caz contrar, verificăm celulele din jurul acelei celule pentru a vedea dacă am mai atribuit deja același animal. Dacă am făcut-o, trecem la următoarea celulă. Dacă nu, alegem animalul opus ultimului animal atribuit și îl atribuim acelei celule. Acest lucru se face pentru a asigura faptul că animalele sunt atribuite alternativ.&lt;br /&gt;
&lt;br /&gt;
Dacă nu se poate atribui nici unul dintre cele două animale, schimbăm animalul și încercăm din nou. Dacă după schimbarea animalului nu putem atribui niciunul dintre cele două animale, înseamnă că am epuizat ambele opțiuni și atribuim celula cu caracterul A.&lt;br /&gt;
&lt;br /&gt;
#3 În final, funcția solve() returnează matricea rezultat result.&lt;br /&gt;
&lt;br /&gt;
#4 Funcția print_result(result) primește matricea rezultat și o afișează pe ecran într-un format ușor de citit, unde fiecare linie a matricei este afișată pe o linie separată, iar fiecare element dintr-o linie este separat prin un singur spațiu.&lt;br /&gt;
&lt;br /&gt;
#5 În blocul if __name__ == &#039;__main__&#039;:, citim datele de intrare din fișierul &amp;quot;croco.in&amp;quot; și le verificăm folosind funcția validate_input(). Dacă datele sunt valide, apelăm funcția solve() pentru a obține matricea rezultat și apoi afișăm matricea rezultat folosind funcția print_result(). În loc să afișăm matricea pe ecran, o scriem în fișierul &amp;quot;croco.out&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0838_-_Iesire&amp;diff=6461</id>
		<title>0838 - Iesire</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0838_-_Iesire&amp;diff=6461"/>
		<updated>2023-05-14T20:52:07Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dă planul unei clădiri pătrate formate din n*n camere, sub forma unei matrice cu n linii și n coloane și elemente 0 sau 1. Camerele marcate cu 0 sunt libere, cel marcate cu 1 sunt inaccesibile și fiecare cameră are o pereche de coordonate, de forma I J, reprezentând linia și coloană pe care este situată camera. Dintr-o cameră liberă se poate trece în altă cameră liberă, cu condiția să se învecineze pe linie sau pe coloană.&lt;br /&gt;
&lt;br /&gt;
Administratorul clădirii primește o listă cu coordonatele a m camere pentru care s-au găsit potențiali chiriași. Nu pot fi închiriate decât camerele libere și accesibile din exteriorul clădirii – adică să existe o succesiune de camere învecinate care începe pe o latură a clădirii și se încheie la camera respectivă.&lt;br /&gt;
&lt;br /&gt;
Pentru fiecare dintre camerele din listă, verificați dacă poate fi închiriată sau nu.&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare iesire.in conține pe prima linie numerele n m. Următoarele n linii conțin câte n elemente, 0 sau 1, cu semnificația din enunț. Următoarele m linii conțin câte două numere X Y, reprezentând coordonatele unei camere din listă.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire iesire.out va conține m linii; fiecare dintre ele va conține mesajul da, dacă camera corespunzătoare din listă poate fi închiriată, respectiv nu în caz contrar.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
&lt;br /&gt;
*1 ≤ n ≤ 100&lt;br /&gt;
*1 ≤ m ≤ 10&lt;br /&gt;
*1 ≤ x,y ≤ n&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;alpinisti.in&lt;br /&gt;
;6 3&lt;br /&gt;
;1 1 1 1 1 0&lt;br /&gt;
;1 0 0 0 1 1&lt;br /&gt;
;1 0 1 1 0 0&lt;br /&gt;
;0 1 0 1 0 1&lt;br /&gt;
;1 0 0 1 0 1&lt;br /&gt;
;1 1 0 1 1 0&lt;br /&gt;
;4 3&lt;br /&gt;
;2 2&lt;br /&gt;
;5 5&lt;br /&gt;
&lt;br /&gt;
:Iesire:&lt;br /&gt;
;alpinisti.out&lt;br /&gt;
;da&lt;br /&gt;
;nu&lt;br /&gt;
;da&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
def validare_date_intrare(n: int, m: int, matrice: list, camere: list) -&amp;gt; bool:&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100 and 1 &amp;lt;= m &amp;lt;= 10):&lt;br /&gt;
        return False&lt;br /&gt;
    if not all(len(row) == n for row in matrice):&lt;br /&gt;
        return False&lt;br /&gt;
    if not all(1 &amp;lt;= x &amp;lt;= n and 1 &amp;lt;= y &amp;lt;= n for x, y in camere):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def poate_fi_inchiriata(n: int, matrice: list, x: int, y: int) -&amp;gt; bool:&lt;br /&gt;
    def dfs(i: int, j: int, viz: list) -&amp;gt; bool:&lt;br /&gt;
        if i &amp;lt; 0 or i &amp;gt;= n or j &amp;lt; 0 or j &amp;gt;= n:&lt;br /&gt;
            return False&lt;br /&gt;
        if viz[i][j]:&lt;br /&gt;
            return False&lt;br /&gt;
        if matrice[i][j] == 1:&lt;br /&gt;
            return False&lt;br /&gt;
        if i == 0 or i == n-1 or j == 0 or j == n-1:&lt;br /&gt;
            return True&lt;br /&gt;
        viz[i][j] = True&lt;br /&gt;
        if dfs(i+1, j, viz) or dfs(i-1, j, viz) or dfs(i, j+1, viz) or dfs(i, j-1, viz):&lt;br /&gt;
            return True&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    return dfs(x-1, y-1, [[False]*n for _ in range(n)])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;iesire.in&amp;quot;) as fin:&lt;br /&gt;
        n, m = map(int, fin.readline().split())&lt;br /&gt;
        matrice = [list(map(int, fin.readline().split())) for _ in range(n)]&lt;br /&gt;
        camere = [tuple(map(int, fin.readline().split())) for _ in range(m)]&lt;br /&gt;
&lt;br /&gt;
    if not validare_date_intrare(n, m, matrice, camere):&lt;br /&gt;
        print(&amp;quot;Date de intrare invalide!&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;iesire.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        for x, y in camere:&lt;br /&gt;
            if poate_fi_inchiriata(n, matrice, x, y):&lt;br /&gt;
                fout.write(&amp;quot;da\n&amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                fout.write(&amp;quot;nu\n&amp;quot;)&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații ==&lt;br /&gt;
Codul are 3 funcții și o funcție main() care coordonează tot procesul de citire, validare a datelor de intrare, rezolvare a problemei și scrierea rezultatelor în fișierul de ieșire.&lt;br /&gt;
&lt;br /&gt;
#1 Prima funcție, validare_date_intrare(n: int, m: int, matrice: list, camere: list) -&amp;gt; bool, primește ca parametri dimensiunile matricei, matricea în sine și lista cu camerele. Ea verifică dacă datele de intrare sunt valide conform condițiilor impuse de problema și returnează True dacă da și False dacă nu.&lt;br /&gt;
&lt;br /&gt;
#2 A doua funcție, poate_fi_inchiriata(n: int, matrice: list, x: int, y: int) -&amp;gt; bool, verifică dacă o cameră de la coordonatele x, y poate fi închiriată, folosind o căutare în adâncime (DFS) începând cu acea cameră. Dacă se găsește o succesiune de camere libere care începe pe o latură a clădirii și se încheie la camera respectivă, atunci camera poate fi închiriată, altfel nu.&lt;br /&gt;
&lt;br /&gt;
#3 Ultima funcție, main(), citeste datele de intrare din fișierul iesire.in, validează datele, apoi aplică funcția poate_fi_inchiriata() pentru fiecare cameră și scrie rezultatele în fișierul iesire.out.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2741_-_SAO1&amp;diff=6458</id>
		<title>2741 - SAO1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2741_-_SAO1&amp;diff=6458"/>
		<updated>2023-05-14T20:48:59Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Enunț==&lt;br /&gt;
După ce ți-ai dat seama că nu poți învinge nici unul dintre monștrii (din problema SAO), ai decis să te retragi și să devii un fermier. Din banii pentru cumpărarea echipamentului ai cumpărat o parcelă codificată sub forma unei matrice de n linii și m coloane, pentru fiecare zonă cunoscându-se fertilitatea ei. Cum nu ai bani ca să cultivi pământul, dorești să selectezi o parcelă în care toate zonele să aibă aceeași fertilitate, iar fertilitatea totală să fie maximă. Fertilitatea totală a unei parcele este egală cu suma fertilităților zonelor care compun acea parcelă.&lt;br /&gt;
&lt;br /&gt;
==Cerința==&lt;br /&gt;
Dându-se matricea codificărilor zonelor din teren, să se determine fertilitatea totală maximă a unei parcele în care toate zonele au aceeași fertilitate.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare sao1.in conține pe prima linie numerele n şi m, iar pe următoarele n linii câte m numere naturale, separate prin spaţii, reprezentând elementele matricei.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire sao1.out va conține numărul P, reprezentând fertilitatea totală maximă a unei parcele, în condițiile date.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
&lt;br /&gt;
*1 ≤ n,m ≤ 500&lt;br /&gt;
*fertilitatea totală se va încadra pe tipul de date long long.&lt;br /&gt;
*nu există sol infertil (a cărui fertilitate să fie mai mică sau egală cu 0).&lt;br /&gt;
*acesta este “bad ending”-ul problemei SAO&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu1===&lt;br /&gt;
:Intrare: &lt;br /&gt;
;SAO1.in&lt;br /&gt;
;4 4&lt;br /&gt;
;1 1 1 3&lt;br /&gt;
;1 1 1 3&lt;br /&gt;
;1 1 1 3&lt;br /&gt;
;3 3 3 3&lt;br /&gt;
:Iesire:&lt;br /&gt;
;SAO1.out&lt;br /&gt;
;21&lt;br /&gt;
&lt;br /&gt;
===Exemplu2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;SAO1.in&lt;br /&gt;
;4 4&lt;br /&gt;
;3 5 1 3&lt;br /&gt;
;1 5 5 3&lt;br /&gt;
;5 5 5 3&lt;br /&gt;
;3 3 3 3&lt;br /&gt;
:Iesire:&lt;br /&gt;
;SAO1.out&lt;br /&gt;
;30&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
def validare(n, m, matrice):&lt;br /&gt;
    # verificam daca dimensiunile matricei sunt in intervalul permis&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 500 or m &amp;lt; 1 or m &amp;gt; 500:&lt;br /&gt;
        return False&lt;br /&gt;
    # verificam ca toate valorile din matrice sa fie numere intregi pozitive&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            if not matrice[i][j].isdigit() or int(matrice[i][j]) &amp;lt;= 0:&lt;br /&gt;
                return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolvare(n, m, matrice):&lt;br /&gt;
    # initializam suma maxima cu 0&lt;br /&gt;
    suma_maxima = 0&lt;br /&gt;
    # cautam valoarea maxima din matrice&lt;br /&gt;
    max_valoare = int(matrice[0][0])&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            valoare = int(matrice[i][j])&lt;br /&gt;
            if valoare &amp;gt; max_valoare:&lt;br /&gt;
                max_valoare = valoare&lt;br /&gt;
    # iteram prin valori de la 1 la valoarea maxima din matrice&lt;br /&gt;
    for k in range(1, max_valoare + 1):&lt;br /&gt;
        suma = 0&lt;br /&gt;
        # calculam suma pentru fiecare submatrice care contine doar valoarea k&lt;br /&gt;
        for i in range(n):&lt;br /&gt;
            for j in range(m):&lt;br /&gt;
                if matrice[i][j] == str(k):&lt;br /&gt;
                    suma += k&lt;br /&gt;
        # actualizam suma_maxima daca suma este mai mare&lt;br /&gt;
        if suma &amp;gt; suma_maxima:&lt;br /&gt;
            suma_maxima = suma&lt;br /&gt;
    return suma_maxima&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # citim datele de intrare din fisierul &amp;quot;sao1.in&amp;quot;&lt;br /&gt;
    with open(&amp;quot;sao1.in&amp;quot;) as f:&lt;br /&gt;
        n, m = map(int, f.readline().split())&lt;br /&gt;
        matrice = [f.readline().split() for i in range(n)]&lt;br /&gt;
&lt;br /&gt;
    # validam datele de intrare&lt;br /&gt;
    if not validare(n, m, matrice):&lt;br /&gt;
        print(&amp;quot;Date de intrare invalide&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # rezolvam problema&lt;br /&gt;
    suma_maxima = rezolvare(n, m, matrice)&lt;br /&gt;
&lt;br /&gt;
    # afisam rezultatul in fisierul &amp;quot;sao1.out&amp;quot;&lt;br /&gt;
    with open(&amp;quot;sao1.out&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        f.write(str(suma_maxima))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații ==&lt;br /&gt;
#1 Codul începe prin citirea datelor de intrare din fișierul &amp;quot;sao1.in&amp;quot; în funcția &amp;quot;validare&amp;quot;. În această funcție, se verifică dacă datele de intrare respectă restricțiile problemei: 1 ≤ n,m ≤ 500 și dacă fertilitatea tuturor zonelor este strict pozitivă.&lt;br /&gt;
&lt;br /&gt;
#2 În funcția &amp;quot;rezolvare&amp;quot;, se calculează fertilitatea maximă a unei parcele în care toate zonele au aceeași fertilitate. Algoritmul folosit este unul de tip căutare binară. Se găsește cea mai mică fertilitate posibilă, iar apoi se calculează fertilitatea totală a unei parcele în care toate zonele au aceeași fertilitate, folosind această fertilitate minimă ca și valoare pentru toate zonele. Dacă fertilitatea totală calculată este mai mică decât suma fertilităților tuturor zonelor, se scade valoarea 1 din fertilitatea minimă găsită și se reia procesul. Acest proces continuă până când fertilitatea totală calculată este mai mică sau egală cu suma fertilităților tuturor zonelor.&lt;br /&gt;
&lt;br /&gt;
#3 În funcția &amp;quot;main&amp;quot;, se apelează mai întâi funcția &amp;quot;validare&amp;quot; pentru a verifica corectitudinea datelor de intrare. Dacă datele sunt corecte, se apelează funcția &amp;quot;rezolvare&amp;quot; pentru a găsi fertilitatea maximă a unei parcele în care toate zonele au aceeași fertilitate. Rezultatul este apoi scris în fișierul &amp;quot;sao1.out&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2741_-_SAO1&amp;diff=6457</id>
		<title>2741 - SAO1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2741_-_SAO1&amp;diff=6457"/>
		<updated>2023-05-14T20:48:31Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Enunț==&lt;br /&gt;
După ce ți-ai dat seama că nu poți învinge nici unul dintre monștrii (din problema SAO), ai decis să te retragi și să devii un fermier. Din banii pentru cumpărarea echipamentului ai cumpărat o parcelă codificată sub forma unei matrice de n linii și m coloane, pentru fiecare zonă cunoscându-se fertilitatea ei. Cum nu ai bani ca să cultivi pământul, dorești să selectezi o parcelă în care toate zonele să aibă aceeași fertilitate, iar fertilitatea totală să fie maximă. Fertilitatea totală a unei parcele este egală cu suma fertilităților zonelor care compun acea parcelă.&lt;br /&gt;
&lt;br /&gt;
==Cerința==&lt;br /&gt;
Dându-se matricea codificărilor zonelor din teren, să se determine fertilitatea totală maximă a unei parcele în care toate zonele au aceeași fertilitate.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare sao1.in conține pe prima linie numerele n şi m, iar pe următoarele n linii câte m numere naturale, separate prin spaţii, reprezentând elementele matricei.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire sao1.out va conține numărul P, reprezentând fertilitatea totală maximă a unei parcele, în condițiile date.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
&lt;br /&gt;
*1 ≤ n,m ≤ 500&lt;br /&gt;
*fertilitatea totală se va încadra pe tipul de date long long.&lt;br /&gt;
*nu există sol infertil (a cărui fertilitate să fie mai mică sau egală cu 0).&lt;br /&gt;
acesta este “bad ending”-ul problemei SAO&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu1===&lt;br /&gt;
:Intrare: &lt;br /&gt;
;SAO1.in&lt;br /&gt;
;4 4&lt;br /&gt;
;1 1 1 3&lt;br /&gt;
;1 1 1 3&lt;br /&gt;
;1 1 1 3&lt;br /&gt;
;3 3 3 3&lt;br /&gt;
:Iesire:&lt;br /&gt;
;SAO1.out&lt;br /&gt;
;21&lt;br /&gt;
&lt;br /&gt;
===Exemplu2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;SAO1.in&lt;br /&gt;
;4 4&lt;br /&gt;
;3 5 1 3&lt;br /&gt;
;1 5 5 3&lt;br /&gt;
;5 5 5 3&lt;br /&gt;
;3 3 3 3&lt;br /&gt;
:Iesire:&lt;br /&gt;
;SAO1.out&lt;br /&gt;
;30&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
def validare(n, m, matrice):&lt;br /&gt;
    # verificam daca dimensiunile matricei sunt in intervalul permis&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 500 or m &amp;lt; 1 or m &amp;gt; 500:&lt;br /&gt;
        return False&lt;br /&gt;
    # verificam ca toate valorile din matrice sa fie numere intregi pozitive&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            if not matrice[i][j].isdigit() or int(matrice[i][j]) &amp;lt;= 0:&lt;br /&gt;
                return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolvare(n, m, matrice):&lt;br /&gt;
    # initializam suma maxima cu 0&lt;br /&gt;
    suma_maxima = 0&lt;br /&gt;
    # cautam valoarea maxima din matrice&lt;br /&gt;
    max_valoare = int(matrice[0][0])&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            valoare = int(matrice[i][j])&lt;br /&gt;
            if valoare &amp;gt; max_valoare:&lt;br /&gt;
                max_valoare = valoare&lt;br /&gt;
    # iteram prin valori de la 1 la valoarea maxima din matrice&lt;br /&gt;
    for k in range(1, max_valoare + 1):&lt;br /&gt;
        suma = 0&lt;br /&gt;
        # calculam suma pentru fiecare submatrice care contine doar valoarea k&lt;br /&gt;
        for i in range(n):&lt;br /&gt;
            for j in range(m):&lt;br /&gt;
                if matrice[i][j] == str(k):&lt;br /&gt;
                    suma += k&lt;br /&gt;
        # actualizam suma_maxima daca suma este mai mare&lt;br /&gt;
        if suma &amp;gt; suma_maxima:&lt;br /&gt;
            suma_maxima = suma&lt;br /&gt;
    return suma_maxima&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # citim datele de intrare din fisierul &amp;quot;sao1.in&amp;quot;&lt;br /&gt;
    with open(&amp;quot;sao1.in&amp;quot;) as f:&lt;br /&gt;
        n, m = map(int, f.readline().split())&lt;br /&gt;
        matrice = [f.readline().split() for i in range(n)]&lt;br /&gt;
&lt;br /&gt;
    # validam datele de intrare&lt;br /&gt;
    if not validare(n, m, matrice):&lt;br /&gt;
        print(&amp;quot;Date de intrare invalide&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # rezolvam problema&lt;br /&gt;
    suma_maxima = rezolvare(n, m, matrice)&lt;br /&gt;
&lt;br /&gt;
    # afisam rezultatul in fisierul &amp;quot;sao1.out&amp;quot;&lt;br /&gt;
    with open(&amp;quot;sao1.out&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        f.write(str(suma_maxima))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații ==&lt;br /&gt;
#1 Codul începe prin citirea datelor de intrare din fișierul &amp;quot;sao1.in&amp;quot; în funcția &amp;quot;validare&amp;quot;. În această funcție, se verifică dacă datele de intrare respectă restricțiile problemei: 1 ≤ n,m ≤ 500 și dacă fertilitatea tuturor zonelor este strict pozitivă.&lt;br /&gt;
&lt;br /&gt;
#2 În funcția &amp;quot;rezolvare&amp;quot;, se calculează fertilitatea maximă a unei parcele în care toate zonele au aceeași fertilitate. Algoritmul folosit este unul de tip căutare binară. Se găsește cea mai mică fertilitate posibilă, iar apoi se calculează fertilitatea totală a unei parcele în care toate zonele au aceeași fertilitate, folosind această fertilitate minimă ca și valoare pentru toate zonele. Dacă fertilitatea totală calculată este mai mică decât suma fertilităților tuturor zonelor, se scade valoarea 1 din fertilitatea minimă găsită și se reia procesul. Acest proces continuă până când fertilitatea totală calculată este mai mică sau egală cu suma fertilităților tuturor zonelor.&lt;br /&gt;
&lt;br /&gt;
#3 În funcția &amp;quot;main&amp;quot;, se apelează mai întâi funcția &amp;quot;validare&amp;quot; pentru a verifica corectitudinea datelor de intrare. Dacă datele sunt corecte, se apelează funcția &amp;quot;rezolvare&amp;quot; pentru a găsi fertilitatea maximă a unei parcele în care toate zonele au aceeași fertilitate. Rezultatul este apoi scris în fișierul &amp;quot;sao1.out&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4058_-_Ronti&amp;diff=6455</id>
		<title>4058 - Ronti</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4058_-_Ronti&amp;diff=6455"/>
		<updated>2023-05-14T20:45:28Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţă==&lt;br /&gt;
La ferma din comuna Iepurești există un teren de forma dreptunghiulară în care fermierii satului au creat mai multe grădini în care au plantat morcovi. Terenul este împărțit în nxm unități (n reprezintă numărul de linii, iar m reprezintă numărul de coloane) numite celule. Morcovii nu sunt plantați uniform astfel încât în celule diferite pot exista numere diferite de morcovi. Grădinile sunt separate între ele prin garduri de diverse forme și lățimi, gardurile ocupând și ele un număr întreg de unități din teren.&lt;br /&gt;
&lt;br /&gt;
Iepurele Ronți vrea să știe în ce grădină să intre pentru a aduna cât mai mulți morcovi dintr-un singur raid asupra terenului și vă cere să-l ajutați și să-i spuneți care este numărul maxim de morcovi pe care îl adună și de unde trebuie să înceapă pentru a aduna acea cantitate. Din celula în care se află, el poate sări maxim k unități, putând astfel să sară peste eventuale garduri dintre grădini. Ronți poate sări doar în direcțiile N, S, E și V.&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare ronti.in conține pe prima linie trei numere naturale n, m și k, separate printr-un spațiu, cu semnificația din enunț. Fiecare dintre următoarele n linii conține câte m numere naturale separate prin câte un spațiu. O valoare 0 semnifica faptul că acea unitate face parte dintr-un gard, iar o valoare nenulă reprezintă numărul de morcovi din unitate.&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire ronti.out va conține pe prima linie doua numere naturale x și y, reprezentând coordonatele unității din care trebuie să pornească Ronți pentru a obține numărul maxim de morcovi, iar pe următoarea linie a fișierului numărul maxim de morcovi obținut în urma raidului.&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*1 ≤ n ≤ 100&lt;br /&gt;
*1 ≤ m ≤ 100&lt;br /&gt;
*Numărul de morcovi din fiecare unitate este mai mic decât 200.000&lt;br /&gt;
*Dacă există două drumuri cu același număr maxim de morcovi adunați, se va alege drumul care are poziția de start cea mai mică din punct de vedere lexicografic&lt;br /&gt;
*Perechea (i, j) este mai mică în sens lexicografic decât perechea (x, y) dacă i&amp;lt;x sau dacă i=x și j&amp;lt;y&lt;br /&gt;
==Exemple==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
;Intrare&lt;br /&gt;
ronti.in&lt;br /&gt;
&lt;br /&gt;
4 8 2&lt;br /&gt;
1 2 0 1 1 0 0 10&lt;br /&gt;
3 4 0 1 1 0 0 0&lt;br /&gt;
0 0 0 0 0 0 0 0&lt;br /&gt;
2 2 2 2 2 0 3 3&lt;br /&gt;
;Ieșire&lt;br /&gt;
ronti.out&lt;br /&gt;
&lt;br /&gt;
1 1&lt;br /&gt;
30&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def e_valid(k, i, j, n, m):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Verifică dacă celula (i, j) se află pe hartă și poate fi atinsă în k pași.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if i &amp;lt; 0 or i &amp;gt;= n or j &amp;lt; 0 or j &amp;gt;= m:&lt;br /&gt;
        return False&lt;br /&gt;
    if k &amp;lt; 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def cauta_maxim(harta, vizitat, k, i, j, n, m):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Caută celula de pe hartă de la care se poate obține numărul maxim de morcovi într-un raid de cel mult k pași.&lt;br /&gt;
    Returnează numărul maxim de morcovi și coordonatele de început ale raidului.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if not e_valid(k, i, j, n, m) or vizitat[i][j]:&lt;br /&gt;
        return 0, (i, j)&lt;br /&gt;
&lt;br /&gt;
    vizitat[i][j] = True&lt;br /&gt;
    morcovi = harta[i][j]&lt;br /&gt;
    max_morcovi = morcovi&lt;br /&gt;
    start = (i, j)&lt;br /&gt;
&lt;br /&gt;
    for x, y in [(i-1, j), (i+1, j), (i, j-1), (i, j+1)]:&lt;br /&gt;
        s, p = cauta_maxim(harta, vizitat, k-1, x, y, n, m)&lt;br /&gt;
        if s &amp;gt; max_morcovi:&lt;br /&gt;
            max_morcovi = s&lt;br /&gt;
            start = p&lt;br /&gt;
        elif s == max_morcovi and p &amp;lt; start:&lt;br /&gt;
            start = p&lt;br /&gt;
&lt;br /&gt;
    vizitat[i][j] = False&lt;br /&gt;
    return morcovi + max_morcovi, start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolva(n, m, k, harta):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Găsește celula de pe hartă de la care se poate obține numărul maxim de morcovi într-un raid de cel mult k pași.&lt;br /&gt;
    Returnează o listă de tuple cu punctele de start și numărul maxim de morcovi.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    maxim = 0&lt;br /&gt;
    solutii = []&lt;br /&gt;
    vizitat = [[False] * m for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            s, p = cauta_maxim(harta, vizitat, k, i, j, n, m)&lt;br /&gt;
            if s &amp;gt; maxim:&lt;br /&gt;
                maxim = s&lt;br /&gt;
                solutii = [(p, s)]&lt;br /&gt;
            elif s == maxim:&lt;br /&gt;
                solutii.append((p, s))&lt;br /&gt;
&lt;br /&gt;
    return solutii[0]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # citire date de intrare&lt;br /&gt;
    with open(&#039;ronti.in&#039;, &#039;r&#039;) as f:&lt;br /&gt;
        n, m, k = map(int, f.readline().split())&lt;br /&gt;
        harta = []&lt;br /&gt;
        for i in range(n):&lt;br /&gt;
            linie = list(map(int, f.readline().split()))&lt;br /&gt;
            harta.append(linie)&lt;br /&gt;
&lt;br /&gt;
    # rezolvare&lt;br /&gt;
    start, maxim = rezolva(n, m, k, harta)&lt;br /&gt;
    print(start)&lt;br /&gt;
    print(maxim)&lt;br /&gt;
&lt;br /&gt;
    # scriere date de ieșire&lt;br /&gt;
    with open(&#039;ronti.out&#039;, &#039;w&#039;) as f:&lt;br /&gt;
        i, j = start[0], start[1]&lt;br /&gt;
        f.write(f&amp;quot;{i+1}  {j+1}\n&amp;quot;)&lt;br /&gt;
        f.write(f&amp;quot;{maxim}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Explicație rezolvare==&lt;br /&gt;
&lt;br /&gt;
 Acest cod are rolul de a rezolva o problemă de tip backtracking. Scopul problemei este de a găsi celula de pe o hartă, din care se pot obține cele mai multe morcovi într-un raid de cel mult k pași.&lt;br /&gt;
&lt;br /&gt;
#1 Funcția e_valid verifică dacă o celulă dată este validă, adică se află pe hartă și poate fi atinsă în k pași.&lt;br /&gt;
&lt;br /&gt;
#2 Funcția cauta_maxim este funcția principală de backtracking care găsește celula de pe hartă care poate fi atinsă în cel mult k pași și care aduce cele mai multe morcovi. Funcția începe cu celula dată ca argument, adună morcovii din acea celulă și verifică dacă celula dată este vizitată și dacă este validă. Dacă celula este vizitată sau nu este validă, se va întoarce 0 morcovi și coordonatele celulei actuale. Altfel, se va trece la celulele adiacente și se va aduna morcovii. Funcția va întoarce celulele cu cele mai multe morcovi și coordonatele celulei respective.&lt;br /&gt;
&lt;br /&gt;
#3 Funcția rezolva este cea care găsește celula cu cele mai multe morcovi și apelează funcția cauta_maxim pentru fiecare celulă de pe hartă. Funcția începe cu cele mai mici coordonate și verifică toate celulele de pe hartă. Dacă se găsește o celulă cu mai mulți morcovi, se actualizează valoarea maximă și se actualizează soluția.&lt;br /&gt;
&lt;br /&gt;
#4 Funcția main citește datele de intrare dintr-un fișier, apelează funcția rezolva, afișează celula de start și numărul maxim de morcovi și scrie datele de ieșire într-un fișier.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4081_-_alpinistii&amp;diff=6454</id>
		<title>4081 - alpinistii</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4081_-_alpinistii&amp;diff=6454"/>
		<updated>2023-05-14T20:44:34Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Enunț==&lt;br /&gt;
Un grup de alpiniști, aflați pe marginea unei stânci de pe un versant, sunt prinși în mijlocul unei furtuni. Pentru a se adăposti, ei trebuie să găsească o zonă-adăpost din versant formată din spații sigure învecinate în direcțiile N, E, S și V, suficient de mare, astfel încât în ea să se poată adăposti întregul grup. Alpiniștii au, pe căștile lor, montate camere care trimit o filmare video, în direct, la o echipă de programatori salvamontiști. Informaticienii reușesc să analizeze spațiile sigure ale versantului și să reprezinte versantul cu ajutorul unei matrice binare. Fiecare spațiu sigur este codificat cu 0, iar valorile de 1 reprezintă spațiile blocate.&lt;br /&gt;
Ei vă cer ajutorul pentru a reuși să-i salveze pe alpiniști.&lt;br /&gt;
&lt;br /&gt;
==Cerința==&lt;br /&gt;
Cunoscând matricea binară ce codifică versantul, determinați:&lt;br /&gt;
1) Numărul maxim de spații sigure ce pot forma o zonă-adăpost de pe versant&lt;br /&gt;
2) Numărul maxim de spații sigure dintr-o zonă-adăpost dreptunghiulară corespunzătoare unui dreptunghi format doar din valori de 0 din matricea dată.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare alpinistii.in conține pe prima linie trei numere naturale: c, n și m, separate prin câte un spațiu, c reprezentând numărul cerinței ce urmează a fi rezolvată (1 sau 2), n reprezentând numărul de linii ale matricei, iar m numărul de coloane. Fiecare dintre următoarele n linii conține câte m cifre de 0 și 1, separate prin câte un spațiu, cu semnificația din enunț.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire alpinistii.out va conține pe prima linie un număr natural reprezentând răspunsul la cerința care se rezolvă.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
&lt;br /&gt;
*1 ≤ n ≤ 200&lt;br /&gt;
*1 ≤ m ≤ 200&lt;br /&gt;
*în matrice sunt doar valori de 0 și 1&lt;br /&gt;
*Pentru rezolvarea corectă a cerinței 1 se acordă 40 puncte, iar pentru cerința 2 se acordă 60 puncte.&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu1===&lt;br /&gt;
:Intrare: &lt;br /&gt;
;alpinisti.in&lt;br /&gt;
;1 7 8&lt;br /&gt;
;1 1 1 1 1 1 1 1 &lt;br /&gt;
;1 0 0 1 1 1 1 0 &lt;br /&gt;
;1 1 0 1 0 0 0 1 &lt;br /&gt;
;1 1 0 1 0 0 1 1 &lt;br /&gt;
;0 1 1 0 0 0 0 1 &lt;br /&gt;
;0 0 1 0 0 0 0 1 &lt;br /&gt;
;1 0 0 1 1 1 1 1&lt;br /&gt;
&lt;br /&gt;
:Iesire:&lt;br /&gt;
;alpinisti.out&lt;br /&gt;
;13&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemplu2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;alpinisti.in&lt;br /&gt;
;2 7 8&lt;br /&gt;
;1 1 1 1 1 1 1 1 &lt;br /&gt;
;1 0 0 1 1 1 1 0 &lt;br /&gt;
;1 1 0 1 0 0 0 1 &lt;br /&gt;
;1 1 0 1 0 0 1 1 &lt;br /&gt;
;0 1 1 0 0 0 0 1 &lt;br /&gt;
;0 0 1 0 0 0 0 1 &lt;br /&gt;
;1 0 0 1 1 1 1 1&lt;br /&gt;
:Iesire:&lt;br /&gt;
;alpinisti.out&lt;br /&gt;
;9&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
def validare(n, m, matrice):&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 200:&lt;br /&gt;
        return False&lt;br /&gt;
    if m &amp;lt; 1 or m &amp;gt; 200:&lt;br /&gt;
        return False&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        if len(matrice[i]) != m:&lt;br /&gt;
            return False&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            if matrice[i][j] != &#039;0&#039; and matrice[i][j] != &#039;1&#039;:&lt;br /&gt;
                return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolvare1(n, m, matrice):&lt;br /&gt;
    max_spatii = 0&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            if matrice[i][j] == &#039;0&#039;:&lt;br /&gt;
                count = 0&lt;br /&gt;
                queue = [(i, j)]&lt;br /&gt;
                while queue:&lt;br /&gt;
                    x, y = queue.pop(0)&lt;br /&gt;
                    if matrice[x][y] == &#039;0&#039;:&lt;br /&gt;
                        count += 1&lt;br /&gt;
                        matrice[x][y] = &#039;1&#039;&lt;br /&gt;
                        if x &amp;gt; 0 and matrice[x-1][y] == &#039;0&#039;:&lt;br /&gt;
                            queue.append((x-1, y))&lt;br /&gt;
                        if x &amp;lt; n-1 and matrice[x+1][y] == &#039;0&#039;:&lt;br /&gt;
                            queue.append((x+1, y))&lt;br /&gt;
                        if y &amp;gt; 0 and matrice[x][y-1] == &#039;0&#039;:&lt;br /&gt;
                            queue.append((x, y-1))&lt;br /&gt;
                        if y &amp;lt; m-1 and matrice[x][y+1] == &#039;0&#039;:&lt;br /&gt;
                            queue.append((x, y+1))&lt;br /&gt;
                max_spatii = max(max_spatii, count)&lt;br /&gt;
    return max_spatii&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolvare2(n, m, matrice):&lt;br /&gt;
    # initializam matricea dp cu 0-uri&lt;br /&gt;
    dp = [[0] * m for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
    # calculam lățimea și înălțimea maximă a unui dreptunghi de spații sigure care include fiecare element&lt;br /&gt;
    for i in range(n-1, -1, -1):&lt;br /&gt;
        for j in range(m-1, -1, -1):&lt;br /&gt;
            if matrice[i][j] == &#039;0&#039;:&lt;br /&gt;
                w = dp[i][j+1] + 1 if j &amp;lt; m-1 else 1&lt;br /&gt;
                h = dp[i+1][j] + 1 if i &amp;lt; n-1 else 1&lt;br /&gt;
                dp[i][j] = min(w, h)&lt;br /&gt;
&lt;br /&gt;
    # calculam aria maximă a unui dreptunghi format doar din spații sigure din matrice&lt;br /&gt;
    max_area = 0&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            if matrice[i][j] == &#039;0&#039;:&lt;br /&gt;
                area = dp[i][j] * dp[i][j]&lt;br /&gt;
                max_area = max(max_area, area)&lt;br /&gt;
&lt;br /&gt;
    return max_area&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    with open(&#039;alpinisti.in&#039;, &#039;r&#039;) as f:&lt;br /&gt;
        cerinta, n, m = map(int, f.readline().strip().split())&lt;br /&gt;
        matrice = [list(f.readline().strip().split()) for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
    if cerinta == 1:&lt;br /&gt;
        if not validare(n, m, matrice):&lt;br /&gt;
            with open(&#039;alpinisti.out&#039;, &#039;w&#039;) as f:&lt;br /&gt;
                f.write(&#039;Date de intrare invalide&#039;)&lt;br /&gt;
        else:&lt;br /&gt;
            max_spatii = rezolvare1(n, m, matrice)&lt;br /&gt;
            with open(&#039;alpinisti.out&#039;, &#039;w&#039;) as f:&lt;br /&gt;
                f.write(str(max_spatii))&lt;br /&gt;
&lt;br /&gt;
    elif cerinta == 2:&lt;br /&gt;
        max_spatii = rezolvare2(n, m,matrice)&lt;br /&gt;
        with open(&#039;alpinisti.out&#039;, &#039;w&#039;) as f:&lt;br /&gt;
            f.write(str(max_spatii))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații ==&lt;br /&gt;
Acest cod este o soluție pentru problema &amp;quot;Alpiniști&amp;quot; și se împarte în trei funcții:&lt;br /&gt;
&lt;br /&gt;
#1 Funcția validare(n, m, matrice) are rolul de a verifica dacă datele de intrare sunt valide. În cazul de față, se verifică dacă n și m se află în intervalul [1, 200] și dacă matricea matrice are dimensiunea corespunzătoare și conține doar caracterele &#039;0&#039; și &#039;1&#039;. Această verificare este importantă pentru a ne asigura că programul primește date valide și poate produce un rezultat corect.&lt;br /&gt;
&lt;br /&gt;
#2 Funcția rezolvare1(n, m, matrice) calculează numărul maxim de spații sigure care pot fi găsite în matricea dată. Se parcurge fiecare element al matricei și se verifică dacă acesta este un spațiu sigur (&#039;0&#039;). Dacă este, se inițializează un contor la 0 și se adaugă poziția elementului într-o coadă. Apoi, se parcurge coada și se verifică dacă poziția curentă este un spațiu sigur. Dacă da, se incrementează contorul, se marchează spațiul ca fiind vizitat și se adaugă în coadă toți vecinii săi care sunt spații sigure și nu au fost deja vizitați. Acest proces continuă până când coada este goală și se înregistrează numărul maxim de spații sigure găsite până în acel moment. Această metodă se bazează pe algoritmul de căutare în lățime (BFS) și ne permite să găsim numărul maxim de spații sigure în matricea dată.&lt;br /&gt;
&lt;br /&gt;
#3 Funcția rezolvare2(n, m, matrice) calculează aria maximă a unui dreptunghi format doar din spații sigure din matricea dată. În această funcție se folosește o metodă de programare dinamică. Se construiește o matrice dp cu aceleași dimensiuni ca și matricea matrice, inițializată cu zero. Pentru fiecare element din matricea matrice care este un spațiu sigur (&#039;0&#039;), se calculează lățimea maximă și înălțimea maximă a unui dreptunghi de spații sigure care include acel element, iar apoi se calculează aria maximă a dreptunghiului care conține acel element. Această metodă se bazează pe observația că orice dreptunghi format doar din spații sigure trebuie să includă un element din matricea matrice și că putem folosi matricea dp pentru a evita să re-calculăm dreptunghiuri în mod repetat.&lt;br /&gt;
&lt;br /&gt;
#4 În if __name__ == &#039;__main__&#039;: se deschide fișierul de intrare &#039;alpinisti.in&#039; și se citesc datele de intrare. Apoi, în funcția main(), se verifică dacă datele de intrare sunt valide folosind funcția validare(). Dacă acestea sunt valide, se calculează numărul maxim de spații sigure și aria maximă a unui dreptunghi format doar din spații sigure, folosind funcțiile rezolvare1() și rezolvare2(). Aceste valori sunt apoi scrise în fișierul de ieșire &#039;alpinisti.out&#039;.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1864_-_MosCraciun&amp;diff=6452</id>
		<title>1864 - MosCraciun</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1864_-_MosCraciun&amp;diff=6452"/>
		<updated>2023-05-14T20:41:29Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Cerința==&lt;br /&gt;
Moș Crăciun locuiește la polul nord și pregătește cadouri pentru copii cuminți din clasele a X-a B și A, ajutat de mai mulți spiriduși. Datorită încălzirii globale, gheața se topește, formându-se mai multe banchize. Spiridușii care se află pe alte banchize decât Moș Crăciun nu-l mai pot ajuta pe acesta, spre disperarea generală.&lt;br /&gt;
&lt;br /&gt;
Harta polului nord seamănă cu o matrice cu n linii și m coloane în care elementele pot avea următoarele valori:&lt;br /&gt;
&lt;br /&gt;
0 – zonă cu apă, în care gheața s-a topit.&lt;br /&gt;
1 – zonă cu gheață care face parte dintr-o banchiză. Două zone cu gheață fac parte din aceeași banchiză dacă se învecinează pe linie sau pe coloană.&lt;br /&gt;
2 – zonă cu gheață în care se găsește Moș Crăciun.&lt;br /&gt;
3 – zonă cu gheață în care se găsește un spiriduș&lt;br /&gt;
Scrieți un program care să determine câți spiriduși se află pe aceeași banchiză cu Moș Crăciun și îl pot ajuta în continuare să pregătească cadouri pentru copii cuminți din clasele a X-a B și A.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
&lt;br /&gt;
Fișierul de intrare moscraciun.in conține pe prima linie numerele n m. Următoarele n linii conțin câte m elemente, 0, 1, 2 sau 3, cu semnificația din enunț.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire moscraciun.out va conține pe prima linie numărul C spiriduși de pe banchiza lui Moș Crăciun.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
&lt;br /&gt;
*1 ≤ n , m ≤ 100&lt;br /&gt;
&lt;br /&gt;
==Exemplu ==&lt;br /&gt;
&lt;br /&gt;
:Intrare&lt;br /&gt;
;moscraciun.in&lt;br /&gt;
;4 6&lt;br /&gt;
;1 1 1 0 1 0&lt;br /&gt;
;0 0 1 0 1 1&lt;br /&gt;
;1 1 1 0 0 0&lt;br /&gt;
;0 1 0 1 1 1&lt;br /&gt;
&lt;br /&gt;
:Iesire:&lt;br /&gt;
;moscraciun.out&lt;br /&gt;
;3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
def validare(matrice, n, m):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Verifică dacă matricea de intrare este validă.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            if matrice[i][j] not in [0, 1, 2, 3]:&lt;br /&gt;
                return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolvare(matrice, n, m):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Determină numărul de spiriduși de pe aceeași banchiză cu Moș Crăciun.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dx = [1, -1, 0, 0]&lt;br /&gt;
    dy = [0, 0, 1, -1]&lt;br /&gt;
    q = [(i, j) for i in range(n) for j in range(m) if matrice[i][j] == 2] # coordonatele lui Mos Craciun&lt;br /&gt;
    vizitat = set(q) # nodurile vizitate&lt;br /&gt;
    count = 0 # numarul de spiridusi gasiti&lt;br /&gt;
    while q:&lt;br /&gt;
        x, y = q.pop(0)&lt;br /&gt;
        if matrice[x][y] == 3:&lt;br /&gt;
            count += 1&lt;br /&gt;
        for i in range(4):&lt;br /&gt;
            nx, ny = x + dx[i], y + dy[i]&lt;br /&gt;
            if 0 &amp;lt;= nx &amp;lt; n and 0 &amp;lt;= ny &amp;lt; m and matrice[nx][ny] in [1, 3] and (nx, ny) not in vizitat:&lt;br /&gt;
                vizitat.add((nx, ny))&lt;br /&gt;
                q.append((nx, ny))&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;moscraciun.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        n, m = map(int, f.readline().split())&lt;br /&gt;
        matrice = [[int(x) for x in f.readline().split()] for i in range(n)]&lt;br /&gt;
    if not validare(matrice, n, m):&lt;br /&gt;
        print(&amp;quot;Matricea de intrare nu este valida.&amp;quot;, file=sys.stderr)&lt;br /&gt;
        sys.exit(1)&lt;br /&gt;
    with open(&amp;quot;moscraciun.out&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        f.write(str(rezolvare(matrice, n, m)))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații ==&lt;br /&gt;
#1 Funcția validare primește ca argumente matricea de intrare și dimensiunile acesteia (n și m). Aceasta verifică dacă toate elementele matricei sunt 0, 1, 2 sau 3, returnând False dacă nu este cazul și True altfel.&lt;br /&gt;
&lt;br /&gt;
#2 Funcția rezolvare primește matricea de intrare și dimensiunile acesteia (n și m). Se caută poziția lui Moș Crăciun în matrice (elementul cu valoarea 2) și se adaugă în coada q ca punct de plecare pentru parcurgerea grafului. În timpul parcurgerii BFS, se verifică dacă fiecare nod adiacent este de tip 1 sau 3, adică dacă se poate ajunge la el și se mai pot colecta spiriduși. Nodurile deja vizitate sunt stocate în setul vizitat. La final, funcția returnează numărul de spiriduși colectați.&lt;br /&gt;
&lt;br /&gt;
#3 Funcția main citește matricea de intrare din fișierul &amp;quot;moscraciun.in&amp;quot;, verifică validitatea acesteia prin apelul funcției validare, și afișează un mesaj de eroare dacă matricea este invalidă. Altfel, rezultatul returnat de funcția rezolvare este scris în fișierul &amp;quot;moscraciun.out&amp;quot; prin intermediul modulului sys.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0837_-_Fill&amp;diff=6450</id>
		<title>0837 - Fill</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0837_-_Fill&amp;diff=6450"/>
		<updated>2023-05-14T20:38:27Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Cerința==&lt;br /&gt;
Se dă o matrice cu n linii și m coloane și elemente 0 sau 1, care reprezintă harta unei planete, în care 1 înseamnă uscat, iar 0 înseamnă apă. Două elemente 1 care se învecinează pe linie sau pe coloană (nu și pe diagonală) fac parte din același continent.&lt;br /&gt;
&lt;br /&gt;
Să se determine câte continente sunt pe hartă.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare fill.in conține pe prima linie numerele n m. Următoarele n linii conțin câte m elemente, 0 sau 1, cu semnificația din enunț.&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire fill.out va conține pe prima linie numărul C de continente existente.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
&lt;br /&gt;
*1 ≤ n , m ≤ 100&lt;br /&gt;
&lt;br /&gt;
==Exemplu ==&lt;br /&gt;
&lt;br /&gt;
:Intrare:&lt;br /&gt;
;fill.in&lt;br /&gt;
&lt;br /&gt;
;4 6&lt;br /&gt;
;1 1 1 0 1 0&lt;br /&gt;
;0 0 1 0 1 1&lt;br /&gt;
;1 1 1 0 0 0&lt;br /&gt;
;0 1 0 1 1 1&lt;br /&gt;
&lt;br /&gt;
:Iesire:&lt;br /&gt;
;fill.out&lt;br /&gt;
&lt;br /&gt;
;3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
def validare(n, m, harta):&lt;br /&gt;
    if len(harta) != n:&lt;br /&gt;
        return False&lt;br /&gt;
    for linie in harta:&lt;br /&gt;
        if len(linie) != m:&lt;br /&gt;
            return False&lt;br /&gt;
        for element in linie:&lt;br /&gt;
            if element != 0 and element != 1:&lt;br /&gt;
                return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def numar_continente(n, m, harta):&lt;br /&gt;
    visited = [[False for j in range(m)] for i in range(n)]&lt;br /&gt;
    count = 0&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            if harta[i][j] == 1 and not visited[i][j]:&lt;br /&gt;
                count += 1&lt;br /&gt;
                dfs(i, j, n, m, harta, visited)&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
def dfs(x, y, n, m, harta, visited):&lt;br /&gt;
    if x &amp;lt; 0 or x &amp;gt;= n or y &amp;lt; 0 or y &amp;gt;= m or visited[x][y] or harta[x][y] == 0:&lt;br /&gt;
        return&lt;br /&gt;
    visited[x][y] = True&lt;br /&gt;
    dfs(x-1, y, n, m, harta, visited)&lt;br /&gt;
    dfs(x+1, y, n, m, harta, visited)&lt;br /&gt;
    dfs(x, y-1, n, m, harta, visited)&lt;br /&gt;
    dfs(x, y+1, n, m, harta, visited)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;fill.in&amp;quot;) as f:&lt;br /&gt;
        n, m = map(int, f.readline().split())&lt;br /&gt;
        harta = [list(map(int, f.readline().split())) for i in range(n)]&lt;br /&gt;
&lt;br /&gt;
    if not validare(n, m, harta):&lt;br /&gt;
        print(&amp;quot;Date invalide&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;fill.out&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        f.write(str(numar_continente(n, m, harta)))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații ==&lt;br /&gt;
Pentru a rezolva această problemă, putem folosi o variantă a algoritmului DFS (Depth-First Search) pentru a parcurge matricea. Pentru a număra continentele, vom căuta primul element 1 din matrice și vom căuta toate celulele adiacente cu acestea, marcate cu 1, folosind o căutare în adâncime.&lt;br /&gt;
&lt;br /&gt;
#1 În implementarea noastră, definim o funcție validare_matrice care verifică dacă matricea introdusă în fișierul de intrare este validă, adică are dimensiunile n și m, și are elemente doar 0 sau 1. În caz contrar, programul va afișa un mesaj de eroare.&lt;br /&gt;
&lt;br /&gt;
#2 Funcția rezolva primește matricea și dimensiunile acesteia și returnează numărul de continente găsite. Algoritmul DFS este implementat în funcția auxiliară dfs, care primește matricea, poziția curentă și o matrice booleană care urmărește celulele deja vizitate. Algoritmul parcurge matricea în profunzime și marchează celulele vizitate.&lt;br /&gt;
&lt;br /&gt;
#3 În funcția main citim dimensiunile matricei și matricea din fișierul de intrare. Apoi, verificăm dacă matricea este validă. Dacă este validă, apelăm funcția rezolva și afișăm rezultatul în fișierul de ieșire. În caz contrar, afișăm un mesaj de eroare.&lt;br /&gt;
&lt;br /&gt;
Observăm că, pentru a urmări celulele vizitate în matricea de intrare, folosim o matrice suplimentară visited de dimensiune n x m, care conține valori booleane. Aceasta este utilă pentru a evita parcurgerea acelorași celule de mai multe ori.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2082_-_Sierpinski&amp;diff=6449</id>
		<title>2082 - Sierpinski</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2082_-_Sierpinski&amp;diff=6449"/>
		<updated>2023-05-14T20:36:28Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Cerința==&lt;br /&gt;
Se dă un număr natural n. Să se genereze o matrice pătratică de ordinul 3n, cu elemente din mulțimea {0, 1}, după modelul covorului lui Sierpinski.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare sierpinski.in conține pe prima linie numărul n.&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
Fișierul de ieșire sierpinski.out va conține pe primele 3n linii câte 3n cifre binare, reprezentând elementele matricei.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
&lt;br /&gt;
*1 ≤ n ≤ 6&lt;br /&gt;
*Atenție la limita de memorie!&lt;br /&gt;
&lt;br /&gt;
==Exemplu ==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;sierpinski.in&lt;br /&gt;
&lt;br /&gt;
;2&lt;br /&gt;
:Iesire:&lt;br /&gt;
;sierpinski.out&lt;br /&gt;
&lt;br /&gt;
;0 0 0 0 0 0 0 0 0 &lt;br /&gt;
;0 1 0 0 1 0 0 1 0 &lt;br /&gt;
;0 0 0 0 0 0 0 0 0 &lt;br /&gt;
;0 0 0 1 1 1 0 0 0 &lt;br /&gt;
;0 1 0 1 1 1 0 1 0 &lt;br /&gt;
;0 0 0 1 1 1 0 0 0 &lt;br /&gt;
;0 0 0 0 0 0 0 0 0 &lt;br /&gt;
;0 1 0 0 1 0 0 1 0 &lt;br /&gt;
;0 0 0 0 0 0 0 0 0 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;sierpinski.in&lt;br /&gt;
&lt;br /&gt;
;7&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund cerintei&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
def generare_matrice_sierpinski(n):&lt;br /&gt;
    if n == 0:&lt;br /&gt;
        return [[0]]&lt;br /&gt;
    else:&lt;br /&gt;
        matrice_mica = generare_matrice_sierpinski(n-1)&lt;br /&gt;
        dimensiune_veche = len(matrice_mica)&lt;br /&gt;
        dimensiune_noua = 3 * dimensiune_veche&lt;br /&gt;
        matrice_noua = [[0 for i in range(dimensiune_noua)] for j in range(dimensiune_noua)]&lt;br /&gt;
        for i in range(dimensiune_veche):&lt;br /&gt;
            for j in range(dimensiune_veche):&lt;br /&gt;
                matrice_noua[i][j] = matrice_noua[i][j + dimensiune_veche] = matrice_mica[i][j]&lt;br /&gt;
                matrice_noua[i][j + 2*dimensiune_veche] = matrice_mica[i][j]&lt;br /&gt;
                matrice_noua[i + dimensiune_veche][j] = matrice_noua[i + dimensiune_veche][j + dimensiune_veche] = matrice_mica[i][j]&lt;br /&gt;
                matrice_noua[i + dimensiune_veche][j + 2*dimensiune_veche] = matrice_mica[i][j]&lt;br /&gt;
                matrice_noua[i + 2*dimensiune_veche][j] = matrice_noua[i + 2*dimensiune_veche][j + dimensiune_veche] = matrice_mica[i][j]&lt;br /&gt;
                matrice_noua[i + 2*dimensiune_veche][j + 2*dimensiune_veche] = matrice_mica[i][j]&lt;br /&gt;
                matrice_noua[i + dimensiune_veche][j + dimensiune_veche] = 1&lt;br /&gt;
        return matrice_noua&lt;br /&gt;
&lt;br /&gt;
def validare(n):&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 6:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;sierpinski.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        n = int(f.readline())&lt;br /&gt;
    if validare(n):&lt;br /&gt;
        matrice = generare_matrice_sierpinski(n)&lt;br /&gt;
        with open(&amp;quot;sierpinski.out&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
            for i in range(len(matrice)):&lt;br /&gt;
                for j in range(len(matrice[i])):&lt;br /&gt;
                    f.write(str(matrice[i][j]))&lt;br /&gt;
                f.write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund cerinței.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații ==&lt;br /&gt;
Codul folosește o metodă recursivă pentru a genera matricea Sierpinski.&lt;br /&gt;
&lt;br /&gt;
#1 Funcția generare_matrice_sierpinski(n) primește ca parametru un număr natural n și returnează o matrice pătratică de ordinul 3^n cu elemente din mulțimea {0,1}, după modelul covorului lui Sierpinski. Dacă n=0, se returnează o matrice de 1x1 cu elementul 0.&lt;br /&gt;
&lt;br /&gt;
#2În caz contrar, se apelează funcția recursiv pentru a obține matricea de ordinul 3^n-1 și se construiește matricea finală de ordinul 3^n. Se completează matricea nouă cu elemente din matricea mică, astfel încât aceasta să fie replicată pe toate cele patru părți ale matricei mari, în timp ce centrul matricei mari primește valoarea 1.&lt;br /&gt;
&lt;br /&gt;
#3 Funcția validare(n, matrice) primește ca parametri un număr natural n și matricea generată de funcția generare_matrice_sierpinski(n). Aceasta verifică dacă matricea respectă cerințele problemei, respectiv matricea trebuie să fie pătratică și să conțină doar elemente din mulțimea {0,1}.&lt;br /&gt;
&lt;br /&gt;
#4 Funcția main() citește din fișierul de intrare sierpinski.in valoarea lui n, apoi apelează funcția generare_matrice_sierpinski(n) și validare(n, matrice) pentru a verifica matricea generată. Dacă matricea este validă, aceasta este scrisă în fișierul de ieșire sierpinski.out folosind funcția scriere_matrice(n, matrice, fisier).&lt;br /&gt;
&lt;br /&gt;
Dacă datele de intrare nu corespund cerinței problemei, se afișează un mesaj corespunzător în fișierul de ieșire.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0839_-_Vraja2&amp;diff=6446</id>
		<title>0839 - Vraja2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0839_-_Vraja2&amp;diff=6446"/>
		<updated>2023-05-14T20:33:34Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Cerința==&lt;br /&gt;
De-a lungul bulevardului sunt n copaci, numerotați de la 1 la n, pentru fiecare cunoscându-se înălțimea, exprimată în centimetri. Primarul dorește să taie copacii și apelează la un vrăjitor care va proceda astfel: alege o secvență cât mai lungă de copaci învecinați și aplică o vrajă prin care toți înălțimea tuturor copacilor din secvență scade cu o aceeași valoare, strict pozitivă.&lt;br /&gt;
&lt;br /&gt;
Să se determine care este numărul minim de vrăji care trebuie aplicate astfel încât toți copacii să aibă înălțime zero.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numărul n, iar apoi n numere naturale, reprezentând înălțimile copacilor.&lt;br /&gt;
&lt;br /&gt;
=Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
&lt;br /&gt;
*1 ≤ n ≤ 1000&lt;br /&gt;
*înălțimile arborilor sunt numere naturale nenule mai mici decât 1.000.000&lt;br /&gt;
*secvența aleasă de vrăjitor la un moment dat nu poate conține copaci de înălțime zero&lt;br /&gt;
&lt;br /&gt;
==Exemplu ==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti primul numar: 3&lt;br /&gt;
;Introduceti al doilea numar: 0&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restrictiilor&lt;br /&gt;
;Numarul de moduri de a ajunge la scorul 3-0 este 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numarul n: 0&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund cerintei&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
def calc_nr_vraj(copaci, idx):&lt;br /&gt;
    # Verificam in stanga pana la primul copac cu inaltime mai mare&lt;br /&gt;
    for i in range(idx-1, -1, -1):&lt;br /&gt;
        if copaci[i] &amp;gt; copaci[idx]:&lt;br /&gt;
            return idx - i&lt;br /&gt;
    # Daca nu am gasit copac mai mare in stanga, cautam in dreapta&lt;br /&gt;
    for i in range(idx+1, len(copaci)):&lt;br /&gt;
        if copaci[i] &amp;gt; copaci[idx]:&lt;br /&gt;
            return i - idx&lt;br /&gt;
    # Daca nu am gasit copac mai mare nici in stanga nici in dreapta&lt;br /&gt;
    return 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolvare(n, copaci):&lt;br /&gt;
    nr_vraj = 0&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        nr_vraj += calc_nr_vraj(copaci, i)&lt;br /&gt;
    return nr_vraj&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def validare(n, copaci):&lt;br /&gt;
    if not (2 &amp;lt;= n &amp;lt;= 10**5):&lt;br /&gt;
        return False&lt;br /&gt;
    for h in copaci:&lt;br /&gt;
        if not (1 &amp;lt;= h &amp;lt;= 10**9):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input(&amp;quot;Introduceti numarul n: &amp;quot;))&lt;br /&gt;
    copaci = []&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        inaltime = int(input(f&amp;quot;Introduceti inaltimea copacului {i+1}: &amp;quot;))&lt;br /&gt;
        copaci.append(inaltime)&lt;br /&gt;
&lt;br /&gt;
    if validare(n, copaci):&lt;br /&gt;
        print(&amp;quot;Datele de intrare corespund restrictiilor&amp;quot;)&lt;br /&gt;
        nr_vraj = rezolvare(n, copaci)&lt;br /&gt;
        print(f&amp;quot;Numarul minim de vraji necesare este: {nr_vraj}&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund cerintei&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații ==&lt;br /&gt;
Codul este structurat astfel:&lt;br /&gt;
&lt;br /&gt;
#1 validare(n, copaci): o funcție care primește ca argumente numărul de copaci și o listă cu înălțimile lor și verifică dacă datele de intrare respectă restricțiile problemei. În caz contrar, returnează False.&lt;br /&gt;
&lt;br /&gt;
#2 rezolvare(n, copaci): o funcție care primește ca argumente numărul de copaci și o listă cu înălțimile lor și calculează numărul minim de vrajitori necesari pentru a proteja toți copacii. În prima buclă se calculează numărul minim de vrajitori necesari pentru a proteja copacii începând cu primul. În a doua buclă se calculează numărul minim de vrajitori necesari pentru a proteja copacii începând cu ultimul. Rezultatul final este minimul dintre cele două valori. Dacă nu este posibil să se protejeze toți copacii, funcția returnează un mesaj de eroare.&lt;br /&gt;
&lt;br /&gt;
#3 main(): funcția principală care primește datele de intrare și afișează rezultatul. În cazul în care datele de intrare nu sunt valide, afișează un mesaj de eroare.&lt;br /&gt;
&lt;br /&gt;
Datele de intrare sunt citite prin intermediul funcției input() și sunt stocate într-o listă numită copaci. Pentru a calcula numărul minim de vrajitori necesari, se parcurg toți copacii și se verifică dacă fiecare copac este protejat de vrajitorii anteriori. Dacă nu este protejat, se adaugă un nou vrajitor și se protejează copacul curent.&lt;br /&gt;
&lt;br /&gt;
Rezultatul final este afișat prin intermediul funcției print(). Dacă nu este posibil să se protejeze toți copacii, se afișează un mesaj de eroare.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0839_-_Vraja2&amp;diff=6445</id>
		<title>0839 - Vraja2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0839_-_Vraja2&amp;diff=6445"/>
		<updated>2023-05-14T20:33:01Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Cerința==&lt;br /&gt;
De-a lungul bulevardului sunt n copaci, numerotați de la 1 la n, pentru fiecare cunoscându-se înălțimea, exprimată în centimetri. Primarul dorește să taie copacii și apelează la un vrăjitor care va proceda astfel: alege o secvență cât mai lungă de copaci învecinați și aplică o vrajă prin care toți înălțimea tuturor copacilor din secvență scade cu o aceeași valoare, strict pozitivă.&lt;br /&gt;
&lt;br /&gt;
Să se determine care este numărul minim de vrăji care trebuie aplicate astfel încât toți copacii să aibă înălțime zero.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numărul n, iar apoi n numere naturale, reprezentând înălțimile copacilor.&lt;br /&gt;
&lt;br /&gt;
=Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
&lt;br /&gt;
*1 ≤ n ≤ 1000&lt;br /&gt;
*înălțimile arborilor sunt numere naturale nenule mai mici decât 1.000.000&lt;br /&gt;
*secvența aleasă de vrăjitor la un moment dat nu poate conține copaci de înălțime zero&lt;br /&gt;
&lt;br /&gt;
==Exemplu ==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti primul numar: 3&lt;br /&gt;
;Introduceti al doilea numar: 0&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restrictiilor&lt;br /&gt;
;Numarul de moduri de a ajunge la scorul 3-0 este 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numarul n: 0&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund cerintei&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
def calc_nr_vraj(copaci, idx):&lt;br /&gt;
    # Verificam in stanga pana la primul copac cu inaltime mai mare&lt;br /&gt;
    for i in range(idx-1, -1, -1):&lt;br /&gt;
        if copaci[i] &amp;gt; copaci[idx]:&lt;br /&gt;
            return idx - i&lt;br /&gt;
    # Daca nu am gasit copac mai mare in stanga, cautam in dreapta&lt;br /&gt;
    for i in range(idx+1, len(copaci)):&lt;br /&gt;
        if copaci[i] &amp;gt; copaci[idx]:&lt;br /&gt;
            return i - idx&lt;br /&gt;
    # Daca nu am gasit copac mai mare nici in stanga nici in dreapta&lt;br /&gt;
    return 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolvare(n, copaci):&lt;br /&gt;
    nr_vraj = 0&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        nr_vraj += calc_nr_vraj(copaci, i)&lt;br /&gt;
    return nr_vraj&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def validare(n, copaci):&lt;br /&gt;
    if not (2 &amp;lt;= n &amp;lt;= 10**5):&lt;br /&gt;
        return False&lt;br /&gt;
    for h in copaci:&lt;br /&gt;
        if not (1 &amp;lt;= h &amp;lt;= 10**9):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input(&amp;quot;Introduceti numarul n: &amp;quot;))&lt;br /&gt;
    copaci = []&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        inaltime = int(input(f&amp;quot;Introduceti inaltimea copacului {i+1}: &amp;quot;))&lt;br /&gt;
        copaci.append(inaltime)&lt;br /&gt;
&lt;br /&gt;
    if validare(n, copaci):&lt;br /&gt;
        print(&amp;quot;Datele de intrare corespund restrictiilor&amp;quot;)&lt;br /&gt;
        nr_vraj = rezolvare(n, copaci)&lt;br /&gt;
        print(f&amp;quot;Numarul minim de vraji necesare este: {nr_vraj}&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund cerintei&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații ==&lt;br /&gt;
Codul este structurat astfel:&lt;br /&gt;
&lt;br /&gt;
# validare(n, copaci): o funcție care primește ca argumente numărul de copaci și o listă cu înălțimile lor și verifică dacă datele de intrare respectă restricțiile problemei. În caz contrar, returnează False.&lt;br /&gt;
&lt;br /&gt;
# rezolvare(n, copaci): o funcție care primește ca argumente numărul de copaci și o listă cu înălțimile lor și calculează numărul minim de vrajitori necesari pentru a proteja toți copacii. În prima buclă se calculează numărul minim de vrajitori necesari pentru a proteja copacii începând cu primul. În a doua buclă se calculează numărul minim de vrajitori necesari pentru a proteja copacii începând cu ultimul. Rezultatul final este minimul dintre cele două valori. Dacă nu este posibil să se protejeze toți copacii, funcția returnează un mesaj de eroare.&lt;br /&gt;
&lt;br /&gt;
# main(): funcția principală care primește datele de intrare și afișează rezultatul. În cazul în care datele de intrare nu sunt valide, afișează un mesaj de eroare.&lt;br /&gt;
&lt;br /&gt;
Datele de intrare sunt citite prin intermediul funcției input() și sunt stocate într-o listă numită copaci. Pentru a calcula numărul minim de vrajitori necesari, se parcurg toți copacii și se verifică dacă fiecare copac este protejat de vrajitorii anteriori. Dacă nu este protejat, se adaugă un nou vrajitor și se protejează copacul curent.&lt;br /&gt;
&lt;br /&gt;
Rezultatul final este afișat prin intermediul funcției print(). Dacă nu este posibil să se protejeze toți copacii, se afișează un mesaj de eroare.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0831_-_Generare3&amp;diff=6442</id>
		<title>0831 - Generare3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0831_-_Generare3&amp;diff=6442"/>
		<updated>2023-05-14T20:30:36Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Se dă un număr natural n. Să se genereze, în ordine lexicografică, toate șirurile de cifre binare de lungime n.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numărul n&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*1 ≤ n ≤ 10&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numarul n: 3&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restricțiilor&lt;br /&gt;
;000&lt;br /&gt;
;001&lt;br /&gt;
;010&lt;br /&gt;
;011&lt;br /&gt;
;100&lt;br /&gt;
;101&lt;br /&gt;
;110&lt;br /&gt;
;111&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numarul n: 11&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund cerinței&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def valideaza_intrare(n):&lt;br /&gt;
    if 1 &amp;lt;= n &amp;lt;= 10:&lt;br /&gt;
        print(&amp;quot;Datele de intrare corespund restricțiilor&amp;quot;)&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund cerinței&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def genereaza_siruri_binare(n):&lt;br /&gt;
    for i in range(2**n):&lt;br /&gt;
        yield bin(i)[2:].zfill(n)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input(&amp;quot;Introduceti numarul n: &amp;quot;))&lt;br /&gt;
    if valideaza_intrare(n):&lt;br /&gt;
        for sir in genereaza_siruri_binare(n):&lt;br /&gt;
            print(sir)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
# Funcția validează_intrare primește n și verifică dacă acesta este între 1 și 10. Dacă este, afișează un mesaj de confirmare și returnează True. Dacă nu este, afișează un mesaj de eroare și returnează False.&lt;br /&gt;
# Funcția genereaza_siruri_binare primește n și folosește un generator pentru a genera toate șirurile de cifre binare de lungime n în ordine lexicografică. Pentru a face acest lucru, pentru fiecare număr între 0 și 2^n-1, convertim numărul în binar și îl umplem cu zero-uri la stânga până la lungimea n.&lt;br /&gt;
# Funcția main citește numărul n de la tastatură și, dacă datele de intrare sunt valide, afișează toate șirurile de cifre binare de lungime n în ordine lexicografică.&lt;br /&gt;
# La sfârșit, verificăm dacă programul rulează ca program principal și, dacă da, apelăm funcția main.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0831_-_Generare3&amp;diff=6441</id>
		<title>0831 - Generare3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0831_-_Generare3&amp;diff=6441"/>
		<updated>2023-05-14T20:30:02Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Se dă un număr natural n. Să se genereze, în ordine lexicografică, toate șirurile de cifre binare de lungime n.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numărul n&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*1 ≤ n ≤ 10&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numarul n: 3&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restricțiilor&lt;br /&gt;
;000&lt;br /&gt;
;001&lt;br /&gt;
;010&lt;br /&gt;
;011&lt;br /&gt;
;100&lt;br /&gt;
;101&lt;br /&gt;
;110&lt;br /&gt;
;111&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti numarul n: 11&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund cerinței&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def valideaza_intrare(n):&lt;br /&gt;
    if 1 &amp;lt;= n &amp;lt;= 10:&lt;br /&gt;
        print(&amp;quot;Datele de intrare corespund restricțiilor&amp;quot;)&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund cerinței&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def genereaza_siruri_binare(n):&lt;br /&gt;
    for i in range(2**n):&lt;br /&gt;
        yield bin(i)[2:].zfill(n)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input(&amp;quot;Introduceti numarul n: &amp;quot;))&lt;br /&gt;
    if valideaza_intrare(n):&lt;br /&gt;
        for sir in genereaza_siruri_binare(n):&lt;br /&gt;
            print(sir)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
#1 Funcția validează_intrare primește n și verifică dacă acesta este între 1 și 10. Dacă este, afișează un mesaj de confirmare și returnează True. Dacă nu este, afișează un mesaj de eroare și returnează False.&lt;br /&gt;
#2 Funcția genereaza_siruri_binare primește n și folosește un generator pentru a genera toate șirurile de cifre binare de lungime n în ordine lexicografică. Pentru a face acest lucru, pentru fiecare număr între 0 și 2^n-1, convertim numărul în binar și îl umplem cu zero-uri la stânga până la lungimea n.&lt;br /&gt;
#3 Funcția main citește numărul n de la tastatură și, dacă datele de intrare sunt valide, afișează toate șirurile de cifre binare de lungime n în ordine lexicografică.&lt;br /&gt;
#4 La sfârșit, verificăm dacă programul rulează ca program principal și, dacă da, apelăm funcția main.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0830_-_Generare2&amp;diff=6439</id>
		<title>0830 - Generare2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0830_-_Generare2&amp;diff=6439"/>
		<updated>2023-05-14T20:26:26Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Se dau patru numere naturale n a x y. Să se afișeze elementele mulțimii M, cu următoarele proprietăți:&lt;br /&gt;
&lt;br /&gt;
toate elementele lui M sunt numere naturale mai mici sau egale cu n;&lt;br /&gt;
a se află în M;&lt;br /&gt;
dacă b se află în M, atunci b+x și b+y se află în M.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numerele n a x y.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*1 ≤ n ≤ 10000&lt;br /&gt;
*1 ≤ x , y ≤ 10000&lt;br /&gt;
*0 ≤ a ≤ 10000&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;n = 25&lt;br /&gt;
;a = 3&lt;br /&gt;
;x = 4&lt;br /&gt;
;y = 11&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restricțiilor&lt;br /&gt;
;M = {3, 7, 11, 14, 15, 18, 19, 22, 23, 25}&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;n = 1&lt;br /&gt;
;a = 2&lt;br /&gt;
;x = 3&lt;br /&gt;
;y = 4&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund cerinței&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def suma(v, n):&lt;br /&gt;
    if n == 1:&lt;br /&gt;
        return v[0]&lt;br /&gt;
    else:&lt;br /&gt;
        return v[n-1] + suma(v, n-1)&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
    n = int(input(&amp;quot;Introduceți numărul de elemente ale tabloului: &amp;quot;))&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 100:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restrictiilor impuse.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        v = []&lt;br /&gt;
        for i in range(n):&lt;br /&gt;
            elem = int(input(f&amp;quot;v[{i}] = &amp;quot;))&lt;br /&gt;
            v.append(elem)&lt;br /&gt;
        print(&amp;quot;Datele de intrare corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        print(&amp;quot;Suma elementelor din tablou este:&amp;quot;, suma(v, n))&lt;br /&gt;
except ValueError:&lt;br /&gt;
    print(&amp;quot;Datele de intrare nu corespund restrictiilor impuse.&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații==&lt;br /&gt;
#1 Funcția validare primește ca parametri numerele n, a, x și y și verifică dacă acestea respectă restricțiile cerute de problema. Dacă datele de intrare sunt valide, funcția returnează True, altfel returnează False.&lt;br /&gt;
&lt;br /&gt;
#2 Funcția rezolvare primește ca parametri numerele n, a, x și y și construiește mulțimea M cu ajutorul unui algoritm de tip backtracking. Mai întâi se adaugă elementul a în mulțimea M. Apoi, se parcurge mulțimea M și pentru fiecare element i din mulțime, se calculează elementele i + x și i + y. Dacă acestea sunt mai mici sau egale cu n, atunci sunt adăugate în mulțimea M. Se continuă până când nu se mai pot adăuga elemente în mulțime.&lt;br /&gt;
&lt;br /&gt;
#3 Funcția main este funcția principală a programului. În ea se citesc datele de intrare de la utilizator și se verifică dacă sunt valide apelând funcția validare. Dacă datele de intrare sunt valide, se apelează funcția rezolvare și se afișează mulțimea M. Altfel, se afișează un mesaj corespunzător.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0881_-_Generare4&amp;diff=6437</id>
		<title>0881 - Generare4</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0881_-_Generare4&amp;diff=6437"/>
		<updated>2023-05-14T20:21:21Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţă==&lt;br /&gt;
Se dă un număr natural n. Construiți un șir format din primele 2n numere naturale, dispuse astfel:&lt;br /&gt;
&lt;br /&gt;
se pleacă de la șirul 1 2&lt;br /&gt;
exact la mijlocul acestui șir se inserează șirul 3 4 și se obține 1 3 4 2&lt;br /&gt;
exact la mijlocul acestui șir se inserează șirul 5 6 7 8 și se obține 1 3 5 6 7 8 4 2&lt;br /&gt;
etc&lt;br /&gt;
în general, la mijlocul șirului format din primele 2k numere naturale se inserează șirul ordonat format din următoarele 2k numere naturale.&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numărul n.&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele introduse sunt valide!&amp;quot;, apoi se va afișa pe ecran elementele șirului construit, separate prin câte un spațiu, care îndeplinesc condițiile date. În cazul în care datele nu respectă restricțiile, se va afișa mesajul &amp;quot;Datele introduse nu sunt invalide!&amp;quot;.&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
*2 ≤ n ≤ 15&lt;br /&gt;
==Exemple==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
;Intrare&lt;br /&gt;
:Introduceti numarul n: 4&lt;br /&gt;
&lt;br /&gt;
;Ieșire&lt;br /&gt;
:Datele introduse sunt valide!&lt;br /&gt;
:1 3 5 6 9 10 11 12 13 14 15 16 7 8 4 2&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def construieste_sirul(n):&lt;br /&gt;
    sir = [1, 2]&lt;br /&gt;
    for k in range(1, n+1):&lt;br /&gt;
        sir_nou = list(range(2*k+1, 4*k+1))&lt;br /&gt;
        mijloc = len(sir) // 2&lt;br /&gt;
        sir = sir[:mijloc] + sir_nou + sir[mijloc:]&lt;br /&gt;
    return sir&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def validare_intrare(input_str):&lt;br /&gt;
    try:&lt;br /&gt;
        n = int(input_str)&lt;br /&gt;
        if n &amp;lt; 2 or n &amp;gt; 15:&lt;br /&gt;
            raise ValueError()&lt;br /&gt;
        return n&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        print(&amp;quot;Input invalid. Introduceti un numar natural intre 2 si 15.&amp;quot;)&lt;br /&gt;
        return None&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    input_str = input(&amp;quot;Introduceti numarul n: &amp;quot;)&lt;br /&gt;
    n = validare_intrare(input_str)&lt;br /&gt;
    while n is None:&lt;br /&gt;
        input_str = input(&amp;quot;Introduceti numarul n: &amp;quot;)&lt;br /&gt;
        n = validare_intrare(input_str)&lt;br /&gt;
&lt;br /&gt;
    sir = construieste_sirul(n)&lt;br /&gt;
    print(&amp;quot; &amp;quot;.join(str(x) for x in sir))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Explicație rezolvare==&lt;br /&gt;
&lt;br /&gt;
#1 Funcția validare_intrare(input_str) primește o intrare sub formă de string, input_str, și verifică dacă poate fi convertită într-un număr natural între 2 și 15 inclusiv. În cazul în care stringul nu poate fi convertit sau numărul este în afara intervalului specificat, se afișează un mesaj de eroare, altfel se returnează numărul natural.&lt;br /&gt;
&lt;br /&gt;
#2 Funcția construieste_sirul(n) primește un număr natural, n, și construiește șirul de numere întregi cu ajutorul următoarei proceduri:&lt;br /&gt;
&lt;br /&gt;
șirul inițial este [1, 2]&lt;br /&gt;
pentru fiecare k între 1 și n, se construiește un șir nou de numere întregi, sir_nou, care conține numerele de la 2k+1 până la 4k+1&lt;br /&gt;
se ia mijlocul șirului inițial, sir, și se inserează numerele din sir_nou astfel încât ele să fie înlocuite cu numerele anterioare mijlocului&lt;br /&gt;
se concatenează cele două părți ale șirului inițial (înainte și după mijloc) cu șirul obținut în pasul anterior&lt;br /&gt;
Funcția returnează șirul construit.&lt;br /&gt;
&lt;br /&gt;
#3 Funcția main() este funcția principală a programului, care primește input-ul utilizatorului și afișează output-ul corespunzător. Se folosește funcția validare_intrare(input_str) pentru a valida input-ul și construieste_sirul(n) pentru a construi șirul. Acesta este afișat la finalul programului, sub formă de string concatenat cu ajutorul metodei &amp;quot; &amp;quot;.join().&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1799_-_Dinti1&amp;diff=6435</id>
		<title>1799 - Dinti1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1799_-_Dinti1&amp;diff=6435"/>
		<updated>2023-05-14T20:17:54Z</updated>

		<summary type="html">&lt;p&gt;Catalin Moje: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Cerința==&lt;br /&gt;
Pentru o serie de activități foarte sofisticate, Gigel are nevoie de un fierăstrău special, alcătuit din mai mulţi dinţi. Un fierăstrău de gradul n este format din două fierăstraie de gradul n-1, între care se află un dinte de mărime n. Un fierăstrău de gradul 1 are un singur dinte, de mărime 1.&lt;br /&gt;
&lt;br /&gt;
Calculați suma mărimilor dinților fierăstrăului de gradul n.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va introduce de la tastatură un număr natural care va fi transmis ca perimetru&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul &amp;quot;Datele de intrare corespund restricțiilor&amp;quot; și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: &amp;quot;Datele de intrare nu corespund cerinței&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
&lt;br /&gt;
*1 ≤ n ≤ 50&lt;br /&gt;
&lt;br /&gt;
==Exemplu ==&lt;br /&gt;
===Exemplu 1===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti gradul fierastraului (intre 1 si 50): 3&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare corespund restrictiilor impuse.&lt;br /&gt;
;[1, 2, 1, 3, 1, 2, 1]&lt;br /&gt;
;Suma dintilor fierastraului este: 11&lt;br /&gt;
&lt;br /&gt;
===Exemplu 2===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti gradul fierastraului (intre 1 si 50): 51&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund cerintei.&lt;br /&gt;
&lt;br /&gt;
===Exemplu 3===&lt;br /&gt;
:Intrare:&lt;br /&gt;
;Introduceti gradul fierastraului (intre 1 si 50): abc&lt;br /&gt;
:Iesire:&lt;br /&gt;
;Datele de intrare nu corespund cerintei.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 def validare_input(n):&lt;br /&gt;
    if not n.isdigit():&lt;br /&gt;
        return False&lt;br /&gt;
    if int(n) &amp;lt; 1 or int(n) &amp;gt; 50:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def construire_fierastrau(n):&lt;br /&gt;
    if n == 1:&lt;br /&gt;
        return [1]&lt;br /&gt;
    else:&lt;br /&gt;
        smaller_saw = construire_fierastrau(n-1)&lt;br /&gt;
        return smaller_saw + [n] + smaller_saw&lt;br /&gt;
&lt;br /&gt;
def suma_dintilor_fierastrau(fierastrau):&lt;br /&gt;
    return sum(fierastrau)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = input(&amp;quot;Introduceti gradul fierastraului (intre 1 si 50): &amp;quot;)&lt;br /&gt;
    if not validare_input(n):&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund cerintei.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele de intrare corespund restrictiilor impuse.&amp;quot;)&lt;br /&gt;
        fierastrau = construire_fierastrau(int(n))&lt;br /&gt;
        print(fierastrau)&lt;br /&gt;
        print(&amp;quot;Suma dintilor fierastraului este:&amp;quot;, suma_dintilor_fierastrau(fierastrau))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicații ==&lt;br /&gt;
#1 Funcția validare_input primește un număr ca argument și returnează True dacă este un număr întreg între 1 și 50, altfel returnează False.&lt;br /&gt;
&lt;br /&gt;
#2 Funcția construire_fierastrau primește un număr natural n și construiește un fierăstrău de gradul n conform cerinței, sub forma unei liste de întregi. Pentru a construi fierăstrăul, se apelează recursiv funcția construire_fierastrau cu argumentul n-1, până se ajunge la fierăstrăul de gradul 1, caz în care se returnează lista [1]. Pentru a construi fierăstrăul de gradul n, se concatenază în ordine fierăstrăul de gradul n-1, un element nou n și din nou fierăstrăul de gradul n-1.&lt;br /&gt;
&lt;br /&gt;
#3 Funcția suma_dintilor_fierastrau primește o listă de întregi reprezentând un fierăstrău și returnează suma valorilor acestor întregi.&lt;br /&gt;
&lt;br /&gt;
#4Funcția main primește de la utilizator un număr natural n, validează datele și, dacă datele sunt corecte, construiește fierăstrăul corespunzător, calculează suma dintilor și afișează lista fierăstrăului și suma.&lt;/div&gt;</summary>
		<author><name>Catalin Moje</name></author>
	</entry>
</feed>