$ 0 \cdot 10 + 5 \cdot 1 =(05)_{10} = (00101)_2 = 1 \cdot 4 + 0 \cdot 2 +1 \cdot 1$
x = 5
bity = []
while (x > 0):
bity.append(x % 2)
x = x // 2
bity
[1, 0, 1]
x = 1000
bity = []
while (x > 0):
bity.append(x % 2)
x = x // 2
bity
[0, 0, 0, 1, 0, 1, 1, 1, 1, 1]
print(f'{1000:b}')
1111101000
x = 1000
bity = []
while (x > 0):
bity.append(x % 2)
x = x // 2
list(reversed(bity)) #otoci zoznam
[1, 1, 1, 1, 1, 0, 1, 0, 0, 0]
bity[::-1] #slice s krokom -1
[1, 1, 1, 1, 1, 0, 1, 0, 0, 0]
Nemusíme otáčať, môžeme pridávať aj na začiatok
x = 1000
bity = []
while (x > 0):
bity.insert(0, x % 2) #vlozi (hocikde uprostred) zoznamu na dany index
x = x // 2
bity
[1, 1, 1, 1, 1, 0, 1, 0, 0, 0]
for index in range(len(bity)):
if bity[index] == 1:
print(index)
0 1 2 3 4 6
zoznam = []
for index in range(len(bity)):
if bity[index] == 1:
zoznam.append(index)
zoznam
[0, 1, 2, 3, 4, 6]
[index for index, prvok in enumerate(bity) if prvok == 1] #Python One Liner
[0, 1, 2, 3, 4, 6]
Zoznam môžeme vytvárať priebežne ...
x = 1000
bity = []
zoznam = []
index = 0
while x > 0:
if x % 2 == 1:
zoznam.append(index)
bity.insert(0, x % 2) #vlozi (hocikde uprostred) zoznamu na dany index
x = x // 2
print(zoznam)
bity
[0, 0, 0, 0, 0, 0]
[1, 1, 1, 1, 1, 0, 1, 0, 0, 0]
Kde je chyba?
x = 1000
bity = []
zoznam = []
index = 0
while x > 0:
if x % 2 == 1:
zoznam.append(index)
bity.insert(0, x % 2) #vlozi (hocikde uprostred) zoznamu na dany index
x = x // 2
index += 1
print(zoznam)
bity
[3, 5, 6, 7, 8, 9]
[1, 1, 1, 1, 1, 0, 1, 0, 0, 0]
indexy sú číslované sprava (od najnižšieho bitu)
def prvky_mnoziny(x):
#vrati prvky mnoziny zapisane v dvojkovej sustave
zoznam = []
index = 0
while x > 0:
if x % 2 == 1:
zoznam.append(index)
x = x // 2
index += 1
return zoznam
prvky_mnoziny(12)
[2, 3]
Chceme číslovať od jednotky ...
def prvky_mnoziny(x):
#vrati prvky mnoziny zapisane v dvojkovej sustave
zoznam = []
index = 0
while x > 0:
if x % 2 == 1:
zoznam.append(index+1)
x = x // 2
index += 1
return zoznam
prvky_mnoziny(12)
[3, 4]
n = 5
for i in range(2**n):
print(f'{i:03d} {i:0{n}b}', prvky_mnoziny(i))
000 00000 [] 001 00001 [1] 002 00010 [2] 003 00011 [1, 2] 004 00100 [3] 005 00101 [1, 3] 006 00110 [2, 3] 007 00111 [1, 2, 3] 008 01000 [4] 009 01001 [1, 4] 010 01010 [2, 4] 011 01011 [1, 2, 4] 012 01100 [3, 4] 013 01101 [1, 3, 4] 014 01110 [2, 3, 4] 015 01111 [1, 2, 3, 4] 016 10000 [5] 017 10001 [1, 5] 018 10010 [2, 5] 019 10011 [1, 2, 5] 020 10100 [3, 5] 021 10101 [1, 3, 5] 022 10110 [2, 3, 5] 023 10111 [1, 2, 3, 5] 024 11000 [4, 5] 025 11001 [1, 4, 5] 026 11010 [2, 4, 5] 027 11011 [1, 2, 4, 5] 028 11100 [3, 4, 5] 029 11101 [1, 3, 4, 5] 030 11110 [2, 3, 4, 5] 031 11111 [1, 2, 3, 4, 5]
k = int(input()) #jedno cislo v riadku
3
while 1:
x = int(input()) #nacitame udalost
if x > 0:
print(f'prislo kladne cislo/kniha {x}')
elif x == -1:
print(f'odstran vrchnu knihu')
elif x == -10:
print(f'vypis a odstran vrchnu knihu')
elif x == -2:
print(f'spustene roboticke rameno velkosti {k}')
elif x == 0:
print('koniec')
break #ukoncime nacitavanie
else:
print('CHYBA!!!')
break
1 prislo kladne cislo/kniha 1 5 prislo kladne cislo/kniha 5 -1 odstran vrchnu knihu -2 spustene roboricke rameno velkosti 3 -10 vypis a odstran vrchnu knihu 0 koniec
Budeme simulovať kopu - zoznam/pole/list
kopa = []
def pridaj_knihu(x):
assert x > 0, f"Cislo {x} musi byt kladne" #len kontrola v kode, ze ma byt kladne cislo
kopa.append(x)
pridaj_knihu(7)
kopa
[7]
pridaj_knihu(19)
kopa
[7, 19]
pridaj_knihu(-5)
--------------------------------------------------------------------------- AssertionError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_12688\2523341153.py in <cell line: 1>() ----> 1 pridaj_knihu(-5) ~\AppData\Local\Temp\ipykernel_12688\1030780395.py in pridaj_knihu(x) 1 def pridaj_knihu(x): ----> 2 assert(x > 0) #len kontrola v kode, ze ma byt kladne cislo 3 kopa.append(x) AssertionError:
def odstran_knihu():
#z kopy odstrani knihu a vrati jej cislo
kniha = kopa[-1]
kopa = kopa[:-1] #odstrani poslednu knihu
return kniha
kopa
[7, 19]
odstran_knihu()
--------------------------------------------------------------------------- UnboundLocalError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_12688\1983476918.py in <cell line: 1>() ----> 1 odstran_knihu() ~\AppData\Local\Temp\ipykernel_12688\57383590.py in odstran_knihu() 1 def odstran_knihu(): 2 #z kopy odstrani knihu a vrati jej cislo ----> 3 kniha = kopa[-1] 4 kopa = kopa[:-1] #odstrani poslednu knihu 5 return kniha UnboundLocalError: local variable 'kopa' referenced before assignment
def odstran_knihu():
#z kopy odstrani knihu a vrati jej cislo
global kopa #budeme upravovat globalnu premennu
kniha = kopa[-1]
kopa = kopa[:-1] #odstrani poslednu knihu
return kniha
kopa
[7, 19]
odstran_knihu()
19
kopa
[7]
odstran_knihu()
7
kopa
[]
Spustenie ramena $k = 3$:
kopa = [ 10, 18, 15, 24, 37, 12]
vznikne:
kopa = [ 10, 18, 15, 12, 37, 24]
Navyše:
(Ak v je kope menej ako k kníh, tak sa obráti poradie všetkých kníh v kope.)
kopa = [ 10, 18, 15, 24, 37, 12]
kopa[-3] #zaciatok otacenej casti kopy
24
kopa[-3:] #otacana cast
[24, 37, 12]
kopa[:-3] #cast, ktora sa nemeni
[10, 18, 15]
#otocenie casti
kopa[-3:][::-1] #odrezeme a potom otocime
[12, 37, 24]
kopa[-1::-1] #otocenie celej kopy
[12, 37, 24, 15, 18, 10]
kopa[-1:-4:-1]
#otocenie len casti kopy ... zacni indexom -1 a skonci ak index bude -4
#-3 este vypis, -4 uz nie
[12, 37, 24]
def spusti_rameno(k):
#spusti roboticke rameno, teda otoci vrchnych k knih
global kopa
# kopa = nemenna cast + otocena cast z poslednych k knih
kopa = kopa[:-k] + kopa[-1:-(k+1):-1]
kopa
[10, 18, 15, 24, 37, 12]
spusti_rameno(3)
kopa
[10, 18, 15, 12, 37, 24]
spusti_rameno(5)
kopa
[10, 24, 37, 12, 15, 18]
spusti_rameno(10) #funguje aj v pripade, ze je kopa mensia ako velkost ramena
kopa
[18, 15, 12, 37, 24, 10]
def pridaj_knihu(x):
assert(x > 0) #len kontrola v kode, ze ma byt kladne cislo
kopa.append(x)
def odstran_knihu():
#z kopy odstrani knihu a vrati jej cislo
global kopa #budeme upravovat globalnu premennu
kniha = kopa[-1]
kopa = kopa[:-1] #odstrani poslednu knihu
return kniha
def spusti_rameno(k):
#spusti roboticke rameno, teda otoci vrchnych k knih
global kopa
# kopa = nemenna cast + otocena cast z poslednych k knih
kopa = kopa[:-k] + kopa[-1:-(k+1):-1]
k = int(input()) #jedno cislo v riadku
kopa = []
while 1:
print(f'Kopa: {kopa}')
x = int(input()) #nacitame udalost
if x > 0:
print(f'prislo kladne cislo/kniha {x}')
pridaj_knihu(x)
elif x == -1:
print(f'odstran vrchnu knihu')
odstran_knihu()
elif x == -10:
print(f'vypis a odstran vrchnu knihu')
print(odstran_knihu())
elif x == -2:
print(f'spustene roboticke rameno velkosti {k}')
spusti_rameno(k)
elif x == 0:
print('koniec')
break #ukoncime nacitavanie
else:
print('CHYBA!!!')
break
3 Kopa: [] 12345 prislo kladne cislo/kniha 12345 Kopa: [12345] 23456 prislo kladne cislo/kniha 23456 Kopa: [12345, 23456] 34567 prislo kladne cislo/kniha 34567 Kopa: [12345, 23456, 34567] 45678 prislo kladne cislo/kniha 45678 Kopa: [12345, 23456, 34567, 45678] -2 spustene roboticke rameno velkosti 3 Kopa: [12345, 45678, 34567, 23456] -10 vypis a odstran vrchnu knihu 23456 Kopa: [12345, 45678, 34567] 98765 prislo kladne cislo/kniha 98765 Kopa: [12345, 45678, 34567, 98765] -2 spustene roboticke rameno velkosti 3 Kopa: [12345, 98765, 34567, 45678] -1 odstran vrchnu knihu Kopa: [12345, 98765, 34567] -10 vypis a odstran vrchnu knihu 34567 Kopa: [12345, 98765] -2 spustene roboticke rameno velkosti 3 Kopa: [98765, 12345] -10 vypis a odstran vrchnu knihu 12345 Kopa: [98765] 0 koniec
def pridaj_knihu(x):
assert(x > 0) #len kontrola v kode, ze ma byt kladne cislo
kopa.append(x)
def odstran_knihu():
#z kopy odstrani knihu a vrati jej cislo
global kopa #budeme upravovat globalnu premennu
kniha = kopa[-1]
kopa = kopa[:-1] #odstrani poslednu knihu
return kniha
def spusti_rameno(k):
#spusti roboticke rameno, teda otoci vrchnych k knih
global kopa
# kopa = nemenna cast + otocena cast z poslednych k knih
kopa = kopa[:-k] + kopa[-1:-(k+1):-1]
k = int(input()) #jedno cislo v riadku
kopa = []
while 1:
# print(f'Kopa: {kopa}')
x = int(input()) #nacitame udalost
if x > 0:
# print(f'prislo kladne cislo/kniha {x}')
pridaj_knihu(x)
elif x == -1:
# print(f'odstran vrchnu knihu')
odstran_knihu()
elif x == -10:
# print(f'vypis a odstran vrchnu knihu')
print(odstran_knihu())
elif x == -2:
# print(f'spustene roboticke rameno velkosti {k}')
spusti_rameno(k)
elif x == 0:
# print('koniec')
break #ukoncime nacitavanie
else:
print('CHYBA!!!')
break
3 12345 23456 34567 45678 -2 -10 23456 98765 -2 -1 -10 34567 -2 -10 12345 0
%%writefile knihy.in
3
12345
23456
34567
45678
-2
-10
98765
-2
-1
-10
-2
-10
0
Writing knihy.in
%%writefile knihy.py3
def pridaj_knihu(x):
assert(x > 0) #len kontrola v kode, ze ma byt kladne cislo
kopa.append(x)
def odstran_knihu():
#z kopy odstrani knihu a vrati jej cislo
global kopa #budeme upravovat globalnu premennu
kniha = kopa[-1]
kopa = kopa[:-1] #odstrani poslednu knihu
return kniha
def spusti_rameno(k):
#spusti roboticke rameno, teda otoci vrchnych k knih
global kopa
# kopa = nemenna cast + otocena cast z poslednych k knih
kopa = kopa[:-k] + kopa[-1:-(k+1):-1]
k = int(input()) #jedno cislo v riadku
kopa = []
while 1:
# print(f'Kopa: {kopa}')
x = int(input()) #nacitame udalost
if x > 0:
# print(f'prislo kladne cislo/kniha {x}')
pridaj_knihu(x)
elif x == -1:
# print(f'odstran vrchnu knihu')
odstran_knihu()
elif x == -10:
# print(f'vypis a odstran vrchnu knihu')
print(odstran_knihu())
elif x == -2:
# print(f'spustene roboticke rameno velkosti {k}')
spusti_rameno(k)
elif x == 0:
# print('koniec')
break #ukoncime nacitavanie
else:
print('CHYBA!!!')
break
Writing knihy.py3
!python --version
Python 3.9.16
!python knihy.py3 <knihy.in #spusti program a presmeruje vstup
23456 34567 12345
%%time
!python knihy.py3 <knihy.in >knihy.out #presmerovanie aj vystupu
Wall time: 375 ms
!type knihy.out
23456 34567 12345
%%time
!python knihy.py3 <03.txt >knihy.out #vstup z testovacich dat
Wall time: 3.69 s