<?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=Codrut+Borcutean</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=Codrut+Borcutean"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/wiki/Special:Contributions/Codrut_Borcutean"/>
	<updated>2026-05-01T02:40:45Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3421_-_ctck&amp;diff=8982</id>
		<title>3421 - ctck</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3421_-_ctck&amp;diff=8982"/>
		<updated>2024-01-04T15:52:24Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Se dă un graf orientat cu &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; vârfuri și &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; arce prin lista arcelor și un număr natural &amp;#039;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;#039;. Afișați numărul de vârfuri ale componentei tare conexe în care se află vârful &amp;#039;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;#039;. == Date de intrare == Programul citește de la tastatură numărul &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; de noduri și numărul &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; de arce și numărul &amp;#039;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;#039;, iar apoi lista arcelor, formată din &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; perechi de forma &amp;#039;&amp;#039;&amp;#039;i j&amp;#039;&amp;#039;&amp;#039;, cu semnificația că există arc orientat de la nod...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dă un graf orientat cu &#039;&#039;&#039;n&#039;&#039;&#039; vârfuri și &#039;&#039;&#039;m&#039;&#039;&#039; arce prin lista arcelor și un număr natural &#039;&#039;&#039;k&#039;&#039;&#039;. Afișați numărul de vârfuri ale componentei tare conexe în care se află vârful &#039;&#039;&#039;k&#039;&#039;&#039;.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul &#039;&#039;&#039;n&#039;&#039;&#039; de noduri și numărul &#039;&#039;&#039;m&#039;&#039;&#039; de arce și numărul &#039;&#039;&#039;k&#039;&#039;&#039;, iar apoi lista arcelor, formată din &#039;&#039;&#039;m&#039;&#039;&#039; perechi de forma &#039;&#039;&#039;i j&#039;&#039;&#039;, cu semnificația că există arc orientat de la nodul &#039;&#039;&#039;i&#039;&#039;&#039; la nodul &#039;&#039;&#039;j&#039;&#039;&#039;.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Programul va afișa pe ecran numărul &#039;&#039;&#039;c&#039;&#039;&#039;, reprezentând numărul de vârfuri ale componentei tare conexe în care se află vârful &#039;&#039;&#039;k&#039;&#039;&#039;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ k ≤ n ≤ 100&#039;&#039;&#039;&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 8 12 3&lt;br /&gt;
 1 3&lt;br /&gt;
 3 5&lt;br /&gt;
 5 7&lt;br /&gt;
 7 1&lt;br /&gt;
 2 6&lt;br /&gt;
 6 8&lt;br /&gt;
 8 2&lt;br /&gt;
 1 4&lt;br /&gt;
 4 6&lt;br /&gt;
 4 8&lt;br /&gt;
 4 2&lt;br /&gt;
 1 8&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 4&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 0 0 0&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def dfs(graph, start):&lt;br /&gt;
    # Inițializează stiva și setul de noduri vizitate&lt;br /&gt;
    stack = [start]&lt;br /&gt;
    visited = set()&lt;br /&gt;
&lt;br /&gt;
    while stack:&lt;br /&gt;
        node = stack.pop()&lt;br /&gt;
        if node not in visited:&lt;br /&gt;
            visited.add(node)&lt;br /&gt;
            stack.extend(graph.get(node, []) - visited)&lt;br /&gt;
&lt;br /&gt;
    return visited&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, arce):&lt;br /&gt;
    # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100) or not all(1 &amp;lt;= i &amp;lt;= n and 1 &amp;lt;= j &amp;lt;= n for i, j in arce):&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, m, k = map(int, input().split())&lt;br /&gt;
    arce = [tuple(map(int, input().split())) for _ in range(m)]&lt;br /&gt;
&lt;br /&gt;
    # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
    if not verifica_restrictii(n, arce):&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Construiește graful și graful transpus&lt;br /&gt;
    graph = {}&lt;br /&gt;
    graph_transposed = {}&lt;br /&gt;
    for i, j in arce:&lt;br /&gt;
        if i not in graph:&lt;br /&gt;
            graph[i] = set()&lt;br /&gt;
        if j not in graph_transposed:&lt;br /&gt;
            graph_transposed[j] = set()&lt;br /&gt;
        graph[i].add(j)&lt;br /&gt;
        graph_transposed[j].add(i)&lt;br /&gt;
&lt;br /&gt;
    # Aplică DFS pe graful transpus pentru a găsi nodurile accesibile din nodul k&lt;br /&gt;
    reachable_nodes = dfs(graph_transposed, k)&lt;br /&gt;
&lt;br /&gt;
    # Verifică dacă există un nod din care se poate ajunge în toate celelalte noduri&lt;br /&gt;
    component_nodes = [node for node in range(1, n + 1) if node in dfs(graph, node) and node in reachable_nodes]&lt;br /&gt;
&lt;br /&gt;
    print(len(component_nodes))&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;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0581_-_Drumuri&amp;diff=8978</id>
		<title>0581 - Drumuri</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0581_-_Drumuri&amp;diff=8978"/>
		<updated>2024-01-04T15:17:04Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Se dă un graf orientat cu &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; noduri și un nod &amp;#039;&amp;#039;&amp;#039;p&amp;#039;&amp;#039;&amp;#039;. Să se afișeze toate nodurile &amp;#039;&amp;#039;&amp;#039;q&amp;#039;&amp;#039;&amp;#039; ale grafului, diferite de &amp;#039;&amp;#039;&amp;#039;p&amp;#039;&amp;#039;&amp;#039;, cu proprietatea că există cel puțin un drum de la &amp;#039;&amp;#039;&amp;#039;p&amp;#039;&amp;#039;&amp;#039; la &amp;#039;&amp;#039;&amp;#039;q&amp;#039;&amp;#039;&amp;#039; și lungimea drumului minim este pară. == Date de intrare == Programul citește de la tastatură numărul &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; de noduri, nodul &amp;#039;&amp;#039;&amp;#039;p&amp;#039;&amp;#039;&amp;#039; și numărul &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; de arce, iar apoi lista arcelor, formată din &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; perechi de forma &amp;#039;&amp;#039;&amp;#039;i j&amp;#039;&amp;#039;&amp;#039;, cu semnificaț...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dă un graf orientat cu &#039;&#039;&#039;n&#039;&#039;&#039; noduri și un nod &#039;&#039;&#039;p&#039;&#039;&#039;. Să se afișeze toate nodurile &#039;&#039;&#039;q&#039;&#039;&#039; ale grafului, diferite de &#039;&#039;&#039;p&#039;&#039;&#039;, cu proprietatea că există cel puțin un drum de la &#039;&#039;&#039;p&#039;&#039;&#039; la &#039;&#039;&#039;q&#039;&#039;&#039; și lungimea drumului minim este pară.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul &#039;&#039;&#039;n&#039;&#039;&#039; de noduri, nodul &#039;&#039;&#039;p&#039;&#039;&#039; și numărul &#039;&#039;&#039;m&#039;&#039;&#039; de arce, iar apoi lista arcelor, formată din &#039;&#039;&#039;m&#039;&#039;&#039; perechi de forma &#039;&#039;&#039;i j&#039;&#039;&#039;, cu semnificația că există arc orientat de la nodul &#039;&#039;&#039;i&#039;&#039;&#039; la nodul &#039;&#039;&#039;j&#039;&#039;&#039;.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Programul va afișa pe ecran numărul &#039;&#039;&#039;C&#039;&#039;&#039; de noduri care respectă cerința, iar pe rândul următor cele &#039;&#039;&#039;C&#039;&#039;&#039; noduri, în ordine crescătoare, separate prin exact un spațiu.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ n ≤ 100&#039;&#039;&#039;&lt;br /&gt;
* prin drum minim se înțelege drum de cu lungimea minimă&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 7 2 10&lt;br /&gt;
 1 2&lt;br /&gt;
 2 3&lt;br /&gt;
 2 5&lt;br /&gt;
 3 4&lt;br /&gt;
 3 6&lt;br /&gt;
 4 7&lt;br /&gt;
 5 1&lt;br /&gt;
 5 3&lt;br /&gt;
 5 4&lt;br /&gt;
 6 5&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 3&lt;br /&gt;
 1 4 6&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 0 0 0&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def verifica_restrictii(n, arce):&lt;br /&gt;
    # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100) or not all(1 &amp;lt;= i &amp;lt;= n and 1 &amp;lt;= j &amp;lt;= n for i, j in arce):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def noduri_drum_par(n, p, arce):&lt;br /&gt;
    # Crează un dicționar pentru a stoca vecinii fiecărui nod&lt;br /&gt;
    vecini = {i: [] for i in range(1, n + 1)}&lt;br /&gt;
    for i, j in arce:&lt;br /&gt;
        vecini[i].append(j)&lt;br /&gt;
&lt;br /&gt;
    # Inițializează distanțele de la nodul p la toate celelalte noduri&lt;br /&gt;
    dist = [float(&#039;inf&#039;)] * (n + 1)&lt;br /&gt;
    dist[p] = 0&lt;br /&gt;
&lt;br /&gt;
    # Aplică algoritmul lui Dijkstra pentru a calcula distanțele minime&lt;br /&gt;
    vizitat = [False] * (n + 1)&lt;br /&gt;
    for _ in range(n):&lt;br /&gt;
        u = min((d, i) for i, d in enumerate(dist) if not vizitat[i])[1]&lt;br /&gt;
        vizitat[u] = True&lt;br /&gt;
        for v in vecini[u]:&lt;br /&gt;
            if dist[u] + 1 &amp;lt; dist[v]:&lt;br /&gt;
                dist[v] = dist[u] + 1&lt;br /&gt;
&lt;br /&gt;
    # Determină nodurile care au un drum de lungime pară de la nodul p&lt;br /&gt;
    noduri = [i for i in range(1, n + 1) if i != p and dist[i] % 2 == 0]&lt;br /&gt;
&lt;br /&gt;
    return noduri&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, p, m = map(int, input().split())&lt;br /&gt;
    arce = [tuple(map(int, input().split())) for _ in range(m)]&lt;br /&gt;
&lt;br /&gt;
    # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
    if not verifica_restrictii(n, arce):&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Determină nodurile care au un drum de lungime pară de la nodul p&lt;br /&gt;
    noduri = noduri_drum_par(n, p, arce)&lt;br /&gt;
&lt;br /&gt;
    # Afiseaza rezultatul&lt;br /&gt;
    print(len(noduri))&lt;br /&gt;
    print(&#039; &#039;.join(map(str, sorted(noduri))))&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;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0582_-_Turneu&amp;diff=8977</id>
		<title>0582 - Turneu</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0582_-_Turneu&amp;diff=8977"/>
		<updated>2024-01-04T15:08:36Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: Un &amp;#039;&amp;#039;&amp;#039;graf orientat&amp;#039;&amp;#039;&amp;#039; se numește graf turneu dacă oricare ar fi două noduri diferite &amp;#039;&amp;#039;&amp;#039;i, j&amp;#039;&amp;#039;&amp;#039;, între ele există un singur arc: arcul &amp;#039;&amp;#039;&amp;#039;(i j)&amp;#039;&amp;#039;&amp;#039; sau arcul &amp;#039;&amp;#039;&amp;#039;(j i)&amp;#039;&amp;#039;&amp;#039;. În orice graf turneu există un drum elementar care trece prin toate nodurile grafului. == Cerinţa == Se dă un graf turneu cu &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; noduri. Să se determine un drum elementar care să conțină toate nodurile grafului. == Date de intrare == Programul citește de la tastatură numărul de noduri &amp;#039;&amp;#039;&amp;#039;...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un &#039;&#039;&#039;graf orientat&#039;&#039;&#039; se numește graf turneu dacă oricare ar fi două noduri diferite &#039;&#039;&#039;i, j&#039;&#039;&#039;, între ele există un singur arc: arcul &#039;&#039;&#039;(i j)&#039;&#039;&#039; sau arcul &#039;&#039;&#039;(j i)&#039;&#039;&#039;. În orice graf turneu există un drum elementar care trece prin toate nodurile grafului.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă un graf turneu cu &#039;&#039;&#039;n&#039;&#039;&#039; noduri. Să se determine un drum elementar care să conțină toate nodurile grafului.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul de noduri &#039;&#039;&#039;n&#039;&#039;&#039;, iar apoi &#039;&#039;&#039;n*(n-1)/2&#039;&#039;&#039; perechi &#039;&#039;&#039;i j&#039;&#039;&#039;, cu semnificația că există arcul &#039;&#039;&#039;(i j)&#039;&#039;&#039;.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Programul va afișa pe ecran cele &#039;&#039;&#039;n&#039;&#039;&#039; noduri ale drumului determinat, separate prin exact un spațiu.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ n ≤ 100&#039;&#039;&#039;&lt;br /&gt;
* orice drum corect determinat este acceptat&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 4&lt;br /&gt;
 1 4&lt;br /&gt;
 2 1&lt;br /&gt;
 2 4&lt;br /&gt;
 3 1&lt;br /&gt;
 3 2&lt;br /&gt;
 4 3&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 1 4 3 2&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 0&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def verifica_restrictii(n, arce):&lt;br /&gt;
    # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100) or not all(1 &amp;lt;= i &amp;lt;= n and 1 &amp;lt;= j &amp;lt;= n for i, j in arce):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def drum_elementar(n, arce):&lt;br /&gt;
    # Crează un dicționar pentru a stoca vecinii fiecărui nod&lt;br /&gt;
    vecini = {i: [] for i in range(1, n + 1)}&lt;br /&gt;
    for i, j in arce:&lt;br /&gt;
        vecini[i].append(j)&lt;br /&gt;
&lt;br /&gt;
    # Alege un nod de start arbitrar&lt;br /&gt;
    nod_curent = 1&lt;br /&gt;
&lt;br /&gt;
    # Inițializează drumul cu nodul de start&lt;br /&gt;
    drum = [nod_curent]&lt;br /&gt;
&lt;br /&gt;
    # Construiește drumul&lt;br /&gt;
    while len(drum) &amp;lt; n:&lt;br /&gt;
        for nod in sorted(vecini[nod_curent]):&lt;br /&gt;
            if nod not in drum:&lt;br /&gt;
                drum.append(nod)&lt;br /&gt;
                nod_curent = nod&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
    return drum&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    arce = [tuple(map(int, input().split())) for _ in range(n * (n - 1) // 2)]&lt;br /&gt;
&lt;br /&gt;
    # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
    if not verifica_restrictii(n, arce):&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Determină un drum elementar care să conțină toate nodurile grafului&lt;br /&gt;
    drum = drum_elementar(n, arce)&lt;br /&gt;
&lt;br /&gt;
    # Afiseaza rezultatul&lt;br /&gt;
    print(&#039; &#039;.join(map(str, drum)))&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;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0575_-_Cunoscuti&amp;diff=8976</id>
		<title>0575 - Cunoscuti</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0575_-_Cunoscuti&amp;diff=8976"/>
		<updated>2024-01-04T14:59:25Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Într-un grup sunt &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; persoane, numerotate de la &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039; la &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; și o persoană poate cunoaște alte persoane – relație care nu este reciprocă. Să se determine persoana cea mai cunoscută. == Date de intrare == Programul citește de la tastatură numărul &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; de noduri și numărul &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; de relații dintre persoane, iar apoi &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; perechi de forma &amp;#039;&amp;#039;&amp;#039;i j&amp;#039;&amp;#039;&amp;#039;, cu semnificația că persoana &amp;#039;&amp;#039;&amp;#039;i&amp;#039;&amp;#039;&amp;#039; cunoaște persoana &amp;#039;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;#039;. == Date de ieși...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Într-un grup sunt &#039;&#039;&#039;n&#039;&#039;&#039; persoane, numerotate de la &#039;&#039;&#039;1&#039;&#039;&#039; la &#039;&#039;&#039;n&#039;&#039;&#039; și o persoană poate cunoaște alte persoane – relație care nu este reciprocă. Să se determine persoana cea mai cunoscută.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul &#039;&#039;&#039;n&#039;&#039;&#039; de noduri și numărul &#039;&#039;&#039;m&#039;&#039;&#039; de relații dintre persoane, iar apoi &#039;&#039;&#039;m&#039;&#039;&#039; perechi de forma &#039;&#039;&#039;i j&#039;&#039;&#039;, cu semnificația că persoana &#039;&#039;&#039;i&#039;&#039;&#039; cunoaște persoana &#039;&#039;&#039;j&#039;&#039;&#039;.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Programul va afișa pe ecran numărul de ordine al celei mai cunoscute persoane. Dacă răspunsul constă din mai multe persoane, se vor afișa toate, în ordine crescătoare a numerelor de ordine, separate prin exact un spațiu.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ n ≤ 100&#039;&#039;&#039;&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 5 8&lt;br /&gt;
 1 3&lt;br /&gt;
 1 4&lt;br /&gt;
 3 2&lt;br /&gt;
 3 4&lt;br /&gt;
 4 2&lt;br /&gt;
 5 2&lt;br /&gt;
 5 4&lt;br /&gt;
 5 1&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 2 4&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 104 0&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def verifica_restrictii(n, arce):&lt;br /&gt;
    # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100) or not all(1 &amp;lt;= i &amp;lt;= n and 1 &amp;lt;= j &amp;lt;= n for i, j in arce):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def persoana_cea_mai_cunoscuta(n, arce):&lt;br /&gt;
    # Inițializează gradele interioare ale nodurilor&lt;br /&gt;
    grad_interior = [0] * (n + 1)&lt;br /&gt;
&lt;br /&gt;
    # Calculează gradele interioare ale nodurilor&lt;br /&gt;
    for _, j in arce:&lt;br /&gt;
        grad_interior[j] += 1&lt;br /&gt;
&lt;br /&gt;
    # Determină persoanele cele mai cunoscute&lt;br /&gt;
    max_grad = max(grad_interior)&lt;br /&gt;
    persoane = [i for i in range(1, n + 1) if grad_interior[i] == max_grad]&lt;br /&gt;
&lt;br /&gt;
    return persoane&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, m = map(int, input().split())&lt;br /&gt;
    arce = [tuple(map(int, input().split())) for _ in range(m)]&lt;br /&gt;
&lt;br /&gt;
    # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
    if not verifica_restrictii(n, arce):&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Determină persoanele cele mai cunoscute&lt;br /&gt;
    persoane = persoana_cea_mai_cunoscuta(n, arce)&lt;br /&gt;
&lt;br /&gt;
    # Afiseaza rezultatul&lt;br /&gt;
    if persoane:&lt;br /&gt;
        print(&#039; &#039;.join(map(str, sorted(persoane))))&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;NU EXISTA&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3450_-_gegik&amp;diff=8975</id>
		<title>3450 - gegik</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3450_-_gegik&amp;diff=8975"/>
		<updated>2024-01-04T14:54:33Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Se dă un graf orientat cu &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; vârfuri și &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; arce prin lista arcelor și un număr natural &amp;#039;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;#039;. Afișați vârfurile din graf care au suma gradelor (interior și exterior) egală cu &amp;#039;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;#039;. == Date de intrare == Programul citește de la tastatură numărul &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; de noduri și numărul &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; de arce și un număr &amp;#039;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;#039;. Apoi se citește lista arcelor, formată din &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; perechi de forma &amp;#039;&amp;#039;&amp;#039;i j&amp;#039;&amp;#039;&amp;#039;, cu semnificația că există arc de la no...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dă un graf orientat cu &#039;&#039;&#039;n&#039;&#039;&#039; vârfuri și &#039;&#039;&#039;m&#039;&#039;&#039; arce prin lista arcelor și un număr natural &#039;&#039;&#039;k&#039;&#039;&#039;. Afișați vârfurile din graf care au suma gradelor (interior și exterior) egală cu &#039;&#039;&#039;k&#039;&#039;&#039;.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul &#039;&#039;&#039;n&#039;&#039;&#039; de noduri și numărul &#039;&#039;&#039;m&#039;&#039;&#039; de arce și un număr &#039;&#039;&#039;k&#039;&#039;&#039;. Apoi se citește lista arcelor, formată din &#039;&#039;&#039;m&#039;&#039;&#039; perechi de forma &#039;&#039;&#039;i j&#039;&#039;&#039;, cu semnificația că există arc de la nodul &#039;&#039;&#039;i&#039;&#039;&#039; la nodul &#039;&#039;&#039;j&#039;&#039;&#039;.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Programul va afișa pe ecran în ordine crescătoare și separate printr-un spațiu vârfurile care au suma gradelor (interior și exterior) egală cu &#039;&#039;&#039;k&#039;&#039;&#039;. Dacă nu există astfel de vârfuri, atunci programul va afișa &#039;&#039;&#039;Nu exista&#039;&#039;&#039;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ n ≤ 100&#039;&#039;&#039;&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 7 10 3&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 1 4&lt;br /&gt;
 1 5&lt;br /&gt;
 2 5&lt;br /&gt;
 5 1&lt;br /&gt;
 3 4&lt;br /&gt;
 4 3&lt;br /&gt;
 4 6&lt;br /&gt;
 4 7&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 3 5&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 103 0 0&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Explicatie ==&lt;br /&gt;
Vârfurile 3 și 5 au suma gradelor egală cu 3.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def verifica_restrictii(n, arce):&lt;br /&gt;
    # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100) or not all(1 &amp;lt;= i &amp;lt;= n and 1 &amp;lt;= j &amp;lt;= n for i, j in arce):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def noduri_grad_suma_k(n, arce, k):&lt;br /&gt;
    # Inițializează gradele interioare și exterioare ale nodurilor&lt;br /&gt;
    grad_interior = [0] * (n + 1)&lt;br /&gt;
    grad_exterior = [0] * (n + 1)&lt;br /&gt;
&lt;br /&gt;
    # Calculează gradele interioare și exterioare ale nodurilor&lt;br /&gt;
    for i, j in arce:&lt;br /&gt;
        grad_exterior[i] += 1&lt;br /&gt;
        grad_interior[j] += 1&lt;br /&gt;
&lt;br /&gt;
    # Determină nodurile care au suma gradelor egală cu k&lt;br /&gt;
    noduri = [i for i in range(1, n + 1) if grad_interior[i] + grad_exterior[i] == k]&lt;br /&gt;
&lt;br /&gt;
    return noduri&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, m, k = map(int, input().split())&lt;br /&gt;
    arce = [tuple(map(int, input().split())) for _ in range(m)]&lt;br /&gt;
&lt;br /&gt;
    # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
    if not verifica_restrictii(n, arce):&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Determină nodurile care au suma gradelor egală cu k&lt;br /&gt;
    noduri = noduri_grad_suma_k(n, arce, k)&lt;br /&gt;
&lt;br /&gt;
    # Afiseaza rezultatul&lt;br /&gt;
    if noduri:&lt;br /&gt;
        print(&#039; &#039;.join(map(str, sorted(noduri))))&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;NU EXISTA&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4158_-_Grade11&amp;diff=8974</id>
		<title>4158 - Grade11</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4158_-_Grade11&amp;diff=8974"/>
		<updated>2024-01-04T14:49:27Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Se dă lista arcelor unui graf orientat. Să se determine nodurile care au gradul exterior divizibil cu gradul interior sau gradul interior divizibil cu gradul exterior. Un nod care are gradul exterior sau gradul interior egal cu &amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039; nu respectă condiția cerută. == Date de intrare == Programul citește de la tastatură numărul &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; de noduri și numărul &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; de arce, iar apoi lista arcelor, formată din &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; perechi de forma &amp;#039;&amp;#039;&amp;#039;i&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;#039;, c...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dă lista arcelor unui graf orientat. Să se determine nodurile care au gradul exterior divizibil cu gradul interior sau gradul interior divizibil cu gradul exterior. Un nod care are gradul exterior sau gradul interior egal cu &#039;&#039;&#039;0&#039;&#039;&#039; nu respectă condiția cerută.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul &#039;&#039;&#039;n&#039;&#039;&#039; de noduri și numărul &#039;&#039;&#039;m&#039;&#039;&#039; de arce, iar apoi lista arcelor, formată din &#039;&#039;&#039;m&#039;&#039;&#039; perechi de forma &#039;&#039;&#039;i&#039;&#039;&#039; &#039;&#039;&#039;j&#039;&#039;&#039;, cu semnificația că există arc orientat de la &#039;&#039;&#039;i&#039;&#039;&#039; la &#039;&#039;&#039;j&#039;&#039;&#039;.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Programul va afișa pe ecran nodurile cerute, ordonate crescător, separate prin exact un spațiu. Dacă nu există noduri care să respecte proprietatea că au gradul exterior divizibil cu gradul interior sau gradul interior divizibil cu gradul exterior, atunci se va afișa &#039;&#039;&#039;NU EXISTA&#039;&#039;&#039;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ n ≤ 100&#039;&#039;&#039;&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 6 9&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 1 5&lt;br /&gt;
 3 5&lt;br /&gt;
 4 1&lt;br /&gt;
 3 4&lt;br /&gt;
 5 1&lt;br /&gt;
 6 1&lt;br /&gt;
 6 3&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 1 3 4 5&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 102 0&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Explicatie ==&lt;br /&gt;
Vârful &#039;&#039;&#039;1&#039;&#039;&#039; are gradul exterior egal cu &#039;&#039;&#039;3&#039;&#039;&#039; și gradul interior egal cu &#039;&#039;&#039;3&#039;&#039;&#039;. Vârful &#039;&#039;&#039;3&#039;&#039;&#039; are gradul exterior egal cu &#039;&#039;&#039;2&#039;&#039;&#039; și gradul interior egal cu &#039;&#039;&#039;1&#039;&#039;&#039;. Vârful &#039;&#039;&#039;4&#039;&#039;&#039; are gradul exterior egal cu &#039;&#039;&#039;1&#039;&#039;&#039; și gradul interior egal cu &#039;&#039;&#039;1&#039;&#039;&#039;. Vârful &#039;&#039;&#039;5&#039;&#039;&#039; are gradul exterior egal cu &#039;&#039;&#039;1&#039;&#039;&#039; și gradul interior egal cu &#039;&#039;&#039;2&#039;&#039;&#039;.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def verifica_restrictii(n, arce):&lt;br /&gt;
    # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100) or not all(1 &amp;lt;= i &amp;lt;= n and 1 &amp;lt;= j &amp;lt;= n for i, j in arce):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def noduri_grad_divizibil(n, arce):&lt;br /&gt;
    # Inițializează gradele interioare și exterioare ale nodurilor&lt;br /&gt;
    grad_interior = [0] * (n + 1)&lt;br /&gt;
    grad_exterior = [0] * (n + 1)&lt;br /&gt;
&lt;br /&gt;
    # Calculează gradele interioare și exterioare ale nodurilor&lt;br /&gt;
    for i, j in arce:&lt;br /&gt;
        grad_exterior[i] += 1&lt;br /&gt;
        grad_interior[j] += 1&lt;br /&gt;
&lt;br /&gt;
    # Determină nodurile care au gradul exterior divizibil cu gradul interior&lt;br /&gt;
    # sau gradul interior divizibil cu gradul exterior&lt;br /&gt;
    noduri = [i for i in range(1, n + 1) if grad_interior[i] != 0 and grad_exterior[i] != 0 and&lt;br /&gt;
              (grad_exterior[i] % grad_interior[i] == 0 or grad_interior[i] % grad_exterior[i] == 0)]&lt;br /&gt;
&lt;br /&gt;
    return noduri&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, m = map(int, input().split())&lt;br /&gt;
    arce = [tuple(map(int, input().split())) for _ in range(m)]&lt;br /&gt;
&lt;br /&gt;
    # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
    if not verifica_restrictii(n, arce):&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Determină nodurile care au gradul exterior divizibil cu gradul interior&lt;br /&gt;
    # sau gradul interior divizibil cu gradul exterior&lt;br /&gt;
    noduri = noduri_grad_divizibil(n, arce)&lt;br /&gt;
&lt;br /&gt;
    # Afiseaza rezultatul&lt;br /&gt;
    if noduri:&lt;br /&gt;
        print(&#039; &#039;.join(map(str, sorted(noduri))))&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;NU EXISTA&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4153_-_Grade3&amp;diff=8973</id>
		<title>4153 - Grade3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4153_-_Grade3&amp;diff=8973"/>
		<updated>2024-01-04T14:43:45Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Se dă lista arcelor unui graf orientat. Să se determine nodurile care au gradul exterior mai mic decât gradul interior. == Date de intrare == Programul citește de la tastatură numărul &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; de noduri și numărul &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; de arce, iar apoi lista arcelor, formată din &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; perechi de forma &amp;#039;&amp;#039;&amp;#039;i j&amp;#039;&amp;#039;&amp;#039;, cu semnificația că există arc orientat de la &amp;#039;&amp;#039;&amp;#039;i&amp;#039;&amp;#039;&amp;#039; la &amp;#039;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;#039;. == Date de ieșire == Programul va afișa pe ecran numărul &amp;#039;&amp;#039;&amp;#039;C&amp;#039;&amp;#039;&amp;#039;, reprezentând num...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dă lista arcelor unui graf orientat. Să se determine nodurile care au gradul exterior mai mic decât gradul interior.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul &#039;&#039;&#039;n&#039;&#039;&#039; de noduri și numărul &#039;&#039;&#039;m&#039;&#039;&#039; de arce, iar apoi lista arcelor, formată din &#039;&#039;&#039;m&#039;&#039;&#039; perechi de forma &#039;&#039;&#039;i j&#039;&#039;&#039;, cu semnificația că există arc orientat de la &#039;&#039;&#039;i&#039;&#039;&#039; la &#039;&#039;&#039;j&#039;&#039;&#039;.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Programul va afișa pe ecran numărul &#039;&#039;&#039;C&#039;&#039;&#039;, reprezentând numărul de noduri care au gradul exterior mai mic decât cel interior, iar pe linie următoare afișează aceste noduri, ordonate crescător, separate prin exact un spațiu.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ n ≤ 100&#039;&#039;&#039;&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 6 9&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 1 5&lt;br /&gt;
 3 5&lt;br /&gt;
 4 1&lt;br /&gt;
 3 4&lt;br /&gt;
 5 1&lt;br /&gt;
 6 1&lt;br /&gt;
 6 3&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 2&lt;br /&gt;
 2 5&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 101 0&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def verifica_restrictii(n, arce):&lt;br /&gt;
    # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100) or not all(1 &amp;lt;= i &amp;lt;= n and 1 &amp;lt;= j &amp;lt;= n for i, j in arce):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def noduri_grad_exterior_mic(n, arce):&lt;br /&gt;
    # Inițializează gradele interioare și exterioare ale nodurilor&lt;br /&gt;
    grad_interior = [0] * (n + 1)&lt;br /&gt;
    grad_exterior = [0] * (n + 1)&lt;br /&gt;
&lt;br /&gt;
    # Calculează gradele interioare și exterioare ale nodurilor&lt;br /&gt;
    for i, j in arce:&lt;br /&gt;
        grad_exterior[i] += 1&lt;br /&gt;
        grad_interior[j] += 1&lt;br /&gt;
&lt;br /&gt;
    # Determină nodurile care au gradul exterior mai mic decât gradul interior&lt;br /&gt;
    noduri = [i for i in range(1, n + 1) if grad_exterior[i] &amp;lt; grad_interior[i]]&lt;br /&gt;
&lt;br /&gt;
    return noduri&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, m = map(int, input().split())&lt;br /&gt;
    arce = [tuple(map(int, input().split())) for _ in range(m)]&lt;br /&gt;
&lt;br /&gt;
    # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
    if not verifica_restrictii(n, arce):&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Determină nodurile care au gradul exterior mai mic decât gradul interior&lt;br /&gt;
    noduri = noduri_grad_exterior_mic(n, arce)&lt;br /&gt;
&lt;br /&gt;
    # Afiseaza rezultatul&lt;br /&gt;
    print(len(noduri))&lt;br /&gt;
    print(&#039; &#039;.join(map(str, sorted(noduri))))&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;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0573_-_Grade2&amp;diff=8972</id>
		<title>0573 - Grade2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0573_-_Grade2&amp;diff=8972"/>
		<updated>2024-01-04T14:39:02Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Se dă lista arcelor unui graf orientat. Să se determine nodurile care au gradul exterior egal cu gradul interior. == Date de intrare == Programul citește de la tastatură numărul &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; de noduri și numărul &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; de arce, iar apoi lista arcelor, formată din &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; perechi de forma &amp;#039;&amp;#039;&amp;#039;i&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;#039;, cu semnificația că există arc orientat de la &amp;#039;&amp;#039;&amp;#039;i&amp;#039;&amp;#039;&amp;#039; la &amp;#039;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;#039;. == Date de ieșire == Programul va afișa pe ecran numărul &amp;#039;&amp;#039;&amp;#039;C&amp;#039;&amp;#039;&amp;#039;, reprezentând num...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dă lista arcelor unui graf orientat. Să se determine nodurile care au gradul exterior egal cu gradul interior.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul &#039;&#039;&#039;n&#039;&#039;&#039; de noduri și numărul &#039;&#039;&#039;m&#039;&#039;&#039; de arce, iar apoi lista arcelor, formată din &#039;&#039;&#039;m&#039;&#039;&#039; perechi de forma &#039;&#039;&#039;i&#039;&#039;&#039; &#039;&#039;&#039;j&#039;&#039;&#039;, cu semnificația că există arc orientat de la &#039;&#039;&#039;i&#039;&#039;&#039; la &#039;&#039;&#039;j&#039;&#039;&#039;.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Programul va afișa pe ecran numărul &#039;&#039;&#039;C&#039;&#039;&#039;, reprezentând numărul de noduri care au gradul interior egal cu cel exterior, iar pe linie următoare afișează aceste noduri, ordonate crescător, separate prin exact un spațiu.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ n ≤ 100&#039;&#039;&#039;&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 6 9&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 1 5&lt;br /&gt;
 3 5&lt;br /&gt;
 4 1&lt;br /&gt;
 3 4&lt;br /&gt;
 5 1&lt;br /&gt;
 6 1&lt;br /&gt;
 6 3&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 3&lt;br /&gt;
 1 3 4&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 101 0&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def verifica_restrictii(n, arce):&lt;br /&gt;
    # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100) or not all(1 &amp;lt;= i &amp;lt;= n and 1 &amp;lt;= j &amp;lt;= n for i, j in arce):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def noduri_grad_egale(n, arce):&lt;br /&gt;
    # Inițializează gradele interioare și exterioare ale nodurilor&lt;br /&gt;
    grad_interior = [0] * (n + 1)&lt;br /&gt;
    grad_exterior = [0] * (n + 1)&lt;br /&gt;
&lt;br /&gt;
    # Calculează gradele interioare și exterioare ale nodurilor&lt;br /&gt;
    for i, j in arce:&lt;br /&gt;
        grad_exterior[i] += 1&lt;br /&gt;
        grad_interior[j] += 1&lt;br /&gt;
&lt;br /&gt;
    # Determină nodurile care au gradul interior egal cu gradul exterior&lt;br /&gt;
    noduri = [i for i in range(1, n + 1) if grad_interior[i] == grad_exterior[i]]&lt;br /&gt;
&lt;br /&gt;
    return noduri&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, m = map(int, input().split())&lt;br /&gt;
    arce = [tuple(map(int, input().split())) for _ in range(m)]&lt;br /&gt;
&lt;br /&gt;
    # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
    if not verifica_restrictii(n, arce):&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Determină nodurile care au gradul interior egal cu gradul exterior&lt;br /&gt;
    noduri = noduri_grad_egale(n, arce)&lt;br /&gt;
&lt;br /&gt;
    # Afiseaza rezultatul&lt;br /&gt;
    print(len(noduri))&lt;br /&gt;
    print(&#039; &#039;.join(map(str, sorted(noduri))))&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0586_-_GradIntNul&amp;diff=8969</id>
		<title>0586 - GradIntNul</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0586_-_GradIntNul&amp;diff=8969"/>
		<updated>2024-01-04T14:29:46Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Se dă lista arcelor unui graf orientat. Să se determine nodurile care au gradul interior nul. == Date de intrare == Programul citește de la tastatură numărul &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; de noduri și numărul &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; de arce, iar apoi lista arcelor, formată din &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; perechi de forma &amp;#039;&amp;#039;&amp;#039;i&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;#039;, cu semnificația că există arc orientat de la &amp;#039;&amp;#039;&amp;#039;i&amp;#039;&amp;#039;&amp;#039; la &amp;#039;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;#039;. == Date de ieșire == Programul va afișa pe ecran nodurile cu gradul interior nul, ordonate crescător și...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dă lista arcelor unui graf orientat. Să se determine nodurile care au gradul interior nul.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul &#039;&#039;&#039;n&#039;&#039;&#039; de noduri și numărul &#039;&#039;&#039;m&#039;&#039;&#039; de arce, iar apoi lista arcelor, formată din &#039;&#039;&#039;m&#039;&#039;&#039; perechi de forma &#039;&#039;&#039;i&#039;&#039;&#039; &#039;&#039;&#039;j&#039;&#039;&#039;, cu semnificația că există arc orientat de la &#039;&#039;&#039;i&#039;&#039;&#039; la &#039;&#039;&#039;j&#039;&#039;&#039;.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Programul va afișa pe ecran nodurile cu gradul interior nul, ordonate crescător și separate prin exact un spațiu. Dacă nu există nici un nod cu gradul interior nul, se va afișa mesajul &#039;&#039;&#039;NU EXISTA&#039;&#039;&#039;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ n ≤ 100&#039;&#039;&#039;&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 6 8&lt;br /&gt;
 1 3&lt;br /&gt;
 1 5&lt;br /&gt;
 3 5&lt;br /&gt;
 4 1&lt;br /&gt;
 3 4&lt;br /&gt;
 5 1&lt;br /&gt;
 6 1&lt;br /&gt;
 6 3&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 2 6&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 5 1&lt;br /&gt;
 1 6&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def verifica_restrictii(n, arce):&lt;br /&gt;
    # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100) or not all(1 &amp;lt;= i &amp;lt;= n and 1 &amp;lt;= j &amp;lt;= n for i, j in arce):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def noduri_grad_interior_nul(n, arce):&lt;br /&gt;
    # Inițializează gradele interioare ale nodurilor&lt;br /&gt;
    grad_interior = [0] * (n + 1)&lt;br /&gt;
&lt;br /&gt;
    # Calculează gradele interioare ale nodurilor&lt;br /&gt;
    for _, j in arce:&lt;br /&gt;
        grad_interior[j] += 1&lt;br /&gt;
&lt;br /&gt;
    # Determină nodurile care au gradul interior nul&lt;br /&gt;
    noduri = [i for i in range(1, n + 1) if grad_interior[i] == 0]&lt;br /&gt;
&lt;br /&gt;
    return noduri&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, m = map(int, input().split())&lt;br /&gt;
    arce = [tuple(map(int, input().split())) for _ in range(m)]&lt;br /&gt;
&lt;br /&gt;
    # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
    if not verifica_restrictii(n, arce):&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Determină nodurile care au gradul interior nul&lt;br /&gt;
    noduri = noduri_grad_interior_nul(n, arce)&lt;br /&gt;
&lt;br /&gt;
    # Afiseaza rezultatul&lt;br /&gt;
    if noduri:&lt;br /&gt;
        print(&#039; &#039;.join(map(str, sorted(noduri))))&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;NU EXISTA&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2632_-_Interclasari&amp;diff=8965</id>
		<title>2632 - Interclasari</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2632_-_Interclasari&amp;diff=8965"/>
		<updated>2024-01-04T11:13:15Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: Se dau &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; șiruri de numere întregi ordonate crescător, de dimensiuni &amp;#039;&amp;#039;&amp;#039;d[1]&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;d[2]&amp;#039;&amp;#039;&amp;#039;, …, &amp;#039;&amp;#039;&amp;#039;d[n]&amp;#039;&amp;#039;&amp;#039;. Dacă se interclasează șirurile de dimensiuni &amp;#039;&amp;#039;&amp;#039;d[i]&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;d[j]&amp;#039;&amp;#039;&amp;#039; atunci se efectuează &amp;#039;&amp;#039;&amp;#039;d[i]+d[j]&amp;#039;&amp;#039;&amp;#039; operații și se obține un șir de dimensiuni &amp;#039;&amp;#039;&amp;#039;d[i]+d[j]&amp;#039;&amp;#039;&amp;#039;. Trebuie interclasate toate cele &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; șiruri. Pentru aceasta sunt necesari exact &amp;#039;&amp;#039;&amp;#039;n - 1&amp;#039;&amp;#039;&amp;#039; pași. La fiecare pas se iau două șiruri, se interclasează și cele două șiruri se î...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se dau &#039;&#039;&#039;n&#039;&#039;&#039; șiruri de numere întregi ordonate crescător, de dimensiuni &#039;&#039;&#039;d[1]&#039;&#039;&#039;, &#039;&#039;&#039;d[2]&#039;&#039;&#039;, …, &#039;&#039;&#039;d[n]&#039;&#039;&#039;. Dacă se interclasează șirurile de dimensiuni &#039;&#039;&#039;d[i]&#039;&#039;&#039; și &#039;&#039;&#039;d[j]&#039;&#039;&#039; atunci se efectuează &#039;&#039;&#039;d[i]+d[j]&#039;&#039;&#039; operații și se obține un șir de dimensiuni &#039;&#039;&#039;d[i]+d[j]&#039;&#039;&#039;. Trebuie interclasate toate cele &#039;&#039;&#039;n&#039;&#039;&#039; șiruri. Pentru aceasta sunt necesari exact &#039;&#039;&#039;n - 1&#039;&#039;&#039; pași. La fiecare pas se iau două șiruri, se interclasează și cele două șiruri se înlocuiesc cu noul șir. Scopul este să se obțină un singur șir ordonat efectuând un număr minim de operații. De exemplu, dacă &#039;&#039;&#039;n=4&#039;&#039;&#039; și șirurile au dimensiunile &#039;&#039;&#039;1&#039;&#039;&#039;, &#039;&#039;&#039;5&#039;&#039;&#039;, &#039;&#039;&#039;2&#039;&#039;&#039; și &#039;&#039;&#039;5&#039;&#039;&#039;, atunci se poate interclasa mai întâi &#039;&#039;&#039;1&#039;&#039;&#039; și &#039;&#039;&#039;5&#039;&#039;&#039;, se fac &#039;&#039;&#039;6&#039;&#039;&#039; operații și rămân &#039;&#039;&#039;3&#039;&#039;&#039; șiruri de lungimi &#039;&#039;&#039;6&#039;&#039;&#039;, &#039;&#039;&#039;2&#039;&#039;&#039;, &#039;&#039;&#039;5&#039;&#039;&#039;. Se interclasează apoi &#039;&#039;&#039;2&#039;&#039;&#039; cu &#039;&#039;&#039;5&#039;&#039;&#039; cu un cost &#039;&#039;&#039;7&#039;&#039;&#039; și rămân două șiruri: &#039;&#039;&#039;6&#039;&#039;&#039; și &#039;&#039;&#039;7&#039;&#039;&#039;. Se interclasează aceasta două cu un cost de &#039;&#039;&#039;13&#039;&#039;&#039; și a rămas un singur șir. În total s-au efectuat &#039;&#039;&#039;6 + 7 + 13 = 26&#039;&#039;&#039; operații, dar acesta nu este numărul minim posibil.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Să se determine numărul minim de operații necesare pentru a interclasa cele &#039;&#039;&#039;n&#039;&#039;&#039; șiruri.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul &#039;&#039;&#039;n&#039;&#039;&#039;, iar apoi dimensiunile celor &#039;&#039;&#039;n&#039;&#039;&#039; șiruri.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Programul va afișa pe ecran numărul minim de operații.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 &amp;amp;les; n &amp;amp;les; 100.000&#039;&#039;&#039;&lt;br /&gt;
* cele &#039;&#039;&#039;n&#039;&#039;&#039; numere citite vor fi nenule și mai mici decât &#039;&#039;&#039;1.000&#039;&#039;&#039;&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 4&lt;br /&gt;
 1 5 2 5&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 24&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 5&lt;br /&gt;
 1001 1002 1003 1004 1005&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import heapq&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def numar_minim_operatii(siruri):&lt;br /&gt;
    # Calculează numărul minim de operații necesare pentru a interclasa cele n șiruri.&lt;br /&gt;
&lt;br /&gt;
    heapq.heapify(siruri)&lt;br /&gt;
    operatii = 0&lt;br /&gt;
&lt;br /&gt;
    while len(siruri) &amp;gt; 1:&lt;br /&gt;
        a = heapq.heappop(siruri)&lt;br /&gt;
        b = heapq.heappop(siruri)&lt;br /&gt;
        operatii += a + b&lt;br /&gt;
        heapq.heappush(siruri, a + b)&lt;br /&gt;
&lt;br /&gt;
    return operatii&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input().strip())&lt;br /&gt;
    siruri = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
    # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100000 and all(1 &amp;lt;= x &amp;lt; 1000 for x in siruri)):&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    operatii = numar_minim_operatii(siruri)&lt;br /&gt;
    print(f&amp;quot;{operatii}&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3264_-_Sum_Min_XI&amp;diff=8962</id>
		<title>3264 - Sum Min XI</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3264_-_Sum_Min_XI&amp;diff=8962"/>
		<updated>2024-01-04T10:58:33Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Se dă o matrice pătratică cu &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; lini şi &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; coloane şi elemente numere întregi. Determinaţi cea mai mică sumă a &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; elemente din matrice, obținută adunând câte un element de pe fiecare coloană a matricei. == Date de intrare == Fişierul de intrare &amp;#039;&amp;#039;&amp;#039;summin_xiin.txt&amp;#039;&amp;#039;&amp;#039; conţine pe prima linie numărul &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039;, iar pe următoarele &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; linii câte &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; numere întregi, separate prin spaţii, reprezentând elementele matricei. ==...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dă o matrice pătratică cu &#039;&#039;&#039;n&#039;&#039;&#039; lini şi &#039;&#039;&#039;n&#039;&#039;&#039; coloane şi elemente numere întregi. Determinaţi cea mai mică sumă a &#039;&#039;&#039;n&#039;&#039;&#039; elemente din matrice, obținută adunând câte un element de pe fiecare coloană a matricei.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare &#039;&#039;&#039;summin_xiin.txt&#039;&#039;&#039; conţine pe prima linie numărul &#039;&#039;&#039;n&#039;&#039;&#039;, iar pe următoarele &#039;&#039;&#039;n&#039;&#039;&#039; linii câte &#039;&#039;&#039;n&#039;&#039;&#039; numere întregi, separate prin spaţii, reprezentând elementele matricei.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fişierul de ieşire &#039;&#039;&#039;summin_xiout.txt&#039;&#039;&#039; va conţine pe prima linie numărul &#039;&#039;&#039;S&#039;&#039;&#039;, reprezentând suma minimă determinată.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 &amp;amp;les; n&amp;amp;les; 100&#039;&#039;&#039;&lt;br /&gt;
* elementele matricei vor avea cel mult &#039;&#039;&#039;4&#039;&#039;&#039; cifre&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; summin_xiin.txt&lt;br /&gt;
 4&lt;br /&gt;
 12 16 5 4&lt;br /&gt;
 11 14 6 7&lt;br /&gt;
 8 2 3 17&lt;br /&gt;
 10 9 13 15&lt;br /&gt;
; summin_xiout.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 17&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; summin_xiin.txt&lt;br /&gt;
 4000&lt;br /&gt;
 12 16 5 4&lt;br /&gt;
 11 14 6 7&lt;br /&gt;
 8 2 3 17&lt;br /&gt;
 10 9 13 15&lt;br /&gt;
; summin_xiout.txt&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Explicatie ==&lt;br /&gt;
&#039;&#039;&#039;17=8+2+3+4&#039;&#039;&#039;.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def suma_minima(matrice):&lt;br /&gt;
    # Calculează suma minimă a elementelor din matrice, adunând câte un element de pe fiecare coloană.&lt;br /&gt;
&lt;br /&gt;
    suma = 0&lt;br /&gt;
    for coloana in zip(*matrice):&lt;br /&gt;
        suma += min(coloana)&lt;br /&gt;
    return suma&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;summin_xiin.txt&#039;, &#039;r&#039;) as fin, open(&#039;summin_xiout.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        matrice = [list(map(int, linie.split())) for linie in fin.readlines()]&lt;br /&gt;
&lt;br /&gt;
        # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
        if not (1 &amp;lt;= n &amp;lt;= 100 and all(0 &amp;lt;= x &amp;lt; 10000 for linie in matrice for x in linie)):&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        suma = suma_minima(matrice)&lt;br /&gt;
        fout.write(f&amp;quot;{suma}\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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0556_-_Flici&amp;diff=8961</id>
		<title>0556 - Flici</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0556_-_Flici&amp;diff=8961"/>
		<updated>2024-01-04T10:51:35Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Un &amp;#039;&amp;#039;&amp;#039;flic&amp;#039;&amp;#039;&amp;#039; este o creatură pufoasă de dimensiunea unui hamster, având trei ochi și o blană colorată. De la naștere, fiecărui flic îi place în mod deosebit un anumit număr.  Hobby-ul lor este să intre în cutii, iar în lumea flicilor, pe fiecare cutie este inscripționat un număr. Flicii sunt pretențioși și nu vor alege orice cutie. În mod ideal, ar alege cutia pentru care numărul inscripționat este cel mai apropiat de numărul lor favorit...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Un &#039;&#039;&#039;flic&#039;&#039;&#039; este o creatură pufoasă de dimensiunea unui hamster, având trei ochi și o blană colorată. De la naștere, fiecărui flic îi place în mod deosebit un anumit număr.&lt;br /&gt;
&lt;br /&gt;
Hobby-ul lor este să intre în cutii, iar în lumea flicilor, pe fiecare cutie este inscripționat un număr. Flicii sunt pretențioși și nu vor alege orice cutie. În mod ideal, ar alege cutia pentru care numărul inscripționat este cel mai apropiat de numărul lor favorit, dar pentru că flicii sunt altruiști, vor alege cutiile astfel încât ceilalți flici să nu se supere prea tare.&lt;br /&gt;
&lt;br /&gt;
Astăzi s-a format un grup de &#039;&#039;&#039;n&#039;&#039;&#039; flici, fiecare cu un număr favorit, care au la dispoziție &#039;&#039;&#039;n&#039;&#039;&#039; cutii, fiecare având inscripționat un număr. Sarcina ta este să stabilești pentru fiecare flic în ce cutie va intra, astfel încât suma modulelor diferențelor dintre numărul favorit a flicului și cel inscripționat pe cutia în care intră acesta să fie minimă.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;fliciin.txt&#039;&#039;&#039; conține pe prima linie numărul &#039;&#039;&#039;n&#039;&#039;&#039;; a doua linie conține &#039;&#039;&#039;n&#039;&#039;&#039; numere naturale separate prin spații, reprezentând numerele favorite ale flicilor, iar a treia linie conține &#039;&#039;&#039;n&#039;&#039;&#039; numere naturale separate prin spații, reprezentând numerele inscripționate pe cutii.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire &#039;&#039;&#039;fliciout.txt&#039;&#039;&#039; va conține pe prima linie numărul &#039;&#039;&#039;S&#039;&#039;&#039;, reprezentând suma minimă obținută.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 &amp;amp;les; n &amp;amp;les; 100.000&#039;&#039;&#039;&lt;br /&gt;
* numerele favorite și cele inscripționate sunt numere naturale mai mici sau egale cu &#039;&#039;&#039;10.000&#039;&#039;&#039;&lt;br /&gt;
* pentru 40% din punctaj, &#039;&#039;&#039;n &amp;lt; 10&#039;&#039;&#039;&lt;br /&gt;
* pentru 80% din punctaj, &#039;&#039;&#039;n &amp;amp;les; 1.000&#039;&#039;&#039;&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; fliciin.txt&lt;br /&gt;
 3&lt;br /&gt;
 1 1 3&lt;br /&gt;
 1 2 2&lt;br /&gt;
; fliciout.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 2&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; fliciin.txt&lt;br /&gt;
 3&lt;br /&gt;
 1 1 3000000&lt;br /&gt;
 1 2 2&lt;br /&gt;
; fliciout.txt&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Explicatie ==&lt;br /&gt;
Flicul &#039;&#039;&#039;1&#039;&#039;&#039; va intra în cutia &#039;&#039;&#039;1&#039;&#039;&#039;, flicul &#039;&#039;&#039;2&#039;&#039;&#039; în a doua, flicul &#039;&#039;&#039;3&#039;&#039;&#039; în a treia, rezultând suma&lt;br /&gt;
&#039;&#039;&#039;|1-1| + |1-2| + |3-2| = 2.&#039;&#039;&#039;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def suma_minima(n, flici, cutii):&lt;br /&gt;
    # Calculează suma minimă a diferențelor dintre numărul favorit al flicului și cel inscripționat pe cutie.&lt;br /&gt;
&lt;br /&gt;
    flici.sort()&lt;br /&gt;
    cutii.sort()&lt;br /&gt;
    suma = 0&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        suma += abs(flici[i] - cutii[i])&lt;br /&gt;
&lt;br /&gt;
    return suma&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;fliciin.txt&#039;, &#039;r&#039;) as fin, open(&#039;fliciout.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        flici = list(map(int, fin.readline().split()))&lt;br /&gt;
        cutii = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
        # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
        if not (1 &amp;lt;= n &amp;lt;= 100000 and all(1 &amp;lt;= x &amp;lt;= 10000 for x in flici + cutii)):&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        suma = suma_minima(n, flici, cutii)&lt;br /&gt;
        fout.write(f&amp;quot;{suma}\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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1262_-_Sub_Secv&amp;diff=8960</id>
		<title>1262 - Sub Secv</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1262_-_Sub_Secv&amp;diff=8960"/>
		<updated>2024-01-04T10:39:51Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Se dau &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; numere naturale. Să se găsească o subsecvență astfel încât suma elementelor din această subsecvență să fie divizibilă cu &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039;. == Date de intrare == Fișierul de intrare &amp;#039;&amp;#039;&amp;#039;subsecvin.txt&amp;#039;&amp;#039;&amp;#039; conține pe prima linie numărul &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039;, iar pe a doua linie &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; numere naturale separate prin spații. == Date de ieșire == Fișierul de ieșire &amp;#039;&amp;#039;&amp;#039;subsecvout.txt&amp;#039;&amp;#039;&amp;#039; va conține pe prima linie indicele stânga al subsecvenței, respectiv...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dau &#039;&#039;&#039;n&#039;&#039;&#039; numere naturale. Să se găsească o subsecvență astfel încât suma elementelor din această subsecvență să fie divizibilă cu &#039;&#039;&#039;n&#039;&#039;&#039;.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;subsecvin.txt&#039;&#039;&#039; conține pe prima linie numărul &#039;&#039;&#039;n&#039;&#039;&#039;, iar pe a doua linie &#039;&#039;&#039;n&#039;&#039;&#039; numere naturale separate prin spații.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire &#039;&#039;&#039;subsecvout.txt&#039;&#039;&#039; va conține pe prima linie indicele stânga al subsecvenței, respectiv indicele dreapta al subsecvenței.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 &amp;amp;les; n &amp;amp;les; 10000&#039;&#039;&#039;&lt;br /&gt;
* numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât &#039;&#039;&#039;2.000.000.000&#039;&#039;&#039;&lt;br /&gt;
* în caz că există mai multe soluții se va afișa cea cu indicele stânga minim, iar dacă există mai multe soluții cu indicele stânga minim se va afișa cea cu indicele dreapta minim&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; subsecvin.txt&lt;br /&gt;
 7&lt;br /&gt;
 65 26877 13488 43 256888 53 428&lt;br /&gt;
; subsecvout.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 3 4&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; subsecvin.txt&lt;br /&gt;
 700000000&lt;br /&gt;
 65 26877 13488 43 256888 53 428&lt;br /&gt;
; subsecvout.txt&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Explicatie ==&lt;br /&gt;
Suma numerelor aflate în intervalul &#039;&#039;&#039;[3, 4]&#039;&#039;&#039; este &#039;&#039;&#039;13531&#039;&#039;&#039;, care este divizibil cu &#039;&#039;&#039;7&#039;&#039;&#039;.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def subsecventa_divizibila(n, numere):&lt;br /&gt;
    # Calculează subsecvența cu suma elementelor divizibilă cu n.&lt;br /&gt;
&lt;br /&gt;
    prefix = [0] * (n + 1)&lt;br /&gt;
    poz = [-1] * (n + 1)&lt;br /&gt;
    poz[0] = 0&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        prefix[i] = (prefix[i - 1] + numere[i - 1]) % n&lt;br /&gt;
        if poz[prefix[i]] != -1:&lt;br /&gt;
            return poz[prefix[i]] + 1, i&lt;br /&gt;
        poz[prefix[i]] = i&lt;br /&gt;
&lt;br /&gt;
    return None&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;subsecvin.txt&#039;, &#039;r&#039;) as fin, open(&#039;subsecvout.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        numere = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
        # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
        if not (1 &amp;lt;= n &amp;lt;= 10000 and all(1 &amp;lt;= x &amp;lt; 2000000000 for x in numere)):&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        subsecventa = subsecventa_divizibila(n, numere)&lt;br /&gt;
        if subsecventa is not None:&lt;br /&gt;
            fout.write(f&amp;quot;{subsecventa[0]} {subsecventa[1]}\n&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            fout.write(&amp;quot;-1\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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3624_-_Bal_1&amp;diff=8959</id>
		<title>3624 - Bal 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3624_-_Bal_1&amp;diff=8959"/>
		<updated>2024-01-04T10:28:59Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: Tocmai a ajuns la balul din sat un grup de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; fete numerotate de la &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039; la &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039;. Acolo sunt așteptate de &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; băieți frumoși, numerotați de la &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039; la &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039;. Fiecare băiat &amp;#039;&amp;#039;&amp;#039;i&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;i=1..m&amp;#039;&amp;#039;&amp;#039;) are un coeficient de frumusețe &amp;#039;&amp;#039;&amp;#039;b[i]&amp;#039;&amp;#039;&amp;#039;. Fetele nu acceptă orice băiat la dans. Fata &amp;#039;&amp;#039;&amp;#039;i&amp;#039;&amp;#039;&amp;#039; va accepta să danseze cu un băiat doar dacă băiatul are un coeficient de frumusețe mai mare sau egal cu &amp;#039;&amp;#039;&amp;#039;f[i]&amp;#039;&amp;#039;&amp;#039;. == Cerinţa == Cunoscând coeficienții...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tocmai a ajuns la balul din sat un grup de &#039;&#039;&#039;n&#039;&#039;&#039; fete numerotate de la &#039;&#039;&#039;1&#039;&#039;&#039; la &#039;&#039;&#039;n&#039;&#039;&#039;. Acolo sunt așteptate de &#039;&#039;&#039;m&#039;&#039;&#039; băieți frumoși, numerotați de la &#039;&#039;&#039;1&#039;&#039;&#039; la &#039;&#039;&#039;m&#039;&#039;&#039;. Fiecare băiat &#039;&#039;&#039;i&#039;&#039;&#039; (&#039;&#039;&#039;i=1..m&#039;&#039;&#039;) are un coeficient de frumusețe &#039;&#039;&#039;b[i]&#039;&#039;&#039;. Fetele nu acceptă orice băiat la dans. Fata &#039;&#039;&#039;i&#039;&#039;&#039; va accepta să danseze cu un băiat doar dacă băiatul are un coeficient de frumusețe mai mare sau egal cu &#039;&#039;&#039;f[i]&#039;&#039;&#039;.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Cunoscând coeficienții de frumusețe ai băieților, &#039;&#039;&#039;b[1]&#039;&#039;&#039;, &#039;&#039;&#039;b[2]&#039;&#039;&#039;, …, &#039;&#039;&#039;b[m]&#039;&#039;&#039; precum și coeficienții preferințelor fetelor, &#039;&#039;&#039;f[1]&#039;&#039;&#039;, &#039;&#039;&#039;f[2]&#039;&#039;&#039;, …, &#039;&#039;&#039;f[n]&#039;&#039;&#039;, să se determine numărul maxim de perechi de dansatori care se poate forma.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;balin.txt&#039;&#039;&#039; conține pe prima linie numerele &#039;&#039;&#039;n&#039;&#039;&#039; și &#039;&#039;&#039;m&#039;&#039;&#039;. Pe a doua linie sunt n numere naturale separate prin spații &#039;&#039;&#039;f[1]&#039;&#039;&#039;, &#039;&#039;&#039;f[2]&#039;&#039;&#039;, …, &#039;&#039;&#039;f[n]&#039;&#039;&#039; reprezentând coeficienții fetelor, iar pe a treia linie sunt numerele &#039;&#039;&#039;b[1]&#039;&#039;&#039;, &#039;&#039;&#039;b[2]&#039;&#039;&#039;, …, &#039;&#039;&#039;b[m]&#039;&#039;&#039; reprezentând coeficienții băieților.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire &#039;&#039;&#039;balout.txt&#039;&#039;&#039; va conține un singur număr natural &#039;&#039;&#039;P&#039;&#039;&#039;, reprezentând numărul perechilor &#039;&#039;&#039;(f[i], b[j])&#039;&#039;&#039; care se poate forma astfel încât &#039;&#039;&#039;f[i] &amp;amp;les; b[j]&#039;&#039;&#039;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 &amp;amp;les; n, m &amp;amp;les; 100.000&#039;&#039;&#039;&lt;br /&gt;
* coeficienții băieților și fetelor sunt numere naturale nenule mai mici sau egale cu &#039;&#039;&#039;1.000.000.000&#039;&#039;&#039;&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; balin.txt&lt;br /&gt;
 3 3&lt;br /&gt;
 4 1 5&lt;br /&gt;
 2 6 3&lt;br /&gt;
; balout.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 2&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; balin.txt&lt;br /&gt;
 3 3&lt;br /&gt;
 4 11000000000 5&lt;br /&gt;
 2 6 3&lt;br /&gt;
; balout.txt&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Explicatie ==&lt;br /&gt;
Sunt trei fete și trei băieți. Se pot forma doar două perechi: &#039;&#039;&#039;(1,2)&#039;&#039;&#039; și &#039;&#039;&#039;(4,6)&#039;&#039;&#039;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def numar_maxim_perechi(n, m, fete, baieti):&lt;br /&gt;
    # Calculează numărul maxim de perechi de dansatori care se poate forma.&lt;br /&gt;
&lt;br /&gt;
    fete.sort()&lt;br /&gt;
    baieti.sort()&lt;br /&gt;
    i = j = perechi = 0&lt;br /&gt;
&lt;br /&gt;
    while i &amp;lt; n and j &amp;lt; m:&lt;br /&gt;
        if fete[i] &amp;lt;= baieti[j]:&lt;br /&gt;
            perechi += 1&lt;br /&gt;
            i += 1&lt;br /&gt;
        j += 1&lt;br /&gt;
&lt;br /&gt;
    return perechi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;balin.txt&#039;, &#039;r&#039;) as fin, open(&#039;balout.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        n, m = map(int, fin.readline().split())&lt;br /&gt;
        fete = list(map(int, fin.readline().split()))&lt;br /&gt;
        baieti = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
        # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
        if not (1 &amp;lt;= n &amp;lt;= 100000 and 1 &amp;lt;= m &amp;lt;= 100000 and all(1 &amp;lt;= x &amp;lt;= 1000000000 for x in fete + baieti)):&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        perechi = numar_maxim_perechi(n, m, fete, baieti)&lt;br /&gt;
        fout.write(f&amp;quot;{perechi}\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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2684_-_Hard_ssc&amp;diff=8958</id>
		<title>2684 - Hard ssc</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2684_-_Hard_ssc&amp;diff=8958"/>
		<updated>2024-01-04T10:13:02Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: Se dă un șir de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; numere naturale. Șirul poate fi partiționat în mai multe moduri într-un număr de subșiruri strict crescătoare. De exemplu, șirul &amp;#039;&amp;#039;&amp;#039;4 6 2 5 8 1 3 7&amp;#039;&amp;#039;&amp;#039; poate fi partiționat astfel: &amp;#039;&amp;#039;&amp;#039;4 6 8&amp;#039;&amp;#039;&amp;#039; (primul subșir), &amp;#039;&amp;#039;&amp;#039;2 5 7&amp;#039;&amp;#039;&amp;#039; (al doilea) și &amp;#039;&amp;#039;&amp;#039;1 3&amp;#039;&amp;#039;&amp;#039; (al treilea). O altă modalitate este formând patru subșiruri: &amp;#039;&amp;#039;&amp;#039;4 5 7&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;6 8&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;2 3&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;. == Cerinţa == Să se determine numărul minim de subșiruri strict crescătoare în...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se dă un șir de &#039;&#039;&#039;n&#039;&#039;&#039; numere naturale. Șirul poate fi partiționat în mai multe moduri într-un număr de subșiruri strict crescătoare. De exemplu, șirul &#039;&#039;&#039;4 6 2 5 8 1 3 7&#039;&#039;&#039; poate fi partiționat astfel: &#039;&#039;&#039;4 6 8&#039;&#039;&#039; (primul subșir), &#039;&#039;&#039;2 5 7&#039;&#039;&#039; (al doilea) și &#039;&#039;&#039;1 3&#039;&#039;&#039; (al treilea). O altă modalitate este formând patru subșiruri: &#039;&#039;&#039;4 5 7&#039;&#039;&#039;, &#039;&#039;&#039;6 8&#039;&#039;&#039;, &#039;&#039;&#039;2 3&#039;&#039;&#039; și &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Să se determine numărul minim de subșiruri strict crescătoare în care se poate partiționa șirul.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul &#039;&#039;&#039;n&#039;&#039;&#039;, iar apoi șirul de &#039;&#039;&#039;n&#039;&#039;&#039; numere naturale, separate prin spații.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Programul va afișa pe ecran numărul minim de subșiruri strict crescătoare în care se poate partiționa șirul.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 &amp;amp;les; n &amp;amp;les; 100.000&#039;&#039;&#039;&lt;br /&gt;
* cele &#039;&#039;&#039;n&#039;&#039;&#039; numere citite vor fi mai mici decât &#039;&#039;&#039;100.000&#039;&#039;&#039;&lt;br /&gt;
* Un subșir se obține dintr-un șir prin eliminarea a zero, unul, sau mai multe elemente.&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 8&lt;br /&gt;
 4 6 2 5 8 1 3 7&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 3&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 100002&lt;br /&gt;
 12 12&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
from bisect import bisect_left&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def numar_minim_subsecvente(n, sir):&lt;br /&gt;
    # Calculează numărul minim de subșiruri strict crescătoare în care se poate partiționa șirul.&lt;br /&gt;
&lt;br /&gt;
    subsecvente = [0] * n&lt;br /&gt;
    lungime = 1&lt;br /&gt;
&lt;br /&gt;
    # Primul element al sirului este întotdeauna o subsecvență în sine&lt;br /&gt;
    subsecvente[0] = sir[0]&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        # Dacă elementul curent este mai mare decât ultimul element al subsecvenței curente,&lt;br /&gt;
        # îl adăugăm la sfârșitul subsecvenței și creștem lungimea acesteia&lt;br /&gt;
        if sir[i] &amp;gt; subsecvente[lungime - 1]:&lt;br /&gt;
            subsecvente[lungime] = sir[i]&lt;br /&gt;
            lungime += 1&lt;br /&gt;
        else:&lt;br /&gt;
            # Dacă elementul curent este mai mic sau egal cu ultimul element al subsecvenței curente,&lt;br /&gt;
            # înlocuim cel mai mare element care este mai mic sau egal cu elementul curent&lt;br /&gt;
            j = bisect_left(subsecvente, sir[i], 0, lungime)&lt;br /&gt;
            subsecvente[j] = sir[i]&lt;br /&gt;
&lt;br /&gt;
    return lungime&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input().strip())&lt;br /&gt;
    sir = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
    # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100000 and all(0 &amp;lt;= x &amp;lt; 100000 for x in sir)):&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    numar = numar_minim_subsecvente(n, sir)&lt;br /&gt;
    print(f&amp;quot;{numar}\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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2683_-_Easy_ssc&amp;diff=8957</id>
		<title>2683 - Easy ssc</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2683_-_Easy_ssc&amp;diff=8957"/>
		<updated>2024-01-04T10:07:09Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: Se dă un șir de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; numere naturale. Șirul poate fi partiționat în mai multe moduri într-un număr de subșiruri strict crescătoare. De exemplu, șirul &amp;#039;&amp;#039;&amp;#039;4 6 2 5 8 1 3 7&amp;#039;&amp;#039;&amp;#039; poate fi partiționat astfel: &amp;#039;&amp;#039;&amp;#039;4 6 8&amp;#039;&amp;#039;&amp;#039; (primul subșir), &amp;#039;&amp;#039;&amp;#039;2 5 7&amp;#039;&amp;#039;&amp;#039; (al doilea) și &amp;#039;&amp;#039;&amp;#039;1 3&amp;#039;&amp;#039;&amp;#039; (al treilea). O altă modalitate este formând patru subșiruri: &amp;#039;&amp;#039;&amp;#039;4 5 7&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;6 8&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;2 3&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;. == Cerinţa == Să se determine numărul minim de subșiruri strict crescătoare în...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se dă un șir de &#039;&#039;&#039;n&#039;&#039;&#039; numere naturale. Șirul poate fi partiționat în mai multe moduri într-un număr de subșiruri strict crescătoare. De exemplu, șirul &#039;&#039;&#039;4 6 2 5 8 1 3 7&#039;&#039;&#039; poate fi partiționat astfel: &#039;&#039;&#039;4 6 8&#039;&#039;&#039; (primul subșir), &#039;&#039;&#039;2 5 7&#039;&#039;&#039; (al doilea) și &#039;&#039;&#039;1 3&#039;&#039;&#039; (al treilea). O altă modalitate este formând patru subșiruri: &#039;&#039;&#039;4 5 7&#039;&#039;&#039;, &#039;&#039;&#039;6 8&#039;&#039;&#039;, &#039;&#039;&#039;2 3&#039;&#039;&#039; și &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Să se determine numărul minim de subșiruri strict crescătoare în care se poate partiționa șirul.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul &#039;&#039;&#039;n&#039;&#039;&#039;, iar apoi șirul de &#039;&#039;&#039;n&#039;&#039;&#039; numere naturale, separate prin spații.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Programul va afișa pe ecran numărul minim de subșiruri strict crescătoare în care se poate partiționa șirul.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 &amp;amp;les; n &amp;amp;les; 1000&#039;&#039;&#039;&lt;br /&gt;
* cele &#039;&#039;&#039;n&#039;&#039;&#039; numere citite vor fi mai mici decât &#039;&#039;&#039;50.000&#039;&#039;&#039;&lt;br /&gt;
* Un subșir se obține dintr-un șir prin eliminarea a zero, unul, sau mai multe elemente.&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 8&lt;br /&gt;
 4 6 2 5 8 1 3 7&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 3&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 10001&lt;br /&gt;
 4 6 2 5 8 1 3 7&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
from bisect import bisect_left&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def numar_minim_subsecvente(n, sir):&lt;br /&gt;
    # Calculează numărul minim de subșiruri strict crescătoare în care se poate partiționa șirul.&lt;br /&gt;
&lt;br /&gt;
    subsecvente = [0] * n&lt;br /&gt;
    lungime = 1&lt;br /&gt;
&lt;br /&gt;
    # Primul element al sirului este întotdeauna o subsecvență în sine&lt;br /&gt;
    subsecvente[0] = sir[0]&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        # Dacă elementul curent este mai mare decât ultimul element al subsecvenței curente,&lt;br /&gt;
        # îl adăugăm la sfârșitul subsecvenței și creștem lungimea acesteia&lt;br /&gt;
        if sir[i] &amp;gt; subsecvente[lungime - 1]:&lt;br /&gt;
            subsecvente[lungime] = sir[i]&lt;br /&gt;
            lungime += 1&lt;br /&gt;
        else:&lt;br /&gt;
            # Dacă elementul curent este mai mic sau egal cu ultimul element al subsecvenței curente,&lt;br /&gt;
            # înlocuim cel mai mare element care este mai mic sau egal cu elementul curent&lt;br /&gt;
            j = bisect_left(subsecvente, sir[i], 0, lungime)&lt;br /&gt;
            subsecvente[j] = sir[i]&lt;br /&gt;
&lt;br /&gt;
    return lungime&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input().strip())&lt;br /&gt;
    sir = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
    # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 1000 and all(0 &amp;lt;= x &amp;lt; 50000 for x in sir)):&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    numar = numar_minim_subsecvente(n, sir)&lt;br /&gt;
    print(f&amp;quot;{numar}\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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0932_-_Aria_Poligon_Simplu&amp;diff=8956</id>
		<title>0932 - Aria Poligon Simplu</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0932_-_Aria_Poligon_Simplu&amp;diff=8956"/>
		<updated>2024-01-04T09:50:39Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Se dau coordonatele în plan pentru &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; puncte. Să se afișeze valoarea ariei poligonului pe care acestea îl formează. == Date de intrare == Fișierul de intrare &amp;#039;&amp;#039;&amp;#039;ariapoligonsimpluin.txt&amp;#039;&amp;#039;&amp;#039; conține pe prima linie numărul de vârfuri ale poligonului, notat cu &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039;. Pe următoarele &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; linii se găsesc câte două numere separate printr-un spațiu, reprezentând abscisa respectiv ordonata câte unui vârf. Acestea sunt date într-un sens de parc...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dau coordonatele în plan pentru &#039;&#039;&#039;n&#039;&#039;&#039; puncte. Să se afișeze valoarea ariei poligonului pe care acestea îl formează.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;ariapoligonsimpluin.txt&#039;&#039;&#039; conține pe prima linie numărul de vârfuri ale poligonului, notat cu &#039;&#039;&#039;n&#039;&#039;&#039;. Pe următoarele &#039;&#039;&#039;n&#039;&#039;&#039; linii se găsesc câte două numere separate printr-un spațiu, reprezentând abscisa respectiv ordonata câte unui vârf. Acestea sunt date într-un sens de parcurgere a laturilor poligonului.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire &#039;&#039;&#039;ariapoligonsimpluout.txt&#039;&#039;&#039; va conține pe prima linie un număr real, cu exact o zecimală, reprezentând valoarea cerută.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* Numerele din fișierul de intrare sunt întregi cuprinse între &#039;&#039;&#039;-1001&#039;&#039;&#039; și &#039;&#039;&#039;1001&#039;&#039;&#039;.&lt;br /&gt;
* Poligonul nu este neapărat convex dar nu se autointersectează.&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; ariapoligonsimpluin.txt&lt;br /&gt;
 4&lt;br /&gt;
 0 0&lt;br /&gt;
 1 0&lt;br /&gt;
 1 1&lt;br /&gt;
 0 1&lt;br /&gt;
; ariapoligonsimpluout.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 1.0&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; ariapoligonsimpluin.txt&lt;br /&gt;
 4&lt;br /&gt;
 0 0&lt;br /&gt;
 1 0&lt;br /&gt;
 1 5000&lt;br /&gt;
 0 1&lt;br /&gt;
; ariapoligonsimpluout.txt&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def calculeaza_arie(puncte):&lt;br /&gt;
    # Calculează aria unui poligon dat prin coordonatele punctelor sale.&lt;br /&gt;
&lt;br /&gt;
    n = len(puncte)&lt;br /&gt;
    arie = 0.0&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        j = (i + 1) % n&lt;br /&gt;
        arie += puncte[i][0] * puncte[j][1]&lt;br /&gt;
        arie -= puncte[j][0] * puncte[i][1]&lt;br /&gt;
    arie = abs(arie) / 2.0&lt;br /&gt;
    return arie&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;ariapoligonsimpluin.txt&#039;, &#039;r&#039;) as fin, open(&#039;ariapoligonsimpluout.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        puncte = []&lt;br /&gt;
        for _ in range(n):&lt;br /&gt;
            x, y = map(int, fin.readline().split())&lt;br /&gt;
            puncte.append((x, y))&lt;br /&gt;
&lt;br /&gt;
        # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
        if not all(-1001 &amp;lt;= x &amp;lt;= 1001 and -1001 &amp;lt;= y &amp;lt;= 1001 for x, y in puncte):&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        arie = calculeaza_arie(puncte)&lt;br /&gt;
        fout.write(f&amp;quot;{arie:.1f}\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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1413_-_ConstructPalindrom&amp;diff=8954</id>
		<title>1413 - ConstructPalindrom</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1413_-_ConstructPalindrom&amp;diff=8954"/>
		<updated>2024-01-04T09:11:52Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: Mai sunt câteva săptămâni și vine Crăciunul. Ajuns într-un magazin de jucării, Robert îl roagă pe tatăl său să-i cumpere cea mai frumoasă mașină cu telecomandă. Tatăl său îi spune că nu a fost cuminte în timpul anului și nu merită această jucărie, însă după dispute intense acesta hotaraste să-i mai acorde o sansă, doar dacă va rezolva următoarea problema:  Având un string &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039;, putem să obținem un palindrom din acest șir ștergând un s...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mai sunt câteva săptămâni și vine Crăciunul. Ajuns într-un magazin de jucării, Robert îl roagă pe tatăl său să-i cumpere cea mai frumoasă mașină cu telecomandă. Tatăl său îi spune că nu a fost cuminte în timpul anului și nu merită această jucărie, însă după dispute intense acesta hotaraste să-i mai acorde o sansă, doar dacă va rezolva următoarea problema:&lt;br /&gt;
&lt;br /&gt;
Având un string &#039;&#039;&#039;S&#039;&#039;&#039;, putem să obținem un palindrom din acest șir ștergând un singur caracter?&lt;br /&gt;
&lt;br /&gt;
Robert nu se prea descurca la algoritmică așa că vă roagă foarte mult să-i rezolvați problema pentru a se putea juca cu mașina cu telecomandă. În schimbul acestei mașini el vă va recompensa cu 100 puncte.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Find dat un string &#039;&#039;&#039;S&#039;&#039;&#039;, se poate obține un palindrom din șirul inițial ștergând doar un singur caracter ?&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare &#039;&#039;&#039;constructpalindromin.txt&#039;&#039;&#039; conţine pe prima linie o valoare &#039;&#039;&#039;T&#039;&#039;&#039; reprezentând numărul de teste. Pe următoarele T linii vom avea cate un string reprezentând întrebarea adresata lui Robert de către tatăl sau.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fişierul de ieşire &#039;&#039;&#039;constructpalindromout.txt&#039;&#039;&#039; va conține &#039;&#039;&#039;T&#039;&#039;&#039; linii cu răspunsul &#039;&#039;&#039;YES&#039;&#039;&#039; daca se poate obține un palindrom ștergând un singur caracter și &#039;&#039;&#039;NO&#039;&#039;&#039; dacă nu se poate obține.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 &amp;amp;les; T &amp;amp;les; 100&#039;&#039;&#039;&lt;br /&gt;
* Dimensiunea stringului &#039;&#039;&#039;&amp;amp;les; 100000&#039;&#039;&#039;&lt;br /&gt;
* Pentru 10% din punctaj dimensiunea stringului &#039;&#039;&#039;&amp;amp;les; 1000&#039;&#039;&#039;&lt;br /&gt;
* String-ul conține caractere de la &#039;&#039;&#039;a&#039;&#039;&#039; la &#039;&#039;&#039;z&#039;&#039;&#039;.&lt;br /&gt;
* Dimensiunea string-ului după ștergerea unui caracter va fi mai mică decât a fost înainte.&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; constructpalindromin.txt&lt;br /&gt;
 4&lt;br /&gt;
 aaa&lt;br /&gt;
 abc&lt;br /&gt;
 abdbca&lt;br /&gt;
 abba&lt;br /&gt;
; constructpalindromout.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 YES&lt;br /&gt;
 NO&lt;br /&gt;
 YES&lt;br /&gt;
 YES&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; constructpalindromin.txt&lt;br /&gt;
 40000000&lt;br /&gt;
 aaa&lt;br /&gt;
 abc&lt;br /&gt;
 abdbca&lt;br /&gt;
 abba&lt;br /&gt;
; constructpalindromout.txt&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Explicatie ==&lt;br /&gt;
Pentru primul exemplu (&#039;&#039;&#039;aaa&#039;&#039;&#039;): Putem șterge orice &#039;&#039;&#039;a&#039;&#039;&#039;, string-ul rezultat este &#039;&#039;&#039;aa&#039;&#039;&#039;, care este palindrom.&lt;br /&gt;
&lt;br /&gt;
Pentru al doilea exemplu (&#039;&#039;&#039;abc&#039;&#039;&#039;): Nu este posibil să eliminăm exact un caracter și să obtinem un palindrom.&lt;br /&gt;
&lt;br /&gt;
Pentru al treilea exemplu (&#039;&#039;&#039;abdbca&#039;&#039;&#039;): ștergem caracterul &#039;&#039;&#039;c&#039;&#039;&#039;, string-ul rezultat este &#039;&#039;&#039;abdba&#039;&#039;&#039; care este palindrom.&lt;br /&gt;
&lt;br /&gt;
Pentru exemplul al patrulea (&#039;&#039;&#039;abba&#039;&#039;&#039;): Ștergem &#039;&#039;&#039;b&#039;&#039;&#039;, obținem &#039;&#039;&#039;aba&#039;&#039;&#039; care este palindrom.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def is_palindrome(s):&lt;br /&gt;
    # Funcția verifică dacă un șir este palindrom.&lt;br /&gt;
&lt;br /&gt;
    return s == s[::-1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def can_form_palindrome(s):&lt;br /&gt;
    # Funcția verifică dacă se poate forma un palindrom ștergând un singur caracter din șirul s.&lt;br /&gt;
&lt;br /&gt;
    for i in range(len(s)):&lt;br /&gt;
        t = s[:i] + s[i + 1:]&lt;br /&gt;
        if is_palindrome(t):&lt;br /&gt;
            return True&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;constructpalindromin.txt&#039;, &#039;r&#039;) as fin, open(&#039;constructpalindromout.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        t = int(fin.readline().strip())&lt;br /&gt;
&lt;br /&gt;
        # Verificăm dacă numărul de teste respectă restricțiile&lt;br /&gt;
        if not (1 &amp;lt;= t &amp;lt;= 100):&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        for _ in range(t):&lt;br /&gt;
            s = fin.readline().strip()&lt;br /&gt;
&lt;br /&gt;
            # Verificăm dacă șirul respectă restricțiile&lt;br /&gt;
            if len(s) &amp;gt; 100000:&lt;br /&gt;
                fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
                return&lt;br /&gt;
&lt;br /&gt;
            # Verificăm dacă se poate forma un palindrom și scriem rezultatul în fișierul de ieșire&lt;br /&gt;
            fout.write(&#039;YES\n&#039; if can_form_palindrome(s) else &#039;NO\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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0888_-_ChangeCase&amp;diff=8906</id>
		<title>0888 - ChangeCase</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0888_-_ChangeCase&amp;diff=8906"/>
		<updated>2024-01-03T19:51:18Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Cele mai multe editoare de text moderne oferă utilizatorilor o serie de opțiuni pentru modificarea textului grupate sub numele &amp;#039;&amp;#039;&amp;#039;Change Case&amp;#039;&amp;#039;&amp;#039;. Aceste opțiuni sunt:   1. &amp;#039;&amp;#039;&amp;#039;lowercase&amp;#039;&amp;#039;&amp;#039; – toate literele din text sunt transformate în litere mici. Celelalte caractere rămân neschimbate;  2. &amp;#039;&amp;#039;&amp;#039;UPPERCASE&amp;#039;&amp;#039;&amp;#039; – toate literele din text sunt transformate în litere mari. Celelalte caractere rămân neschimbate;  3. &amp;#039;&amp;#039;&amp;#039;TitleCase&amp;#039;&amp;#039;&amp;#039; – primul caracter a fiec...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Cele mai multe editoare de text moderne oferă utilizatorilor o serie de opțiuni pentru modificarea textului grupate sub numele &#039;&#039;&#039;Change Case&#039;&#039;&#039;. Aceste opțiuni sunt:&lt;br /&gt;
&lt;br /&gt;
 1. &#039;&#039;&#039;lowercase&#039;&#039;&#039; – toate literele din text sunt transformate în litere mici. Celelalte caractere rămân neschimbate;&lt;br /&gt;
 2. &#039;&#039;&#039;UPPERCASE&#039;&#039;&#039; – toate literele din text sunt transformate în litere mari. Celelalte caractere rămân neschimbate;&lt;br /&gt;
 3. &#039;&#039;&#039;TitleCase&#039;&#039;&#039; – primul caracter a fiecărui cuvânt se transformă în literă mare, dacă este literă; celelalte litere se transformă în litere mici;&lt;br /&gt;
 4. &#039;&#039;&#039;iNVERTcASE&#039;&#039;&#039; – primul caracter a fiecărui cuvânt se transformă în literă mică, dacă este literă; celelalte litere se transformă în litere mari;&lt;br /&gt;
 5. &#039;&#039;&#039;Sentencecase&#039;&#039;&#039; – prima literă a fiecărei propoziții este transformată în literă mare, celelalte în litere mici.&lt;br /&gt;
Se dă un sir de caractere format din litere mari și mici ale alfabetului englez, cifre, spații și semnele de punctuație &#039;&#039;&#039;.,;&#039;&#039;&#039;, în care cuvintele sunt alcătuite din litere sau cifre, iar propozițiile sunt separate prin punct (&#039;&#039;&#039;.&#039;&#039;&#039;), precum și o transformare dintre cele date care trebuie aplicată.&lt;br /&gt;
&lt;br /&gt;
Aplicați asupra șirului dat transformarea precizată și afișați șirul.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;changecasein.txt&#039;&#039;&#039; conține pe prima linie unul dintre cuvintele &#039;&#039;&#039;lowercase UPPERCASE TitleCase iNVERTcASE Sentencecase&#039;&#039;&#039;, iar pe a doua linie șirul dat.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire &#039;&#039;&#039;changecaseout.txt&#039;&#039;&#039; va conține pe prima linie șirul transformat în concordanță cu operația precizată.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* șirul dat va avea cel mult &#039;&#039;&#039;255&#039;&#039;&#039; de caractere.&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; changecasein.txt&lt;br /&gt;
 UPPERCASE&lt;br /&gt;
 Ana are   mere. Multe&lt;br /&gt;
; changecaseout.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 51 223 19 37 111&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; changecasein.txt&lt;br /&gt;
 Ana are mereAna are mereAna are mereAna are mereAna are mereAna are mereAna are mereAna are mereAna are mereAna are mereAna are mereAna are mereAna are mereAna are mereAna are mereAna are mereAna are mereAna are mereAna are mereAna are mereAna are mereAna are mere&lt;br /&gt;
; changecaseout.txt&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def change_case(case, s):&lt;br /&gt;
    # Funcția aplică transformarea specificată asupra șirului s.&lt;br /&gt;
&lt;br /&gt;
    if case == &#039;lowercase&#039;:&lt;br /&gt;
        return s.lower()&lt;br /&gt;
    elif case == &#039;UPPERCASE&#039;:&lt;br /&gt;
        return s.upper()&lt;br /&gt;
    elif case == &#039;TitleCase&#039;:&lt;br /&gt;
        return s.title()&lt;br /&gt;
    elif case == &#039;iNVERTcASE&#039;:&lt;br /&gt;
        return s.swapcase()&lt;br /&gt;
    elif case == &#039;Sentencecase&#039;:&lt;br /&gt;
        return &#039;. &#039;.join(sentence.capitalize() for sentence in s.split(&#039;. &#039;))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;changecasein.txt&#039;, &#039;r&#039;) as fin, open(&#039;changecaseout.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        case = fin.readline().strip()&lt;br /&gt;
        s = fin.readline().strip()&lt;br /&gt;
&lt;br /&gt;
        # Verificăm dacă șirul respectă restricțiile&lt;br /&gt;
        if len(s) &amp;gt; 255:&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Aplicăm transformarea și scriem șirul rezultat în fișierul de ieșire&lt;br /&gt;
        fout.write(change_case(case, s) + &#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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2344_-_Dvorak&amp;diff=8905</id>
		<title>2344 - Dvorak</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2344_-_Dvorak&amp;diff=8905"/>
		<updated>2024-01-03T19:40:39Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Enunt == &amp;#039;&amp;#039;&amp;#039;R.&amp;#039;&amp;#039;&amp;#039; a descoperit de curând tastatura &amp;#039;&amp;#039;&amp;#039;DVORAK&amp;#039;&amp;#039;&amp;#039; și s-a decis că poate scrie mult mai rapid și mai corect cod folosind această tastatură decât folosind tastatura &amp;#039;&amp;#039;&amp;#039;QWERTY&amp;#039;&amp;#039;&amp;#039;. Plictisindu-se, &amp;#039;&amp;#039;&amp;#039;R&amp;#039;&amp;#039;&amp;#039;. a creat, pentru a onora tastatura lui preferată, &amp;#039;&amp;#039;&amp;#039;transformarea&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;dvorak&amp;#039;&amp;#039;&amp;#039;, care se realizează prin înlocuirea fiecărei litere dintr-un șir de caractere cu corespondența acesteia dintr-o permutare dată a alfabetului englez. De exemplu, cuv...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
&#039;&#039;&#039;R.&#039;&#039;&#039; a descoperit de curând tastatura &#039;&#039;&#039;DVORAK&#039;&#039;&#039; și s-a decis că poate scrie mult mai rapid și mai corect cod folosind această tastatură decât folosind tastatura &#039;&#039;&#039;QWERTY&#039;&#039;&#039;. Plictisindu-se, &#039;&#039;&#039;R&#039;&#039;&#039;. a creat, pentru a onora tastatura lui preferată, &#039;&#039;&#039;transformarea&#039;&#039;&#039; &#039;&#039;&#039;dvorak&#039;&#039;&#039;, care se realizează prin înlocuirea fiecărei litere dintr-un șir de caractere cu corespondența acesteia dintr-o permutare dată a alfabetului englez. De exemplu, cuvântul &#039;&#039;&#039;informatica&#039;&#039;&#039; poate să devină, printr-o transformare dvorak, &#039;&#039;&#039;cburpmaycja&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;H.&#039;&#039;&#039;, profitor din fire, a decis să intre pe calculatorul lui &#039;&#039;&#039;R.&#039;&#039;&#039; și să îi fure sursele valoroase de la problemele “rupere” pe care le-a rezolvat.&lt;br /&gt;
&lt;br /&gt;
Dar &#039;&#039;&#039;R.&#039;&#039;&#039; şi-a securizat calculatorul cu o parolă (constând într-o succesiune de litere mici ale alfabetului englez). Din când în când, &#039;&#039;&#039;R.&#039;&#039;&#039; își modifică o parte din parolă efectuând următoarea operație: alege două poziții în parolă &#039;&#039;&#039;Si&#039;&#039;&#039; (capăt stânga) si &#039;&#039;&#039;Di&#039;&#039;&#039; (capăt dreapta) apoi aplică transformarea dvorak asupra secvenței formată din caracterele situate în parolă pe poziții din intervalul &#039;&#039;&#039;[Si&#039;&#039;&#039;, &#039;&#039;&#039;Di]&#039;&#039;&#039;. Această operație este de tipul &#039;&#039;&#039;1&#039;&#039;&#039; și este codificată prin: &#039;&#039;&#039;1 Si Di&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Acum &#039;&#039;&#039;H.&#039;&#039;&#039; are nevoie de ajutorul vostru ca să afle parola şi să furați împreună toate sursele ca sa fiți primii la statistici pe Varena). Din când în când, el vă va da câte un sir de caractere nevid (&#039;&#039;&#039;SIR&#039;&#039;&#039;) și vă va întreba dacă acest șir se regăsește ca subsecvență în parola lui &#039;&#039;&#039;R.&#039;&#039;&#039; Această operație este de tipul &#039;&#039;&#039;2&#039;&#039;&#039; și este codificată prin: &#039;&#039;&#039;2 SIR&#039;&#039;&#039;&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Cunoscându-se permutarea dată, parola lui &#039;&#039;&#039;R.&#039;&#039;&#039; precum și o succesiune de &#039;&#039;&#039;Q&#039;&#039;&#039; operații de tipul &#039;&#039;&#039;1&#039;&#039;&#039; sau &#039;&#039;&#039;2&#039;&#039;&#039;, găsiți răspunsurile la întrebările toate lui &#039;&#039;&#039;H.&#039;&#039;&#039;&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Pe prima linie a fișierului &#039;&#039;&#039;dvorakin.txt&#039;&#039;&#039; se va afla numărul natural Q reprezentând numărul de operații din succesiunea dată.&lt;br /&gt;
Pe cea de-a doua linie se va afla &#039;&#039;&#039;permutarea dată&#039;&#039;&#039; pentru &#039;&#039;&#039;transformarea dvorak&#039;&#039;&#039;.&lt;br /&gt;
Pe cea de-a treia linie se va afla un sir de caractere litere mici, reprezentând &#039;&#039;&#039;parola inițială&#039;&#039;&#039; a lui &#039;&#039;&#039;R.&#039;&#039;&#039;&lt;br /&gt;
Pe fiecare dintre următoarele &#039;&#039;&#039;Q&#039;&#039;&#039; linii se află câte o operație de tip &#039;&#039;&#039;1&#039;&#039;&#039; sau &#039;&#039;&#039;2&#039;&#039;&#039;, codificate ca în enunț.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Pe fiecare linie a fișierului &#039;&#039;&#039;dvorakout.txt&#039;&#039;&#039; se va afla răspunsul pentru fiecare dintre intrebările lui &#039;&#039;&#039;H.&#039;&#039;&#039;, în ordinea în care apar în fișierul de intrare: răspundeti cu &#039;&#039;&#039;Da&#039;&#039;&#039; dacă șirul se regăsește ca subsecvență în parola și &#039;&#039;&#039;Nu&#039;&#039;&#039; altfel.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 &amp;amp;les; Q &amp;amp;les; 500&#039;&#039;&#039;&lt;br /&gt;
* Fiecare al &#039;&#039;&#039;i&#039;&#039;&#039;-lea element al permutării date reprezintă litera în care se transformă cel de-al &#039;&#039;&#039;i&#039;&#039;&#039;-lea caracter din alfabetul englez într-o transformare dvorak&lt;br /&gt;
* Se garantează că fiecare literă din permutarea dată apare o singură dată, iar permutarea are fix &#039;&#039;&#039;26&#039;&#039;&#039; de caractere&lt;br /&gt;
* Parola este un șir de cel mult &#039;&#039;&#039;500&#039;&#039;&#039; de litere mici ale alfabetului englez.&lt;br /&gt;
* Pozițiile caracterelor din parolă sunt numerotate incepând de la &#039;&#039;&#039;1&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;1 &amp;amp;les; Si &amp;amp;les;  Di &amp;amp;les;&#039;&#039;&#039; lungimea parolei&lt;br /&gt;
* Intervalele &#039;&#039;&#039;[Si&#039;&#039;&#039;, &#039;&#039;&#039;Di]&#039;&#039;&#039; corespunzătoare operației &#039;&#039;&#039;1&#039;&#039;&#039; se pot suprapune&lt;br /&gt;
* Șirul &#039;&#039;&#039;SIR&#039;&#039;&#039; pentru operația &#039;&#039;&#039;2&#039;&#039;&#039; are cel mult &#039;&#039;&#039;500&#039;&#039;&#039; de caractere&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; dvorakin.txt&lt;br /&gt;
 6&lt;br /&gt;
 ifynmlbkpduogahqzsjxcervwt&lt;br /&gt;
 olimpiadadeinformatica&lt;br /&gt;
 1 1 6&lt;br /&gt;
 2 info&lt;br /&gt;
 2 olimpiada&lt;br /&gt;
 1 8 15&lt;br /&gt;
 1 9 14&lt;br /&gt;
 2 olimpiadadeinformaticaecool5&lt;br /&gt;
; dvorakout.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 Da&lt;br /&gt;
 Nu&lt;br /&gt;
 Nu&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; dvorakin.txt&lt;br /&gt;
 6&lt;br /&gt;
 ASDASD&lt;br /&gt;
; dvorakout.txt&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Explicatie ==&lt;br /&gt;
După prima operație, parola se transformă în &#039;&#039;&#039;hopgqpadadeinformatica&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La a doua operație se răspunde cu &#039;&#039;&#039;Da&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
La a treia operație se răspunde cu &#039;&#039;&#039;Nu&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
După a patra operație, parola se transformă în &#039;&#039;&#039;hopgqpaninmpalhrmatica&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
După a cincea operație, parola se transformă în &#039;&#039;&#039;hopgqpanpagqiohrmatica&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
La a șasea operație se răspunde cu &#039;&#039;&#039;Nu&#039;&#039;&#039;.&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 transform(s, perm, la, r):&lt;br /&gt;
    # Funcția aplică transformarea dvorak pe un substring al șirului s.&lt;br /&gt;
&lt;br /&gt;
    return s[:la] + &#039;&#039;.join(perm[ord(c) - ord(&#039;a&#039;)] for c in s[la:r]) + s[r:]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;dvorakin.txt&#039;, &#039;r&#039;) as fin, open(&#039;dvorakout.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        q = int(fin.readline().strip())&lt;br /&gt;
        perm = fin.readline().strip()&lt;br /&gt;
        s = fin.readline().strip()&lt;br /&gt;
&lt;br /&gt;
        # Verificăm dacă datele de intrare respectă restricțiile&lt;br /&gt;
        if not (1 &amp;lt;= q &amp;lt;= 500) or len(s) &amp;gt; 500 or len(set(perm)) != 26:&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        for _ in range(q):&lt;br /&gt;
            op = fin.readline().strip().split()&lt;br /&gt;
            if op[0] == &#039;1&#039;:&lt;br /&gt;
                # Aplicăm transformarea dvorak&lt;br /&gt;
                s = transform(s, perm, int(op[1]) - 1, int(op[2]))&lt;br /&gt;
            else:&lt;br /&gt;
                # Verificăm dacă șirul se regăsește ca subsecvență în parola&lt;br /&gt;
                fout.write(&#039;Da\n&#039; if op[1] in s else &#039;Nu\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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2321_-_HappyNY2018&amp;diff=8903</id>
		<title>2321 - HappyNY2018</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2321_-_HappyNY2018&amp;diff=8903"/>
		<updated>2024-01-03T19:08:01Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Alba ca Zapada == şi cei &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; pitici locuiau încă în căsuţa lor din pădure. Piticilor le făcuse cadou Moş Crăciun câte un număr şi fiecare pitic s-a hotărât să scrie numărul primit ca sumă de &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; numere naturale.  == Cerinţa == Dându-se cele &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; numere naturale primite de pitici, să se afle, pentru fiecare pitic, cele &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; numere a căror sumă este egală cu numărul primit de pitic, astfel încât cel mai mic dintre numerele din sumă s...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Alba ca Zapada ==&lt;br /&gt;
şi cei &#039;&#039;&#039;n&#039;&#039;&#039; pitici locuiau încă în căsuţa lor din pădure. Piticilor le făcuse cadou Moş Crăciun câte un număr şi fiecare pitic s-a hotărât să scrie numărul primit ca sumă de &#039;&#039;&#039;m&#039;&#039;&#039; numere naturale.&lt;br /&gt;
&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Dându-se cele &#039;&#039;&#039;n&#039;&#039;&#039; numere naturale primite de pitici, să se afle, pentru fiecare pitic, cele &#039;&#039;&#039;m&#039;&#039;&#039; numere a căror sumă este egală cu numărul primit de pitic, astfel încât cel mai mic dintre numerele din sumă să fie maxim posibil, iar diferenţa dintre cel mai mare număr din sumă şi cel mai mic să fie minimă.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numerele &#039;&#039;&#039;n&#039;&#039;&#039; şi &#039;&#039;&#039;m&#039;&#039;&#039;, iar apoi de pe a doua linie &#039;&#039;&#039;n&#039;&#039;&#039; numere naturale, separate prin spații, reprezentând numerele primite de pitici.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Programul va afișa pe ecran, pe primele &#039;&#039;&#039;n&#039;&#039;&#039; linii, câte &#039;&#039;&#039;m&#039;&#039;&#039; numere, reprezentând numerele cerute pentru fiecare pitic, în ordine crescătoare.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 &amp;amp;les; n &amp;amp;les; 2017&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;2 &amp;amp;les; m &amp;amp;les; 2018&#039;&#039;&#039;&lt;br /&gt;
* cele &#039;&#039;&#039;n&#039;&#039;&#039; numere citite vor fi mai mici decât &#039;&#039;&#039;1.000.000&#039;&#039;&#039;&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 1 2&lt;br /&gt;
 5&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 2 3&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 3000 3000&lt;br /&gt;
 3000&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Explicatie ==&lt;br /&gt;
Avem un pitic care a primit numărul &#039;&#039;&#039;5&#039;&#039;&#039; şi trebuie să-l scrie ca sumă de două numere naturale : &#039;&#039;&#039;2+3=5&#039;&#039;&#039;. Cel mai mic dintre cele două numere este maxim (&#039;&#039;&#039;2&#039;&#039;&#039;).&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def find_numbers(n, m):&lt;br /&gt;
    # Funcția găsește m numere a căror sumă este egală cu n,&lt;br /&gt;
    # astfel încât cel mai mic număr să fie maxim posibil și diferența dintre&lt;br /&gt;
    # cel mai mare număr și cel mai mic să fie minimă.&lt;br /&gt;
&lt;br /&gt;
    # Calculăm cât de mari pot fi numerele&lt;br /&gt;
    q, r = divmod(n, m)&lt;br /&gt;
    # Primele r numere vor fi cu 1 mai mari decât restul&lt;br /&gt;
    return [q + 1] * r + [q] * (m - r)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, m = map(int, input().strip().split())&lt;br /&gt;
    numbers = list(map(int, input().strip().split()))&lt;br /&gt;
&lt;br /&gt;
    # Verificăm dacă numerele respectă restricțiile&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 2017) or not (2 &amp;lt;= m &amp;lt;= 2018) or any(number &amp;gt;= 1000000 for number in numbers):&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Pentru fiecare număr, găsim m numere a căror sumă este egală cu numărul&lt;br /&gt;
    for number in numbers:&lt;br /&gt;
        print(&#039; &#039;.join(map(str, sorted(find_numbers(number, 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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2890_-_Base_Convertor&amp;diff=8889</id>
		<title>2890 - Base Convertor</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2890_-_Base_Convertor&amp;diff=8889"/>
		<updated>2024-01-03T16:25:34Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Se dă numărul &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; în baza &amp;#039;&amp;#039;&amp;#039;b&amp;#039;&amp;#039;&amp;#039;, să se afișeze numărul &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; în convertit în baza &amp;#039;&amp;#039;&amp;#039;c&amp;#039;&amp;#039;&amp;#039;. == Date de intrare == Fișierul de intrare &amp;#039;&amp;#039;&amp;#039;base_converterin.txt&amp;#039;&amp;#039;&amp;#039; conține pe prima linie numerele &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;b&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;c&amp;#039;&amp;#039;&amp;#039;, separate prin spații. == Date de ieșire == Fișierul de ieșire &amp;#039;&amp;#039;&amp;#039;base_converterout.txt&amp;#039;&amp;#039;&amp;#039; va conține pe prima linie numărul &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; în baza &amp;#039;&amp;#039;&amp;#039;c&amp;#039;&amp;#039;&amp;#039;. == Restricţii şi precizări == * la afișarea numerelor în baze mai m...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dă numărul &#039;&#039;&#039;n&#039;&#039;&#039; în baza &#039;&#039;&#039;b&#039;&#039;&#039;, să se afișeze numărul &#039;&#039;&#039;n&#039;&#039;&#039; în convertit în baza &#039;&#039;&#039;c&#039;&#039;&#039;.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;base_converterin.txt&#039;&#039;&#039; conține pe prima linie numerele &#039;&#039;&#039;n&#039;&#039;&#039;, &#039;&#039;&#039;b&#039;&#039;&#039;, &#039;&#039;&#039;c&#039;&#039;&#039;, separate prin spații.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire &#039;&#039;&#039;base_converterout.txt&#039;&#039;&#039; va conține pe prima linie numărul &#039;&#039;&#039;n&#039;&#039;&#039; în baza &#039;&#039;&#039;c&#039;&#039;&#039;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* la afișarea numerelor în baze mai mare decât &#039;&#039;&#039;10&#039;&#039;&#039;, cifrele mai mari decât &#039;&#039;&#039;9&#039;&#039;&#039; sunt înlocuite cu litere mari din alfabetul englez (&#039;&#039;&#039;10&#039;&#039;&#039; cu &#039;&#039;&#039;A&#039;&#039;&#039;, &#039;&#039;&#039;11&#039;&#039;&#039; cu &#039;&#039;&#039;B&#039;&#039;&#039;, etc.);&lt;br /&gt;
* &#039;&#039;&#039;1≤nrcif(n(b))≤1585&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;2≤b≤36&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;2≤c≤36&#039;&#039;&#039;&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; base_converterin.txt&lt;br /&gt;
 26 17 11&lt;br /&gt;
; base_converterout.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 37&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; base_converterin.txt&lt;br /&gt;
 26 40 11&lt;br /&gt;
; base_converterout.txt&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def base_converter(n, b, c):&lt;br /&gt;
    # Funcția convertește numărul n din baza b în baza c.&lt;br /&gt;
&lt;br /&gt;
    # Convertim numărul n din baza b în baza 10&lt;br /&gt;
    n_in_base_10 = int(n, b)&lt;br /&gt;
&lt;br /&gt;
    # Convertim numărul n din baza 10 în baza c&lt;br /&gt;
    n_in_base_c = &#039;&#039;&lt;br /&gt;
    while n_in_base_10 &amp;gt; 0:&lt;br /&gt;
        n_in_base_10, remainder = divmod(n_in_base_10, c)&lt;br /&gt;
        if 0 &amp;lt;= remainder &amp;lt;= 9:&lt;br /&gt;
            n_in_base_c = str(remainder) + n_in_base_c&lt;br /&gt;
        else:&lt;br /&gt;
            n_in_base_c = chr(ord(&#039;A&#039;) + remainder - 10) + n_in_base_c&lt;br /&gt;
&lt;br /&gt;
    return n_in_base_c&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;base_converterin.txt&#039;, &#039;r&#039;) as fin, open(&#039;base_converterout.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        n, b, c = fin.readline().strip().split()&lt;br /&gt;
        b = int(b)&lt;br /&gt;
        c = int(c)&lt;br /&gt;
&lt;br /&gt;
        # Verificăm dacă datele de intrare respectă restricțiile&lt;br /&gt;
        if len(n) &amp;gt; 1585 or not (2 &amp;lt;= b &amp;lt;= 36) or not (2 &amp;lt;= c &amp;lt;= 36):&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Convertim numărul n din baza b în baza c și scriem rezultatul în fișierul de ieșire&lt;br /&gt;
        fout.write(base_converter(n, b, c) + &#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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0853_-_Cadouri&amp;diff=8886</id>
		<title>0853 - Cadouri</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0853_-_Cadouri&amp;diff=8886"/>
		<updated>2024-01-03T16:17:21Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Elevii clasei a X-a s-au implicat în strângerea de cadouri pentru Crăciun. Fiecare elev a adus mai multe cadouri, și a trimis prin email șefului clasei o urare, însoțită de lista cadourilor. Fiecare email are forma: &amp;#039;&amp;#039;&amp;#039;urare lista_cadouri&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;urare&amp;#039;&amp;#039;&amp;#039; este un text care nu conţine cifre. Lista cadourilor constă într-o enumerare a cadourilor: &amp;#039;&amp;#039;&amp;#039;numar_cadouri denumire_cadou&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;numar_cadouri&amp;#039;&amp;#039;&amp;#039; este un număr natural, iar &amp;#039;&amp;#039;&amp;#039;denumire_cadou&amp;#039;&amp;#039;&amp;#039; este...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Elevii clasei a X-a s-au implicat în strângerea de cadouri pentru Crăciun. Fiecare elev a adus mai multe cadouri, și a trimis prin email șefului clasei o urare, însoțită de lista cadourilor. Fiecare email are forma:&lt;br /&gt;
&#039;&#039;&#039;urare lista_cadouri&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;urare&#039;&#039;&#039; este un text care nu conţine cifre. Lista cadourilor constă într-o enumerare a cadourilor:&lt;br /&gt;
&#039;&#039;&#039;numar_cadouri denumire_cadou&#039;&#039;&#039;&lt;br /&gt;
(&#039;&#039;&#039;numar_cadouri&#039;&#039;&#039; este un număr natural, iar &#039;&#039;&#039;denumire_cadou&#039;&#039;&#039; este un cuvânt scris cu litere mici ale alfabetului englez; &#039;&#039;&#039;numar_cadouri&#039;&#039;&#039; şi &#039;&#039;&#039;denumire_cadou&#039;&#039;&#039; sunt separate prin cel puţin un spaţiu), cadourile din listă fiind separate prin spaţii şi/sau diverse semne de punctuaţie&lt;br /&gt;
&lt;br /&gt;
Şeful clasei trebuie să centralizeze listele primite. Ajutaţi-l să construiască o listă a care să conţină denumirea fiecărui cadou şi numărul total de cadouri de acel tip (cantitatea). Lista va fi ordonată descrescător după cantitate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;cadouriin.txt&#039;&#039;&#039; conține pe prima linie numărul &#039;&#039;&#039;n&#039;&#039;&#039; de elevi din clasa a X-a; fiecare dintre următoarele &#039;&#039;&#039;n&#039;&#039;&#039; linii, conţine câte un email.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire &#039;&#039;&#039;cadouriout.txt&#039;&#039;&#039; va conține pe prima linie numărul de cadouri diferite &#039;&#039;&#039;C&#039;&#039;&#039;; următoarele &#039;&#039;&#039;C&#039;&#039;&#039; linii vor conţine câte un cadou şi cantitatea totală, separate prin exact un spaţiu. Lista cadouri va fi ordonată descrescător după cantitate. Dacă există mai multe cadouri cu aceeaşi cantitate, se va afişa mai întâi cadoul cu denumirea mai mică din punct de vedere lexicografic.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 &amp;amp;les; n &amp;amp;les; 100&#039;&#039;&#039;&lt;br /&gt;
* fiecare linie a fişierului de intrare conţine cel mult &#039;&#039;&#039;255&#039;&#039;&#039; caractere&lt;br /&gt;
* sunt cel mult &#039;&#039;&#039;500&#039;&#039;&#039; de cadouri diferite cu denumirea de cel mult &#039;&#039;&#039;20&#039;&#039;&#039; de litere ale afabetului englez&lt;br /&gt;
* cantitatea din fiecare cadou este cel mult &#039;&#039;&#039;100.000&#039;&#039;&#039;&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; cadouriin.txt&lt;br /&gt;
 3&lt;br /&gt;
 La multi ani! 4 papusi, 15 ciocolate , 20 sosete.&lt;br /&gt;
 Sarbatori fericite :) ! 3 ciocolate , 10 biscuiti, 5 papusi&lt;br /&gt;
 Salut. 2 ciocolate , 1 papusi. 1 ciocolate!&lt;br /&gt;
; cadouriout.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 4&lt;br /&gt;
 ciocolate 21&lt;br /&gt;
 sosete 20&lt;br /&gt;
 biscuiti 10&lt;br /&gt;
 papusi 10&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; cadouriin.txt&lt;br /&gt;
 1000&lt;br /&gt;
 La multi ani! 40 ab, 15 ciocolate , 20 sosete.&lt;br /&gt;
 Sarbatori fericite :) ! 3 ciocolateciocolateciocolate , 10 biscuiti, 5 papusi&lt;br /&gt;
 Salut. 2 ciocolate , 1 papusi. 1 ciocolate!&lt;br /&gt;
; cadouriout.txt&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import re&lt;br /&gt;
from collections import Counter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def process_emails(emails):&lt;br /&gt;
    # Funcția procesează emailurile și returnează un dicționar&lt;br /&gt;
    # cu denumirea fiecărui cadou și numărul total de cadouri de acel tip.&lt;br /&gt;
&lt;br /&gt;
    gifts = Counter()&lt;br /&gt;
    for email in emails:&lt;br /&gt;
        # Extragem lista de cadouri din email&lt;br /&gt;
        gift_list = re.findall(r&#039;(\d+) (\w+)&#039;, email)&lt;br /&gt;
        for count, gift in gift_list:&lt;br /&gt;
            gifts[gift] += int(count)&lt;br /&gt;
    return gifts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;cadouriin.txt&#039;, &#039;r&#039;) as fin, open(&#039;cadouriout.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        emails = [fin.readline().strip() for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
        # Verificăm dacă emailurile respectă restricțiile&lt;br /&gt;
        if len(emails) &amp;gt; 100 or any(len(email) &amp;gt; 255 for email in emails):&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Procesăm emailurile și obținem numărul total de cadouri de fiecare tip&lt;br /&gt;
        gifts = process_emails(emails)&lt;br /&gt;
&lt;br /&gt;
        # Sortăm cadourile în ordine descrescătoare a numărului de cadouri și lexicografică&lt;br /&gt;
        sorted_gifts = sorted(gifts.items(), key=lambda x: (-x[1], x[0]))&lt;br /&gt;
&lt;br /&gt;
        # Scriem numărul de cadouri diferite și lista de cadouri în fișierul de ieșire&lt;br /&gt;
        fout.write(str(len(sorted_gifts)) + &#039;\n&#039;)&lt;br /&gt;
        for gift, count in sorted_gifts:&lt;br /&gt;
            fout.write(f&#039;{gift} {count}\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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3054_-_PrimeXXL&amp;diff=8882</id>
		<title>3054 - PrimeXXL</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3054_-_PrimeXXL&amp;diff=8882"/>
		<updated>2024-01-03T16:04:35Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Se dă un număr natural &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039;. Să se afișeze &amp;#039;&amp;#039;&amp;#039;DA&amp;#039;&amp;#039;&amp;#039; dacă numărul este prim altfel se afișează &amp;#039;&amp;#039;&amp;#039;NU&amp;#039;&amp;#039;&amp;#039;. == Date de intrare == Fișierul de intrare &amp;#039;&amp;#039;&amp;#039;primexxlin.txt&amp;#039;&amp;#039;&amp;#039; conține pe prima linie numărul &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039;. == Date de ieșire == Fișierul de ieșire &amp;#039;&amp;#039;&amp;#039;primexxlout.txt&amp;#039;&amp;#039;&amp;#039; va conține pe prima linie &amp;#039;&amp;#039;&amp;#039;DA&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;NU&amp;#039;&amp;#039;&amp;#039; după caz. == Restricţii şi precizări == * &amp;#039;&amp;#039;&amp;#039;1 ≤ nrcif(n) ≤ 1000&amp;#039;&amp;#039;&amp;#039; == Exemplu 1 == ; primexxlin.txt  5 ; primexxlout.txt...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dă un număr natural &#039;&#039;&#039;n&#039;&#039;&#039;. Să se afișeze &#039;&#039;&#039;DA&#039;&#039;&#039; dacă numărul este prim altfel se afișează &#039;&#039;&#039;NU&#039;&#039;&#039;.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;primexxlin.txt&#039;&#039;&#039; conține pe prima linie numărul &#039;&#039;&#039;n&#039;&#039;&#039;.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire &#039;&#039;&#039;primexxlout.txt&#039;&#039;&#039; va conține pe prima linie &#039;&#039;&#039;DA&#039;&#039;&#039; sau &#039;&#039;&#039;NU&#039;&#039;&#039; după caz.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ nrcif(n) ≤ 1000&#039;&#039;&#039;&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; primexxlin.txt&lt;br /&gt;
 5&lt;br /&gt;
; primexxlout.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 DA&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; primexxlin.txt&lt;br /&gt;
 10000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001&lt;br /&gt;
; primexxlout.txt&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def is_prime(n):&lt;br /&gt;
    # Funcția verifică dacă un număr este prim.&lt;br /&gt;
&lt;br /&gt;
    if n &amp;lt; 2:&lt;br /&gt;
        return False&lt;br /&gt;
    if n == 2:&lt;br /&gt;
        return True&lt;br /&gt;
    if n % 2 == 0:&lt;br /&gt;
        return False&lt;br /&gt;
    p = 3&lt;br /&gt;
    while p * p &amp;lt;= n:&lt;br /&gt;
        if n % p == 0:&lt;br /&gt;
            return False&lt;br /&gt;
        p += 2&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;primexxlin.txt&#039;, &#039;r&#039;) as fin, open(&#039;primexxlout.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
&lt;br /&gt;
        # Verificăm dacă numărul respectă restricțiile&lt;br /&gt;
        if len(str(n)) &amp;gt; 1000:&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Verificăm dacă numărul este prim și scriem rezultatul în fișierul de ieșire&lt;br /&gt;
        fout.write(&#039;DA\n&#039; if is_prime(n) else &#039;NU\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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0851_-_Email&amp;diff=8876</id>
		<title>0851 - Email</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0851_-_Email&amp;diff=8876"/>
		<updated>2024-01-03T15:52:11Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: O adresă de email este alcătuită din &amp;#039;&amp;#039;&amp;#039;numele de utilizator&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;numele de domeniu&amp;#039;&amp;#039;&amp;#039;, separate prin simbolul &amp;#039;&amp;#039;&amp;#039;@&amp;#039;&amp;#039;&amp;#039;. De exemplu, &amp;#039;&amp;#039;&amp;#039;gigel@pbinfo.ro&amp;#039;&amp;#039;&amp;#039; este o adresă de email corectă ca structură, chiar dacă inexistentă. == Cerinţa == Se dă o listă de adrese de email corecte ca structură. Să se determine câte adrese de email sunt asociate cu fiecare nume de domeniu == Date de intrare == Fișierul de intrare &amp;#039;&amp;#039;&amp;#039;emailin.txt&amp;#039;&amp;#039;&amp;#039; conține mai multe adrese de e...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O adresă de email este alcătuită din &#039;&#039;&#039;numele de utilizator&#039;&#039;&#039; și &#039;&#039;&#039;numele de domeniu&#039;&#039;&#039;, separate prin simbolul &#039;&#039;&#039;@&#039;&#039;&#039;. De exemplu, &#039;&#039;&#039;gigel@pbinfo.ro&#039;&#039;&#039; este o adresă de email corectă ca structură, chiar dacă inexistentă.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dă o listă de adrese de email corecte ca structură. Să se determine câte adrese de email sunt asociate cu fiecare nume de domeniu&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;emailin.txt&#039;&#039;&#039; conține mai multe adrese de email, câte una pe o linie.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire &#039;&#039;&#039;emailout.txt&#039;&#039;&#039; va conține pe prima linie numărul &#039;&#039;&#039;C&#039;&#039;&#039; de nume de domenii diferite. Următoarele &#039;&#039;&#039;C&#039;&#039;&#039; linii conțin câte un nume de domeniu, urmat de un spațiu și de numărul de adrese date asociate cu acel domeniu. Numele de domeniu se vor afișa în ordine descrescătoare a numărului de adrese asociate. Dacă există mai multe nume de domenii cu același număr de adrese asociate, se vor afișa în ordine lexicografică.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* fișierul de intrare va conține cel mult &#039;&#039;&#039;1000&#039;&#039;&#039; de adrese distincte, cu cel mult &#039;&#039;&#039;200&#039;&#039;&#039; de domenii distincte;&lt;br /&gt;
* lungimea maximă a unei adrese de email este de &#039;&#039;&#039;50&#039;&#039;&#039; de caractere;&lt;br /&gt;
* numele de domeniu începe după simbolul &#039;&#039;&#039;@&#039;&#039;&#039; și se termină la sfârșitul adresei;&lt;br /&gt;
* adresa de email nu conține spații sau alte caractere albe.&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; emailin.txt&lt;br /&gt;
 gigel@pbinfo.ro&lt;br /&gt;
 gigel@yahoo.com&lt;br /&gt;
 ionel.c@gmail.com&lt;br /&gt;
 gigi@pbinfo.ro&lt;br /&gt;
 vasile@yahoo.com&lt;br /&gt;
 jr@gmail.com&lt;br /&gt;
 qwerty@yahoo.com&lt;br /&gt;
; emailout.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 3&lt;br /&gt;
 yahoo.com 3&lt;br /&gt;
 gmail.com 2&lt;br /&gt;
 pbinfo.ro 2&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; emailin.txt&lt;br /&gt;
 012345678901234567890123456789012345678901234567891@pbinfo.ro&lt;br /&gt;
 gigel@yahoo.com&lt;br /&gt;
 ionel.c@gmail.com&lt;br /&gt;
 gigi@pbinfo.ro&lt;br /&gt;
 vasile@yahoo.com&lt;br /&gt;
 jr@gmail.com&lt;br /&gt;
 qwerty@yahoo.com&lt;br /&gt;
; emailout.txt&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
from collections import Counter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def count_domains(emails):&lt;br /&gt;
    # Funcția numără câte adrese de email sunt asociate cu fiecare nume de domeniu.&lt;br /&gt;
&lt;br /&gt;
    # Extragem numele de domeniu din fiecare adresă de email și le numărăm&lt;br /&gt;
    domains = [email.split(&#039;@&#039;)[1] for email in emails]&lt;br /&gt;
    return Counter(domains)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;emailin.txt&#039;, &#039;r&#039;) as fin, open(&#039;emailout.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        emails = [line.strip() for line in fin]&lt;br /&gt;
&lt;br /&gt;
        # Verificăm dacă adresele de email respectă restricțiile&lt;br /&gt;
        if len(emails) &amp;gt; 1000 or any(len(email) &amp;gt; 50 for email in emails):&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Numărăm câte adrese de email sunt asociate cu fiecare nume de domeniu&lt;br /&gt;
        domain_counts = count_domains(emails)&lt;br /&gt;
&lt;br /&gt;
        # Sortăm numele de domeniu în ordine descrescătoare a numărului de adrese asociate&lt;br /&gt;
        sorted_domains = sorted(domain_counts.items(), key=lambda x: (-x[1], x[0]))&lt;br /&gt;
&lt;br /&gt;
        # Scriem numărul de nume de domenii diferite și numărul de adrese asociate cu fiecare domeniu&lt;br /&gt;
        fout.write(str(len(sorted_domains)) + &#039;\n&#039;)&lt;br /&gt;
        for domain, count in sorted_domains:&lt;br /&gt;
            fout.write(f&#039;{domain} {count}\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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0850_-_Repetitii&amp;diff=8873</id>
		<title>0850 - Repetitii</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0850_-_Repetitii&amp;diff=8873"/>
		<updated>2024-01-03T15:41:14Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Se consideră un șir de caractere format numai din litere mici ale alfabetului englez. Dacă șirul conține subșiruri consecutive care se repetă, el poate fi scris condensat. De exemplu, șirul &amp;#039;&amp;#039;&amp;#039;mamateteter&amp;#039;&amp;#039;&amp;#039; poate fi scris &amp;#039;&amp;#039;&amp;#039;(ma)2(te)3r&amp;#039;&amp;#039;&amp;#039; – subșirul care se repetă se scrie între paranteze rotunde, urmat de numărul de apariții.  Dându-se un șir în forma condensată, să se determine șirul în forma inițială. == Date de intrare == Programul...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se consideră un șir de caractere format numai din litere mici ale alfabetului englez. Dacă șirul conține subșiruri consecutive care se repetă, el poate fi scris condensat. De exemplu, șirul &#039;&#039;&#039;mamateteter&#039;&#039;&#039; poate fi scris &#039;&#039;&#039;(ma)2(te)3r&#039;&#039;&#039; – subșirul care se repetă se scrie între paranteze rotunde, urmat de numărul de apariții.&lt;br /&gt;
&lt;br /&gt;
Dându-se un șir în forma condensată, să se determine șirul în forma inițială.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură șirul &#039;&#039;&#039;s&#039;&#039;&#039;, în forma condensată.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Programul va afișa pe ecran șirul &#039;&#039;&#039;t&#039;&#039;&#039;, în forma inițială.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* lungimea șirurilor &#039;&#039;&#039;s&#039;&#039;&#039; și &#039;&#039;&#039;t&#039;&#039;&#039; nu depășește &#039;&#039;&#039;255&#039;&#039;&#039; caractere&lt;br /&gt;
* șirul condensat nu va conține paranteze în alte paranteze&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 (ma)2(te)3r&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 mamateteter&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import re&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def expand_string(s):&lt;br /&gt;
    # Funcția expandează un șir de caractere condensat în forma sa inițială.&lt;br /&gt;
&lt;br /&gt;
    # Folosim o expresie regulată pentru a găsi toate subșirurile de forma (x)n&lt;br /&gt;
    matches = re.findall(r&#039;\((.*?)\)(\d+)&#039;, s)&lt;br /&gt;
    for match in matches:&lt;br /&gt;
        # Înlocuim fiecare subșir (x)n cu x repetat de n ori&lt;br /&gt;
        s = s.replace(f&#039;({match[0]}){match[1]}&#039;, match[0] * int(match[1]))&lt;br /&gt;
    return s&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citim șirul de la tastatură&lt;br /&gt;
    s = input().strip()&lt;br /&gt;
&lt;br /&gt;
    # Verificăm dacă șirul respectă restricțiile&lt;br /&gt;
    if len(s) &amp;gt; 255:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Expandăm șirul și îl afișăm&lt;br /&gt;
    print(expand_string(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;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0992_-_NrVocale1&amp;diff=8869</id>
		<title>0992 - NrVocale1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0992_-_NrVocale1&amp;diff=8869"/>
		<updated>2024-01-03T15:33:02Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Se dă un şir cu cel mult &amp;#039;&amp;#039;&amp;#039;255&amp;#039;&amp;#039;&amp;#039; de caractere. Să se determine câte vocale conţine.  Se va defini şi utiliza subprogramul &amp;#039;&amp;#039;&amp;#039;apcar&amp;#039;&amp;#039;&amp;#039;, cu doi parametri:  * &amp;#039;&amp;#039;&amp;#039;s&amp;#039;&amp;#039;&amp;#039; – un şir cu cel mult &amp;#039;&amp;#039;&amp;#039;255&amp;#039;&amp;#039;&amp;#039; de caractere * &amp;#039;&amp;#039;&amp;#039;c&amp;#039;&amp;#039;&amp;#039; – un caracter care returnează numărul de apariţii ale caracterului &amp;#039;&amp;#039;&amp;#039;c&amp;#039;&amp;#039;&amp;#039; în şirul &amp;#039;&amp;#039;&amp;#039;s&amp;#039;&amp;#039;&amp;#039;. == Date de intrare == Programul citește de la tastatură un şir de caractere. == Date de ieșire == Programul va afișa pe ecran numă...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dă un şir cu cel mult &#039;&#039;&#039;255&#039;&#039;&#039; de caractere. Să se determine câte vocale conţine.&lt;br /&gt;
&lt;br /&gt;
Se va defini şi utiliza subprogramul &#039;&#039;&#039;apcar&#039;&#039;&#039;, cu doi parametri:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;s&#039;&#039;&#039; – un şir cu cel mult &#039;&#039;&#039;255&#039;&#039;&#039; de caractere&lt;br /&gt;
* &#039;&#039;&#039;c&#039;&#039;&#039; – un caracter&lt;br /&gt;
care returnează numărul de apariţii ale caracterului &#039;&#039;&#039;c&#039;&#039;&#039; în şirul &#039;&#039;&#039;s&#039;&#039;&#039;.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură un şir de caractere.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Programul va afișa pe ecran numărul de vocale din şirul dat.&lt;br /&gt;
&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 VULPEA11 vulpea22&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 6&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 &lt;br /&gt;
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def apcar(s, c):&lt;br /&gt;
    # Funcția returnează numărul de apariții ale caracterului c în șirul s.&lt;br /&gt;
&lt;br /&gt;
    return s.count(c)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citim șirul de la tastatură&lt;br /&gt;
    s = input().strip()&lt;br /&gt;
&lt;br /&gt;
    # Verificăm dacă șirul respectă restricțiile&lt;br /&gt;
    if len(s) &amp;gt; 255:&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Definim vocalele&lt;br /&gt;
    vowels = &#039;aeiouAEIOU&#039;&lt;br /&gt;
&lt;br /&gt;
    # Calculăm numărul de vocale din șir&lt;br /&gt;
    num_vowels = sum(apcar(s, vowel) for vowel in vowels)&lt;br /&gt;
&lt;br /&gt;
    # Afișăm numărul de vocale&lt;br /&gt;
    print(num_vowels)&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;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3492_-_PalPal&amp;diff=8864</id>
		<title>3492 - PalPal</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3492_-_PalPal&amp;diff=8864"/>
		<updated>2024-01-03T15:19:55Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Se dă un șir &amp;#039;&amp;#039;&amp;#039;s&amp;#039;&amp;#039;&amp;#039; care conține litere mici ale alfabetului englez, urmat de un număr natural &amp;#039;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;#039;. Să se afișeze câte subsecvențe ale șirului &amp;#039;&amp;#039;&amp;#039;s&amp;#039;&amp;#039;&amp;#039; de lungime &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;2&amp;#039;&amp;#039;&amp;#039;, … &amp;#039;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;#039; sunt palindromuri. == Date de intrare == Fișierul de intrare &amp;#039;&amp;#039;&amp;#039;palpalin.txt&amp;#039;&amp;#039;&amp;#039; conține pe prima linie un șir &amp;#039;&amp;#039;&amp;#039;s&amp;#039;&amp;#039;&amp;#039; și pe următoarea linie un număr natural &amp;#039;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;#039;. == Date de ieșire == Fișierul de ieșire &amp;#039;&amp;#039;&amp;#039;palpalout.txt&amp;#039;&amp;#039;&amp;#039; va conține &amp;#039;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;#039; lin...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dă un șir &#039;&#039;&#039;s&#039;&#039;&#039; care conține litere mici ale alfabetului englez, urmat de un număr natural &#039;&#039;&#039;k&#039;&#039;&#039;. Să se afișeze câte subsecvențe ale șirului &#039;&#039;&#039;s&#039;&#039;&#039; de lungime &#039;&#039;&#039;1&#039;&#039;&#039;, &#039;&#039;&#039;2&#039;&#039;&#039;, … &#039;&#039;&#039;k&#039;&#039;&#039; sunt palindromuri.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;palpalin.txt&#039;&#039;&#039; conține pe prima linie un șir &#039;&#039;&#039;s&#039;&#039;&#039; și pe următoarea linie un număr natural &#039;&#039;&#039;k&#039;&#039;&#039;.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire &#039;&#039;&#039;palpalout.txt&#039;&#039;&#039; va conține &#039;&#039;&#039;k&#039;&#039;&#039; linii. Pe linia &#039;&#039;&#039;i&#039;&#039;&#039; (&#039;&#039;&#039;1 ≤ i ≤ k&#039;&#039;&#039;) se va găsi numărul de subsecvențe de &#039;&#039;&#039;i&#039;&#039;&#039; caractere care sunt palindromuri.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 &amp;amp;les; k &amp;amp;les; 1000&#039;&#039;&#039;&lt;br /&gt;
* șirul &#039;&#039;&#039;s&#039;&#039;&#039; are maxim &#039;&#039;&#039;20000&#039;&#039;&#039; de caractere&lt;br /&gt;
* Prin subsecvență a unui șir de caractere se înțelege o succesiune de unul sau mai multe caractere din șir aflate pe poziții consecutive.&lt;br /&gt;
* Un șir de caractere este palindrom dacă se citește la fel de la stânga la dreapta și de la dreapta la stânga.&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; palpalin.txt&#039;&lt;br /&gt;
 eaaebeadaebcc&lt;br /&gt;
 5&lt;br /&gt;
; palpalout.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 13&lt;br /&gt;
 2&lt;br /&gt;
 2&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; palpalin.txt&#039;&lt;br /&gt;
 eaaebeadaebcc&lt;br /&gt;
 -5&lt;br /&gt;
; palpalout.txt&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Explicatie ==&lt;br /&gt;
Subsecvențe palindrom de lungime 1: &#039;&#039;&#039;e&#039;&#039;&#039;, &#039;&#039;&#039;a&#039;&#039;&#039;, &#039;&#039;&#039;a&#039;&#039;&#039;, &#039;&#039;&#039;e&#039;&#039;&#039;, &#039;&#039;&#039;b&#039;&#039;&#039;, &#039;&#039;&#039;e&#039;&#039;&#039;, &#039;&#039;&#039;a&#039;&#039;&#039;, &#039;&#039;&#039;d&#039;&#039;&#039;, &#039;&#039;&#039;a&#039;&#039;&#039;, &#039;&#039;&#039;e&#039;&#039;&#039;, &#039;&#039;&#039;b&#039;&#039;&#039;, &#039;&#039;&#039;c&#039;&#039;&#039;, &#039;&#039;&#039;c&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Subsecvențe palindrom de lungime 2: &#039;&#039;&#039;aa&#039;&#039;&#039;, &#039;&#039;&#039;cc&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Subsecvențe palindrom de lungime 3: &#039;&#039;&#039;ebe&#039;&#039;&#039;, &#039;&#039;&#039;ada&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Subsecvențe palindrom de lungime 4: &#039;&#039;&#039;eaae&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Subsecvențe palindrom de lungime 5: &#039;&#039;&#039;aebea&#039;&#039;&#039;, &#039;&#039;&#039;eadae&#039;&#039;&#039;.&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 is_palindrome(s):&lt;br /&gt;
&lt;br /&gt;
    #Verifică dacă un șir de caractere este palindrom.&lt;br /&gt;
&lt;br /&gt;
    return s == s[::-1]&lt;br /&gt;
&lt;br /&gt;
def count_palindromic_subsequences(s, k):&lt;br /&gt;
&lt;br /&gt;
    #Numără subsecvențele palindromice de lungime 1, 2, ..., k ale unui șir.&lt;br /&gt;
&lt;br /&gt;
    counts = [0] * k&lt;br /&gt;
    for length in range(1, k + 1):&lt;br /&gt;
        for i in range(len(s) - length + 1):&lt;br /&gt;
            if is_palindrome(s[i:i+length]):&lt;br /&gt;
                counts[length-1] += 1&lt;br /&gt;
    return counts&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;palpalin.txt&#039;, &#039;r&#039;) as fin, open(&#039;palpalout.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        s = fin.readline().strip()&lt;br /&gt;
        k = int(fin.readline().strip())&lt;br /&gt;
&lt;br /&gt;
        # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
        if len(s) &amp;gt; 20000 or k &amp;lt; 1 or k &amp;gt; 1000:&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Numără subsecvențele palindromice și scrie rezultatele în fișierul de ieșire&lt;br /&gt;
        counts = count_palindromic_subsequences(s, k)&lt;br /&gt;
        for count in counts:&lt;br /&gt;
            fout.write(str(count) + &#039;\n&#039;)&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;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2029_-_AfisareN&amp;diff=8858</id>
		<title>2029 - AfisareN</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2029_-_AfisareN&amp;diff=8858"/>
		<updated>2024-01-03T15:03:08Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Citindu-se un număr natural &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; şi un şir de caractere să se afişeze de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; ori şirul de caractere. De fiecare dată se va trece pe rând nou. == Date de intrare == Fişierul de intrare &amp;#039;&amp;#039;&amp;#039;afisarenin.txt&amp;#039;&amp;#039;&amp;#039; conţine pe prima linie numărul &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039;, iar pe a două şirul de caractere. == Date de ieșire == Fişierul de ieşire &amp;#039;&amp;#039;&amp;#039;afisarenout.txt&amp;#039;&amp;#039;&amp;#039; va afişa pe fiecare linie de la &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039; la &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; şirul de caractere. == Restricţii şi precizăr...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Citindu-se un număr natural &#039;&#039;&#039;n&#039;&#039;&#039; şi un şir de caractere să se afişeze de &#039;&#039;&#039;n&#039;&#039;&#039; ori şirul de caractere. De fiecare dată se va trece pe rând nou.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare &#039;&#039;&#039;afisarenin.txt&#039;&#039;&#039; conţine pe prima linie numărul &#039;&#039;&#039;n&#039;&#039;&#039;, iar pe a două şirul de caractere.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fişierul de ieşire &#039;&#039;&#039;afisarenout.txt&#039;&#039;&#039; va afişa pe fiecare linie de la &#039;&#039;&#039;1&#039;&#039;&#039; la &#039;&#039;&#039;n&#039;&#039;&#039; şirul de caractere.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ n ≤ 50&#039;&#039;&#039;&lt;br /&gt;
* lungimea şirului de caractere este maxim &#039;&#039;&#039;1.000.000&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;daca n = 0 nu se va afisa nimic&#039;&#039;&#039;&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; afisarenin.txt&lt;br /&gt;
 3 &lt;br /&gt;
 AfisareN &lt;br /&gt;
; afisarenout.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 AfisareN &lt;br /&gt;
 AfisareN &lt;br /&gt;
 AfisareN &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; afisarenin.txt&lt;br /&gt;
 51&lt;br /&gt;
 AfisareN&lt;br /&gt;
; afisarenout.txt&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;afisarenin.txt&#039;, &#039;r&#039;) as fin, open(&#039;afisarenout.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        sir = fin.readline().strip()&lt;br /&gt;
&lt;br /&gt;
        # Verifică dacă numărul și șirul respectă restricțiile&lt;br /&gt;
        if not (1 &amp;lt;= n &amp;lt;= 50) or len(sir) &amp;gt; 1000000 or not all(c.isalpha() or c.isspace() for c in sir):&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Afișează șirul de n ori&lt;br /&gt;
        for _ in range(n):&lt;br /&gt;
            fout.write(sir + &#039;\n&#039;)&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;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3101_-_XORCrypt&amp;diff=8852</id>
		<title>3101 - XORCrypt</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3101_-_XORCrypt&amp;diff=8852"/>
		<updated>2024-01-03T14:54:26Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Se citește un text de maxim &amp;#039;&amp;#039;&amp;#039;256&amp;#039;&amp;#039;&amp;#039; caractere și o cheie de număr egal de caractere cu textul citit. După aplicarea &amp;#039;&amp;#039;&amp;#039;Encripției XOR&amp;#039;&amp;#039;&amp;#039;, caracterele rezultate se vor afișa în &amp;#039;&amp;#039;&amp;#039;format binar&amp;#039;&amp;#039;&amp;#039; deoarece în majoritatea cazurilor se obțin caractere neprintabile.  &amp;#039;&amp;#039;&amp;#039;Encripția XOR&amp;#039;&amp;#039;&amp;#039; presupune aplicarea operatorului pe biți &amp;#039;&amp;#039;&amp;#039;XOR&amp;#039;&amp;#039;&amp;#039; între text și cheie, între fiecare caracter din text și caracterul din cheie de pe aceeași poziție cu cel din te...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se citește un text de maxim &#039;&#039;&#039;256&#039;&#039;&#039; caractere și o cheie de număr egal de caractere cu textul citit. După aplicarea &#039;&#039;&#039;Encripției XOR&#039;&#039;&#039;, caracterele rezultate se vor afișa în &#039;&#039;&#039;format binar&#039;&#039;&#039; deoarece în majoritatea cazurilor se obțin caractere neprintabile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Encripția XOR&#039;&#039;&#039; presupune aplicarea operatorului pe biți &#039;&#039;&#039;XOR&#039;&#039;&#039; între text și cheie, între fiecare caracter din text și caracterul din cheie de pe aceeași poziție cu cel din text: &#039;&#039;&#039;text[i] XOR cheie[i]&#039;&#039;&#039;. Pentru decriptare, operatorul se aplică între cheie și textul criptat.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
 Fișierul de intrare &#039;&#039;&#039;xorcryptin.txt&#039;&#039;&#039; conține:&lt;br /&gt;
   1. Pe prima linie un text format din maxim &#039;&#039;&#039;256&#039;&#039;&#039; caractere.&lt;br /&gt;
   2.Pe a doua linie cheia, de lungime egală cu textul.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire &#039;&#039;&#039;xorcryptout.txt&#039;&#039;&#039; va conține o singură linie, având caracterele în &#039;&#039;&#039;format binar&#039;&#039;&#039; separate prin spațiu.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* Se va folosi alfabetul englez.&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; xorcryptin.txt&lt;br /&gt;
 xor&lt;br /&gt;
 key&lt;br /&gt;
; xorcryptout.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 00010011 00001010 00001011&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; xorcryptin.txt&lt;br /&gt;
 xor10&lt;br /&gt;
 key&lt;br /&gt;
; xorcryptout.txt&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Explicatie ==&lt;br /&gt;
&#039;&#039;&#039;x^k -&amp;gt; 00010011&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;o^e -&amp;gt; 00001010&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;r^y -&amp;gt; 00001011&#039;&#039;&#039;&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 xor_encrypt(text, key):&lt;br /&gt;
    # Aplică encripția XOR pe text cu cheia dată&lt;br /&gt;
    return &#039; &#039;.join([format(ord(a) ^ ord(b), &#039;08b&#039;) for a, b in zip(text, key)])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;xorcryptin.txt&#039;, &#039;r&#039;) as fin, open(&#039;xorcryptout.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        text = fin.readline().strip()&lt;br /&gt;
        key = fin.readline().strip()&lt;br /&gt;
&lt;br /&gt;
        # Verifică dacă textul și cheia respectă restricțiile&lt;br /&gt;
        if len(text) &amp;gt; 256 or len(key) != len(text) or not all(c.isalpha() or c.isspace() for c in text):&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Aplică encripția XOR pe text cu cheia dată și scrie rezultatul în fișierul de ieșire&lt;br /&gt;
        fout.write(xor_encrypt(text, key) + &#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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1868_-_Prosirx&amp;diff=8850</id>
		<title>1868 - Prosirx</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1868_-_Prosirx&amp;diff=8850"/>
		<updated>2024-01-03T14:37:29Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Se consideră un text format din cel mult &amp;#039;&amp;#039;&amp;#039;200&amp;#039;&amp;#039;&amp;#039; de caractere litere mici și spații. Cuvintele din text sunt separate prin unul sau mai multe spații. Scrieti un program care citește textul și care:  &amp;#039;&amp;#039;&amp;#039;a)&amp;#039;&amp;#039;&amp;#039; determină numărul de consoane din textul citit;  &amp;#039;&amp;#039;&amp;#039;b)&amp;#039;&amp;#039;&amp;#039; înlocuiește prima literă a fiecărui cuvânt din textul citit cu litera X (mare);  &amp;#039;&amp;#039;&amp;#039;c)&amp;#039;&amp;#039;&amp;#039; modifică textul citit prin aranjarea în ordine lexicografică a tuturor cuvintelor din text...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se consideră un text format din cel mult &#039;&#039;&#039;200&#039;&#039;&#039; de caractere litere mici și spații. Cuvintele din text sunt separate prin unul sau mai multe spații. Scrieti un program care citește textul și care:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;a)&#039;&#039;&#039; determină numărul de consoane din textul citit;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b)&#039;&#039;&#039; înlocuiește prima literă a fiecărui cuvânt din textul citit cu litera X (mare);&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c)&#039;&#039;&#039; modifică textul citit prin aranjarea în ordine lexicografică a tuturor cuvintelor din text și separarea lor prin câte un singur spațiu.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;prosirxin.txt&#039;&#039;&#039; conține pe prima linie textul.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire &#039;&#039;&#039;prosirxout.txt&#039;&#039;&#039; va conține:&lt;br /&gt;
&lt;br /&gt;
- pe prima linie răspunsul la cerința &#039;&#039;&#039;a)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- pe a doua linie răspunsul la cerința &#039;&#039;&#039;b)&#039;&#039;&#039;  &lt;br /&gt;
&lt;br /&gt;
- pe a treia linie răspunsul la cerința &#039;&#039;&#039;c)&#039;&#039;&#039;&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* textul este format din cel mult &#039;&#039;&#039;200&#039;&#039;&#039; de caractere, doar litere mici sau spații&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; prosirxin.txt&lt;br /&gt;
 oana   este    la scoala &lt;br /&gt;
; prosirxout.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 7 &lt;br /&gt;
 Xana   Xste    Xa Xcoala &lt;br /&gt;
 este la oana scoala &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; prosirxin.txt&lt;br /&gt;
 oana   este    la scoala999&lt;br /&gt;
; prosirxout.txt&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Explicație ==&lt;br /&gt;
 Sunt &#039;&#039;&#039;7&#039;&#039;&#039; consoane în textul citit.&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 analyze_text(text):&lt;br /&gt;
    # Analizează textul și returnează numărul de consoane,&lt;br /&gt;
    # textul cu prima literă a fiecărui cuvânt înlocuită cu &#039;X&#039;&lt;br /&gt;
    # și textul cu cuvintele aranjate în ordine lexicografică&lt;br /&gt;
    consoane = &#039;bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ&#039;&lt;br /&gt;
    vocale = &#039;aeiouAEIOU&#039;&lt;br /&gt;
    nr_consoane = sum(c in consoane for c in text)&lt;br /&gt;
    cuvinte = text.split()&lt;br /&gt;
    cuvinte_x = [&#039;X&#039; + cuvant[1:] if cuvant[0] in vocale else cuvant for cuvant in cuvinte]&lt;br /&gt;
    cuvinte_sortate = sorted(cuvinte)&lt;br /&gt;
    return nr_consoane, &#039; &#039;.join(cuvinte_x), &#039; &#039;.join(cuvinte_sortate)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;prosirxin.txt&#039;, &#039;r&#039;) as fin, open(&#039;prosirxout.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        text = fin.readline().strip()&lt;br /&gt;
&lt;br /&gt;
        # Verifică dacă textul respectă restricțiile&lt;br /&gt;
        if len(text) &amp;gt; 200 or not all(c.isalpha() or c.isspace() for c in text):&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Analizează textul și scrie rezultatele în fișierul de ieșire&lt;br /&gt;
        nr_consoane, text_x, text_sortat = analyze_text(text)&lt;br /&gt;
        fout.write(str(nr_consoane) + &#039;\n&#039;)&lt;br /&gt;
        fout.write(text_x + &#039;\n&#039;)&lt;br /&gt;
        fout.write(text_sortat + &#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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1711_-_Siruri_concatenate&amp;diff=8847</id>
		<title>1711 - Siruri concatenate</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1711_-_Siruri_concatenate&amp;diff=8847"/>
		<updated>2024-01-03T14:27:30Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Scrieţi un program care citeşte din fişierul de intrare mai multe şiruri de caractere formate din litere mici ale alfabetului englez şi determină câte dintre acestea sunt formate din două şiruri identice (cu lungimea cel puţin 1) concatenate. == Date de intrare == Fișierul de intrare &amp;#039;&amp;#039;&amp;#039;siruri_concatenatein.txt&amp;#039;&amp;#039;&amp;#039; conține pe prima linie un număr natural nenul &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039;, iar pe următoarele &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; linii câte un şir format din litere mici ale alfabe...&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 mai multe şiruri de caractere formate din litere mici ale alfabetului englez şi determină câte dintre acestea sunt formate din două şiruri identice (cu lungimea cel puţin 1) concatenate.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;siruri_concatenatein.txt&#039;&#039;&#039; conține pe prima linie un număr natural nenul &#039;&#039;&#039;n&#039;&#039;&#039;, iar pe următoarele &#039;&#039;&#039;n&#039;&#039;&#039; linii câte un şir format din litere mici ale alfabetului englez.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire &#039;&#039;&#039;siruri_concatenateout.txt&#039;&#039;&#039; va conține pe prima linie numărul de şiruri din fişierul de intrare care sunt formate din două şiruri identice concatenate.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 &amp;amp;les; n &amp;amp;les; 1000000&#039;&#039;&#039;&lt;br /&gt;
* şirurile au cel mult &#039;&#039;&#039;5000&#039;&#039;&#039; de caractere.&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; siruri_concatenatein.txt&lt;br /&gt;
 5&lt;br /&gt;
 sirsir&lt;br /&gt;
 micropico&lt;br /&gt;
 pp&lt;br /&gt;
 vara&lt;br /&gt;
 nanonano&lt;br /&gt;
; siruri_concatenateout.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 3&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; siruri_concatenatein.txt&lt;br /&gt;
 -5&lt;br /&gt;
 sirsir&lt;br /&gt;
 micropico&lt;br /&gt;
 pp&lt;br /&gt;
 vara&lt;br /&gt;
 nanonano&lt;br /&gt;
; siruri_concatenateout.txt&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Explicatie ==&lt;br /&gt;
Cele 3 şiruri din fişier obţinute prin concatenarea a două şiruri identice sunt: &#039;&#039;&#039;sirsir&#039;&#039;&#039; (&#039;&#039;&#039;sir&#039;&#039;&#039;), &#039;&#039;&#039;pp&#039;&#039;&#039; (&#039;&#039;&#039;p&#039;&#039;&#039;) şi &#039;&#039;&#039;nanonano&#039;&#039;&#039; (&#039;&#039;&#039;nano&#039;&#039;&#039;).&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def is_concatenated(s):&lt;br /&gt;
    # Verifică dacă șirul s este format din două șiruri identice concatenate&lt;br /&gt;
    n = len(s)&lt;br /&gt;
    if n % 2 != 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return s[:n//2] == s[n//2:]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;siruri_concatenatein.txt&#039;, &#039;r&#039;) as fin, open(&#039;siruri_concatenateout.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        siruri = [fin.readline().strip() for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
        # Verifică dacă șirurile respectă restricțiile&lt;br /&gt;
        if not (1 &amp;lt;= n &amp;lt;= 1000000) or any(not s.islower() or len(s) &amp;gt; 5000 for s in siruri):&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Numără șirurile care sunt formate din două șiruri identice concatenate&lt;br /&gt;
        nr = sum(is_concatenated(s) for s in siruri)&lt;br /&gt;
        fout.write(str(nr) + &#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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1631_-_Cuvinte5&amp;diff=8845</id>
		<title>1631 - Cuvinte5</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1631_-_Cuvinte5&amp;diff=8845"/>
		<updated>2024-01-03T14:12:33Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Se citește un text cu cel mult &amp;#039;&amp;#039;&amp;#039;255&amp;#039;&amp;#039;&amp;#039; de caractere, litere mici și mari ale alfabetului englez și spații. Cuvintele sunt separate printr-un singur spațiu. Să se determine câte cuvinte din text au exact trei litere, care sunt cuvintele care încep și se termină cu vocală și care este lungimea celui mai lung cuvânt. == Date de intrare == Programul citește de la tastatură textul. == Date de ieșire == Programul va afișa pe ecran, pe prima linie n...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se citește un text cu cel mult &#039;&#039;&#039;255&#039;&#039;&#039; de caractere, litere mici și mari ale alfabetului englez și spații. Cuvintele sunt separate printr-un singur spațiu. Să se determine câte cuvinte din text au exact trei litere, care sunt cuvintele care încep și se termină cu vocală și care este lungimea celui mai lung cuvânt.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură textul.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Programul va afișa pe ecran, pe prima linie numărul &#039;&#039;&#039;nr&#039;&#039;&#039;, reprezentând numărul cuvintelor din text cu exact trei litere, pe următoarele linii cuvintele care încep și se termină cu vocală, iar pe ultima linie numărul &#039;&#039;&#039;mx&#039;&#039;&#039; reprezentând lungimea celui mai lung cuvânt.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* textul conține cel mult &#039;&#039;&#039;30&#039;&#039;&#039; cuvinte&lt;br /&gt;
* fiecare cuvânt conține cel mult &#039;&#039;&#039;10&#039;&#039;&#039; caractere&lt;br /&gt;
* se consideră vocale &#039;&#039;&#039;a e i o u A E I O U&#039;&#039;&#039;&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 Dan are un pix care este albastru si un creion care e gri&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 4&lt;br /&gt;
 are&lt;br /&gt;
 este&lt;br /&gt;
 albastru&lt;br /&gt;
 e &lt;br /&gt;
 8&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 dan4&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def analyze_text(text):&lt;br /&gt;
    # Analizează textul și returnează numărul de cuvinte cu exact trei litere,&lt;br /&gt;
    # cuvintele care încep și se termină cu vocală și lungimea celui mai lung cuvânt&lt;br /&gt;
    cuvinte = text.split()&lt;br /&gt;
    cuvinte_trei_litere = [cuvant for cuvant in cuvinte if len(cuvant) == 3]&lt;br /&gt;
    cuvinte_vocale = [cuvant for cuvant in cuvinte if cuvant[0] in &#039;aeiouAEIOU&#039; and cuvant[-1] in &#039;aeiouAEIOU&#039;]&lt;br /&gt;
    lungime_max = max(len(cuvant) for cuvant in cuvinte)&lt;br /&gt;
    return cuvinte_trei_litere, cuvinte_vocale, lungime_max&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    text = input().strip()&lt;br /&gt;
&lt;br /&gt;
    # Verifică dacă textul respectă restricțiile&lt;br /&gt;
    if len(text) &amp;gt; 255 or not all(c.isalpha() or c.isspace()&lt;br /&gt;
                                  for c in text) or len(text.split()) &amp;gt; 30 \&lt;br /&gt;
            or any(len(cuvant) &amp;gt; 10 for cuvant in text.split()):&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Analizează textul și afișează rezultatele&lt;br /&gt;
    cuvinte_trei_litere, cuvinte_vocale, lungime_max = analyze_text(text)&lt;br /&gt;
    print(str(len(cuvinte_trei_litere)) + &#039;\n&#039;)&lt;br /&gt;
    print(&#039;\n&#039;.join(cuvinte_vocale) + &#039;\n&#039;)&lt;br /&gt;
    print(str(lungime_max) + &#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;
== Explicatie ==&lt;br /&gt;
 &#039;&#039;&#039;4&#039;&#039;&#039; cuvinte au exact trei litere.&lt;br /&gt;
 Cuvintele care încep și termină cu vocală sunt &#039;&#039;&#039;are este albastru e.&#039;&#039;&#039;&lt;br /&gt;
 Cuvântul cel mai lung are &#039;&#039;&#039;8&#039;&#039;&#039; litere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1873_-_Cuvinte_pare&amp;diff=8841</id>
		<title>1873 - Cuvinte pare</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1873_-_Cuvinte_pare&amp;diff=8841"/>
		<updated>2024-01-03T13:18:06Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == Un text are cel mult &amp;#039;&amp;#039;&amp;#039;100&amp;#039;&amp;#039;&amp;#039; de caractere, iar cuvintele sale sunt formate doar din litere mici ale alfabetului englez și sunt separate prin câte un spațiu.  Scrieți un program C/C++ care citește de la tastatură un text de tipul precizat mai sus și îl transformă în memorie prin înlocuirea fiecărui cuvânt format din număr par de litere cu simbolul &amp;#039;&amp;#039;&amp;#039;#&amp;#039;&amp;#039;&amp;#039;.  Programul afișează pe ecran textul obținut sau mesajul &amp;#039;&amp;#039;&amp;#039;nu exista&amp;#039;&amp;#039;&amp;#039; dacă textul cit...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Un text are cel mult &#039;&#039;&#039;100&#039;&#039;&#039; de caractere, iar cuvintele sale sunt formate doar din litere mici ale alfabetului englez și sunt separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
Scrieți un program C/C++ care citește de la tastatură un text de tipul precizat mai sus și îl transformă în memorie prin înlocuirea fiecărui cuvânt format din număr par de litere cu simbolul &#039;&#039;&#039;#&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Programul afișează pe ecran textul obținut sau mesajul &#039;&#039;&#039;nu exista&#039;&#039;&#039; dacă textul citit nu conține astfel de cuvinte.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură un text.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Programul va afișa textul modificat.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* textul are cel mult &#039;&#039;&#039;100&#039;&#039;&#039; de caractere&lt;br /&gt;
* cuvintele sunt formate doar din litere mici ale alfabetului englez&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 anii de liceu sunt foarte frumosi&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 # # liceu # # frumosi&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
 ANII DE LICEU SUNT FOARTE FRUMOSI&lt;br /&gt;
; Iesire&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def transforma_text(text):&lt;br /&gt;
    # Înlocuiește fiecare cuvânt format din număr par de litere cu simbolul #&lt;br /&gt;
    cuvinte = text.split()&lt;br /&gt;
    for i in range(len(cuvinte)):&lt;br /&gt;
        if len(cuvinte[i]) % 2 == 0:&lt;br /&gt;
            cuvinte[i] = &#039;#&#039;&lt;br /&gt;
    return &#039; &#039;.join(cuvinte)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    text = input().strip()&lt;br /&gt;
&lt;br /&gt;
    # Verifică dacă textul respectă restricțiile&lt;br /&gt;
    if len(text) &amp;gt; 100 or not text.islower():&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Datele de intrare corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Transformă textul și afișează rezultatul&lt;br /&gt;
    text_transformat = transforma_text(text)&lt;br /&gt;
    if &#039;#&#039; in text_transformat:&lt;br /&gt;
        print(text_transformat)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;nu exista&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3190_-_Vigenere&amp;diff=8839</id>
		<title>3190 - Vigenere</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3190_-_Vigenere&amp;diff=8839"/>
		<updated>2024-01-03T13:02:13Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Vigenere == La fel ca &amp;#039;&amp;#039;&amp;#039;cifrul Cezar&amp;#039;&amp;#039;&amp;#039;, cifrul Vigenere deplasează literele, dar acesta folosește o deplasare multiplă. Cheia este constituită din câțiva întregi &amp;#039;&amp;#039;&amp;#039;ki&amp;#039;&amp;#039;&amp;#039;, unde &amp;#039;&amp;#039;&amp;#039;0 ≤ ki ≤ 25.&amp;#039;&amp;#039;&amp;#039; Aceşti întregi pot fi, de exemplu, &amp;#039;&amp;#039;&amp;#039;k = (21, 4, 2 19, 14, 17)&amp;#039;&amp;#039;&amp;#039;. Această cheie ar provoca deplasare primei litere cu &amp;#039;&amp;#039;&amp;#039;21&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;c1 = p1 + 21 (mod 26)&amp;#039;&amp;#039;&amp;#039;, a celei de-a doua cu &amp;#039;&amp;#039;&amp;#039;4&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;c2 = p2 + 4 (mod 26)&amp;#039;&amp;#039;&amp;#039;, ş.a.m.d. până la sfârşitul cheii și apoi d...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Vigenere ==&lt;br /&gt;
La fel ca &#039;&#039;&#039;cifrul Cezar&#039;&#039;&#039;, cifrul Vigenere deplasează literele, dar acesta folosește o deplasare multiplă. Cheia este constituită din câțiva întregi &#039;&#039;&#039;ki&#039;&#039;&#039;, unde &#039;&#039;&#039;0 ≤ ki ≤ 25.&#039;&#039;&#039;&lt;br /&gt;
Aceşti întregi pot fi, de exemplu, &#039;&#039;&#039;k = (21, 4, 2 19, 14, 17)&#039;&#039;&#039;. Această cheie ar provoca deplasare primei litere cu &#039;&#039;&#039;21&#039;&#039;&#039;, &#039;&#039;&#039;c1 = p1 + 21 (mod 26)&#039;&#039;&#039;, a celei de-a doua cu &#039;&#039;&#039;4&#039;&#039;&#039;, &#039;&#039;&#039;c2 = p2 + 4 (mod 26)&#039;&#039;&#039;, ş.a.m.d. până la sfârşitul cheii și apoi de la început, din nou.&lt;br /&gt;
&lt;br /&gt;
Pentru o memorare mai ușoară cheia este de regulă dată printr-un cuvânt – cheia de mai sus corespunde cuvântului &#039;&#039;&#039;vector&#039;&#039;&#039;, litera &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039;” corespondând numărului &#039;&#039;&#039;21&#039;&#039;&#039; (numerotarea începe de la &#039;&#039;&#039;0&#039;&#039;&#039;), litera &#039;&#039;&#039;&#039;e&#039;&#039;&#039;&#039; cu &#039;&#039;&#039;4&#039;&#039;&#039;, etc.&lt;br /&gt;
Un exemplu de cifru Vigenere:&lt;br /&gt;
&lt;br /&gt;
Textul clar: &#039;&#039;&#039;thisisanexampleofthevigenerecipher&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Cheia: &#039;&#039;&#039;vector&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Textul cifrat: &#039;&#039;&#039;olklwjvrgqodkpghtkcixbuviitxqzklgk&#039;&#039;&#039;&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
 Se citesc două texte &#039;&#039;&#039;a&#039;&#039;&#039; și &#039;&#039;&#039;b&#039;&#039;&#039; cu lungimea maximă de &#039;&#039;&#039;255&#039;&#039;&#039; de caractere. Să se afișeze textul după &lt;br /&gt;
 aplicarea cifrului Vigenere la textul &#039;&#039;&#039;a&#039;&#039;&#039; cu cheia &#039;&#039;&#039;b&#039;&#039;&#039;.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
 Fișierul de intrare &#039;&#039;&#039;vigenerein.txt&#039;&#039;&#039; conține pe prima linie textul &#039;&#039;&#039;a&#039;&#039;&#039; iar pe a doua linie textul &#039;&#039;&#039;b&#039;&#039;&#039;.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
 Fișierul de ieșire &#039;&#039;&#039;vigenereout.txt&#039;&#039;&#039; va conține pe prima linie rezultatul criptării.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* lungimea lui &#039;&#039;&#039;b &amp;amp;les;&#039;&#039;&#039; Lungimea lui &#039;&#039;&#039;a &amp;amp;les; 255&#039;&#039;&#039;;&lt;br /&gt;
* cele două șiruri vor conține doar litere mici din alfabetul englez.&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; vigenerein.txt&lt;br /&gt;
 pbinfo&lt;br /&gt;
 dio&lt;br /&gt;
; vigenereout.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 sjwqnc&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; vigenerein.txt&lt;br /&gt;
 abc123&lt;br /&gt;
; vigenereout.txt&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Explicatie ==&lt;br /&gt;
În Cifrul Vigenere începem numărătoarea caracterelor din cheie de la 0, astfel, caracterul &#039;&#039;&#039;&#039;d&#039;&#039;&#039;&#039; din cheie deplasează caractrrul corespunzător din text cu 3 caractere; astfel, &#039;&#039;&#039;&#039;p&#039;&#039;&#039;&#039; devine &#039;&#039;&#039;&#039;s&#039;&#039;&#039;&#039;. Acest procedeu se repetă și pentru restul șirului.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def vigenere(a, b, c):&lt;br /&gt;
    # Aplică cifrul Vigenere pe textul a cu cheia b&lt;br /&gt;
    alfabet = &#039;abcdefghijklmnopqrstuvwxyz&#039;&lt;br /&gt;
    if c == 1:&lt;br /&gt;
        return &#039;&#039;.join([alfabet[(alfabet.index(a[i]) + alfabet.index(b[i % len(b)])) % 26] for i in range(len(a))])&lt;br /&gt;
    else:&lt;br /&gt;
        return &#039;&#039;.join([alfabet[(alfabet.index(a[i]) - alfabet.index(b[i % len(b)])) % 26] for i in range(len(a))])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;vigenerein.txt&#039;, &#039;r&#039;) as fin, open(&#039;vigenereout.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        a = fin.readline().strip()&lt;br /&gt;
        b = fin.readline().strip()&lt;br /&gt;
&lt;br /&gt;
        # Verifică dacă textele respectă restricțiile&lt;br /&gt;
        if len(a) &amp;gt; 255 or len(b) &amp;gt; len(a) or not a.islower() or not b.islower():&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Aplică cifrul Vigenere pe textul a cu cheia b și scrie rezultatul în fișierul de ieșire&lt;br /&gt;
        fout.write(vigenere(a, b, 1) + &#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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3141_-_Atbash&amp;diff=8836</id>
		<title>3141 - Atbash</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3141_-_Atbash&amp;diff=8836"/>
		<updated>2024-01-03T12:41:23Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Atbash ==  Cifrul atbash este un cifru de substituție care constă în inversarea alfabetului: prima literă din alfabet se   interschimbă cu ultima, a doua cu penultima, etc. == Cerinţa ==  Se dă un șir &amp;#039;&amp;#039;&amp;#039;s&amp;#039;&amp;#039;&amp;#039; care conține doar litere mari. Să se aplice cifrul atbash pe el. == Date de intrare ==  Fișierul de intrare &amp;#039;&amp;#039;&amp;#039;atbashin.txt&amp;#039;&amp;#039;&amp;#039; conține pe prima linie șirul &amp;#039;&amp;#039;&amp;#039;s&amp;#039;&amp;#039;&amp;#039;. == Date de ieșire ==  Fișierul de ieșire &amp;#039;&amp;#039;&amp;#039;atbashout.txt&amp;#039;&amp;#039;&amp;#039; va conține pe prima linie...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Atbash ==&lt;br /&gt;
 Cifrul atbash este un cifru de substituție care constă în inversarea alfabetului: prima literă din alfabet se &lt;br /&gt;
 interschimbă cu ultima, a doua cu penultima, etc.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
 Se dă un șir &#039;&#039;&#039;s&#039;&#039;&#039; care conține doar litere mari. Să se aplice cifrul atbash pe el.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
 Fișierul de intrare &#039;&#039;&#039;atbashin.txt&#039;&#039;&#039; conține pe prima linie șirul &#039;&#039;&#039;s&#039;&#039;&#039;.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
 Fișierul de ieșire &#039;&#039;&#039;atbashout.txt&#039;&#039;&#039; va conține pe prima linie șirul după aplicarea cifrului atbash.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 &amp;amp;les; lungimea șirului &amp;amp;les; 1.000.000&#039;&#039;&#039;&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; atbashin.txt&lt;br /&gt;
 ANAAREMERE&lt;br /&gt;
; atbashout.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 ZMZZIVNVIV&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; atbashin.txt&lt;br /&gt;
 anaaremere1&lt;br /&gt;
; atbashout.txt&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def atbash(s):&lt;br /&gt;
    # Aplică cifrul Atbash pe șirul s&lt;br /&gt;
    return &#039;&#039;.join([chr(ord(&#039;Z&#039;) - (ord(c) - ord(&#039;A&#039;))) for c in s])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;atbashin.txt&#039;, &#039;r&#039;) as fin, open(&#039;atbashout.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        s = fin.readline().strip()&lt;br /&gt;
&lt;br /&gt;
        # Verifică dacă șirul respectă restricțiile&lt;br /&gt;
        if len(s) &amp;gt; 1000000 or not s.isupper():&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Aplică cifrul Atbash pe șirul s și scrie rezultatul în fișierul de ieșire&lt;br /&gt;
        fout.write(atbash(s) + &#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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3140_-_A1z26&amp;diff=8833</id>
		<title>3140 - A1z26</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3140_-_A1z26&amp;diff=8833"/>
		<updated>2024-01-03T12:31:17Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == A1Z26 ==  Cifrul A1Z26 este cel mai ușor cifru de substituție: fiecare literă este înlocuită cu numărul ei de ordine în   alfabet. Astfel, &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; devine &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; devine &amp;#039;&amp;#039;&amp;#039;2&amp;#039;&amp;#039;&amp;#039;, ș.a.m.d. == Cerinţa ==  Se dă un număr &amp;#039;&amp;#039;&amp;#039;p&amp;#039;&amp;#039;&amp;#039;:  1. Dacă &amp;#039;&amp;#039;&amp;#039;p = 1&amp;#039;&amp;#039;&amp;#039;, se dă un șir de caractere &amp;#039;&amp;#039;&amp;#039;s&amp;#039;&amp;#039;&amp;#039; format din litere mari. Să se afișeze numărul de ordine   al caracterelor separate printr-un spațiu.  2. Dacă &amp;#039;&amp;#039;&amp;#039;p = 2&amp;#039;&amp;#039;&amp;#039;, se dă un număr &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; numere...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== A1Z26 ==&lt;br /&gt;
 Cifrul A1Z26 este cel mai ușor cifru de substituție: fiecare literă este înlocuită cu numărul ei de ordine în &lt;br /&gt;
 alfabet. Astfel, &#039;&#039;&#039;A&#039;&#039;&#039; devine &#039;&#039;&#039;1&#039;&#039;&#039;, &#039;&#039;&#039;B&#039;&#039;&#039; devine &#039;&#039;&#039;2&#039;&#039;&#039;, ș.a.m.d.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
 Se dă un număr &#039;&#039;&#039;p&#039;&#039;&#039;:&lt;br /&gt;
 1. Dacă &#039;&#039;&#039;p = 1&#039;&#039;&#039;, se dă un șir de caractere &#039;&#039;&#039;s&#039;&#039;&#039; format din litere mari. Să se afișeze numărul de ordine &lt;br /&gt;
 al caracterelor separate printr-un spațiu.&lt;br /&gt;
 2. Dacă &#039;&#039;&#039;p = 2&#039;&#039;&#039;, se dă un număr &#039;&#039;&#039;n&#039;&#039;&#039; și &#039;&#039;&#039;n&#039;&#039;&#039; numere cuprinse între &#039;&#039;&#039;1&#039;&#039;&#039; și &#039;&#039;&#039;26&#039;&#039;&#039;. Să se afișeze &lt;br /&gt;
 șirul corespunzător numerelor.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
 Fișierul de intrare &#039;&#039;&#039;a1z26in.txt&#039;&#039;&#039; conține pe prima linie numărul &#039;&#039;&#039;p&#039;&#039;&#039;.&lt;br /&gt;
 Dacă &#039;&#039;&#039;p = 1&#039;&#039;&#039;, pe a doua linie din fișier se află șirul de caractere &#039;&#039;&#039;s&#039;&#039;&#039;.&lt;br /&gt;
 Dacă &#039;&#039;&#039;p = 2&#039;&#039;&#039;, pe a doua linie din fișier se află numarul natural &#039;&#039;&#039;n&#039;&#039;&#039; iar pe următoarea linie se află &#039;&#039;&#039;n&#039;&#039;&#039; numere.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Dacă &#039;&#039;&#039;p = 1&#039;&#039;&#039;, fișierul de ieșire &#039;&#039;&#039;a1z26out.txt&#039;&#039;&#039; va conține pe prima linie numerele de ordine ale caracterelor din șirul &#039;&#039;&#039;s&#039;&#039;&#039;, separate prin câte un spațiu.&lt;br /&gt;
Daca &#039;&#039;&#039;p = 2&#039;&#039;&#039;, fișierul de ieșire &#039;&#039;&#039;a1z26out.txt&#039;&#039;&#039; va conține pe prima linie șirul format din numerele de ordine date, afișate cu litere mari.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 &amp;amp;les; p &amp;amp;les; 2&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;1 &amp;amp;les; lungimea șirului s &amp;amp;les; 1.000.000&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;1 &amp;amp;les; n &amp;amp;les; 1.000.000&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;1 &amp;amp;les; numerele de pe a doua linie &amp;amp;les; 26&#039;&#039;&#039;&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; a1z26in.txt&lt;br /&gt;
 1&lt;br /&gt;
 ANAAREMERE&lt;br /&gt;
; a1z26out.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 1 14 1 1 18 5 13 5 18 5&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; a1z26in.txt&lt;br /&gt;
 2&lt;br /&gt;
 10&lt;br /&gt;
 1 14 1 1 18 5 13 5 18 5&lt;br /&gt;
; a1z26out.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 ANAAREMERE&lt;br /&gt;
== Exemplu 3==&lt;br /&gt;
; a1z26in.txt&lt;br /&gt;
 1&lt;br /&gt;
 anaaremere&lt;br /&gt;
; a1z26out.txt&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def cifrare(s):&lt;br /&gt;
    # Transformă fiecare literă în numărul ei de ordine în alfabet&lt;br /&gt;
    return &#039; &#039;.join([str(ord(c) - ord(&#039;A&#039;) + 1) for c in s])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def decifrare(numere):&lt;br /&gt;
    # Transformă fiecare număr în litera sa corespunzătoare în alfabet&lt;br /&gt;
    return &#039;&#039;.join([chr(numar + ord(&#039;A&#039;) - 1) for numar in numere])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;a1z26in.txt&#039;, &#039;r&#039;) as fin, open(&#039;a1z26out.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        p = int(fin.readline().strip())&lt;br /&gt;
&lt;br /&gt;
        # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
        if p == 1:&lt;br /&gt;
            s = fin.readline().strip()&lt;br /&gt;
            if len(s) &amp;gt; 1000000 or not s.isupper():&lt;br /&gt;
                fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
                return&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            fout.write(cifrare(s) + &#039;\n&#039;)&lt;br /&gt;
        elif p == 2:&lt;br /&gt;
            n = int(fin.readline().strip())&lt;br /&gt;
            numere = list(map(int, fin.readline().strip().split()))&lt;br /&gt;
            if n &amp;gt; 1000000 or not all(1 &amp;lt;= numar &amp;lt;= 26 for numar in numere):&lt;br /&gt;
                fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
                return&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            fout.write(decifrare(numere) + &#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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3398_-_Kps&amp;diff=8830</id>
		<title>3398 - Kps</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3398_-_Kps&amp;diff=8830"/>
		<updated>2024-01-03T10:59:39Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: Un cuvânt se numește &amp;#039;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;#039;-ps dacă prefixul său de lungime &amp;#039;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;#039; este identic cu sufixul de lungime &amp;#039;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;#039;, iar &amp;#039;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;#039; este cea mai mare valoare strict mai mică decât lungimea cuvântului, cu această proprietate. Dacă nu există nicio astfel de valoare &amp;#039;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;#039; nenulă, spunem despre cuvânt că este &amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039;-ps. De exemplu, &amp;#039;&amp;#039;&amp;#039;amalgam&amp;#039;&amp;#039;&amp;#039; este &amp;#039;&amp;#039;&amp;#039;2&amp;#039;&amp;#039;&amp;#039;-ps, iar &amp;#039;&amp;#039;&amp;#039;amestec&amp;#039;&amp;#039;&amp;#039; este &amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039;-ps.  == Cerinţa == Rezolvați următoarele cerințe:  1) Se dă un cuvânt. De...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un cuvânt se numește &#039;&#039;&#039;k&#039;&#039;&#039;-ps dacă prefixul său de lungime &#039;&#039;&#039;k&#039;&#039;&#039; este identic cu sufixul de lungime &#039;&#039;&#039;k&#039;&#039;&#039;, iar &#039;&#039;&#039;k&#039;&#039;&#039; este cea mai mare valoare strict mai mică decât lungimea cuvântului, cu această proprietate. Dacă nu există nicio astfel de valoare &#039;&#039;&#039;k&#039;&#039;&#039; nenulă, spunem despre cuvânt că este &#039;&#039;&#039;0&#039;&#039;&#039;-ps. De exemplu, &#039;&#039;&#039;amalgam&#039;&#039;&#039; este &#039;&#039;&#039;2&#039;&#039;&#039;-ps, iar &#039;&#039;&#039;amestec&#039;&#039;&#039; este &#039;&#039;&#039;0&#039;&#039;&#039;-ps.&lt;br /&gt;
&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Rezolvați următoarele cerințe:&lt;br /&gt;
&lt;br /&gt;
1) Se dă un cuvânt. Determinați &#039;&#039;&#039;k&#039;&#039;&#039; asfel încât cuvântul să fie &#039;&#039;&#039;k&#039;&#039;&#039;-ps.&lt;br /&gt;
&lt;br /&gt;
2) Se dă un șir de caractere în care cuvintele sunt alcătuite din litere mici ale alfabetului englez și sunt separate prin spații. Să se afișeze în ordine cuvintele &#039;&#039;&#039;0&#039;&#039;&#039;-ps, &#039;&#039;&#039;1&#039;&#039;&#039;-ps, &#039;&#039;&#039;2&#039;&#039;&#039;-ps, &#039;&#039;&#039;3&#039;&#039;&#039;-ps, etc, până la cel mai mare &#039;&#039;&#039;k&#039;&#039;&#039; pentru care există în șir cel puțin un cuvânt &#039;&#039;&#039;k&#039;&#039;&#039;-ps. Pentru fiecare categorie, cuvintele vor fi afișate în ordine alfabetică.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
 Fișierul de intrare &#039;&#039;&#039;kpsin.txt&#039;&#039;&#039; conține pe prima linie numărul &#039;&#039;&#039;C&#039;&#039;&#039;, care reprezintă cerința și poate fi &#039;&#039;&#039;1&#039;&#039;&#039; sau &#039;&#039;&#039;2&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Dacă &#039;&#039;&#039;C=1&#039;&#039;&#039;, a doua linie conține un cuvânt format litere mici ale alfabetului englez.&lt;br /&gt;
* daca &#039;&#039;&#039;C=2&#039;&#039;&#039;, a doua linie conține șir de caractere în care cuvintele sunt alcătuite din litere mici ale alfabetului englez și sunt separate prin spații.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
* Dacă &#039;&#039;&#039;C=1&#039;&#039;&#039;, fișierul de ieșire &#039;&#039;&#039;kpsout.txt&#039;&#039;&#039; va conține pe prima linie numărul &#039;&#039;&#039;K&#039;&#039;&#039;, astel încât cuvântul dat este cuvânt &#039;&#039;&#039;K&#039;&#039;&#039;-ps. Dacă cuvântul dat nu este cuvânt &#039;&#039;&#039;k&#039;&#039;&#039;-ps, se va afișa valoarea &#039;&#039;&#039;0&#039;&#039;&#039;.&lt;br /&gt;
* Dacă &#039;&#039;&#039;C=2&#039;&#039;&#039;, fișierul de ieșire &#039;&#039;&#039;kpsout.txt&#039;&#039;&#039; va conține mai multe linii:&lt;br /&gt;
* prima linie corespunde cuvintelor &#039;&#039;&#039;0&#039;&#039;&#039;-ps, a doua corespunde cuvintelor &#039;&#039;&#039;1&#039;&#039;&#039;-ps, a treia cuvintelor &#039;&#039;&#039;2&#039;&#039;&#039;-ps, etc.&lt;br /&gt;
* fiecare linie începe cu numărul de cuvinte din categoria curentă, urmat de un spațiu și de aceste cuvinte, in ordine alfabetică, separate prin câte un spațiu;&lt;br /&gt;
* dacă nu există niciun cuvânt dintr-o anumită categorie, linia corespunzătoare va conține doar valoarea &#039;&#039;&#039;0&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* pentru &#039;&#039;&#039;C=1&#039;&#039;&#039;, cuvântul dat va avea cel mult &#039;&#039;&#039;1000&#039;&#039;&#039; de litere;&lt;br /&gt;
* pentru &#039;&#039;&#039;C=2&#039;&#039;&#039;, șirul dat va avea cel mult &#039;&#039;&#039;10000&#039;&#039;&#039; de caractere, fiecare cuvânt având cel mult &#039;&#039;&#039;100&#039;&#039;&#039; de litere;&lt;br /&gt;
* pentru 50 de puncte, &#039;&#039;&#039;C=1&#039;&#039;&#039;.&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; kpsin.txt&lt;br /&gt;
 1&lt;br /&gt;
 amalgam&lt;br /&gt;
; kpsout.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 2&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; kpsin.txt&lt;br /&gt;
 2&lt;br /&gt;
 asdfqwasdf zar amalgam  zarzar  barbar ghjtttyuttghj asaswasas kps&lt;br /&gt;
; kpsout.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 2 kps zar&lt;br /&gt;
 0&lt;br /&gt;
 1 amalgam&lt;br /&gt;
 3 barbar ghjtttyuttghj zarzar&lt;br /&gt;
 2 asaswasas asdfqwasdf&lt;br /&gt;
== Exemplu 3 ==&lt;br /&gt;
; kpsin.txt&lt;br /&gt;
 1&lt;br /&gt;
 ASD SCCS&lt;br /&gt;
; kpsout.txt&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def k_ps(cuvant):&lt;br /&gt;
    # Determină k pentru care cuvântul este k-ps&lt;br /&gt;
    for k in range(len(cuvant) - 1, 0, -1):&lt;br /&gt;
        if cuvant[:k] == cuvant[-k:]:&lt;br /&gt;
            return k&lt;br /&gt;
    return 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sortare_cuvinte(sir):&lt;br /&gt;
    # Sortează cuvintele în funcție de valoarea k&lt;br /&gt;
    cuvinte = sir.split()&lt;br /&gt;
    k_cuvinte = {k: [] for k in range(max(map(k_ps, cuvinte)) + 1)}&lt;br /&gt;
    for cuvant in cuvinte:&lt;br /&gt;
        k_cuvinte[k_ps(cuvant)].append(cuvant)&lt;br /&gt;
    for k in k_cuvinte:&lt;br /&gt;
        k_cuvinte[k].sort()&lt;br /&gt;
    return k_cuvinte&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;kpsin.txt&#039;, &#039;r&#039;) as fin, open(&#039;kpsout.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        c = int(fin.readline().strip())&lt;br /&gt;
&lt;br /&gt;
        # Verifică dacă datele de intrare respectă restricțiile&lt;br /&gt;
        if c == 1:&lt;br /&gt;
            cuvant = fin.readline().strip()&lt;br /&gt;
            if len(cuvant) &amp;gt; 1000 or not cuvant.islower():&lt;br /&gt;
                fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
                return&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            fout.write(str(k_ps(cuvant)) + &#039;\n&#039;)&lt;br /&gt;
        elif c == 2:&lt;br /&gt;
            sir = fin.readline().strip()&lt;br /&gt;
            if len(sir) &amp;gt; 10000 or not all(cuvant.islower() for cuvant in sir.split()):&lt;br /&gt;
                fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
                return&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            k_cuvinte = sortare_cuvinte(sir)&lt;br /&gt;
            for k in k_cuvinte:&lt;br /&gt;
                fout.write(str(len(k_cuvinte[k])) + &#039; &#039; + &#039; &#039;.join(k_cuvinte[k]) + &#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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3669_-_Bacon&amp;diff=8829</id>
		<title>3669 - Bacon</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3669_-_Bacon&amp;diff=8829"/>
		<updated>2024-01-03T10:10:35Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Bacon == Cifrul Bacon funcţionează așa:  * se citește un mesaj * fiecare litera este înlocuită cu un cod: &amp;#039;&amp;#039;&amp;#039;A-0, B-1, C-2, ... Z-25.&amp;#039;&amp;#039;&amp;#039; * codul fiecarei litere este scris în baza &amp;#039;&amp;#039;&amp;#039;2&amp;#039;&amp;#039;&amp;#039; cu exact &amp;#039;&amp;#039;&amp;#039;5&amp;#039;&amp;#039;&amp;#039; cifre: &amp;#039;&amp;#039;&amp;#039;A-00000&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;B-00001&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;C-00010&amp;#039;&amp;#039;&amp;#039;, … &amp;#039;&amp;#039;&amp;#039;Z-11001&amp;#039;&amp;#039;&amp;#039; * fiecare cifră de &amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039; este înlocuită cu litera &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; * fiecare cifră de &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039; este înlocuită cu litera &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; == Cerinţa == Pentru un număr &amp;#039;&amp;#039;&amp;#039;c&amp;#039;&amp;#039;&amp;#039;: * dacă &amp;#039;&amp;#039;&amp;#039;c=1&amp;#039;&amp;#039;&amp;#039;, se dă un...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bacon ==&lt;br /&gt;
Cifrul Bacon funcţionează așa:&lt;br /&gt;
&lt;br /&gt;
* se citește un mesaj&lt;br /&gt;
* fiecare litera este înlocuită cu un cod: &#039;&#039;&#039;A-0, B-1, C-2, ... Z-25.&#039;&#039;&#039;&lt;br /&gt;
* codul fiecarei litere este scris în baza &#039;&#039;&#039;2&#039;&#039;&#039; cu exact &#039;&#039;&#039;5&#039;&#039;&#039; cifre: &#039;&#039;&#039;A-00000&#039;&#039;&#039;, &#039;&#039;&#039;B-00001&#039;&#039;&#039;, &#039;&#039;&#039;C-00010&#039;&#039;&#039;, … &#039;&#039;&#039;Z-11001&#039;&#039;&#039;&lt;br /&gt;
* fiecare cifră de &#039;&#039;&#039;0&#039;&#039;&#039; este înlocuită cu litera &#039;&#039;&#039;A&#039;&#039;&#039;&lt;br /&gt;
* fiecare cifră de &#039;&#039;&#039;1&#039;&#039;&#039; este înlocuită cu litera &#039;&#039;&#039;B&#039;&#039;&#039;&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Pentru un număr &#039;&#039;&#039;c&#039;&#039;&#039;:&lt;br /&gt;
* dacă &#039;&#039;&#039;c=1&#039;&#039;&#039;, se dă un mesaj ce trebuie codificat&lt;br /&gt;
* dacă &#039;&#039;&#039;c=2&#039;&#039;&#039;, se dă un mesaj ce trebuie decodificat&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;baconin.txt&#039;&#039;&#039; conține pe prima linie numărul &#039;&#039;&#039;c&#039;&#039;&#039;, iar pe a doua linie un mesaj&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire &#039;&#039;&#039;baconout.txt&#039;&#039;&#039; va conține pe prima linie mesajul codificat, dacă &#039;&#039;&#039;c=1&#039;&#039;&#039; sau mesajul decodificat in caz contrar&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 &amp;amp;les;&#039;&#039;&#039; lungimea mesajului necodificat &#039;&#039;&#039;&amp;amp;les; 10000&#039;&#039;&#039;&lt;br /&gt;
* mesajul necodificat va conține numai litere mari ale alfabetului englez&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; baconin.txt&lt;br /&gt;
 1&lt;br /&gt;
 PBINFO&lt;br /&gt;
; baconout.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 ABBBBAAAABABAAAABBABAABABABBBA&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; baconin.txt&lt;br /&gt;
 2&lt;br /&gt;
 ABBBBAAAABABAAAABBABAABABABBBA&lt;br /&gt;
; baconout.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 PBINFO&lt;br /&gt;
== Exemplu 3 ==&lt;br /&gt;
; baconin.txt&lt;br /&gt;
 1&lt;br /&gt;
 pbinfo&lt;br /&gt;
; baconout.txt&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def codificare(mesaj):&lt;br /&gt;
    # Transformă fiecare literă în codul său corespunzător&lt;br /&gt;
    return &#039;&#039;.join([&#039;A&#039; if cifra == &#039;0&#039; else &#039;B&#039; for litera&lt;br /&gt;
                    in mesaj for cifra in format(ord(litera) - ord(&#039;A&#039;), &#039;05b&#039;)])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def decodificare(mesaj):&lt;br /&gt;
    # Transformă fiecare cod în litera sa corespunzătoare&lt;br /&gt;
    return &#039;&#039;.join([chr(int(mesaj[i:i+5].replace(&#039;A&#039;, &#039;0&#039;).replace(&#039;B&#039;, &#039;1&#039;), 2) + ord(&#039;A&#039;))&lt;br /&gt;
                    for i in range(0, len(mesaj), 5)])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;baconin.txt&#039;, &#039;r&#039;) as fin, open(&#039;baconout.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        c = int(fin.readline().strip())&lt;br /&gt;
        mesaj = fin.readline().strip()&lt;br /&gt;
&lt;br /&gt;
        # Verifică dacă mesajul respectă restricțiile&lt;br /&gt;
        if len(mesaj) &amp;gt; 10000 or not mesaj.isupper():&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Codifică sau decodifică mesajul în funcție de valoarea lui c&lt;br /&gt;
        if c == 1:&lt;br /&gt;
            fout.write(codificare(mesaj) + &#039;\n&#039;)&lt;br /&gt;
        elif c == 2:&lt;br /&gt;
            fout.write(decodificare(mesaj) + &#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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3146_-_Sort_4&amp;diff=8828</id>
		<title>3146 - Sort 4</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3146_-_Sort_4&amp;diff=8828"/>
		<updated>2024-01-03T09:28:45Z</updated>

		<summary type="html">&lt;p&gt;Codrut Borcutean: Pagină nouă: == Cerinţa == &amp;#039;&amp;#039;&amp;#039;Laurențiu&amp;#039;&amp;#039;&amp;#039; este un copil pasionat de teoria numerelor, dar și de informatică. Astfel, în timp ce își savura limonada după o zi obositoare de scoală alături de prietenii săi, acestuia i-a venit în minte o problemă interesantă: dându-se un șir de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; numere naturale, sortați-l &amp;#039;&amp;#039;&amp;#039;descrescător&amp;#039;&amp;#039;&amp;#039; după numărul de cifre distincte, la număr de cifre distincte egal sortați-l &amp;#039;&amp;#039;&amp;#039;crescător&amp;#039;&amp;#039;&amp;#039; după suma cifrelor, la suma cifrelor egală so...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
&#039;&#039;&#039;Laurențiu&#039;&#039;&#039; este un copil pasionat de teoria numerelor, dar și de informatică. Astfel, în timp ce își savura limonada după o zi obositoare de scoală alături de prietenii săi, acestuia i-a venit în minte o problemă interesantă: dându-se un șir de &#039;&#039;&#039;n&#039;&#039;&#039; numere naturale, sortați-l &#039;&#039;&#039;descrescător&#039;&#039;&#039; după numărul de cifre distincte, la număr de cifre distincte egal sortați-l &#039;&#039;&#039;crescător&#039;&#039;&#039; după suma cifrelor, la suma cifrelor egală sortați-l &#039;&#039;&#039;crescător&#039;&#039;&#039; după produsul cifrelor, iar dacă și produsul cifrelor este egal, atunci numerele se vor sorta &#039;&#039;&#039;crescător&#039;&#039;&#039; după valorile lor.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;sort4in.txt&#039;&#039;&#039; conține pe prima linie numărul &#039;&#039;&#039;n&#039;&#039;&#039;, iar pe a două linie &#039;&#039;&#039;n&#039;&#039;&#039; numere naturale separate prin spații.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire &#039;&#039;&#039;sort4out.txt&#039;&#039;&#039; vă conține șirul sortat.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 &amp;amp;les; n &amp;amp;les; 1.000.000&#039;&#039;&#039;&lt;br /&gt;
* numerele de pe a două linie a fișierului de intrare vor fi mai mici decât &#039;&#039;&#039;2.000.000.000&#039;&#039;&#039;&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; sort4in.txt&lt;br /&gt;
 5&lt;br /&gt;
 111 19 223 51 37&lt;br /&gt;
; sort4out.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse&lt;br /&gt;
 51 223 19 37 111&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; sort4in.txt&lt;br /&gt;
 5&lt;br /&gt;
 111 19 223 51 20000000001&lt;br /&gt;
; sort4out.txt&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def cifre_distincte(n):&lt;br /&gt;
    return len(set(str(n)))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def suma_cifrelor(n):&lt;br /&gt;
    return sum(int(c) for c in str(n))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def produs_cifrelor(n):&lt;br /&gt;
    produs = 1&lt;br /&gt;
    for c in str(n):&lt;br /&gt;
        produs *= int(c)&lt;br /&gt;
    return produs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Deschiderea fișierelor de intrare și ieșire&lt;br /&gt;
    with open(&#039;sort4in.txt&#039;, &#039;r&#039;) as fin, open(&#039;sort4out.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        # Citirea numărului de elemente din fișierul de intrare&lt;br /&gt;
        int(fin.readline().strip())&lt;br /&gt;
&lt;br /&gt;
        # Citirea numerelor și verificarea restricțiilor&lt;br /&gt;
        numere = list(map(int, fin.readline().strip().split()))&lt;br /&gt;
        if any(numar &amp;lt; 1 or numar &amp;gt;= 2000000000 for numar in numere):&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
        else:&lt;br /&gt;
            fout.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Sortarea numerelor&lt;br /&gt;
        numere.sort(key=lambda x: (-cifre_distincte(x), suma_cifrelor(x), produs_cifrelor(x), x))&lt;br /&gt;
&lt;br /&gt;
        # Scrierea numerelor sortate în fișierul de ieșire&lt;br /&gt;
        fout.write(&#039; &#039;.join(map(str, numere)) + &#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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Codrut Borcutean</name></author>
	</entry>
</feed>