Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 629 odgovora
  • 108.181 pregleda

Najnovija ↓

Re: Zadaci za wannabe pythoniste 18.02.2020. u 17:45 · pre 81 mesec #301
Nema nikakvih komentara za rešenje zadatka broj 22,
što jedino mogu da protumačim tako da je bez mana :D

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.
Re: Zadaci za wannabe pythoniste 18.02.2020. u 19:37 · pre 81 mesec #302
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.
Re: Zadaci za wannabe pythoniste 19.02.2020. u 03:49 · pre 81 mesec #303
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 :D
Re: Zadaci za wannabe pythoniste 19.02.2020. u 05:46 · pre 81 mesec #304
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.
Re: Zadaci za wannabe pythoniste 19.02.2020. u 06:54 · pre 81 mesec #305
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 :)
Re: Zadaci za wannabe pythoniste 19.02.2020. u 06:58 · pre 81 mesec #307
"Ne znam kako da ga sortiram u opadajućem nizu."

Dodaj reverse=True sort funkciji: lista.sort(key = operator.itemgetter(1), reverse=True)
Re: Zadaci za wannabe pythoniste 19.02.2020. u 07:22 · pre 81 mesec #308
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
Re: Zadaci za wannabe pythoniste 19.02.2020. u 07:29 · pre 81 mesec #309
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
Re: Zadaci za wannabe pythoniste 19.02.2020. u 08:53 · pre 81 mesec #310
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
Re: Zadaci za wannabe pythoniste 19.02.2020. u 09:01 · pre 81 mesec #311
Gledam nešto ovaj Rust Docker image mnogo veliki? rust alpine 753MB
Re: Zadaci za wannabe pythoniste 19.02.2020. u 09:01 · pre 81 mesec #312
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

Re: Zadaci za wannabe pythoniste 19.02.2020. u 09:11 · pre 81 mesec #313
"probaj da ukljucis optimizacije:"

Tako radi dosta brže.

real 0m 0.20s
user 0m 0.20s
sys 0m 0.00s
Re: Zadaci za wannabe pythoniste 19.02.2020. u 11:48 · pre 81 mesec #314
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. :)
Re: Zadaci za wannabe pythoniste 19.02.2020. u 13:17 · pre 81 mesec #317
"I ako izbacis regex ubrzaces jos vise ;)"

Neće, čak je i sporije.
Re: Zadaci za wannabe pythoniste 19.02.2020. u 15:32 · pre 81 mesec #319
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
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme