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.059 pregleda

Najnovija ↓

Re: Zadaci za wannabe pythoniste 20.12.2019. u 17:04 · pre 83 meseca
izmenjeno 1 put, poslednji put a1234567 20.12.2019. u 18:14
  1. a123456720.12.2019. u 18:14zapis iz teksta poruke
#81
Ova tema, od kada sam je otvorio pre deset dana ima skoro 2500 pregleda.
Izgleda ima dosta onih koji gledaju sa strane, ali se ne hvataju tastature :)
Ne stidite se, slobodno se uključite, od mene sigurno više znate. Ja učim python eto cele dve nedelje :D

I zato evo nova šansa i novi zadatak za ove što vole da šifriraju i hakerišu!

Zadatak broj 5: Cezarova šifra

Jedan od prvih poznatih primera šifriranja koristio je Julije Cezar. Slao je pisana naređenja svojim generalima, ali nije želeo da ona padnu u neprijateljske ruke. Zato je razvio sistem koji će kasnije biti nazvan Cezarova šifra. A ideja je bila sasvim jednostavna (i zato je ovako kodiran tekst lako dešifrovati savremenim tehnikama), a sastojala se u tome da se svako slovo u originalnoj poruci pomeri za tri mesta u abecedi. Tako A postaje D, B postaje E, C postaje F itd. Poslednja tri slova abecede se tako pomeraju na početak, pa X postaje A, Y postaje B, a Z postaje C. Znakovi interpunkcije su ostajali nepromenjeni. Naravno, mi ćemo koristiti našu latinicu:

abcčćddžđefghijklljmnnjoprsštuvzž

Napiši program koji rešava Cezarovu šifru. Korisnik unosi poruku i broj slova za koliko će biti pomeranje kod šifriranja. Program zatim ispisuje šifriranu poruku. Vodi računa da program šifrira i velika i mala slova. Tvoj program bi takođe trebalo da podržava pomeranje za negativan broj, tako da može i da kodira i da dekodira poruke.

Ajde sad. Lako je :))
Re: Zadaci za wannabe pythoniste 20.12.2019. u 17:22 · pre 83 meseca #82
Mene zanima (da vi mene kažete) zašto, kad kompajliram program u .exe jako sporo se pokreće.
Re: Zadaci za wannabe pythoniste 20.12.2019. u 17:39 · pre 83 meseca #83
Imam i ja jedno pitanje za tebe.

Što ne otvoriš posebnu temu, pa pitaš, ko što je red?
Ova je za zadatke, kao što piše na ulazu :)
Re: Zadaci za wannabe pythoniste 21.12.2019. u 17:25 · pre 83 meseca #85
Evo izborih se nekako sa ovim zadatkom, doduše polovično.


Code:
# Cezarova šifra
poruka = input('Unesi poruku: ')
pomeranje = input('Za koliko mesta pomeriti slova? ')

abc = ['a', 'b', 'c', 'č', 'ć', 'd', 'dž',
       'đ', 'e', 'f', 'g', 'h', 'i', 'j',
       'k', 'l', 'lj', 'm', 'n', 'nj', 'o',
       'p', 'r', 's', 'š', 't', 'u', 'v', 'z', 'ž']

for i in poruka:
    if i in abc:
        ind = abc.index(i)
        ind2 = ind + int(pomeranje)
        if ind2 > 26:
            ind2 = ind2 - 30
        else:
            ind2 = ind2
        slovo = abc[ind2]
        print(slovo, end='')

    else:
         i == i
         slovo = i
         print(slovo, end='')

Ispis na ekranu:


>>> Unesi poruku: Ovo je poruka.
>>> Za koliko mesta pomeriti slova? 4
Obš mi tšuanć.

>>> Unesi poruku: Obš mi tšuanć.
>>> Za koliko mesta pomeriti slova? -4
Ovo je poruka.


Radi i šifrovanje i dešifrovanje.
Ali postoji problem sa našim slovima koja imaju dva znaka: lj, nj, dž.
Jer petlja ide slovo po slovo, pa ih tretira odvojeno kod dešifrovanja.
Jedino da se dopisujemo na engleskom :=))
Re: Zadaci za wannabe pythoniste 22.12.2019. u 15:48 · pre 83 meseca #86
Ovaj tvoj program je loš po toliko mnogo osnova, da će objašnjenje šta je loše biti mnogo duže od samog programa.
Nemoj ovo da shvatiš kao napad na tvoju ličnost, nadam se da ćeš iz ovoga nešto da naučiš

Da krenem redom:

Code:
ind2 = ind + int(pomeranje)


je bezveze, jer u svakom prolazu kroz petlju ponovo radiš konvertovanje u int. Umesto toga, dovoljno je da to uradiš jednom, pre petlje

Code:
pomeranje = int(input('Za koliko mesta pomeriti slova? '))

Code:
else:
  ind2 = ind2

je besmisleno, uopšte ti ne treba taj else. if može da bude i bez else dela

Code:
        ind = abc.index(i)
        ind2 = ind + int(pomeranje)
        if ind2 > 26:
            ind2 = ind2 - 30
        else:
            ind2 = ind2
        slovo = abc[ind2]
        print(slovo, end='')


je višestruko loše. Bezveze koristiš varijable ind, ind2 slovo. Koristiš ono što se zove "magični brojevi". Imaš 26 i 30, a na oba mesta treba da bude 30. Python oprašta greške i dozvoljava negativne vrednoste indeksa, ali samo pukim slučajem program radi.

Code:
    else:
         i == i
         slovo = i
         print(slovo, end='')


Uh, "i==i" - ZAŠTO TO PIŠEŠ??? čak i da si hteo da napišeš i=i to ti ne treba. Zar nije jednostavnije da samo staviš print(i, end='')

Evo tvog programa, bez ulaženja u ispravku logike, koji radi isto što i tvoj kod, samo malo ispravnije:

Code:

# Cezarova šifra
poruka = input('Unesi poruku: ')
pomeranje = int(input('Za koliko mesta pomeriti slova? '))

abc = 'abcčćdđefghijklmnoprsštuvzž'
n=len(abc)

for i in poruka:
    if i in abc:
        print(abc[(abc.index(i)+pomeranje) % n], end='')
    else:
         print(i, end='')


Problem sa slovima lj, nj i dž je REŠEN. Tretiraju se kao dva slova.
Uzmi reči nadživeti, konjunkcija, injekcija. Ovo su slučajevi kada znaci dž i nj predstavljaju DVA slova. Ne mogu da se setim primera da je nekada i lj dva slova.

Sada još samo da rešiš problem velikih slova, pa si rešio zadatak...
Re: Zadaci za wannabe pythoniste 22.12.2019. u 16:21 · pre 83 meseca #87
Evo ti varijanta programa koja zna da radi i sa velikim slovima.

Code:
# Cezarova šifra
poruka = input('Unesi poruku: ')
pomeranje = int(input('Za koliko mesta pomeriti slova? '))

abc = 'abcčćdđefghijklmnoprsštuvzž'
n=len(abc)

for i in poruka:
    c=i.lower()
    up=i.isupper()
    if c in abc:
        s=abc[(abc.index(c)+pomeranje) % n]
        print(s.upper() if up else s, end='')
    else:
        print(i, end='')
Re: Zadaci za wannabe pythoniste 22.12.2019. u 17:13 · pre 83 meseca #88
Pozdrav Đoko,
Veliko hvala na trudu. Upravo mi to treba, povratna informacija i komentar za moj program, kako bih nešto naučio i ispravio greške.
Jer ja u stvari još ništa ne znam. Više nagađam i guglujem, nego što sam siguran kako treba. Ali valjda je to tako uvek u početku.

Dakle, uopšte ne shvatam tvoje komentare kao napad na ličnost, već sam zahvalan što si se uopšte potrudio da pogledaš šta sam uradio.
To mu dođe kao kad nastavnik ispravi domaći zadatak crvenom olovkom, pa iz grešaka učenik nešto nauči. :)

Proučiću pažljivo prvo tvoje komentare, a onda i rešenje koje si ponudio.
Ako budem imao dodatnih pitanja, šaljem i njih.

HVALA JOŠ JEDNOM ZA TRUD!
Re: Zadaci za wannabe pythoniste 22.12.2019. u 18:29 · pre 83 meseca #89
Proučio sam primedbe. Uglavnom su mi jasne i vidim gde sam grešio.
Suviše mnogo koraka tamo gde je moguće pojednostaviti.

Nisam se setio da za oduzimanje iskoristim modulo.
Valjda zato što mi je ostalo u glavi da je on za deljenje.

Novost je za mene i da if ne mora da ima else.
Zato sam i pisao to što sam pisao, da nešto bude i u else :))
I naravno to je višak.

Najviše mi se od svega sviđa abc string bez lj, nj, i dž.
Odlična ideja. Ja sam video problem tamo gde ga nema.

Stavio sam i moju (apdejtovanu) i tvoju verziju programa ovde, ako nekom zatreba.

Re: Zadaci za wannabe pythoniste 22.12.2019. u 18:52 · pre 83 meseca #90
Sledeći korak: napraviti rešenje koje koristi chr() i ord() funkcije, a radi i za naša slova - za engleski alfabet može da se realizuje jednom linijom koda :)
Potpis
Blessed are those who can laugh at themselves, for they shall never cease to be amused.
Re: Zadaci za wannabe pythoniste 23.12.2019. u 17:48 · pre 83 meseca #92
Idemo dalje.
Za opuštanje jedan sasvim lak zadatak, čak i meni :)

Zadatak broj 6

Treba zvezdicama iscrtati pravougaonik.
Jedan način je naravno ovako, ali je tada veličina fiksirana.
Code:
print('************')
print('*          *')
print('*          *')
print('*          *')
print('************')

Napravi programčić gde korisnik može da unese željenu širinu i visinu budućeg pravougaonika/kvadrata.

Ja sam svoje rešenje sačuvao ovde.
Re: Zadaci za wannabe pythoniste 24.12.2019. u 00:56 · pre 83 meseca #93
Else blok može u jednoj liniji (doduše, manje jasno, ali zanimljivo za razmišljanje):
Code:
    for i in range (y):
        print('*' + ('*' * (x-2) if (i == 0 or i == y-1) else ' ' * (x-2)) + '*')
Potpis
Blessed are those who can laugh at themselves, for they shall never cease to be amused.
Re: Zadaci za wannabe pythoniste 24.12.2019. u 02:51 · pre 83 meseca #94
ja sam ovo tvoje ('*' + ('*' * (x-2) malo pojednostavio :)
Code:
for i in range (y):
        print('*' * x) if (i == 0 or i == y-1) else print('*' + ' ' * (y+2) + '*')


E sad mi je bilo zanimljivo da sam morao da stavim print i posle else, inače ne radi program kako treba.
Re: Zadaci za wannabe pythoniste 24.12.2019. u 09:30 · pre 83 meseca #95
Citat:
E sad mi je bilo zanimljivo da sam morao da stavim print i posle else, inače ne radi program kako treba.


Obrati pažnju na zagrade!!

mjanjic je napisao izraz

print ( NEŠTO if USLOV else NEŠTODRUGO )

ti si napisao

print ( NEŠTO ) if USLOV else print ( NEŠTODRUGO )

Re: Zadaci za wannabe pythoniste 24.12.2019. u 09:47 · pre 83 meseca #96
Aha, dobro.
Sad i moja verzija radi bez drugog print,
kad sam uklonio višak zagrada :)

Code:
x = 10
y = 6

for i in range (y):
        print('*' * x if i == 0 or i == y-1 else '*' + ' ' * (y+2) + '*')
Re: Zadaci za wannabe pythoniste 24.12.2019. u 10:02 · pre 83 meseca #97
To što si ti napisao nije greška.

U tom primeru, if-else konstrukcija je TERNARNI operator, odnosno operator koji računa sa tri izraza.
Kao što je "+" BINARNI operator i <izraz> + <izraz> je BINARNA operacija koja kao rezultat vraća <izraz>, tako i

<izraz> if <logicki_izraz> else <izraz>

ternarna operacija koja vraća vrednost.
Ti sada možeš da koristiš povratnu vrednost za nešto drugo, recimo za print:

print( <izraz> if <logicki_izraz> else <izraz> )

a može i sam izraz da bude print() ili neka druga funkcija.

Dakle ispravno je i
print( <izraz> if <logicki_izraz> else <izraz> )
i
print( <izraz> ) if <logicki_izraz> else print( <izraz> )

Samo treba da znaš zašto se to dešava.
A da je i print() funkcija, vidi se jasno jer sve funkcije se pozivaju kao ime_funkcije( argumenti ) (bitno je da stoji zagrada posle imena). Tako je, bar u pythonu 3.
Da je print funkcija, koja vraća neku vrednost, možeš i sam da proveriš sa:

print( print ('x') )
Re: Zadaci za wannabe pythoniste 24.12.2019. u 10:19 · pre 83 meseca #98
Ja sam hteo još "komplikovanije" da napravim koristeći product() ili neki drugi način da izbegnem petlje, nego da na neki drugi način realizujem iscrtavanje karaktera u formi pravougaonika, ali sam odustao. Moglo bi kao dvostruki niz pa da posle odštampa samo elemente niza, ali da bi se taj niz formirao treba poprilično koda.

Drugi problem, koji mi je bio interesantniji, jeste da se detektuje rezolucija ekrana i/ili broj karaktera koji može da se ispiše horizontalno i vertikalno pa da se zvezdice odštampaju samo uz ivicu, međutim tu je potrebna dodatna biblioteka, čija primena se dodatno komplikuje ako je uključeno skaliranje (obično kod 2k displeja sa malim ekranima i većine 4k displeja), ali nigde nisam našao mogućnost da se detektuju dimenzije "output" box-a (npr. kod onlih online interpretera), tj. moramo ih znati unapred.
Potpis
Blessed are those who can laugh at themselves, for they shall never cease to be amused.
Re: Zadaci za wannabe pythoniste 24.12.2019. u 11:24 · pre 83 meseca #100
Citat:
mjanjic:
Ja sam hteo još "komplikovanije" da napravim koristeći product()...

Janjiću samo bez komplikovanja... ovo je kindergarten. Ne obeshrabruj poletarce :D
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme