"""
Задание 7:
В одномерном массиве целых чисел определить два наименьших элемента.
Они могут быть как равны между собой (оба являться минимальными), так и различаться
"""

"""
Варианты, использующие дополнительные переменные однозначно потребляют больше памяти, т.к под эти переменные 
выделяются дополнительные ячейки.

Вариант с sorted(a)[:2] использует паямть, выделенную под массив. Размер до сортировки и после не изменился.

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

Первый вариант получается самый "объемный". Используется дополнительные переменные min_num, min_ind, ind, n
Когда значение индекса начинает увеличиваться, объем выделяемой памяти также растет. Под каждое значение индекса также
выделяется ячейка памяти. В процессе выполнения видно, что одна и тажа ячейка может использоваться для разных
переменных. Например min_ind = 0 и значения индекса, если становится равным нули, то отсыл идет к ячейке с таким же 
идентификатором.

Примерные подсчеты показывают, что первый вариант занимает больше всего памяти.  

"""

from random import random
import sys


def get_size(obj):
    return sys.getsizeof(obj)


n = int(input('Введите длину массива: '))
a = []
for i in range(n):
    a.append(int(random() * 100))


# Перебор списка 2 раза
min_num = a[0]
min_ind = 0
_a = get_size(a)
_min_num = get_size(min_num)
_min_ind = get_size(min_ind)
print(f'Размер переменной min_num: {_min_num}  id = {id(min_num)}')
print(f'Размер переменной min_ind: {_min_ind}  id = {id(min_ind)}')

_ind_sum = 0
for ind, n in enumerate(a):
    _ind = get_size(ind)
    _ind_sum += _ind
    print(f'Размер переменной ind: {_ind}  id = {id(ind)}')
    if n <= min_num:
        min_num = n
        min_ind = ind
print(min_num)

print(f'Всего затрачено памяти (примерно): {_a + _min_num + _min_ind + _ind_sum}')

if min_ind == 0:
    min_num = a[1]
else:
    min_num = a[0]

for ind, n in enumerate(a):
    if ind != min_ind:
        if n <= min_num:
            min_num = n
print(min_num)


# Читерские способы. При условии, что длина массива >= 2
# 1

_a = get_size(a)
print(f'Размер до сортировки: {_a}')
print(sorted(a)[:2])
_a = get_size(a)
print(f'Размер после сортировки: {_a}')


# 2
_a = get_size(a)
print(f'Размер массива a: {_a}  id = {id(a)}')
min_num = min(a)
_b = get_size(min_num)
print(f'Размер переменной min_num: {_b}  id = {id(min_num)}')
_c = _a + _b
print(min_num)
a.remove(min_num)
min_num = min(a)
_b = get_size(min_num)
print(f'Размер переменной b: {_b}  id = {id(min_num)}')
print(min_num)
print(f'Всего затрачено памяти: {_c}')
