Letní akce PHP týden
Pouze tento týden sleva až 80 % na kurzy PHP. Lze kombinovat s akcí Letní slevy na prémiový obsah!
Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!
Avatar
Aleš Fiala
Člen
Avatar
Aleš Fiala:4. července 11:23

Ahoj, nevím si rady s úlohou, ve které má program vypsat po zadání počtu hvězdiček, které budou mít po pěti odděleny svislou čárou. A na internetu není nikde napsáno, jakým způsobem se to má oddělovat. Díky.

Zkusil jsem: Cokoliv ale na dál už nevím

Chci docílit: Maturity na střední odborné škole

 
Odpovědět 4. července 11:23
Avatar
Odpovídá na Aleš Fiala
Erik Šťastný:4. července 11:33

Stačí ti změnít tu podmínku, ne? :)

Zkus se zamyslet,
ty nechceš udělat svislou čárku pokud se "i = 4", ale chceš ji nejspíš udělat když "i" je dělitelné počtem hvězdiček, které chceš vedle sebe beze zbytku, ne? :)

Editováno 4. července 11:36
 
Nahoru Odpovědět 4. července 11:33
Avatar
Aleš Fiala
Člen
Avatar
Odpovídá na Erik Šťastný
Aleš Fiala:4. července 12:04

Dík za radu už jsem na to s tvojí pomocí přišel
if i%5==4 neboli 5-1 za rovná se musel jsem si to ještě posunout aby to nevypsalo za první hvězdičkou :-)

 
Nahoru Odpovědět 4. července 12:04
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:4. července 14:10

Rychlejsi je pouzit dalsi promenou a pocitat ji do 4 nez pomale deleni.

 
Nahoru Odpovědět 4. července 14:10
Avatar
Odpovídá na Peter Mlich
Erik Šťastný:4. července 14:51

Nedalo mi to a musel jsem to vyzkoušet.

import time

def stars(n):
    for i in range(n):
        print("*", end="")
        if i % 5 == 4:
            print("!", end="")

def stars2(n):
    j = 0
    for i in range(n):
        print("*", end="")
        j += 1
        if j == 5:
            print("!", end="")
            j = 0

measurements1 = []
measurements2 = []
repeat = 10000

for i in range(0, repeat):
    start = time.perf_counter_ns()
    stars(100)
    end = time.perf_counter_ns()
    measurement = (end - start) / 1000
    measurements1.append(measurement)

    start = time.perf_counter_ns()
    stars2(100)
    end = time.perf_counter_ns()
    measurement = (end - start) / 1000
    measurements2.append(measurement)

print()
print("stars: " + str(sum(measurements1) / repeat))
print("stars2: " + str(sum(measurements2) / repeat))

-

stars: 412.83270000000033
stars2: 415.24850000000055

Vychází mi to +- stejně. Nevím jestli mám vše správně, když tak to můžeme vyladit :)
Někdy je o deset mikrosekund lepší jedna funkce jindy druhá.

Editováno 4. července 14:52
 
Nahoru Odpovědět 4. července 14:51
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:4. července 15:18

3.7 tam nemaji, chtel jsem to testnout s while, ale py neumim, takze mi to tam nejede ani po snizeni poctu cyklu. A musel jsem zmenit perf, protoze 3.6 neumi nanosekundy _ns. Takze, jestli vis, co s tim, tak pak pripadne zkus zmenit n na 10000 a pocet opakovani na mene. Treba se ty cisla budou menit.
Ale becne pro spoustu jazyku plati, ze dalsi promenna by mela byt rychlejsi nez deleni.
A plati, ze procesory se vyvijeji a mozna to maji urychlene tak, ze to bude stejne.

http://www.pythontutor.com/visualize.html#mode=display
import time

def stars(n):
    for i in range(n):
        print("*", end="")
        if i % 5 == 4:
            print("!", end="")

def stars2(n):
    j = 0
    for i in range(n):
        print("*", end="")
        j += 1
        if j == 5:
            print("!", end="")
            j = 0

def stars3(n):
    i = 0
    j = 0
    while i<n:
        print("*", end="")
        ++j
        if j == 5:
            print("!", end="")
            j = 0
        ++i


measurements1 = []
measurements2 = []
measurements3 = []
repeat = 1000

for i in range(0, repeat):
    start = time.perf_counter()
    stars(100)
    end = time.perf_counter()
    measurement = (end - start) / 100000
    measurements1.append(measurement)

    start = time.perf_counter()
    stars2(100)
    end = time.perf_counter()
    measurement = (end - start) / 100000
    measurements2.append(measurement)

    start = time.perf_counter()
    stars3(100)
    end = time.perf_counter()
    measurement = (end - start) / 100000
    measurements3.append(measurement)

print()
print("stars: " + str(sum(measurements1) / repeat))
print("stars2: " + str(sum(measurements2) / repeat))
print("stars3: " + str(sum(measurements3) / repeat))
 
Nahoru Odpovědět 4. července 15:18
Avatar
Odpovídá na Peter Mlich
Erik Šťastný:4. července 15:36

Python neumí jednoduché ++ :) Je třeba to psát jako += 1

Výsledky:

stars: 1254.4322000000031
stars2: 1321.747599999994
stars3: 1377.4502999999913
 
Nahoru Odpovědět 4. července 15:36
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:4. července 16:00

Aha. Ale mi to prave nechtelo chodit ani s tim.
To pak postrada jakykoliv smysl. Inc byva tak o 1/3 rychlejsi nez +1, takze by se vyplatilo kvuli tomu mit dalsi promenou.
On nejspis je problem dole v tom limitu.
Jeste jsem zkusil tuhle upravu.

from time import perf_counter

def stars(n):
    for i in range(n):
        print("*", end="")
        if i % 5 == 4:
            print("!", end="")

def stars2(n):
    j = 0
    for i in range(n):
        print("*", end="")
        j += 1
        if j == 5:
            print("!", end="")
            j = 0

def stars3(n):
    i = 0
    j = 0
    while (i < n):
        print("*", end="")
        j += 1
        if j == 5:
            print("!", end="")
            j = 0
        i += 1


measurement1 = 0
measurement2 = 0
measurement3 = 0
repeat = 10

for i in range(0, repeat):
#    start = perf_counter()
#    stars(100)
#    end = perf_counter()
#    measurement1 = end - start

#    start = perf_counter()
#    stars2(100)
#    end = perf_counter()
#    measurement2 = end - start

    start = perf_counter()
    stars3(100)
    end = perf_counter()
    measurement3 = end - start

print()
print("stars: "  + str(measurement1) )
print("stars2: " + str(measurement2) )
print("stars3: " + str(measurement3) )

#measurement1    0.093
#measurement2    0.1291
#measurement3   0.1544
 
Nahoru Odpovědět 4. července 16:00
Avatar
Martin Petrovaj
Překladatel
Avatar
Martin Petrovaj:4. července 20:42

Vysvetlí mi niekto, aký má pre autora vlákna zmysel merať rýchlosť zvyšku po delením vs premennej na počítadlo?

IMHO to pre začiatočníka, ktorý ledva začína chápať základy programovania na strednej nie je podstatné vôbec. Ak niekomu reálne záleží na takto malých rozdieloch v rýchlosti, tak 1) buď pravdepodobne vôbec nepoužíva Python, alebo 2) nemá problém pozrieť sa na CPython repo na githube. Resp. dosť pravdepodobne dokonca vie, na aké operácie v ASM sa to in the end preloží aj bez toho, aby sa tam musel pozerať.

Nahoru Odpovědět 4. července 20:42
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
DarkCoder
Redaktor
Avatar
Odpovídá na Martin Petrovaj
DarkCoder:4. července 21:30

Smysl je prostý, naučí se lépe optimalizovat a nahlížet na úlohu více způsoby. Schopnost dokázat zvolit vhodný algoritmus pro vyřešení úlohy je to, co odlišuje běžného programátora od čaroděje. Co se týká rychlosti, naprosto souhlasím.. Jeden z důvodů, proč nepoužívám Python ale C..

Nahoru Odpovědět 4. července 21:30
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.