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

Zadaci za wannabe pythoniste

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

Strane: << < .. 27 28 29 30 31 32

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

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

a1234567

Član broj: 46801
Poruke: 297
65.18.117.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste25.05.2020. u 17:59 - pre 46 meseci
Idemo dalje...

Zadatak 46: YAML

Have you ever heard of such markup language as YAML? It’s a friendly data serialization format.
In fact it’s so friendly that both people and programs can read it quite well. You can play around
with the standard by following this link.

YAML is a text, and you need to convert it into an object. But I’m not asking you to implement
the entire YAML standard, we’ll implement it step by step.

The first step is the key-value conversion. The key can be any string consisting of Latin letters and numbers.
The value can be a single-line string (which consists of spaces, Latin letters and numbers) or a number (int).

I’ll show some examples:

name: Alex
age: 12


Converted into an object.

{
"name": "Alex",
"age": 12
}


Note that the number automatically gets type int
Another example shows that the string may contain spaces.

name: Alex Fox
age: 12

class: 12b


Will be converted into the next object.

{
"age": 12,
"name": "Alex Fox",
"class": "12b"
}


Pay attention to a few things. Between the string "age" and the string "class" there is an empty string that doesn’t interfere with parsing.
The class starts with numbers, but has letters, which means it cannot be converted to numbers, so its type remains a string (str).

Input: A format string.
Output: An object.
Precondition: YAML 1.2 is being used with JSON Schema.

Code:
def yaml(a):
    # your code here
    return None


if __name__ == '__main__':
    print("Example:")
    print(yaml("""name: Alex
age: 12"""))

    # These "asserts" are used for self-checking and not for an auto-testing
    assert yaml("""name: Alex
age: 12""") == {'age': 12, 'name': 'Alex'}
    assert yaml("""name: Alex Fox
age: 12

class: 12b""") == {'age': 12,
 'class': '12b',
 'name': 'Alex Fox'}
    print("Coding complete? Click 'Check' to earn cool rewards!")


Moje rešenje je ovde.
 
Odgovor na temu

B3R1
Berislav Todorovic
NL

Član broj: 224915
Poruke: 794



+630 Profil

icon Re: Zadaci za wannabe pythoniste26.05.2020. u 13:16 - pre 46 meseci
YAML sam ti vec pomenuo u ovom postu. Puna specifikacija je prilicno slozena, zato i postoji 'yaml' modul kojim se sve to resava. Ali dobro, poenta je ovde vezbanje pythona. Par napomena:
Code (python):
    a = [i for i in a if len(i) != 0]
    a = sorted(a)

Cemu ovo gore? Primecujem da bas u svaki program ubacujes "list comprehension", cak i tamo gde tome nije mesto. S druge strane, onda jos i sortiras kljuceve. To su dva nepotrebna koraka kojima samo usporavas program. Ispitivanje da li je red prazan si mogao da ubacis i u "for" petlju, nakon linije 7. Nema potrebe prolaziti vise puta kroz petlju.

Druga stvar: tvoj program (linije 10-12) ne radi ono sto se trazilo u zadatku:
Citat:
The value can be a single-line string (which consists of spaces, Latin letters and numbers) or a number (int).

Ti umesto toga ispitujes da li je kljuc == 'age' i ako jeste konvertujes njegovu vrednost u int, dok npr. 'class' moze da bude isto tako int ... Ti treba da ispitas da li je vrednost (desno od dvotacke) int ili str i ako je int treba da primenis int() funkciju.
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
65.18.117.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste26.05.2020. u 16:13 - pre 46 meseci
Berislave, hvala na komentarima.

Bio sam pod utiskom da treba sortirati, jer se redosled ulaznih i izlaznih podataka razlikuje.

Evo sad sam napravio apdejtovanu verziju i sve radi.

Code:
def yaml(a):
    recnik = {}
    b = []
    a = a.split('\n')
    a = sorted(a)
    for i in a:
        if len(i) != 0:
            b = i.split(':')
            recnik[b[0]] = b[1].strip()
    for k, v in recnik.items():
        if v.isdigit():
            recnik[k] = int(v)
        else:
            recnik[k] = v
    return recnik 
 
Odgovor na temu

B3R1
Berislav Todorovic
NL

Član broj: 224915
Poruke: 794



+630 Profil

icon Re: Zadaci za wannabe pythoniste26.05.2020. u 17:42 - pre 46 meseci
Dobro, to je vec bolje. Ali moze jos bolje. Opet imas dve petlje, a sve mozes da uradis u jednom potezu. Lepo si razdvojio kljuc i vrednost koristeci split(). Zasto nisi odmah ispitao da li je b[1] numericki podatak ili ne. I ako jeste, da ga odmah prebacis u int. Takodje, strip() je trebalo da primenis ranije, jer u suprotnom 'if len(i)' ce proci takve redove i imaces gresku kod funkcije split(). Znaci:
    for i in a:
i = i.strip()
if len(i) and (':' in i):
b = i.split(':')
if b[1].isdigit():
b[1] = int(b[1])
recnik[b[0]] = b[1]
return recnik

Cilj kodiranja je da sa manje prostijih alata postignes sto vise i napravis sto brzi i efikasniji program, a ne da hiltijem busis rupetinu u zidu samo da bi okacio nesto tesko 50 grama, sto si mogao da zavrsis i obicnim cekicem i ekserom.

Vezano za "less is more", evo ti jedne mozgalice, nije tesko: data je celobrojna pozitivna (int) varijabla n, n >= 0. Napisi program koji umanjuje n za 1 ako je n neparno, a uvecava ga za 1 ako je parno, ali tako da koristis sto manje karaktera (razmaci se ne broje, kao ni unos i ispis, treba mi samo kod koji ispituje i menja vrednost n). Na primer, ako je n = 49, kod treba da vrati 48, ako je npr. 62 kod treba da vrati 63. Da vidimo koliko ti karaktera treba da napravis taj kod. Mozes da koristis sve strukture podataka, sve operatore, sve module ... sve sto Python ima. I sve alate. Ukljucujuci i hilti ... :-)))
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Zadaci za wannabe pythoniste26.05.2020. u 19:59 - pre 46 meseci
Citat:
Bio sam pod utiskom da treba sortirati, jer se redosled ulaznih i izlaznih podataka razlikuje.

Imao si pogrešan utisak. Ako nisi siguran, proveri:
Code:
 py
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul  8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print( {"age":20, "sex":"male"} == { "sex":"male", "age":20} )
True
>>>
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
65.18.117.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste28.05.2020. u 13:08 - pre 46 meseci
Citat:
B3R1:

Vezano za "less is more", evo ti jedne mozgalice, nije tesko: data je celobrojna pozitivna (int) varijabla n, n >= 0. Napisi program koji umanjuje n za 1 ako je n neparno, a uvecava ga za 1 ako je parno, ali tako da koristis sto manje karaktera (razmaci se ne broje, kao ni unos i ispis, treba mi samo kod koji ispituje i menja vrednost n). Na primer, ako je n = 49, kod treba da vrati 48, ako je npr. 62 kod treba da vrati 63. Da vidimo koliko ti karaktera treba da napravis taj kod. Mozes da koristis sve strukture podataka, sve operatore, sve module ... sve sto Python ima. I sve alate. Ukljucujuci i hilti ... :-)))

Ovako nešto?
Code:
if n % 2 == 0:
    print(n + 1)
else:
    print(n - 1)

 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Zadaci za wannabe pythoniste28.05.2020. u 14:04 - pre 46 meseci
Code:
n+=1-(n%2)*2
 
Odgovor na temu

B3R1
Berislav Todorovic
NL

Član broj: 224915
Poruke: 794



+630 Profil

icon Re: Zadaci za wannabe pythoniste28.05.2020. u 17:15 - pre 46 meseci
@a1234567:

Ti si iskoristio 29 karaktera i resio si ga bas skolski ... Ideja je bila da uradis sa sto manje karaktera.
Djoka je iskoristio 12 karaktera i pokazao ono sto sam hteo da kazem: ponekad kada resavas probleme moras da zaviris i ispod haube, gde se nalazi matematika. Kao sto su ti ljudi rekli: strukture podataka, matematicke operacije ...

Medjutim, ima i jos krace resenje ... zahteva svega 4 znaka. Ali da bi to resio treba se podsetiti cinjenice da su svi brojevi kojima Python i ostali jezici barataju zapravo nizovi jedinica i nula. Na primer, broj 12 je zapravo 1010 (binarno), dok je 13 zapravo 1011. U cemu se razlikuju? Kao sto vidis, samo u poslednjem bitu - parni broj ima 0, neparni 1. U opstem slucaju svaki integer mozes da predstavis kao niz bita u formi bb...bb0 ili bb...bb1, gde je deo "bb...bb" zajednicki u oba slucaja. Tebi treba operacija koja te vodece 'b' bite nece dirati, dok ce poslednji bit kao je 0 pretvoriti u 1 i obrnuto - ako je 1 da ga pretvori u 0. Za manipulacije na nivou bita u Pythonu zaduzeni su bitwise operatori. Ako uzmes XOR (^) videces da on daje rezultat koji tebi treba.
bbbbb0 ^ 000001 = bbbbb1
bbbbb1 ^ 000001 = bbbbb0
Shodno tome:
n=n^1
odnosno:
n^=1

Isti problem, nekoliko resenja, izbegavanje nepotrebnih koraka. Kao sto smo vec to rekli: osnovna aritmetika, logika, strukture podataka, pocev od najprostijih kakvi su celi brojevi, preko slozenijih (liste, hash tabele) do onih najslozenijih (ulancane liste, stabla ...). Jednom kada to savladas shvatices koju alatku kada koristiti i zasto.
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
65.18.117.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste28.05.2020. u 18:01 - pre 46 meseci
Shvatam tvoju poentu. Pojednostavljivanje. I to je nešto čemu treba težiti.

Ali ja sam još na nivou da sam srećan ako uopšte znam kako da rešim neki zadatak.
Mnogo je onih za koje ne znam ni kako da krenem.

Verovatno ću kroz praksu doći i do nivoa da razmišljam o pojednostavljivanju.
Kad nešto uradiš sto puta, prirodno je da kreneš da razmišljaš, hej, jel može
to nekako jednostavnije!? Kao što je bilo sa ovim for petljama. Već sam ih toliko
napisao, a onda naiđem na list comprehension i vidim, može i tako. Super,
umesto tri reda, napišem jedan i idemo dalje.

Sve je to praksa. Ali meni još ostaje mnogo rada da uošte celu sintasu jezika
ili bar njene glavne delove prođem tih 100 puta, pa da onda krenem da
mozgam o pojednostavljivanju. U ovom trenutku mi je mnogo realniji zadatak
da recimo eliminišem primere kakav je bio poslednji zadatak, da ne prolazim petlju
dva puta ako može samo jednom. Već to će biti veliki korak za mene :)
 
Odgovor na temu

B3R1
Berislav Todorovic
NL

Član broj: 224915
Poruke: 794



+630 Profil

icon Re: Zadaci za wannabe pythoniste29.05.2020. u 13:23 - pre 46 meseci
Citat:
Shvatam tvoju poentu. Pojednostavljivanje. I to je nešto čemu treba težiti.

Da, ali nije sve samo u tome, vec u tome da ti se fragmenti znanja koje usvajas svakim danom sloze na pravom mestu u glavi. Ti si naucio prve engleske reci i odmah si uzeo Šekspira. Ili još gore, uzeo si Čoserove Kenterberijske priče, koje svega 5% visoko obrazovanih rodjenih Engleza ume da procita i uopste shvate sta su tu procitali. Na tom nivou mozda ces i uspeti da shvatis neka poglavlja, ali da sklopis celinu od svega toga - hm, tesko.

Tako je to i u programiranju. Cilje je da savladas dobro osnove, tako da kada ti se pojavi problem tacno znas da li da koristis listu, recnik ili mozda najobicniji int/float/str ... stvari tipa "list comprehension" su trikovi, ali oni ti nece pomoci ako ne shvatis OSNOVE. A osnove su da su brojevi nizovi jedinica i nula. Da je svako slovo ('A', 'B', 'C' itd. takodje niz jedinica i nula kodirana ASCII kodom. Recimo, 'A' je 65 (decimalno), odnosno 01000001, 'B' je 66 (odnosno 01000010) itd. Koliko slova ima izmedju A i M, ne racunajuci sama slova A i M? Kako ces to prebrojati? Da, verovatno ces reci:
Code:
alfabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
broj = alfabet.find('M') - alfabet.find('A') - 1

dok ce neko ko je ucio programiranje od temelja, kako i dolikuje, znati da kaze:
Code:
broj = ord('M') - ord('A') - 1

Zato sto zna da je svako slovo interno predstavljeno ASCII kodom i da se ASCII kod slova x dobija funkcijom ord(x), a karakter ciji je ASCII kod n se dobija funkcijom chr(n).

Kada naucis te stvari, na redu su slozenije. Recimo, upravljanje datumima i vremenom. Koliko je dana proteklo od Bozica do Uskrsa ove godine? Ili - zadatak sa casova programiranja iz srednje skole iz vremena mog skolovanja: ispisati vremena u toku dana (hh:mm:ss) kada se kazaljke na satu poklope. Ideja je da naucis manipulaciju vremenima i module time i datetime. A mozes i pesice, koristeci samo int i float ... Moja preporuka bi bila da pocnes od tog "pesackog" nacina.

Onda dolaze na red liste. Taman mislis da si naucio liste i krenes:
Code:

>>> a = [1, 2, 3]
>>> b = a
>>> b
[1, 2, 3]

Bas lepo radi. Ali onda u listu a dodas jos jedan element:
Code:

>>> a.append(10)
[1, 2, 3, 10]
>>> b
[1, 2, 3, 10]

WTF?! Zasto? Kako?! Odakle???!!! Pa ja sam azurirao listu a, listu b nisam ni taknuo - zar ne? A pazi sad ovo - hocu da izbrisem treci element liste b:
Code:

>>> del b[2]
>>> b
[1, 2, 10]
>>> a
[1, 2, 10]

Hmmm ... izgleda da sam ja nekako "vencao" ove dve liste, pa kud svi Turci tu i mali Mujo? E vidis, tu vec moras da zaviris malo i ispod haube. Neke slozenije strukture u Pythonu (liste, skupovi i recnici) se ponasaju malcice drugacije od nekih drugih (int, float, str, bool ...). Eventualno, naici ces na neko brzinsko objasenjenje, poput ovog ovde. Ok, covek je to objasnio na bazicnom nivou, cisto da ukapiras da kada imas listu a, pa kazes b=a, ti zapravo ne kopiras VREDNOST liste a u listu b, vec postavis POINTER liste b tamo gde je a. Ako ti treba kopija liste to mozes da uradis na vise nacina, covek je to lepo objasnio - npr:
Code:
a = [1,2,3]
b = list(a)

Ovim si dobio dve nezavisne liste, sto mozes da proveris i ako u Python shellu otkucas id(a), odnosno id(b). Tako, da ako sada dodajes elemente listi a lista b se nece menjati. Identicno se ponasaju i recnici, odnosno hash tabele:
Code:
>>> a={'name': 'John'}
>>> b=a
>>> a
{'name': 'John'}
>>> b
{'name': 'John'}
>>> a['surname']='Doe'
>>> a
{'surname': 'Doe', 'name': 'John'}
>>> b
{'surname': 'Doe', 'name': 'John'}

Ali zato:
Code:

>>> a={'name': 'John'}
>>> b=dict(a)
>>> a
{'name': 'John'}
>>> b
{'name': 'John'}
>>> a['surname']='Doe'
>>> a
{'surname': 'Doe', 'name': 'John'}
>>> b
{'name': 'John'}

I time si shvatio stvar ... mozda ... onako povrsno. Da bi shvatio stvari do kraja moras da se udubis jos vise u nacin na koji je Python implementiran. Lep tekst na tu temu je dat ovde.

Kada to ukapiras, onda ces umeti da objasnis razliku izmedju ovog koda:
Code:

>>> def modify(b):
...     b.append(3)
...
>>> a=[1,2]
>>> modify(a)
>>> a
[1, 2, 3]

i ovog drugog:
Code:

>>> def modint(x):
...     x += 1
...
>>> y = 3
>>> y
3
>>> modint(y)
>>> y
3
>>>

Iskusniji programeri, koji su vec prosli kroz nekoliko drugih, klasicnih programskih jezika, znaju za princip prenosa argumenata po vrednosti i po imenu (referenci, deskriptoru ...). U prvi mah ce shvatiti da Python prenosi skalare (bool, int, float ...) po vrednosti, a vektore (lists, dicts, sets) po referenci. Kasnije, kada se udubi u materiju, shvatice zasto je to tako. Odgovor je dat i ovde. Opet - rec je o PRINCIPU koji se uci. Jednom kada to savladas, shvatices kako to radi i u nekim drugim jezicima.

Ovo sto sam ti opisao gore su tek samo mali detalji. Kockice mozaika ... A ti detalji mogu da ti upropaste program koji pises do te mere da ga analiziras danima i uopste ne kapiras zasto ne radi ... a u pitanju su neke banalne stvari koje nisu naucio u pocetku, jer si krenuo da ucis Python s krajeva.

Mislim da je sada vreme da malo iscitas poglavlja o strukturama podataka i shvatis kako stvari funkcionisu u Pythonu. Usput mozes da radis i zadatke iz te zbirke, ali bez solidnog razumevanja teorije tapkaces u mestu ...

Nemoj ovo da shvatis kao neko pametovanje. Svi smo prosli manje-vise kroz tu istu metodu uzaludnih pokusaja u svojim prvim programerskim koracima. Pre ili kasnije smo shvatili da smo izgubili dosta vremena, pa smo seli i ucili ...

[Ovu poruku je menjao B3R1 dana 29.05.2020. u 16:28 GMT+1]
 
Odgovor na temu

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

Strane: << < .. 27 28 29 30 31 32

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

Postavi temu Odgovori

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