21 задача*

1. Вкажіть, які з наведених заголовків циклу for записані синтаксично правильно і роблять рівно 5 ітерацій?
------------------------------------------------------------------------------------------------------------------
2. Скільки всього кроків пройде Робот, виконавши наступний цикл?

for x in range (4):
    r.right (1)
    for y in range (4):
        r.right (2)
    r.right (3)

Зауважимо, що r.right (3) - це команда зсуву Робота на 3 кроки вправо.
------------------------------------------------------------------------------------------------------------------
3. Що виведе даний код ?
print (1,2,3. sep = ":")
------------------------------------------------------------------------------------------------------------------
4. Яке число буде виведено на екран? Спробуйте виконати це завдання, не запускаючи програму на Python.
N = 987654321
print(N % 10 ** 5 // 10 ** 2)
------------------------------------------------------------------------------------------------------------------
5. Що буде результатом операції 
str ("1" + '2') * int (1 + 2)?
Будь ласка, дайте відповідь без використання інтерпретатора Python.
Якщо результат - рядок, то відповідь треба писати в лапках.
------------------------------------------------------------------------------------------------------------------
6. Яка з операцій змінює рядок s?
Будь ласка, дайте відповідь без використання інтерпретатора Python.
------------------------------------------------------------------------------------------------------------------
7. Знайдіть значення члена арифметичної прогресії з індексом тисячі п'ятсот сорок три(1543), якщо її нульовий член дорівнює 179, а крок дорівнює 2007.

Підказка. Другий параметр range можна просто покласти досить великим числом.
Для об'єкта range використовуйте операцію взяття елемента за індексом (номером): range (...) [...]
range(start, stop, step) [index]
------------------------------------------------------------------------------------------------------------------
8. За допомогою програми з циклом for обчисліть суму арифметичної прогресії:
1 + 3 + 5 + ... + 123456789.

Відповідь:
s = 0
for k in range(1, 123456790, 2):
    s = s + k
print(s)
------------------------------------------------------------------------------------------------------------------
9.





Відповідь:

n = 10 ** 9 + 13
d = 2
while n % d != 0:
    d += 1
print(d)


------------------------------------------------------------------------------------------------------------------
10. Обчисліть за допомогою мови Пітон факторіал числа 50 - добуток всіх натуральних чисел від 1 до 50.
------------------------------------------------------------------------------------------------------------------
11.Послідовність чисел генерується лямбда-функцією:

def generate_number ():
      return lambda random_seed: (random_seed * 693 + 5)% 100
number = generate_number ()

Член послідовності під номером i дорівнює number (i). Послідовність починається з першого елемента, ознака кінця послідовності - значення 0 (не входить в саму послідовність).
Знайти кількість чисел, кратних 7.


Відповідь:

def generate_number():
    return lambda random_seed: (random_seed*693 + 5)%100
n = generate_number()
k = 0
i = 1
while n(i) != 0:
    if n(i)%7 == 0:
         k += 1
    i += 1

print(k)
------------------------------------------------------------------------------------------------------------------
12.Послідовність чисел генерується лямбда-функцією:

def generate_number ():
     return lambda random_seed: (random_seed * 693 + 5)% 100
number = generate_number ()

Член послідовності під номером i дорівнює number (i). Послідовність починається з першого елемента, ознака кінця послідовності - значення 0 (не входить в саму послідовність).
Знайти суму чисел, кратних 7.

Відповідь:

def generate_number():
    return lambda random_seed: (random_seed*693 + 5)%100
n = generate_number()
s = 0
i = 1
while n(i) != 0:
    if n(i)%7 == 0:
        s += n(i)
    i += 1
print(s)
------------------------------------------------------------------------------------------------------------------
13. Послідовність чисел генерується функцією:

def number (random_seed):
     return (random_seed * 693 + 5)% 100

Член послідовності під номером i дорівнює number (i). Зверніть увагу на круглі дужки!
Послідовність починається з першого елемента, ознака кінця послідовності - значення 0 (не входить в саму послідовність).
Знайти середнє арифметичне чисел, кратних 4. 

Відповідь:

def n(random_seed):
    return (random_seed*693 + 5)%100

k = 0
sum = 0
i = 1
while n(i) != 0:
    if n(i)%4 == 0:
        k += 1
        sum += n(i)
    i += 1
print(sum/k)
------------------------------------------------------------------------------------------------------------------
14.Послідовність чисел генерується лямбда-функцією:

def generate_number ():
     return lambda random_seed: (random_seed * 693 + 5)% 100
number = generate_number ()

Член послідовності під номером i дорівнює number (i). Послідовність починається з першого елемента, ознака кінця послідовності - значення 0 (не входить в саму послідовність).
Знайти мінімальне з чисел, кратне 3.

Відповідь:
def generate_number():
    return lambda random_seed: (random_seed*693 + 5)%100
n = generate_number()

i = 1
while n(i)%3 != 0:
    i += 1
minimum3 = n(i)
i += 1
while n(i) != 0:
     if n(i)%3 == 0:
         if n(i) < minimum3:
             minimum3 = n(i)
     i += 1
print(minimum3)
------------------------------------------------------------------------------------------------------------------
15. Дано список з 20 елементів, створений за допомогою

my_list = [(lambda x: (x * 87 + 12)% 16) (i) for i in range (20)]

Знайти кількість елементів, рівних мінімальному значенню, дістаючи з нього значення за допомогою операції

x = my_list.pop ()

і перевіряючи довжину, що залишилася  через len (my_list)

Довідка. Повертає елемент [на зазначеній позиції], видаляючи його зі списку.
list.pop ([i])
i = None: позиція шуканого елемента в списку (ціле число). Якщо не вказана, вважається що мається на увазі останній елемент списку. Від'ємні числа підтримуються.

Відповідь:
my_list = [(lambda x:(x*87+12)%16)(i) for i in range(20)]
print(my_list)

minv = my_list.pop()
minn = 1
while len(my_list) > 0:
    num = my_list.pop()
    if num < minv:
        minv = num
        minn = 1
    elif num == minv:
        minn += 1
print(minn)
------------------------------------------------------------------------------------------------------------------
16. Данo список з 2000 елементів, створений за допомогою

my_list = [(lambda x: (x * 296 + 2410)% 4096) (i) for i in range (2000)]

дістаючи з нього значення за допомогою операції

x = my_list.pop ()

і перевіряючи довжину залишився списку через  len (my_list),
знайти кількість елементів, рівних другому по мінімальності значенню (відмінних за значенням від першого мінімуму).

Відповідь:
# Варіант1
# генерируємо список із 2000 елементов
my_list = [(lambda x:(x*296+2410)%4096)(i) for i in range(2000)]

# початкове значення для тимчасового мінімума
min1_value = min2_value = 10000
min1_number = min2_number = 0

while my_list:
    x = my_list.pop()
    if x < min1_value:
        min2_value = min1_value
        min2_number = min1_number
        min1_value = x
        min1_number = 1
    elif x == min1_value:
        min1_number += 1
    elif x < min2_value:
        min2_value = x
        min2_number = 1
    elif x == min2_value:
        min2_number += 1
       
print(min2_number)

# Варіант 2
my_list = [(lambda x : (x*296+2410)%4096)(i) for i in range(2000)]

mine = min(my_list)

x = len(my_list)-1
while x>0:
    if mine == my_list[x]:
        my_list.pop(x)
    x -= 1
mine = min(my_list)
res = 0
while len(my_list)>0:
    if mine == my_list.pop():
        res += 1
print(res)
------------------------------------------------------------------------------------------------------------------
17. Дан список з 20 елементів, створений за допомогою

my_list = [(lambda x: (x * 87 + 12)% 100) (i) for i in range (20)]

дістаючи з нього значення за допомогою операції  x = my_list.pop ()

і перевіряючи довжину залишився списку через   len (my_list),

знайти середньоквадратичне відхилення (середньоквадратичнепомилку середнього арифметичного) за допомогою однопрохідного алгоритму. (Будьте уважні, "середньоквадратичне відхилення" і "стандартне відхилення" відрізняються один від одного.)

Введіть відповідь з точністю до п'ятого знака після коми.

Відповідь:

my_list = [(lambda x:(x*87+12)%100)(i) for i in range(20)]

summa = 0
summa2 = 0
k = 0
while len(my_list) > 0:
    x = my_list.pop()
    summa += x
    summa2 += x*x
    k += 1
sered = summa/k
sered2 = summa2/k
vidchil = (sered2 - sered**2)**0.5
print(vidchil)
------------------------------------------------------------------------------------------------------------------
18. Дан список з 20 елементів, створений за допомогою

my_list = [(lambda x: (x * 87 + 12)% 100) (i) for i in range (20)]

дістаючи з нього значення за допомогою операції  x = my_list.pop ()

і перевіряючи довжину залишився списку через  len (my_list),

знайти средньоквадратичну похибку середнього арифметичного за допомогою однопрохідного алгоритму за умови, що шукається середнє арифметичне парних чисел.

Введіть відповідь з точністю до другого знака після коми. Округлення здійснюйте за правилами математики.

Відповідь:

my_list = [(lambda x:(x*87+12)%100)(i) for i in range(20)]

summa = 0
summa2 = 0
k = 0
while len(my_list) > 0:
    x = my_list.pop()
    if x%2 == 0:
        summa += x
        summa2 += x*x
        k += 1
sered = summa/k
sered2 = summa2/k
vidchul = (sered2 - sered**2)**0.5
print(vidchul)
------------------------------------------------------------------------------------------------------------------
19. Створіть послідовність A за допомогою наступного генератора:

def pseudo_list ():
    for i in range (N):
        yield (i * 9876 + 1024)% 1000
N = 10 ** 6 + 1
A = pseudo_list ())

# Елементи цієї послідовності слід перебирати так:
for x in A:
    pass # робота з черговим числом x
Знайдіть «медіану» даного псевдосписка чисел за допомогою сортування підрахунком.

Медіана - це число, яке знаходиться рівно посередині списку, якщо список впорядкувати.

У послідовності чисел A - 10^6 + 1 число, всi числа - цілі невід'ємні від 0 до 999. Зберігати цю послідовність в список для подальшого сортування в даній задачі заборонено. Використовуйте сортування підрахунком.

Підказка.
Для кожного числа від 0 до 999 підрахуємо, скільки разів воно зустрічається в даному списку, причому зробимо це як в сортуванні підрахунком.

count = [0] * 1000
for elem in A:
     count [elem] + = 1
Для пошуку медіани не потрібно створювати відсортований масив, досить проаналізувати частоти. Виберемо таке число x, що загальна кількість появи чисел від 0 до x (включно) буде не менше, ніж 500000. Це число - відповідь на задачу.

 Відповідь:

def pseudo_list():
    for i in range(N):
        yield (i*9876+1024)%1000
N = 10**6 + 1
A = pseudo_list()

count = [0] * 1000
for x in A:
    count[x] += 1

x = 0
sum_count = count[0]

while sum_count <= N//2:
    x += 1
    sum_count += count[x]   
print(x)
---------------------------------------------------------------------------------------------------------------
20. Відсортувати слова в порядку лексикографічного зростання і як відповідь вивести слово, яке перебуває рівно посередині (медіану масиву). Кількість слів непарна.
Sam is a multi-file text editor based on structural regular expressions It was originally designed in the early 1980s at Bell Labs by Rob Pike with the help of Ken Thompson and other Unix developers for the Blit windowing terminal running on Unix it was later ported to other systems Sam follows a classical modular Unix aesthetic It is internally simple its power leveraged by the composability of a small command language and extensibility through shell integration
Відповідь:
Введення всіх слів рядка пишеться одним рядком:
words = input (). split ()
Як організувати сортування рядків?
Оскільки рядків трохи, можна скористатися будь-яким найпростішим алгоритмом сортування, наприклад, сортуванням вибором.

# Варіант 1 
words = input(":").split()
N = len(words)

for p in range(N-1):
    for i in range(p+1, N):
        if words[i] < words[p]:
            words[i], words[p] = words[p], words[i]
            
print(words[N//2])

# Варіант2
words = input(":").split()
N = len(words)
words.sort()
print(words[N//2])
-----------------------------------------------------------------------------------------------------------
21. Обчисліть найбільший спільний дільник чисел 77164189341682084692124351766096496451364840671846455244761 і

46668734283684548617206823665104829826096872771679324943689.

Відповідь:
Скористаємось алгоритмом Евкліда:

# Варіант1
def gcd(a, b):   
    while b != 0:
        a, b = b, a % b
    return a

print(gcd(77164189341682084692124351766096496451364840671846455244761, 46668734283684548617206823665104829826096872771679324943689))

# Варіант2

a = 77164189341682084692124351766096496451364840671846455244761 
b = 46668734283684548617206823665104829826096872771679324943689

while a != b:
    if a > b:
        a = a - b
    else:
        b = b - a
print(a)
===============================================================