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?
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)
Ugyanezt a prog.hu-n is megkérdezték. Attól jobb megoldás nem kell.
#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.
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
#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.
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
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.
> 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á.)
@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]
> 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.
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!