Problema la informatica [clasa a IX-a]
Last Updated: Oct 31 2016 20:25, Started by
Luk1152
, Oct 31 2016 18:05
·
0
#1
Posted 31 October 2016 - 18:05
Salutare. Am mai gasit inca o problema in cartea de informatica pe care nu am reusit sa o rezolv...
Enuntul problemei : Sa se afiseze toate numerele mai mici decat n care au proprietatea ca patratul si cubul fiecaruia au cel putin o cifra comuna. Pentru fiecare numar gasit sa se afiseze cate cifre sunt comune si care sunt acestea. Codul (Python 2.7.2) - l-am pus pe site-ul asta pentru ca aici, pe forum, nu era afisat corect codul... Sper ca e destul de inteligibil codul... Sunt incepator. Deci ce am facut eu a fost sa retin cifrele comune intr-o variabila pe care sa o afisez la sfarsit, dar am vazut ca apar unele probleme (pe care le-am scris ingrosat mai jos) si chiar nu imi dau seama cum sa le rezolv... Sa zicem ca n = 11. Asta e ce primesc eu in consola: ~~~ Cifrele lui 1 si 1 : i = 1 Cifrele comune : 1 Numar de cifre comune: 1 ~~~ Cifrele lui 16 si 64 : i = 4 Cifrele comune : 6 Numar de cifre comune: 1 ~~~ Cifrele lui 25 si 125 : i = 5 Cifrele comune : 2 Numar de cifre comune: 2 ~~~ Cifrele lui 36 si 216 : i = 6 Cifrele comune : 6 Numar de cifre comune: 1 ~~~ Cifrele lui 49 si 343 : i = 7 Cifrele comune : 4 Numar de cifre comune: 1 ~~~ Cifrele lui 100 si 1000 : i = 10 Cifrele comune : 10 Numar de cifre comune: 8 Daca ati putea ca rezolvarea sa fie in pseudocod / python ar fi perfect . E bine si in C++, dar mie imi e putin mai greu sa ii inteleg sintaxa. Si eu inca nu am invatat vectorii / matricele si as cam vrea rezolvarea fara ele, asta in caz ca se poate rezolva cu astea, nu stiu. Va multumesc! Edited by Luk1152, 31 October 2016 - 18:06. |
#2
Posted 31 October 2016 - 19:41
Mai pythonic e asa:
1 n = 10 2 mapping={x: (list(map(int,str(x**2))), list(map(int,str(x**3)))) for x in range(n)} 3 print(mapping) 4 intersection_mapping={x: len(set(y[0]).intersection(y[1])) for x, y in mapping.items()} 5 print(intersection_mapping)iti las tie filtrarea histogramei ca tema. PS: python3. Frumusetea la python e ca poti scrie rapid prototipuri destul de expresive, fara a intra in detalii. Codul tau arata mai mult ca cod scris in liceele romanesti, decat ca python idiomatic. |
#3
Posted 31 October 2016 - 20:09
Iti multumesc pentru rezolvare . Acum am sa incerc sa aflu ce face fiecare linie de cod, dar nu ma grabesc (am invatat python singur si nu sunt chiar foarte avansat).
|
#4
Posted 31 October 2016 - 20:20
Ia-o gradual dupa nivelul complexitatii. Cele doua linii se numesc dictionary comprehension. Incearca in ordine:
{x: x for x in range(n)} {x: x**2 for x in range(n)} {x: (x**2, x**3) for x in range(n)} e chiar banal, si expresiv: e o mapare, un dictionar, intre niste valori in stanga lui :, si alte valori in dreapta lui :. In calcularea fiecarei valori poti folosi euristici, de exemplu o euristica este map(int,str(x)) care, dat fiind un x, iti livreaza cifrele lui x. Dar python nu calculeaza imediat valorile din lista, din motive de optimizare, deci poti forta acel map sa devina list inconjurand totul cu list(): list(map(int,str(x))) Expresiv, compact, usor de inteles. Dupa ce ti-ai exprimat ideea clar dpv algoritmic, poti trece la optimizarea ei. Codul pe care ti l-am aratat nu e cel mai performant, insa e expresiv. Iar la un prototip asta te intereseaza cel mai mult: expresivitatea si usurinta de a modifica. Cu cat ai mai putin cod, cu atat e mai usor de modificat. |
Anunturi
Bun venit pe Forumul Softpedia!
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users