# -*- coding: utf-8 -*-
from tkinter import Tk, filedialog
import os
import re
import random

'''
Есть список a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89].
Выведите все элементы, которые меньше 5.
'''
def les_1():
    a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

    for i in a:
        if i <= 5: 
            print(i)

'''
Даны списки:

a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89];

b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13].

Нужно вернуть список, который состоит из элементов, общих для этих двух списков.
'''
def les_2():
    res = []
    a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
    b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

    for i in a:
        for j in b:
            if j == i and j not in res:
                res.append(j)
    print(res)

'''
Отсортируйте словарь по значению в порядке возрастания и убывания.
'''            
def les_3():
    import operator
    d = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
    result = dict(sorted(d.items(), key=operator.itemgetter(1)))
    print(result)

'''
Запишите число в обратном порядке
'''
def les_4():
    a = ""
    n = int(input('Введите число: '))
    while n > 0:
        rem = n % 10
        a += str(n - (n - rem))
        n = n-rem
        if n % 10 == 0: n = int(n/10)
    print(a)
    
'''
Напишите программу для слияния нескольких словарей в один.
'''  
def les_5():
    keys = []
    values = []
    res = {}
    a = {1: 2, 3: 4, 2: 1, 0: 0}
    b = {'a': 3, 'b': 67, 'c': 34, 'd': 'adv'}
    
    for key, value in a.items():
        keys.append(key)
        values.append(value)
    for key, value in b.items():
        keys.append(key)
        values.append(value)
    for i in range(len(keys)):
        res[keys[i]] = values[i]
    print(res)

'''
Найдите три ключа с самыми высокими значениями в словаре my_dict = {'a':500, 'b':5874, 'c': 560,'d':400, 'e':5874, 'f': 20}.
'''
def les_6():
    rem = 0
    keys = None
    my_dict = {'a':500, 'b':5874, 'c': 560,'d':400, 'e':5874, 'f': 20}
    i = 3
    
    while i > 0:
        for key, value in my_dict.items():
            if rem < value:
                rem = value
                keys = key
        print(keys, end = ' ')
        rem = 0
        my_dict.pop (keys, None)
        i -= 1
    
'''
Напишите код, который переводит целое число в строку, при том что его можно применить в любой системе счисления.
'''
def les_7():
    
    def current_row(n):
        row=list()
        for i in range(n):
            if i==0 or i==n-1:
                row.append(1)
            else:
                c_row=current_row(n-1)
                row.append(c_row[i-1]+c_row[i])
        return row
    
    n = int (input('Ввод количества строк: '))
    res = []
    
    for i in range(n):
        res.append(current_row (i + 1))
    for j in range(len(res)):
        print(' ' * (len(res[:-(j + 1)])), *res[j])

'''
Напишите проверку на то, является ли строка палиндромом. Палиндром — это слово или фраза, которые одинаково читаются слева направо и справа налево.
'''
def les_8():
    text = input("Запишите текст: ")
    _text = reversed(text)
    if text == _text:
        print('Палиндром')
    else:
        print('Не палиндром')
        
'''
Сделайте так, чтобы число секунд отображалось в виде дни:часы:минуты:секунды.
'''       
def les_9():
    second_input = int(input('Введите колличество секунд: '))
    minuts = second_input // 60
    if minuts >= 60: minuts = 0
    hor = second_input // 3600
    if hor >= 24: hor = 0
    day = second_input // 86400
    
    print('%d:%d:%d' %(day, hor, minuts))

'''
Вы принимаете от пользователя последовательность чисел, разделённых запятой. Составьте список и кортеж с этими числами.
'''
def les_10():
    text = input('Ведите последовательность чисел через запятую: ')
    rem = text.split(',')
    kor = tuple(rem)
    print(kor)
    
'''
Выведите первый и последний элемент списка.
'''    
def les_11():
    text = [1,2,3,4,5,6,7,8,9,10,11,1,14,15,18]
    print('Первый элеенет списка: ' + str(text[0]) + ', Последний элемент списка: ' + str(text[-1]))
    
'''
Напишите программу, которая принимает имя файла и выводит его расширение. Если расширение у файла определить невозможно, выбросите исключение.
'''
def les_12():
    root = Tk()
    root.filename = filedialog.askopenfilename(initialdir = "D:/", title = "Выбор файла");
    file_name = root.filename.split(".")
    if len(file_name) <= 1:    
        print('Ошибка расширения')
    else:
        print( "Расширение выбранного файла:", file_name[-1] )
    root.withdraw()

'''
При заданном целом числе n посчитайте n + nn + nnn.
'''
def les_13():
    num = int(input("Введите число n: "))
    print("n + nn + nnn =", num + 2*num + 3*num)
    
'''
Напишите программу, которая выводит чётные числа из заданного списка и останавливается, если встречает число 237.
'''    
def les_14():
    numbers = [
                386, 462, 47, 418, 907, 344, 236, 375, 823, 566, 597, 978, 328, 615, 953, 345, 
                399, 162, 758, 219, 918, 237, 412, 566, 826, 248, 866, 950, 626, 949, 687, 217,
              ]
    for i in numbers:
        if i % 2 == 0 and i != 237:
            print(i, end = ' ')
        elif i == 237:
            break;

'''
Напишите программу, которая принимает два списка и выводит все элементы первого, которых нет во втором.
'''
def les_15():
    mas_1 = []
    mas_2 = []
    flag = 0
    while flag == 0:
        rem = input('Заполните первый список (если строка будет пустая, значит закончить ввод): ')
        if not rem:
            flag = 1
            continue
        mas_1.append(rem)
    while flag == 1:
        rem = input('Заполните второй список (если строка будет пустая, значит закончить ввод): ')
        if not rem:
            flag = 3
            continue
        mas_2.append(rem)
    if flag == 3:
        print( 'Первый лист: ', mas_1, 'Второй лист: ', mas_2 )
        set_1 = set(mas_1)
        set_2 = set(mas_2)        
        print( 'Результат: ', set_1 - set_2 )        
 
'''
Выведите список файлов в указанной директории. (Дополнил, вывода размера файлов в выбранной директории и распредение фалов по поддиректориям)
'''    
def les_16():
    
    def size_file(root, f):
        if os.path.getsize( root + '/' + f ) >= 1048576 and os.path.getsize( root + '/' + f ) < 1073741824:
             print( round (float(os.path.getsize( root + '/' + f ) / 1048576), 1), 'МБ -',  os.path.getsize( root + '/' + f ), '(байт)')
        if os.path.getsize( root + '/' + f ) >= 1073741824:
            print( round (float(os.path.getsize( root + '/' + f ) / 1073741824), 2), 'ГБ -',  os.path.getsize( root + '/' + f ), '(байт)')
        if os.path.getsize( root + '/' + f ) >= 1024 and os.path.getsize( root + '/' + f ) < 1048576 and os.path.getsize( root + '/' + f ) < 1073741824:
            print( int(os.path.getsize( root + '/' + f ) / 1024), 'Кб -',  os.path.getsize( root + '/' + f ), '(байт)')
        if os.path.getsize( root + '/' + f ) < 1024:
            print(os.path.getsize( root + '/' + f ), 'байт')
    
    window = Tk()
    window.filename = filedialog.askdirectory()
    window.withdraw()
    print('Выбранная директория:', window.filename)
    print('------------------------------------------------------------------')
    for root, direct, file_name in os.walk(window.filename):
        rem = re.sub(r'\\', '/', root)
        if root == window.filename:
            print('Фалы в основной директории:')
            for f in file_name:
                print(f, end = ' размер: ')
                size_file(root, f)
            print('----------------------------------------------------------------------------------------------------')
        else:
            print('Файлы в поддиректории %s:' %rem)
            if len(file_name) == 0:
                print('Пустая директория')
            for f in file_name:
                print(f, end = ' размер: ')
                size_file(rem, f)
            print('----------------------------------------------------------------------------------------------------')
    
'''
Сложите цифры целого числа.
'''    
def les_17():
    res = 0
    number = int(input('Введите число не меньше десятизначного: '))
    if number // 10 <= 0:
        print('Число меньше или равно десяти:', number)
    else:
        for i in str(number):
            res += int(i)
        print('Результат:', res)
    
'''
Посчитайте, сколько раз символ встречается в строке.
'''
def les_18():
    text = ['Два мальчика стояли и смотрели, как сатана медленно уходит прочь.\nБлеск его гипнотических глаз все ещё туманил их головы.\n— Слушай, чего он от тебя хотел?\n— Мою душу. А от тебя?\n— Монетку для телефона-автомата. Ему срочно надо было позвонить.\n— Хочешь, пойдём поедим?\n— Хочу, но у меня теперь совсем нет денег.\n— Ничего страшного. У меня полно',
             'Блестящие колготки туго и соблазнительно облегали прекрасные бёдра — чудесное дополнение к лёгкому вечернему платью. От самых кончиков бриллиантовых сережек до носков изящных туфелек на тонких шпильках — всё было просто шикарно. Глаза с только что наведёнными тенями рассматривали отражение в зеркале, и накрашенные яркой красной помадой губы растягивались от удовольствия. Внезапно сзади послышался детский голос:«Папа?!»',
             'Говорят, зло не имеет лица. Действительно, на его лице не отражалось никаких чувств. Ни проблеска сочувствия не было на нём, а ведь боль просто невыносима. Разве он не видит ужас в моих глазах и панику на моем лице? Он спокойно, можно сказать, профессионально выполнял свою грязную работу, а в конце учтиво сказал: «Прополощите рот, пожалуйста.',
             'Зазвонил телефон.\n— Алло, — прошептала она.\n— Виктория, это я. Давай встретимся у причала в полночь.\n— Хорошо, дорогой.\n— И пожалуйста, не забудь захватить с собой бутылочку шампанского, — сказал он.\n— Не забуду, дорогой. Я хочу быть с тобой сегодня ночью.\n— Поторопись, мне некогда ждать! — сказал он и повесил трубку.\nОна вздохнула, затем улыбнулась.\n— Интересно, кто это, — сказала она',
             'Был только один выход, ибо наши жизни сплелись в слишком запутанный узел гнева и блаженства, чтобы решить всё как-нибудь иначе. Доверимся жребию: орёл — и мы поженимся, решка — и мы расстанемся навсегда. Монетка была подброшена. Она звякнула, завертелась и остановилась. Орёл. Мы уставились на неё с недоумением. Затем, в один голос, мы сказали: «Может, ещё разок?»']    
    rand = random.randint(0, len(text))
    txt = text[rand].lower()
    print(text[rand])
    world = input('Введите символ который хотите посчитать: ')
    print(txt.count(world.lower()))
  
'''
С помощью анонимной функции извлеките из списка числа, делимые на 15.

Добвал переменную для ввода делимого числа и рандомный список целых чисел
'''
def les_19():
    
    num = int(input("С помощью анонимной функции извлеките из списка числа, делимые на "))
    rand_mas_num = random.randint(0, 10)
    rand_mas = []
    for i in range (rand_mas_num):
        rand_mas.append(random.randint(0, 10000))
    
    print(rand_mas)    
    res = list(filter(lambda x: not x % num, rand_mas))
    print('Числа делимые на %d:' %( num ))
    for j in res:
        print(j, end = ' ')
    
lessons = [
    None, 
    les_1,
    les_2,
    les_3,
    les_4,
    les_5,
    les_6,
    les_7,
    les_8,
    les_9,
    les_10,
    les_11,
    les_12,
    les_13,
    les_14,
    les_15,
    les_16,
    les_17,
    les_18,
    les_19
           ]

if __name__ == "__main__":
    i = int(input ('Номер решеной задачи: '))
    lessons[i] ()