Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Zadaci za wannabe pythoniste

[es] :: Python :: Zadaci za wannabe pythoniste

Strane: << < .. 11 12 13 14 15 16 17 18 19 20 ... Dalje > >>

[ Pregleda: 52161 | Odgovora: 629 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste18.02.2020. u 16:45 - pre 50 meseci
Nema nikakvih komentara za rešenje zadatka broj 22,
što jedino mogu da protumačim tako da je bez mana

Zato idemo na zadatak broj 23:

# Jedna od tehnika koje se koriste pri razbijanju neke jednostavnije forme enkripcije je utvrđivanje
# koja slova se u nekom tekstu najčešće pojavljuju. Zatim se ona mapiraju najučestalijim
# slovima iz datog jezika. Ne znam koja su najučestalija slova u srpskom, ali uz ovaj program možemo to utvrditi,
# ako uzmemo dovoljno velik uzorak. Ovaj program broji koliko se svako slovo teksta puta ponavlja i ispisuje
# odgovarajuću tabelu: "slovo = broj ponavljanja". Korisnik prilikom pokretanja programa navodi ime fajla za analizu.
# Program ga upozorava ako to nije učinio ili ako nije u stanju da otvori traženi fajl.

Rešenje sam postavio ovde.
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Zadaci za wannabe pythoniste18.02.2020. u 18:37 - pre 50 meseci
Zašto brojiš samo slova, a pri tom praviš razliku između malih i velikih slova?
Budi dosledan, ili prebroj SVE znake, uključujući interpunkciju i razmake, ili broj samo slova, ali onda nemoj da praviš razliku mala/velika slova.
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste19.02.2020. u 02:49 - pre 50 meseci
Takav je zadatak. Naći koje slovo je najčešće.

Ali u pravu si, nema potrebe da razdvajam velika i mala slova.
Zato sam dodao jedan
tekst.lower()
i sve u redu

Sada je ispis slova sortiran po abecedi. Bilo bi zanimljivo da postoji i
opcija da se ispis sortira po učestalosti. Od najvećeg do najmanjeg broja.
I kao šlag na tortu, da program sabere sve te brojeve i ispiše koliko je
ukupno slova u tekstu.

Moram još to da provalim, pre nego što rešenje pošaljem guglu
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste19.02.2020. u 04:46 - pre 50 meseci
Dobro, verzija 2.0 programa urađena.

Sada ispisuje sortirano i po slovima i po broju ponavljanja,
u zavisnosti šta mušterija odabere. :)

Kao bonus, dobija na kraju i ukupan broj slova.
Ma sve servirano ko na tacni :))

Ostala je još jedna začkoljica.
Kad ispisuje prema broju ponavljanja, ide od najmanjeg ka najvećem:

15019 = l
15341 = d
15365 = p
17206 = m
19288 = k
19598 = v
19610 = u
21376 = t
23857 = j
27513 = s
34764 = n
43633 = e
47215 = o
52152 = i
53968 = a

Ne znam kako da ga sortiram u opadajućem nizu.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Zadaci za wannabe pythoniste19.02.2020. u 05:54 - pre 50 meseci
A evo i nesto u rustu:
Code:

use std::fs::File;
use std::io::prelude::*;
use std::collections::*;

fn main()-> Result<(),String> {
    let args:Vec<_> = std::env::args().collect();
    if args.len() != 2 {
        return Err(format!("expected: {} file_name",args[0]));
    }
    let mut f = File::open(args[1].clone()).unwrap();
    let mut contents = String::new();
    let _ = f.read_to_string(&mut contents);
    let filtered = contents.chars().filter(|c|c.is_alphabetic()).collect::<String>().to_lowercase();
    let mut hm:HashMap<char,i32>=HashMap::new();
    for l in filtered.chars() {
        let r = hm.entry(l).or_insert(0);
        *r += 1;
    }
    let mut sorted:Vec<(i32,char)> = Vec::new();
    for (k,v) in hm {
        sorted.push((v,k));
    }
    sorted.sort();
    for (k,v) in sorted.iter().rev() {
        println!("{} = {}",k,v);
    }
    println!("chars {}", sorted.iter().fold(0,|s,(num,_)|s+num));
    Ok(())
}


za poredjenje izmenjeni python:
Code:

import sys
import re
import string
import operator

# Provera da su dati svi argumenti.
if len(sys.argv) != 2:
    print("Unesi ime fajla za slovnu analizu. Npr. >> 154.py fajl.txt")
    quit()

sva_slova = {}

# uklanjanje interpunkcije
try:
    with open(sys.argv[1], 'r', encoding='utf-8') as f:
        tekst = f.read()
        tekst1 = tekst.lower()
        samo_reci = re.sub('['+string.punctuation+', 0-9, r\n, ' ']', '', tekst1)
        sorta = ''.join(sorted(samo_reci))

        for slovo in sorta:
            if slovo in sva_slova:
                sva_slova[slovo] += 1
            else:
                sva_slova[slovo] = 1

except:
    print("Dogodila se greška pri učitavanju fajla.")
    quit()

# pravljenje liste sa tuplama, kako bi se dobio ispis
lista = [(k, v) for k, v in sva_slova.items()]

print()
print('Ovo je učestalost po broju ponavljanja:')
lista.sort(key = operator.itemgetter(1))
for item in lista:
        print(str(item[1]) + str(' = ') + str(item[0]))

# izračunavanje ukupnog broja slova u tekst
zbir = 0
lista.reverse()
for char in lista:
    zbir += char[1]
print('Ukupno u tekstu {} slova'.format(zbir))
/code]
A sad vreme izvrsavanja:
rust:
Code:

~/examples/rust >>> time ./letter_count bible.txt                                                                                                                                                                        
437385 = e
323802 = t
292940 = h
291659 = a
253611 = o
236506 = n
214156 = s
209062 = i
179738 = r
160755 = d
140235 = l
91170 = u
90659 = m
83210 = f
66586 = w
61424 = c
59411 = y
58877 = g
52207 = b
46827 = p
32426 = v
26908 = k
13753 = j
4810 = z
2662 = x
953 = q
chars 3431732
./letter_count bible.txt  0.16s user 0.00s system 99% cpu 0.168 total

python:
Code:

/examples/rust >>> time python letter_count.py bible.txt                                                                                                                                                                

Ovo je učestalost po broju ponavljanja:
953 = q
2662 = x
4810 = z
13753 = j
26908 = k
31102 =     
32426 = v
46827 = p
52207 = b
58877 = g
59411 = y
61424 = c
66586 = w
83210 = f
90659 = m
91170 = u
140235 = l
160755 = d
209062 = i
214156 = s
236506 = n
253611 = o
291659 = a
292940 = h
323802 = t
437385 = e
Ukupno u tekstu 3283096 slova
python letter_count.py bible.txt  1.02s user 0.08s system 99% cpu 1.097 total


Kao sto vidis rust je vise nego 5 puta brzi :)
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Zadaci za wannabe pythoniste19.02.2020. u 05:56 - pre 50 meseci
Zeznuo sam se u pythonu samo koju listu d uradim reverse :)
Drugo, python broji i space-ove ....
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste19.02.2020. u 05:58 - pre 50 meseci
"Ne znam kako da ga sortiram u opadajućem nizu."

Dodaj reverse=True sort funkciji: lista.sort(key = operator.itemgetter(1), reverse=True)
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste19.02.2020. u 06:22 - pre 50 meseci
Citat:
Branimir Maksimovic:
Zeznuo sam se u pythonu samo koju listu d uradim reverse :)
Drugo, python broji i space-ove ....


Kako koju listu? Pa ovu sa brojevima napred.
Da vidimo koje je najčešće slovo.
Šta će nam reverse sa slovima od z do a? :))

Pošto sam radio na tekstu od skoro 500.000 slova,
ispada da je "a" stvarno najčešće slovo u srpskom.
Iznenadilo me da su n,s,j,t pre vokala u.

Inače, rust je malo zarđao. Moraš ga podmazati :)))

Python je majka. Prelazi što pre dok nije kasno :D
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste19.02.2020. u 06:29 - pre 50 meseci
Citat:
Panta_:
"Ne znam kako da ga sortiram u opadajućem nizu."

Dodaj reverse=True sort funkciji: lista.sort(key = operator.itemgetter(1), reverse=True)

Radi!

Eto, ko će drugi nego Panta.
Pa čoveče ima li pitanja na koje ti ne znaš odgovor!? :)

Nego, sad kad je program pod konac, da šaljem guglu?
Ili da pokrećem startap? :D
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste19.02.2020. u 07:53 - pre 50 meseci
Malo brža Python verzija:
Code (python):
import sys
import re
import string
import operator
from collections import Counter

# Provera da su dati svi argumenti.
if len(sys.argv) != 2:
    print("Unesi ime fajla za slovnu analizu. Npr. >> 154.py fajl.txt")
    quit()

#sva_slova = {}

# uklanjanje interpunkcije
try:
    with open(sys.argv[1], 'r', encoding='utf-8') as f:
        tekst = f.read()
        #tekst1 = tekst.lower()
        #samo_reci = re.sub('['+string.punctuation+', 0-9, r\n, ' ']', '', tekst1)
        #sorta = ''.join(sorted(samo_reci))
        sorta = ''.join(i for i in sorted(re.findall('[a-zA-Z]+', tekst.lower())))

        # for slovo in sorta:
        #     if slovo in sva_slova:
        #         sva_slova[slovo] += 1
        #     else:
        #         sva_slova[slovo] = 1
        sva_slova = Counter(sorta)

except:
    print("Dogodila se greška pri učitavanju fajla.")
    quit()

# pravljenje liste sa tuplama, kako bi se dobio ispis
#lista = [(k, v) for k, v in sva_slova.items()]

print()
print('Ovo je učestalost po broju ponavljanja:')
#lista.sort(key = operator.itemgetter(1))
lista = sorted(sva_slova.items(), key=operator.itemgetter(1), reverse=True)
for item in lista:
        print(str(item[1]) + str(' = ') + str(item[0]))

# izračunavanje ukupnog broja slova u tekst
#zbir = 0
#lista.reverse()
#for char in lista:
#    zbir += char[1]

zbir = sum(i[1] for i in lista)
print('Ukupno u tekstu {} slova'.format(zbir))
 


Python:

Code:
time python3 letter_count.py pg10.txt 

Ovo je učestalost po broju ponavljanja:
412265 = e
317765 = t
282690 = h
275735 = a
243208 = o
225065 = n
193974 = i
190038 = s
170339 = r
158103 = d
129947 = l
83550 = f
83476 = u
79945 = m
65496 = w
58578 = y
55307 = g
55070 = c
48880 = b
43260 = p
30368 = v
22295 = k
8890 = j
2972 = z
1479 = x
964 = q
Ukupno u tekstu 3239659 slova
real    0m 1.25s
user    0m 1.18s
sys    0m 0.07s


Rust:

Code:
time ./letter_count pg10.txt 
412265 = e
317765 = t
282690 = h
275735 = a
243208 = o
225065 = n
193974 = i
190038 = s
170339 = r
158103 = d
129947 = l
83550 = f
83476 = u
79945 = m
65496 = w
58578 = y
55307 = g
55070 = c
48880 = b
43260 = p
30368 = v
22295 = k
8890 = j
2972 = z
1479 = x
964 = q
chars 3239659
real    0m 2.82s
user    0m 2.81s
sys    0m 0.01s


Python više nego duplo brži. ;)

Fajl input: http://www.gutenberg.org/cache/epub/10/pg10.txt
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste19.02.2020. u 08:01 - pre 50 meseci
Gledam nešto ovaj Rust Docker image mnogo veliki? rust alpine 753MB
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Zadaci za wannabe pythoniste19.02.2020. u 08:01 - pre 50 meseci
Kako si useo da ti Rust radi tako sporo? ;)
Code:

~/examples/rust >>> time ./letter_count bible.txt                                                                                                                                                                        
437385 = e
323802 = t
292940 = h
291659 = a
253611 = o
236506 = n
214156 = s
209062 = i
179738 = r
160755 = d
140235 = l
91170 = u
90659 = m
83210 = f
66586 = w
61424 = c
59411 = y
58877 = g
52207 = b
46827 = p
32426 = v
26908 = k
13753 = j
4810 = z
2662 = x
953 = q
chars 3431732
./letter_count bible.txt  0.16s user 0.01s system 99% cpu 0.174 total
~/examples/rust >>> time python letter_count.py bible.txt                                                                                                                                                                

Ovo je učestalost po broju ponavljanja:
437385 = e
323802 = t
292940 = h
291659 = a
253611 = o
236506 = n
214156 = s
209062 = i
179738 = r
160755 = d
140235 = l
91170 = u
90659 = m
83210 = f
66586 = w
61424 = c
59411 = y
58877 = g
52207 = b
46827 = p
32426 = v
26908 = k
13753 = j
4810 = z
2662 = x
953 = q
Ukupno u tekstu 3431732 slova
python letter_count.py bible.txt  0.63s user 0.06s system 99% cpu 0.703 total

rust vise nego 4 puta brzi ;)

probaj da ukljucis optimizacije:
Code:

rustc -O -C target-cpu=native letter_count.rs

 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste19.02.2020. u 08:11 - pre 50 meseci
"probaj da ukljucis optimizacije:"

Tako radi dosta brže.

real 0m 0.20s
user 0m 0.20s
sys 0m 0.00s
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste19.02.2020. u 10:48 - pre 50 meseci
Sad tek vidim da Python dvaput sortira, dovoljno je "sorta = ''.join(i for i in re.findall('[a-z]+', tekst.lower()))". Onda je "samo" 3 puta sporiji. :)
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Zadaci za wannabe pythoniste19.02.2020. u 11:08 - pre 50 meseci
I ako izbacis regex ubrzaces jos vise ;)
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste19.02.2020. u 11:25 - pre 50 meseci
A kad izbaciš učitavanje fajla, biće ko munja :D
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste19.02.2020. u 12:17 - pre 50 meseci
"I ako izbacis regex ubrzaces jos vise ;)"

Neće, čak je i sporije.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Zadaci za wannabe pythoniste19.02.2020. u 13:34 - pre 50 meseci
Pa da, regex implementacija u C-u ;)
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste19.02.2020. u 14:32 - pre 50 meseci
Fora je što regex + čita koliko god može karaktera u opsegu od a-z dok ne naiđe na neki ne a-z karakter i vrati match, tzv. greedy quantifier, dok bi recimo bez + za svaki a-z karakter vratio match.

Code:
%timeit ''.join(i for i in tekst.lower() if i.isalpha())
1 loop, best of 5: 368 ms per loop

%timeit ''.join(filter(lambda i: i.isalpha(), tekst))
1 loop, best of 5: 508 ms per loop

%timeit ''.join(re.findall('[a-z]+', tekst.lower()))
1 loop, best of 5: 276 ms per loop
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Zadaci za wannabe pythoniste20.02.2020. u 17:31 - pre 50 meseci
Citat:
Panta_:
Gledam nešto ovaj Rust Docker image mnogo veliki? rust alpine 753MB


Gde samo nađe Rust kontejner od 753MB?

https://hub.docker.com/_/rust?tab=tags

Najveći je 450MB. A ide od 125MB pa na gore. Java HelloWorld ne može da se spakuje na manje od 1GB...
 
Odgovor na temu

[es] :: Python :: Zadaci za wannabe pythoniste

Strane: << < .. 11 12 13 14 15 16 17 18 19 20 ... Dalje > >>

[ Pregleda: 52161 | Odgovora: 629 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.