Kezdőoldal » Számítástechnika » Programozás » Ha van egy lista,tele számokka...

Ha van egy lista,tele számokkal,amik 1től 10000ig bármekkorák lehetnek,akkor mi a "legszebb" megoldás arra,hogy összeszámláljuk,hogy egy adott számjegyből mennyi darab van?

Figyelt kérdés
Úgy csináltam,hogy a listán egy for ciklussal végigmenve számjegyenként és helyiértékenként számoltattam össze,úgy hogy pl. 1es a 1es helyiértéken akkor számolja bele,ha a szám maradékosan osztva 1el 1-a maradéka. 1 es számjegyet 10es helyiértéken úgy számoltam,hogy a számot százzal osztva a maradék legalább tíz,de kisebb mint 20. És így tovább. A feladatban megadott tesztértékekkel leteszteltem,jó értékeket adott. Azonban a kód elég hosszú lett. Van-e gyorsabb mód rá,vagy nincs?Arra akarok kilyukadni,hogy lehet-e szebb kóddal?
2021. szept. 23. 23:04
1 2 3
 11/27 Pelenkásfiú ***** válasza:
64%

Python, továbbra is stringként, hadd jöjjön a 0%-os értékelés:


nums = [123, 234, 555, 111, 98]

string = ''.join(str(x) for x in nums)


count = {x:0 for x in range(0, 10)}


for n in string:

___count[ord(n)-48]+=1


print(count)

2021. szept. 23. 23:51
Hasznos számodra ez a válasz?
 12/27 anonim ***** válasza:
75%

Ugyanezt a prog.hu-n is megkérdezték. Attól jobb megoldás nem kell.

[link]

2021. szept. 24. 00:02
Hasznos számodra ez a válasz?
 13/27 2*Sü ***** válasza:
55%

#11: Az a gond ezzel, hogy nagyon memória és processzorigényes, végig kell menni az összes számon, stringgé alakítani, összefűzni – ennek ugye külön memória kell –, majd végigmenni a stringen, az adott karaktert visszaalakítani számmá, stb… Ha 1000 számról van szó, akkor belefér, de ha százmillió számról, akkor nem mindegy a hatékonyság és a memóriaigény sem.


Illetve lehetne „szép” megoldás, ha ugyan erőforrásigényes, de rövidebb vagy kreatívabb megoldás lenne. De a számokat számként kezelő megoldás is eléggé rövidke, átlátható, érthető, viszont nincs különösebb extra memóriaigénye és kellően gyors is. Nyilván a tied is egy megoldás, de én koránt sem mondanám a „legszebb” megoldásnak, akárhogy is értelmezem ezt a kifejezést.

2021. szept. 24. 00:06
Hasznos számodra ez a válasz?
 14/27 anonim ***** válasza:
53%

6 és 10 vagyok


9: direkt nem programnyelvről beszéltem, mert itt nem ez a lényeg. Amúgy ha már a JS-t említed, akkor használjuk a JS által biztosított array methodokat: [link]


Ha dzsuvaszkriptezünk, akkor csináljuk normálisan, és használjuk ki azokat a dolgokat, amikkel 20-30-40 sorokat lehet megspórolni

2021. szept. 24. 00:12
Hasznos számodra ez a válasz?
 15/27 Pelenkásfiú ***** válasza:
63%

#13

A sebességet illetően teljesen igazad van, de számomra szebb és rövidebb az én megoldásom.

Sok programot/scriptet úgy írunk meg, hogy összesen egyszer futtatjuk le valamilyen feladat megoldására, aztán többet nincs rá szükség. Tehát nem mindig kell az optimalizálással foglalkozni. Főleg a tanulás folyamatában jobb minél többféle megoldást látni szerintem.

2021. szept. 24. 00:19
Hasznos számodra ez a válasz?
 16/27 Pelenkásfiú ***** válasza:
36%

Egyébként meg a #7-est is lepontozták 0%-ra, szóval úgy látom, ide is értelmes emberek járnak. :D

Bocs már, hogy szóltam valakinek, hogy a feladatot sem jól értelmezi... :D

2021. szept. 24. 00:36
Hasznos számodra ez a válasz?
 17/27 anonim ***** válasza:
75%

Az a baj, hogy ez a kérdés jelenleg hitvita. Legalább a kérdező mondana valami olyan metrikát, amire lehet alapozni a válaszunkat, például:

- minél kevesebb utasításból álljon a magas szintű nyelvű kód

- minél kevesebb idő alatt végezze el a kód a feladatot

- minél kevesebb legyen a feladat elvégzése során felhasznált memória

stb. Az, hogy a kód "legyen szebb", az szubjektív és nem vezet eredményre, mert ami tetszik az egyiknek, az nem tetszik a másiknak.

2021. szept. 24. 00:44
Hasznos számodra ez a válasz?
 18/27 2*Sü ***** válasza:
69%

> 9: direkt nem programnyelvről beszéltem, mert itt nem ez a lényeg.


Nos, én a kérdezőnek szántam a viszontkérdést, nem neked. A nyelv olyan szempontból nem lényegtelen, hogy a kérdező mennyire fogja érteni a választ – pl. a Python szép nyelv, de aki nem beszéli, annak kicsit nehezebb lesz kibogarásznia a működést –, illetve hogy van-e olyan nyelvi sajátosság, amit kihasználva lehet egy nem szokványos, de elegáns megoldását adni a feladatnak.


> Amúgy ha már a JS-t említed, akkor használjuk a JS által biztosított array methodokat


Ezt a kritikát még a tömb véletlen számokkal való feltöltésénél jogosnak érzem.


~ ~ ~


> [link]


Számomra a szép kód azt jelenti, hogy a kód tömör is, érthető is, hatékony is. Vagy ha ezeket a nem lehet egyszerre kielégíteni, akkor ezek a szempontok megfelelő arányban állnak.


Viszont a megoldásod még inkább erőforrás zabáló, mint #11 megoldása. Van az eredeti tömb. Az összefűzéshez nem a join-t használod, ami ilyen szempontból valószínű hatékonyabb, hanem a reduce metódust, így a végén nem is egyszer, hanem a függvényhívás miatt kvázi kétszer lesz benne a memóriában az összefűzött szöveg – az a és b változóban –, majd utána benne lesz a memóriában ugyanennek a szövegnek a karaktereit tartalmazó tömb.


Érthetőség, átláthatóság szempontjából is vannak szubjektív fenntartásaim.


Oké, működik, meg ha olyan a helyzet, akkor beleférhet ennyi pazarlás, de ezek miatt én mégsem nevezném általánosságban a „legszebb” megoldásnak. (Az enyémet sem feltétlenül, de szerintem az enyém közelebb áll hozzá.)

2021. szept. 24. 01:45
Hasznos számodra ez a válasz?
 19/27 anonim ***** válasza:
81%

@11: szerintem ez a megoldás teljesen fasza. Én annyit tennék csak hozzá, hogy a dictionary inicializálása felesleges, ha defaultdict-et használsz (from collections).


@13: tudom, hogy csak kötözködni akartál, mert miért is ne, mindenesetre megnéztem, és a string-es módszer konzisztensen gyorsabb (A maradékos osztás kellően nagy számok esetén 2x lassabb). Bár való igaz, hogy a stringek memória igényesebb adatok (kb 2x). Vicces az egészben, hogy több ideig tart a random számokat előállítani, mint azokat feldolgozni. :D Akit érdekel a benchmark: [link]

2021. szept. 24. 01:55
Hasznos számodra ez a válasz?
 20/27 2*Sü ***** válasza:

> mindenesetre megnéztem, és a string-es módszer konzisztensen gyorsabb (A maradékos osztás kellően nagy számok esetén 2x lassabb)


Nos, ez elsőre meglepőnek tűnik, hiszen a számnak a stringgé konvertálása során ugyanúgy egy ciklus fut le, ugyanazokkal a maradékos osztásokkal, csak némi összeadással fűszerezve, csak ezt elrejti a nyelv. Kvázi valami ilyesmi történik a háttérben:


def str_2(num):

 result = []

 while num > 0:

  result.append(chr(ord('0') + num % 10))

  num //= 10

 return ''.join(reversed(result))


(Sőt van némi extra kör az előjel miatt.)

(Bocs, ha rosszul írtam, nagyon ritkán és nem túl jól beszélek Pythonul.)


És akkor lehet, hogy itt tényleg nem is annyira mindegy a nyelv, mert sejtésem szerint Pythonban azért gyorsabb a stringes módszer, mert a típuskonverzió a nyelv része, így jól optimalizált gépi kód van mögötte, míg a maradékos osztásos módszerben ugyanez értelmezett, és így nem gépi kódra optimalizált.

2021. szept. 24. 02:43
Hasznos számodra ez a válasz?
1 2 3

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!