04.03.2024

Эксперимент. Решаем 5 задач за час (нестандартные задачи на питон)

Про интерес. Задала гуглу такой запрос:

нестандартная задача питон

И нашла такую статью: "Пять задач, которые хорошо бы уметь решать за час"

запрос гуглу

Автор предлагает решить 5 задач за 1 час.

Конечно захотелось проверить свои силы ))))

Вот эти задачи:

Первая задача

У вас есть массив чисел. Напишите три функции, которые вычисляют сумму этих чисел: с for-циклом, с while-циклом, с рекурсией.

Вторая задача

Напишите функцию, которая создаёт комбинацию двух списков таким образом:

[1, 2, 3] (+) [11, 22, 33] -> [1, 11, 2, 22, 3, 33]

Третья задача

Вычислите первые 100 чисел Фибоначчи. (Напишите код.)

Четвёртая задача

У вас есть массив чисел, составьте из них максимальное число. Например:

 [61, 228, 9] -> 961228

Пятая задача

У вас есть девять цифр: 1, 2, …, 9. Именно в таком порядке. Вы можете вставлять между ними знаки «+», «-» или ничего. У вас будут получаться выражения вида 123+45-6+7+89. Найдите все из них, которые равны 100.

Постарайтесь решить эти задачи за час.

Итак!

Решения

Первая задача

У вас есть массив чисел. Напишите три функции, которые вычисляют сумму этих чисел: с for-циклом, с while-циклом, с рекурсией.

def sum_for(a):

    s = 0

    for k in a:

        s+=k

    return s

def sum_while(a):

    s = 0

    k = 0

    while k<len(a):

        s+=a[k]

        k+=1 

    return s

def sum_rec(a):

    if len(a)==1: return a[0] 

    else: return sum_rec(a[:-1])+a[-1]

x = [100,200,-300,100,-400,10000]

print(sum_for(x))

print(sum_while(x))

print(sum_rec(x))

вывод

9700

9700

9700

Вторая задача

Напишите функцию, которая создаёт комбинацию двух списков таким образом:

[1, 2, 3] (+) [11, 22, 33] -> [1, 11, 2, 22, 3, 33]

def f(a,b):

    r = []

    for k in range(min(len(a),len(b))):

        r.append(a[k])

        r.append(b[k])

    return r 

x = [1,2,3,4,5,6]

y = [11,22,33,44,55]

print(f(x,y))

вывод

[1,11,2,22,3,33,4,44,5,55]

Третья задача

Вычислите первые 100 чисел Фибоначчи. (Напишите код.)

x = [0]*100

x[0] = 0 

x[1] = 1 

for k in range(2,len(x)):

    x[k] = x[k-1] + x[k-2]

print(x)

вывод

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 7778742049, 12586269025, 20365011074, 32951280099, 53316291173, 86267571272, 139583862445, 225851433717, 365435296162, 591286729879, 956722026041, 1548008755920, 2504730781961, 4052739537881, 6557470319842, 10610209857723, 17167680177565, 27777890035288, 44945570212853, 72723460248141, 117669030460994, 190392490709135, 308061521170129, 498454011879264, 806515533049393, 1304969544928657, 2111485077978050, 3416454622906707, 5527939700884757, 8944394323791464, 14472334024676221, 23416728348467685, 37889062373143906, 61305790721611591, 99194853094755497, 160500643816367088, 259695496911122585, 420196140727489673, 679891637638612258, 1100087778366101931, 1779979416004714189, 2880067194370816120, 4660046610375530309, 7540113804746346429, 12200160415121876738, 19740274219868223167, 31940434634990099905, 51680708854858323072, 83621143489848422977, 135301852344706746049, 218922995834555169026]

Четвёртая задача

У вас есть массив чисел, составьте из них максимальное число.

Например: [61, 228, 9] -> 961228

from itertools import *

a = [9,10,10,345,11,9]

m = 0

for x in permutations(a):

    s = int(''.join(map(str,x)))

    m = max(m,s)

print(m) 

вывод

99345111010

К слову, абсолютно неэффективная программа.

Пятая задача

У вас есть девять цифр: 1, 2, …, 9. Именно в таком порядке. Вы можете вставлять между ними знаки «+», «-» или ничего. У вас будут получаться выражения вида 123+45-6+7+89. Найдите все из них, которые равны 100.

m = set()

for k1 in range(1,10):

    for t1 in ' +-':

        for k2 in range(k1+1,10):

            for t2 in ' +-':

                for k3 in range(k2+1,10):

                    for t3 in ' +-':

                        for k4 in range(k3+1,10):

                            for t4 in ' +-':

                                for k5 in range(k4+1,10):

                                    for t5 in ' +-':

                                        for k6 in range(k5+1,10):

                                            for t6 in ' +-':

                                                for k7 in range(k6+1,10):

                                                    for t7 in ' +-':

                                                        for k8 in range(k7+1,10):

                                                            for t8 in ' +-':

                                                                for k9 in range(k8+1,10):

                                                                    for t9 in ' +-':

                                                                        s= str(k1)+str(t1)

                                                                        s+=str(k2)+str(t2)

                                                                        s+=str(k3)+str(t3)

                                                                        s+=str(k4)+str(t4)

                                                                        s+=str(k5)+str(t5)

                                                                        s+=str(k6)+str(t6)

                                                                        s+=str(k7)+str(t7)

                                                                        s+=str(k8)+str(t8)

                                                                        s+=str(k9)+str(t9)

                                                                        w=''

                                                                        for y in s:

                                                                            if y!=' ':

                                                                                w+=y

                                                                        if w[-1] in '+-': w = w[:-1]

                                                                        r = w[0]

                                                                        for q in range(1,len(w)):

                                                                            if w[q] in '+-':

                                                                                r=r+'s'+w[q]

                                                                            else:

                                                                                r=r+w[q]

                                                                        summ = sum(list(map(int,r.split('s'))))  

                                                                        if summ==100:

                                                                            m.add(w)

print(len(m),m)   

вывод

11 {'1+2+3-4+5+6+78+9', '12+3+4+5-6-7+89', '1+2+34-5+67-8+9', '12+3-4+5+67+8+9', '123+45-67+8-9', '123-4-5-6-7+8-9', '1+23-4+56+7+8+9', '1+23-4+5+6+78-9', '12-3-4+5-6+7+89', '123+4-5+67-89', '123-45-67+89'}

Итого

Начало: 19:49

Конец: 20:58

Потрачено: 1 час 9 мин

То чувство, когда применяешь для решения задач что-то по-быстрому, главное решить... и каково снова быть на экзамене?

01.03.2024

Задание 12. ЕГЭ по информатике. Replace. Дана строка, состоящая из 400 цифр 5. Сколько пятёрок было удалено за время обработки строки (программа на языке Python)

 Задача.     Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в обеих командах v и w обозначают цепочки цифр.

заменить (v, w) заменяет подстроку v на w (первое слева вхождение)

нашлось (v) проверяет, нашлась ли подстрока v

Дана программа для исполнителя Редактор:

ПОКА нашлось (555) ИЛИ нашлось (333)

  ЕСЛИ нашлось (555)

    ТО заменить (555, 3)

    ИНАЧЕ заменить (333, 5)

  КОНЕЦ ЕСЛИ 

КОНЕЦ ПОКА 

Дана строка, состоящая из 400 цифр 5. Сколько пятёрок было удалено за время обработки строки по этой программе?

Это пример задачи из ЕГЭ по информатике - задание № 12.

Как будем решать задачу?

Будем использовать метод replace(v,w, x) для замены подстроки v на w, параметр x указывает на количество замен,  в нашем случае x = 1. Если параметр x не указывать, будут выполнены все возможные замены.

Чтобы вычислить количество удаленных '5' за время обработки строки, найдем ту команду, которая заменяет '5' на другие символы - это команда: заменить (555, 3), за счет этой команды удаляются три '5'. В этом месте алгоритма будем увеличивать счетчик удаленных пятерок на 3.

Программа решения задачи на языке Python

s = '5' * 400

k = 0

while '555' in s or '333' in s:

    if '555' in s:

        s = s.replace('555','3',1)

        k+=3

    else:

       s = s.replace('333','5',1)

print('k =',k)

Вывод результата: