B-I-1.1

In [1]:
def daSa(kamene):
    for i in range(len(kamene)-1):
        if kamene[i:i+2] == '--':
            return False
    return True


print(daSa('++-+-+++-++-'))
print(daSa('++-+-+--++-'))
True
False

B-I-1.2

In [2]:
kamene = '++-+-+++-++-'
kamene = '++'+kamene+'+' #zaciname a koncime na brehu
n = len(kamene)
poc_skok = [7*n]*n #dostatocne velke cislo >n znamena neda sa
poc_skok[0] = 0
poc_skok[1] = 0

for i in range(2, n):
    if kamene[i] == '+':
        poc_skok[i] = 1+min(poc_skok[i-1], poc_skok[i-2])
print(poc_skok) #medzivysledky
print(poc_skok[n-1])
[0, 0, 1, 1, 105, 2, 105, 3, 4, 4, 105, 5, 6, 105, 7]
7

B-I-1-3

Ak sa nedá pre krok=2, tak skúšame kroky 3,4,5,...

In [3]:
kamene = '+----+------+----+'
kamene = '---------'

def daSa(kamene, krok):
    for i in range(len(kamene)-krok+1):
        if kamene[i:i+krok] == '-'*krok:
            return False
    return True
krok = 1
while not daSa(kamene, krok): #daSa() == False
    krok += 1
print('Najmenší skok:', krok)
Najmenší skok: 10

Počítanie najmenšieho počtu krokov aj najmenší skok na prechod súčasne.

In [4]:
kamene = '+----+------+----+'
kamene = '++-+-+++-++-'

kamene = '++'+kamene+'+' #zaciname a koncime na brehu
n = len(kamene)
poc_skok = [100*n]*n #dostatocne velke cislo >n znamena neda sa
poc_skok[0] = 0
poc_skok[1] = 0

max_minus = 0 #maximalny pocet minusiek za sebou
akt_minus = 0 #pocet minusiek teraz za sebou
for i in range(2, n):
    if kamene[i] == '+':
        max_minus = max(max_minus, akt_minus)
        poc_skok[i] = 1+min(poc_skok[i-1], poc_skok[i-2])
    else: #ak je tam '-'
        if kamene[i-1] == '-': #ak pred aktualnym '-' bolo tiez '-' #
            akt_minus += 1
        else:
            akt_minus = 1
        
print(poc_skok) #medzivysledky
print(poc_skok[n-1]) #minimalny pocet krokov
print(max_minus+1) #minimalny skok

if poc_skok[n-1] > n:
    print('Da sa na najmensi skok:', max_minus+1)
else:
    print('Minimalny pocet krokov:', poc_skok[n-1])
[0, 0, 1, 1, 1500, 2, 1500, 3, 4, 4, 1500, 5, 6, 1500, 7]
7
2
Minimalny pocet krokov: 7

B-I-1

upravíme daSa na kontrolu pre zadaný počet dní

In [5]:
kamene = [7, 3, 15, 7, 2, 8, 6]

def daSa(kamene, den):
    for i in range(len(kamene)-1):
        if max(kamene[i:i+2]) < den:
            return False
    return True

for i in range(2+max(kamene)): #az po prvy den ked uz budu vsetky kamene zatopene
    print('{:3d} {}'.format(i, daSa(kamene, i)))
  0 True
  1 True
  2 True
  3 True
  4 True
  5 True
  6 True
  7 True
  8 False
  9 False
 10 False
 11 False
 12 False
 13 False
 14 False
 15 False
 16 False
In [6]:
den = 0
while daSa(kamene, den):
    den += 1
den -= 1
print('Max. pocet dni:', den)
Max. pocet dni: 7

Každá susedná dvojica kameňov a,b bude zatopená po 1+max(a,b) dňoch.

In [6]:
%%time
kamene = [7, 3, 15, 7, 2, 8, 6]

kamene = [int(_) for _ in input().split()] #nacita vstup

n = len(kamene)
print(min([max(kamene[i:i+2]) for i in range(n-2)]))
7 3 15 7 2 8 6
7
Wall time: 1.24 s