Diskuze: Python jak se dá za každými pěti znaky napsat jiný znak?????

Aktivity (3)
Avatar
Aleš Fiala
Člen
Avatar
Aleš Fiala:4.7.2019 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.7.2019 11:23
Avatar
Odpovídá na Aleš Fiala
Erik Šťastný:4.7.2019 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.7.2019 11:36
 
Nahoru Odpovědět
4.7.2019 11:33
Avatar
Aleš Fiala
Člen
Avatar
Odpovídá na Erik Šťastný
Aleš Fiala:4.7.2019 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.7.2019 12:04
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:4.7.2019 14:10

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

 
Nahoru Odpovědět
4.7.2019 14:10
Avatar
Odpovídá na Peter Mlich
Erik Šťastný:4.7.2019 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.7.2019 14:52
 
Nahoru Odpovědět
4.7.2019 14:51
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:4.7.2019 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.7.2019 15:18
Avatar
Odpovídá na Peter Mlich
Erik Šťastný:4.7.2019 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.7.2019 15:36
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:4.7.2019 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.7.2019 16:00
Avatar
Martin Petrovaj
Redaktor
Avatar
Martin Petrovaj:4.7.2019 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.7.2019 20:42
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Martin Petrovaj
DarkCoder:4.7.2019 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.7.2019 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.