4253 - Text OJI: Difference between revisions

From Bitnami MediaWiki
Andrada378 (talk | contribs)
Pagină nouă: Vasile lucrează intens la un editor de texte. Un text este format din unul sau mai multe paragrafe. Orice paragraf se termină cu Enter şi oricare două cuvinte consecutive din acelaşi paragraf sunt separate prin spaţii (unul sau mai multe). În funcţie de modul de setare a paginii, numărul maxim de caractere care încap în pagină pe o linie este unic determinat (Max). Funcţia pe care Vasile trebuie să o implementeze acum este alinierea în pagină a fiecărui para...
Tag: visualeditor
 
Andrada378 (talk | contribs)
No edit summary
Tag: visualeditor
 
Line 1: Line 1:
== Enunț ==
Vasile lucrează intens la un editor de texte. Un text este format din unul sau mai multe paragrafe. Orice paragraf se termină cu Enter şi oricare două cuvinte consecutive din acelaşi paragraf sunt separate prin spaţii (unul sau mai multe). În funcţie de modul de setare a paginii, numărul maxim de caractere care încap în pagină pe o linie este unic determinat (Max).
Vasile lucrează intens la un editor de texte. Un text este format din unul sau mai multe paragrafe. Orice paragraf se termină cu Enter şi oricare două cuvinte consecutive din acelaşi paragraf sunt separate prin spaţii (unul sau mai multe). În funcţie de modul de setare a paginii, numărul maxim de caractere care încap în pagină pe o linie este unic determinat (Max).


Line 5: Line 6:
În general, este puţin probabil ca alinierea să fie realizabilă prin plasarea aceluiaşi număr de spaţii între oricare două cuvinte consecutive de pe linie. Vasile consideră că este mai elegant ca, dacă între unele cuvinte consecutive trebuie plasat un spaţiu în plus faţă de alte perechi de cuvinte consecutive, acestea să fie plasate la începutul liniei.
În general, este puţin probabil ca alinierea să fie realizabilă prin plasarea aceluiaşi număr de spaţii între oricare două cuvinte consecutive de pe linie. Vasile consideră că este mai elegant ca, dacă între unele cuvinte consecutive trebuie plasat un spaţiu în plus faţă de alte perechi de cuvinte consecutive, acestea să fie plasate la începutul liniei.


'''''<u>Cerința</u>'''''
== Cerința ==
 
Scrieţi un program care să citească lungimea unei linii şi textul dat şi care să alinieze textul la stânga şi la dreapta.
Scrieţi un program care să citească lungimea unei linii şi textul dat şi care să alinieze textul la stânga şi la dreapta.


'''''<u>Date de intrare</u>'''''
== Date de intrare ==
 
Fișierul de intrare textoji.in conține pe prima linie linie Max, lungimea maximă a unui rând. Pe următoarele linii este scris textul.
Fișierul de intrare textoji.in conține pe prima linie linie Max, lungimea maximă a unui rând. Pe următoarele linii este scris textul.


'''''<u>Date de ieșire</u>'''''
== Date de ieșire ==
 
Fișierul de ieșire textoji.out va conține textul aliniat stânga-dreapta.
Fișierul de ieșire textoji.out va conține textul aliniat stânga-dreapta.


'''''<u>Restricții și precizări</u>'''''
== Restricții și precizări ==
 
2 ≤ Max ≤ 1000
 
Lungimea maximă a oricărui cuvânt din text este 50 caractere şi nu depăşeşte Max.
 
Lungimea unui paragraf nu depăşeşte 1000 de caractere.
 
Soluţia este unică.
 
Problema aceasta s-a dat la OJI clasa a IX-a deoarece pe atunci șirurile de caractere se studiau în primul an de liceu (erau 8 ore de informatică pe săptămână – ce vremuri!)


'''''<u>Exemplul 1:</u>'''''
* 2 ≤ Max ≤ 1000
* Lungimea maximă a oricărui cuvânt din text este 50 caractere şi nu depăşeşte Max.
* Lungimea unui paragraf nu depăşeşte 1000 de caractere.
* Soluţia este unică.
* Problema aceasta s-a dat la OJI clasa a IX-a deoarece pe atunci șirurile de caractere se studiau în primul an de liceu (erau 8 ore de informatică pe săptămână – ce vremuri!)


textoji.in
== Exemplul 1 ==
'''textojiin.txt'''


20
20
Line 37: Line 30:
Vasile are multe bomboane bune.
Vasile are multe bomboane bune.


textoji.out
'''textojiout.txt'''


Vasile   are   multe  
Vasile   are   multe  
Line 43: Line 36:
bomboane bune.
bomboane bune.


Explicație
== Explicație ==
 
Pe prima linie au fost plasate câte 3 spaţii între cuvintele consecutive.
Pe prima linie au fost plasate câte 3 spaţii între cuvintele consecutive.


'''''<u>Exemplul 2:</u>'''''
== Exemplul 2 ==
 
'''textojiin.txt'''
textoji.in


20
20
Line 57: Line 48:
Ion are multe pere galbene?
Ion are multe pere galbene?


textoji.out
'''textojiout.txt'''


Ana are mere.
Ana are mere.
Line 65: Line 56:
galbene?
galbene?


'''''<u>Explicație</u>'''''
== Explicație ==
 
Între Ion şi are există 2 spaţii, între are şi multe – 2 spaţii, iar între multe şi pere – 1 spaţiu. Observaţi că paragraful Ana are mere. (care are lungimea mai mică decât 20) a rămas aliniat la stânga, iar ultima linie din fiecare paragraf rămâne aliniată la stânga, cuvintele consecutive fiind separate printr-un singur spaţiu.
Între Ion şi are există 2 spaţii, între are şi multe – 2 spaţii, iar între multe şi pere – 1 spaţiu. Observaţi că paragraful Ana are mere. (care are lungimea mai mică decât 20) a rămas aliniat la stânga, iar ultima linie din fiecare paragraf rămâne aliniată la stânga, cuvintele consecutive fiind separate printr-un singur spaţiu.


'''''<u>Rezolvare</u>'''''
== Rezolvare ==
 
<syntaxhighlight lang="python">
def aliniere_stanga_dreapta(max_lungime, paragraf):
def aliniere_stanga_dreapta(max_lungime, paragraf):
    # Verificăm condițiile impuse asupra datelor de intrare
    if not (2 <= max_lungime <= 1000):
        raise ValueError("Max trebuie să fie între 2 și 1000.")


    linii = []
    cuvinte_paragraf = paragraf.split()
 
    # Iterăm prin fiecare linie din paragraf
 
    for linie in paragraf.split("\n"):
 
        cuvinte = linie.split()
 
        linie_curenta = cuvinte[0]
 
        # Adăugăm cuvinte la linie până când atingem lungimea maximă


        for cuvant in cuvinte[1:]:
    if any(len(cuvant) > 50 for cuvant in cuvinte_paragraf):
        raise ValueError("Lungimea maximă a oricărui cuvânt nu trebuie să depășească 50 de caractere.")


            if len(linie_curenta) + len(cuvant) + 1 <= max_lungime:
    if len(paragraf) > 1000:
        raise ValueError("Lungimea totală a paragrafului nu trebuie să depășească 1000 de caractere.")


                linie_curenta += " " + cuvant
    linii = []


            else:
    for linie in paragraf.split("\n"):
        cuvinte = linie.split()
        linie_curenta = cuvinte[0]


                linii.append(linie_curenta.ljust(max_lungime))
        for cuvant in cuvinte[1:]:
            if len(linie_curenta) + len(cuvant) + 1 <= max_lungime:
                linie_curenta += " " + cuvant
            else:
                linii.append(linie_curenta.ljust(max_lungime))
                linie_curenta = cuvant


                linie_curenta = cuvant
        linii.append(linie_curenta.ljust(max_lungime))


            # Adăugăm ultima linie sau linie cu un singur cuvânt
    return "\n".join(linii)
 
        linii.append(linie_curenta.ljust(max_lungime))
 
        # Returnăm textul aliniat la stânga și la dreapta
 
    return "\n".join(linii)


if __name__ == "__main__":
if __name__ == "__main__":
    # Citim datele de intrare din fișierul "textoji.in"
    with open("textojiin.txt", "r") as f_in:
        max_lungime = int(f_in.readline().strip())
        text = f_in.read()


    # Citim datele de intrare din fișierul "textoji.in"
    # Apelăm funcția pentru aliniere
 
    try:
    with open("textojiin.txt", "r") as f_in:
        rezultat = aliniere_stanga_dreapta(max_lungime, text)
 
    except ValueError as e:
        max_lungime = int(f_in.readline().strip())
        print(f"Eroare: {str(e)}")
 
    else:
        text = f_in.read()
        # Scriem rezultatul în fișierul "textoji.out"
 
        with open("textojiout.txt", "w") as f_out:
        # Apelăm funcția pentru aliniere
            f_out.write(rezultat)
 
</syntaxhighlight>
    rezultat = aliniere_stanga_dreapta(max_lungime, text)
 
    # Scriem rezultatul în fișierul "textoji.out"
 
    with open("textojiout.txt", "w") as f_out:
 
        f_out.write(rezultat)

Latest revision as of 14:30, 5 January 2024

Enunț[edit]

Vasile lucrează intens la un editor de texte. Un text este format din unul sau mai multe paragrafe. Orice paragraf se termină cu Enter şi oricare două cuvinte consecutive din acelaşi paragraf sunt separate prin spaţii (unul sau mai multe). În funcţie de modul de setare a paginii, numărul maxim de caractere care încap în pagină pe o linie este unic determinat (Max).

Funcţia pe care Vasile trebuie să o implementeze acum este alinierea în pagină a fiecărui paragraf din text la stânga şi la dreapta. Pentru aceasta el va trebui să împartă fiecare paragraf în linii separate de lungime Max (fiecare linie terminată cu Enter). Împărţirea se realizează punând numărul maxim posibil de cuvinte pe fiecare linie, fără împărţirea cuvintelor în silabe. Pentru aliniere stânga-dreapta, el trebuie să repartizeze spaţii în mod uniform între cuvintele de pe fiecare linie, astfel încât ultimul caracter de pe linie să fie diferit de spaţiu, iar numărul total de caractere de pe linie să fie egal cu Max. Excepţie face numai ultima linie din paragraf, care rămâne aliniată la stânga (cuvintele fiind separate printr-un singur spaţiu, chiar dacă linia nu este plină).

În general, este puţin probabil ca alinierea să fie realizabilă prin plasarea aceluiaşi număr de spaţii între oricare două cuvinte consecutive de pe linie. Vasile consideră că este mai elegant ca, dacă între unele cuvinte consecutive trebuie plasat un spaţiu în plus faţă de alte perechi de cuvinte consecutive, acestea să fie plasate la începutul liniei.

Cerința[edit]

Scrieţi un program care să citească lungimea unei linii şi textul dat şi care să alinieze textul la stânga şi la dreapta.

Date de intrare[edit]

Fișierul de intrare textoji.in conține pe prima linie linie Max, lungimea maximă a unui rând. Pe următoarele linii este scris textul.

Date de ieșire[edit]

Fișierul de ieșire textoji.out va conține textul aliniat stânga-dreapta.

Restricții și precizări[edit]

  • 2 ≤ Max ≤ 1000
  • Lungimea maximă a oricărui cuvânt din text este 50 caractere şi nu depăşeşte Max.
  • Lungimea unui paragraf nu depăşeşte 1000 de caractere.
  • Soluţia este unică.
  • Problema aceasta s-a dat la OJI clasa a IX-a deoarece pe atunci șirurile de caractere se studiau în primul an de liceu (erau 8 ore de informatică pe săptămână – ce vremuri!)

Exemplul 1[edit]

textojiin.txt

20

Vasile are multe bomboane bune.

textojiout.txt

Vasile   are   multe

bomboane bune.

Explicație[edit]

Pe prima linie au fost plasate câte 3 spaţii între cuvintele consecutive.

Exemplul 2[edit]

textojiin.txt

20

Ana are mere.

Ion are multe pere galbene?

textojiout.txt

Ana are mere.

Ion  are  multe pere

galbene?

Explicație[edit]

Între Ion şi are există 2 spaţii, între are şi multe – 2 spaţii, iar între multe şi pere – 1 spaţiu. Observaţi că paragraful Ana are mere. (care are lungimea mai mică decât 20) a rămas aliniat la stânga, iar ultima linie din fiecare paragraf rămâne aliniată la stânga, cuvintele consecutive fiind separate printr-un singur spaţiu.

Rezolvare[edit]

<syntaxhighlight lang="python"> def aliniere_stanga_dreapta(max_lungime, paragraf):

   # Verificăm condițiile impuse asupra datelor de intrare
   if not (2 <= max_lungime <= 1000):
       raise ValueError("Max trebuie să fie între 2 și 1000.")
   cuvinte_paragraf = paragraf.split()
   if any(len(cuvant) > 50 for cuvant in cuvinte_paragraf):
       raise ValueError("Lungimea maximă a oricărui cuvânt nu trebuie să depășească 50 de caractere.")
   if len(paragraf) > 1000:
       raise ValueError("Lungimea totală a paragrafului nu trebuie să depășească 1000 de caractere.")
   linii = []
   for linie in paragraf.split("\n"):
       cuvinte = linie.split()
       linie_curenta = cuvinte[0]
       for cuvant in cuvinte[1:]:
           if len(linie_curenta) + len(cuvant) + 1 <= max_lungime:
               linie_curenta += " " + cuvant
           else:
               linii.append(linie_curenta.ljust(max_lungime))
               linie_curenta = cuvant
       linii.append(linie_curenta.ljust(max_lungime))
   return "\n".join(linii)

if __name__ == "__main__":

   # Citim datele de intrare din fișierul "textoji.in"
   with open("textojiin.txt", "r") as f_in:
       max_lungime = int(f_in.readline().strip())
       text = f_in.read()
   # Apelăm funcția pentru aliniere
   try:
       rezultat = aliniere_stanga_dreapta(max_lungime, text)
   except ValueError as e:
       print(f"Eroare: {str(e)}")
   else:
       # Scriem rezultatul în fișierul "textoji.out"
       with open("textojiout.txt", "w") as f_out:
           f_out.write(rezultat)

</syntaxhighlight>