diff --git a/Algorithmf&Data_Structures_3/task_1.py b/Algorithmf&Data_Structures_3/task_1.py new file mode 100644 index 0000000..ff9f70b --- /dev/null +++ b/Algorithmf&Data_Structures_3/task_1.py @@ -0,0 +1,20 @@ +#1. В диапазоне натуральных чисел от 2 до 99 определить, +# сколько из них кратны любому из чисел в диапазоне от 2 до 9. +# +multiplicity_count = [0, 0, ] #список для хранения количеств кратностей +SEQ_LOWERBOUND = 2 +SEQ_UPPERBOUND = 99 +DEVIDERS_LOWERBOUND = 2 +DEVIDERS_UPPERBOUND = 9 +for i in range(DEVIDERS_LOWERBOUND, DEVIDERS_UPPERBOUND + 1): + multiplicity_count.append(0, ) +for k in range(SEQ_LOWERBOUND, SEQ_UPPERBOUND + 1): + for j in range(DEVIDERS_LOWERBOUND, DEVIDERS_UPPERBOUND + 1): + if k % j == 0: + multiplicity_count[j] += 1 +print('\nВ диапазоне натуральных чисел от {: >2d} до {: >2d}:'.format(SEQ_LOWERBOUND, SEQ_UPPERBOUND)) +for i in range(DEVIDERS_LOWERBOUND, DEVIDERS_UPPERBOUND + 1): + print('чисел кратных {: >2d}: {: >2d}'.format(i, multiplicity_count[i])) + +#Здесь я в сомнении не нужно ли всюду отнять по '1', ведь числа-цифры [2-9] кратны сами себе? +#Как-то это вроде не слишком "математично", хотя и под условие данной задачи они подпадают? diff --git a/Algorithmf&Data_Structures_3/task_2.py b/Algorithmf&Data_Structures_3/task_2.py new file mode 100644 index 0000000..8145145 --- /dev/null +++ b/Algorithmf&Data_Structures_3/task_2.py @@ -0,0 +1,17 @@ +#2. Во втором массиве сохранить индексы четных элементов первого массива. +# Например, если дан массив со значениями 8, 3, 15, 6, 4, 2, +# то во второй массив надо заполнить значениями 0, 3, 4, 5 +# (индексация начинается с нуля), т.к. именно в этих позициях первого массива стоят четные числа. +import random + +list_1 = [] +List_1_LENGTH = 20 +for i in range(0, List_1_LENGTH + 1): + list_1.append(random.randint(1, 20)) + +print("\nПервый массив: ", list_1) +#even_numbers_indixes = [i for i in range(0, len(list_1)) if list_1[i] % 2 == 0] +#print("Массив индексов четных чисел первого массива: ", even_numbers_indixes) +even_numbers_indixes = [i for i in range(0, List_1_LENGTH) if list_1[i] % 2 == 0] +print("Массив индексов четных чисел первого массива: ", even_numbers_indixes) + diff --git a/Algorithmf&Data_Structures_3/task_3.py b/Algorithmf&Data_Structures_3/task_3.py new file mode 100644 index 0000000..5c167cc --- /dev/null +++ b/Algorithmf&Data_Structures_3/task_3.py @@ -0,0 +1,32 @@ +#3. В массиве случайных целых чисел поменять местами минимальный и максимальный элементы. + +import random + +random_list = [] +random_list_LENGTH = 20 +for i in range(0, random_list_LENGTH + 1): + random_list.append(random.randint(1, 20)) + +curr_max = {} +curr_max['index'] = 0 +curr_max['value'] = random_list[0] +curr_min = {} +curr_min['index'] = 0 +curr_min['value'] = random_list[0] + +for i in range(0, random_list_LENGTH): + if random_list[i] > curr_max['value']: + curr_max['value'] = random_list[i] + curr_max['index'] = i + continue # текущий элнмент уже заведоио не может оказаться минимальным + else: + if random_list[i] < curr_min['value']: + curr_min['value'] = random_list[i] + curr_min['index'] = i +print('\nМаксимальный элемент: {: >2d} в позиции {: >2d}:'.format(curr_max['value'], curr_max['index'])) +print('Минимальный элемент: {: >2d} в позиции {: >2d}:'.format(curr_min['value'], curr_min['index'])) +changed_list = random_list[:] +changed_list[curr_max['index']] = curr_min['value'] +changed_list[curr_min['index']] = curr_max['value'] +print("\nИсходный массив :", random_list) +print("измененный массив:", changed_list) \ No newline at end of file diff --git a/Algorithmf&Data_Structures_3/task_4.py b/Algorithmf&Data_Structures_3/task_4.py new file mode 100644 index 0000000..9a94996 --- /dev/null +++ b/Algorithmf&Data_Structures_3/task_4.py @@ -0,0 +1,27 @@ +#4. Определить, какое число в массиве встречается чаще всего. + +import random + +count_list = [] +numbers_list = [] +List_LENGTH = 55 +DIFF_NUMBS = 30 +for i in range(0, List_LENGTH + 1): + numbers_list.append(random.randint(1, DIFF_NUMBS)) + +for i in range(0, DIFF_NUMBS+1): + count_list.append(0) + +for i in range(0, List_LENGTH + 1): + count_list[numbers_list[i]] += 1 + +print("исходный массив чисел:") +if List_LENGTH >30: #Если массив очень большой выводим его строками по 10 элементов в строке + for j in range(0, int(List_LENGTH/10)): + line_to_print = numbers_list[j*10:(j*10)+10] + print (line_to_print) +else: + print ('\n', numbers_list) + +for i in range(0, DIFF_NUMBS): + print("В данном массиые число: {: >3d} встречается {: >d} раз".format(i, count_list[i])) diff --git a/Algorithmf&Data_Structures_3/task_5.py b/Algorithmf&Data_Structures_3/task_5.py new file mode 100644 index 0000000..35e9988 --- /dev/null +++ b/Algorithmf&Data_Structures_3/task_5.py @@ -0,0 +1,27 @@ +# 5. В массиве найти максимальный отрицательный элемент. +# Вывести на экран его значение и позицию в массиве. + +import random + +random_list = [] +List_LENGTH = 20 +for i in range(0, List_LENGTH + 1): + random_list.append(random.randint(-10, 20)) + +print(random_list) +max_negative = {} +for i in range(0, List_LENGTH): + if random_list[i]< 0: + max_negative["value"] = random_list[i] + max_negative["index"] = i + +if max_negative["index"] != List_LENGTH: + for i in range(max_negative["index"], List_LENGTH): + if random_list[i]<0: + if random_list[i] > max_negative["value"]: + max_negative["value"] = random_list[i] + max_negative["index"] = i + +print(random_list) +print("Максимальным отрицательным элементом массива является {: >-2d} ".format(max_negative["value"])) +print("Его индекс: {: >-2d} ".format(max_negative["index"])) \ No newline at end of file diff --git a/Algorithmf&Data_Structures_3/task_6.py b/Algorithmf&Data_Structures_3/task_6.py new file mode 100644 index 0000000..b8e6437 --- /dev/null +++ b/Algorithmf&Data_Structures_3/task_6.py @@ -0,0 +1,54 @@ +#6. В одномерном массиве найти сумму элементов, +# находящихся между минимальным и максимальным элементами. +# Сами минимальный и максимальный элементы в сумму не включать. + +import random + +#======================================================================================================= +# далее блок из задачи task_3.py + +print("\nВведите как можно более длинный ряд челых случайных чисел, для завершения ввода введите символ 'S'") +print("Если вообще не хотите вводить числа, введите 'S' вместо первого числа") +print("тогда список будет создан автоматически. И так начинаем:") +answer = input("Введите первое число или 'S': ") +random_list = [] +random_list_LENGTH = 20 +if answer.lower() == 's': + for i in range(0, random_list_LENGTH + 1): + random_list.append(random.randint(1, random_list_LENGTH)) +else: + while answer.lower() != 's': + random_list.append(int(answer)) + answer = input("Введите следующее число или 'S': ") +curr_max = {} +curr_max['index'] = 0 +curr_max['value'] = random_list[0] +curr_min = {} +curr_min['index'] = 0 +curr_min['value'] = random_list[0] + +for i in range(0, len(random_list)): + if random_list[i] > curr_max['value']: + curr_max['value'] = random_list[i] + curr_max['index'] = i + continue # текущий элнмент уже заведоио не может оказаться минимальным + else: + if random_list[i] < curr_min['value']: + curr_min['value'] = random_list[i] + curr_min['index'] = i +print(random_list) +print('\nМаксимальный элемент: {: >2d} в позиции {: >2d}:'.format(curr_max['value'], curr_max['index'])) +print('Минимальный элемент: {: >2d} в позиции {: >2d}:'.format(curr_min['value'], curr_min['index'])) + +# выше блок из задачи task_3.py +#======================================================================================================= +sum_elem = 0 +if curr_max['index'] != curr_min['index']: + if curr_max['index'] > curr_min['index']: + for i in range(curr_min['index'] + 1, curr_max['index']): + sum_elem += random_list[i] + else: + for i in range(curr_max['index'] + 1, curr_min['index']): + sum_elem += random_list[i] + +print('Сумма элементов между максимальным и минимальным значениями, составляет:{: >3d}'.format(sum_elem)) diff --git a/Algorithmf&Data_Structures_3/task_7.py b/Algorithmf&Data_Structures_3/task_7.py new file mode 100644 index 0000000..ebbefd8 --- /dev/null +++ b/Algorithmf&Data_Structures_3/task_7.py @@ -0,0 +1,31 @@ +#7. В одномерном массиве целых чисел определить два наименьших элемента. +# Они могут быть как равны между собой (оба являться минимальными), так и различаться. + + +import random + +random_list = [] +random_list_LENGTH = 20 +for i in range(0, random_list_LENGTH + 1): + random_list.append(random.randint(1, 20)) + +curr_min_1 = {} +curr_min_1['index'] = 0 +curr_min_1['value'] = random_list[0] + +for i in range(0, random_list_LENGTH + 1): + if random_list[i] < curr_min_1['value']: + curr_min_1['value'] = random_list[i] + curr_min_1['index'] = i + +curr_min_2 = {} +curr_min_2['index'] = 0 +curr_min_2['value'] = random_list[0] + +for i in range(curr_min_1['index'] + 1, random_list_LENGTH + 1): + if random_list[i] < curr_min_2['value']: + curr_min_2['value'] = random_list[i] + curr_min_2['index'] = i +print(random_list) +print('\n1й минимальный элемент: {: >2d} в позиции {: >2d}:'.format(curr_min_1['value'], curr_min_1['index'])) +print('2й минимальный элемент: {: >2d} в позиции {: >2d}:'.format(curr_min_2['value'], curr_min_2['index'])) diff --git a/Algorithmf&Data_Structures_3/task_8.py b/Algorithmf&Data_Structures_3/task_8.py new file mode 100644 index 0000000..6536b07 --- /dev/null +++ b/Algorithmf&Data_Structures_3/task_8.py @@ -0,0 +1,41 @@ +#8. Матрица 5x4 заполняется вводом с клавиатуры, кроме последних элементов строк. +# Программа должна вычислять сумму введенных элементов каждой строки и записывать ее +# в ее последнюю ячейку. В конце следует вывести полученную матрицу. + +import random + +print("\nВведите матрицу 5х4 из целых чисел, т.е. 4 раза по 5 чисел. ") +print("В конце ввода каждой строки из 5 чисел будет автоматически добавляться '0'. Не обращайте внмания!") +print("Если вообще не хотите вводить числа, введите 'S' вместо первого числа") +print("тогда матрица будет создана автоматически. И так начинаем:") +answer = input("Введите первое число или 'S': ") + +matrix = [[], [], [], []] +columns_numb = 5 +rows_numb = 4 +if answer.lower() == 's': + for j in range(0, rows_numb): + for i in range(0, columns_numb): + matrix[j].append(random.randint(1,20)) + else: + matrix[j].append(0) +else: + for j in range(0, rows_numb): + for i in range(0, columns_numb): + matrix[j].append(int(answer)) + answer = input("Введите следующее число: ") + else: + matrix[j].append(0) + +for j in range(0, rows_numb): + for i in range(0, columns_numb): + matrix[j][columns_numb] += matrix[j][i] + +print("\nВывод матрицы 5х4, последний 6й элемент каждой строки") +print(" - сумма всех элеменов данной строки матрицы:\n") +for j in range(0, rows_numb): + for i in range(0, columns_numb): + print(' |{: >3d} '.format(matrix[j][i]), end = '') + print (' | {: >3d} |'.format(matrix[j][columns_numb]), end = '') + print ('') + diff --git a/Algorithmf&Data_Structures_3/task_9.py b/Algorithmf&Data_Structures_3/task_9.py new file mode 100644 index 0000000..86b7c85 --- /dev/null +++ b/Algorithmf&Data_Structures_3/task_9.py @@ -0,0 +1,38 @@ +#9. Найти максимальный элемент среди минимальных элементов столбцов матрицы. + +import random + +matrix = [] +columns_numb = 6 +rows_numb = 5 +for i in range(0, rows_numb + 1): + matrix.append([]) +#print(matrix) +for j in range(0, rows_numb): + for i in range(0, columns_numb): + matrix[j].append(random.randint(1, 20)) + else: + matrix[j].append(' ') # Этот последняя строка будет использована для хранения минимальных значений столбцов +for i in range(0, columns_numb + 1): + matrix[rows_numb].append(0) + +for i in range(0, columns_numb): + matrix[rows_numb][i] = matrix[0][i] + for j in range(1, rows_numb): + if matrix[j][i] < matrix[rows_numb][i]: + matrix[rows_numb][i] = matrix[j][i] +matrix[rows_numb][columns_numb] = matrix[rows_numb][0] +for i in range(0, columns_numb): + if matrix[rows_numb][i] > matrix[rows_numb][columns_numb]: + matrix[rows_numb][columns_numb] = matrix[rows_numb][i] + +print("\nПострочный вывод матрицы, последняя строка содержит минимальные значения соответствующих колонок") +print("Элемент в последней колонке последней строки, максимальное значение из этих минимумов") +for j in range(0, rows_numb): + for i in range(0, columns_numb): + print(' |{: >3d} '.format(matrix[j][i]), end='') + print(' | {: >3s} |'.format(matrix[j][columns_numb]), end='') + print('') +for i in range(0, columns_numb + 1): + print(' |{: >3d} '.format(matrix[rows_numb][i]), end='') +print(' |\n') diff --git a/Algorithmf&Data_Structures_4/task_1.py b/Algorithmf&Data_Structures_4/task_1.py new file mode 100644 index 0000000..1bb4ca7 --- /dev/null +++ b/Algorithmf&Data_Structures_4/task_1.py @@ -0,0 +1,133 @@ +#1. Проанализировать скорость и сложность одного - трёх любых алгоритмов, +# разработанных в рамках домашнего задания первых трех уроков. +# Данная программа была составлена специально для донного задания +# +import sys + +def fact_recurs(N): + if N == 1: + return 1 + return fact_recurs(N-1)*N + +def fact_memo(N): + memo_facts = [1,2,6,24,120,720,0,0,0,0,0,0,0,0,0,0,0,0,] + [0]*500 + if memo_facts[N] == 0: + memo_facts[N] = fact_memo(N-1)*N + return memo_facts[N] + +def fact_loop(N): + f = 1 + for i in range(1, N+1): + f *=i + return f + +do = { + "r": fact_recurs, + "m": fact_memo, + "l": fact_loop, +} + +try: + N_factor = int(sys.argv[2]) +except IndexError: + file_dir_name = None + +try: + key = sys.argv[1] +except IndexError: + key = None + + +if key: + if do.get(key): + print(do[key](N_factor)) + +#============================================================================================================ +# вычисление 500! рекурсивной функцией +#C:\Users\Serg_\PycharmProjects\Algorithms&Data_Structures\Lesson_4>python -m cProfile -s time task_1.py r 500 +#122013682599111006870123878542304692625357434280319284219241358838584537315388199760549644750220328186301361647714820358416337872207817720 +#048078520515932928547790757193933060377296085908627042917454788242491272634430567017327076946106280231045264421887878946575477714986349436 +#778103764427403382736539747138647787849543848959553753799042324106127132698432774571554630997720278101456108118837370953101635632443298702 +#956389662891165897476957208792692887128178007026517450776841071962439039432253642260523494585012991857150124870696156814162535905669342381 +#300885624924689156412677565448188650659384795177536089400574523894033579847636394490531306232374906644504882466507594673586207463792518420 +#045936969298102226397195259719094521782333175693458150855233282076282002340262690789834245171200620771464097945611612762914595123722991334 +#016955236385094288559201872743379517301458635757082835578015873543276888868012039988238470215146760544540766353598417443048012893831389688 +#163948746965881750450692636533817505547812864000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +#0000000000000000000000000000000 +# 509 function calls (10 primitive calls) in 0.001 seconds +# +# Ordered by: internal time +# +# ncalls tottime percall cumtime percall filename:lineno(function) +# 500/1 0.001 0.000 0.001 0.001 task_1.py:3(fact_recurs) +# 1 0.000 0.000 0.000 0.000 {built-in method print} +# 2 0.000 0.000 0.000 0.000 {built-in method charmap_encode} +# 1 0.000 0.000 0.001 0.001 task_1.py:1() +# 2 0.000 0.000 0.000 0.000 cp866.py:18(encode) +# 1 0.000 0.000 0.001 0.001 {built-in method exec} +# 1 0.000 0.000 0.000 0.000 {method 'get' of 'dict' objects} +# 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} +# +#============================================================================================================ +# вычисление 500! рекурсивной функцией с меморизацией +#C:\Users\Serg_\PycharmProjects\Algorithms&Data_Structures\Lesson_4>python -m cProfile -s time task_1.py r 500 +#122013682599111006870123878542304692625357434280319284219241358838584537315388199760549644750220328186301361647714820358416337872207817720 +#048078520515932928547790757193933060377296085908627042917454788242491272634430567017327076946106280231045264421887878946575477714986349436 +#778103764427403382736539747138647787849543848959553753799042324106127132698432774571554630997720278101456108118837370953101635632443298702 +#956389662891165897476957208792692887128178007026517450776841071962439039432253642260523494585012991857150124870696156814162535905669342381 +#300885624924689156412677565448188650659384795177536089400574523894033579847636394490531306232374906644504882466507594673586207463792518420 +#045936969298102226397195259719094521782333175693458150855233282076282002340262690789834245171200620771464097945611612762914595123722991334 +#016955236385094288559201872743379517301458635757082835578015873543276888868012039988238470215146760544540766353598417443048012893831389688 +#163948746965881750450692636533817505547812864000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +#0000000000000000000000000000000 +# 509 function calls (10 primitive calls) in 0.001 seconds +# +# Ordered by: internal time +# +# ncalls tottime percall cumtime percall filename:lineno(function) +# 500/1 0.001 0.000 0.001 0.001 task_1.py:3(fact_recurs) +# 1 0.000 0.000 0.000 0.000 {built-in method print} +# 2 0.000 0.000 0.000 0.000 {built-in method charmap_encode} +# 1 0.000 0.000 0.001 0.001 task_1.py:1() +# 2 0.000 0.000 0.000 0.000 cp866.py:18(encode) +# 1 0.000 0.000 0.001 0.001 {built-in method exec} +# 1 0.000 0.000 0.000 0.000 {method 'get' of 'dict' objects} +# 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} +# +#============================================================================================================ +# вычисление 20! рекурсивной функцией с циклом +#C:\Users\Serg_\PycharmProjects\Algorithms&Data_Structures\Lesson_4>python -m cProfile -s time task_1.py l 20 +#2432902008176640000 +# 10 function calls in 0.000 seconds +# +# Ordered by: internal time +# +# ncalls tottime percall cumtime percall filename:lineno(function) +# 1 0.000 0.000 0.000 0.000 {built-in method print} +# 1 0.000 0.000 0.000 0.000 task_1.py:1() +# 1 0.000 0.000 0.000 0.000 task_1.py:14(fact_loop) +# 2 0.000 0.000 0.000 0.000 {built-in method charmap_encode} +# 2 0.000 0.000 0.000 0.000 cp866.py:18(encode) +# 1 0.000 0.000 0.000 0.000 {built-in method exec} +# 1 0.000 0.000 0.000 0.000 {method 'get' of 'dict' objects} +# 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} +# +#============================================================================================================ +# вычисление 500! рекурсивной функцией с циклом выполнить не удалось из-за постоянно возникавшей ошибки: +#C:\Users\Serg_\PycharmProjects\Algorithms&Data_Structures\Lesson_4>python -m cProfile -s time task_1.py l 500 +#Traceback (most recent call last): +# File "C:\Temp\Portable Python 3.2.5.1\App\lib\runpy.py", line 161, in _run_module_as_main +# "__main__", fname, loader, pkg_name) +# File "C:\Temp\Portable Python 3.2.5.1\App\lib\runpy.py", line 74, in _run_code +# exec(code, run_globals) +# File "C:\Temp\Portable Python 3.2.5.1\App\lib\cProfile.py", line 195, in +# main() +# File "C:\Temp\Portable Python 3.2.5.1\App\lib\cProfile.py", line 181, in main +# code = compile(fp.read(), progname, 'exec') +# File "task_1.py", line 113 +#SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 3-4: truncated \UXXXXXXXX escape +#============================================================================================================ +# +#Оценить сложность по результатам выполненых измеренрий не представляется возможным, +# слищком грубым оказался инструмент... +# diff --git a/Algorithmf&Data_Structures_4/task_2.py b/Algorithmf&Data_Structures_4/task_2.py new file mode 100644 index 0000000..c551358 --- /dev/null +++ b/Algorithmf&Data_Structures_4/task_2.py @@ -0,0 +1,60 @@ +#2. Написать два алгоритма нахождения i-го по счёту простого числа. +# Первый - использовать алгоритм решето Эратосфена. Второй - без использования "решета". +# Проанализировать скорость и сложность алгоритмов. +# Примечание: Результаты анализа сохранить в виде комментариев в файле с кодом. + +def erathosthen(up_to): + primes = [i for i in range(2, up_to + 1)] + + for curr_prim in primes: + if curr_prim != 0: + for j in range(curr_prim + curr_prim, up_to + 1, curr_prim): + primes[j - 2] = 0 + return primes + + +nth_prime = 5 +primes = erathosthen(100) +#print(primes) +primes_counter = 0 +#print([i for i in primes if i != 0]) +for i in range(len(primes)): + if primes[i]: + primes_counter += 1 + if primes_counter == nth_prime: + break +#print('{: >2d}е простое число = {: >2d}'.format(nth_prime, primes[i])) + +#Все оценки проводились при отключенном выводе на экран!! +#C:\Users\Serg_\PycharmProjects\Algorithms&Data_Structures\Lesson_4>python -m cProfile -s time task_2.py 25 +# 6 function calls in 0.000 seconds +# +# Ordered by: internal time +# +# ncalls tottime percall cumtime percall filename:lineno(function) +# 1 0.000 0.000 0.000 0.000 task_2.py:6(erathosthen) +# 1 0.000 0.000 0.000 0.000 task_2.py:6() +# 1 0.000 0.000 0.000 0.000 {built-in method exec} +# 1 0.000 0.000 0.000 0.000 task_2.py:8() +# 1 0.000 0.000 0.000 0.000 {built-in method len} +# 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} +# + +# Не представляю, что можно здесь проанализирова!? Видимо слишком простая функция. Даже увеличение +#Даже увеличение параметра у функции erathosthen( до 1000 не влияет на результат!Разве что до 10000 +# +#C:\Users\Serg_\PycharmProjects\Algorithms&Data_Structures\Lesson_4>python -m cProfile -s time task_2.py 10000 +# 6 function calls in 0.003 seconds +# +# Ordered by: internal time +# +# ncalls tottime percall cumtime percall filename:lineno(function) +# 1 0.003 0.003 0.003 0.003 task_2.py:6(erathosthen) +# 1 0.000 0.000 0.000 0.000 task_2.py:8() +# 1 0.000 0.000 0.003 0.003 task_2.py:6() +# 1 0.000 0.000 0.003 0.003 {built-in method exec} +# 1 0.000 0.000 0.000 0.000 {built-in method len} +# 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} +# +# Вообще же все это очень похоже на попытку померить толщину лески метровой линейкой... +# С другой стороны проход по массиву цикл в цикле должен бы дать сложность, теоретически порядка O(x**2) diff --git a/Algorithmf&Data_Structures_4/task_2b.py b/Algorithmf&Data_Structures_4/task_2b.py new file mode 100644 index 0000000..13ee5cc --- /dev/null +++ b/Algorithmf&Data_Structures_4/task_2b.py @@ -0,0 +1,89 @@ +#2. Написать два алгоритма нахождения i-го по счёту простого числа. +# Первый - использовать алгоритм решето Эратосфена. Второй - без использования "решета". +# Проанализировать скорость и сложность алгоритмов. +# Примечание: Результаты анализа сохранить в виде комментариев в файле с кодом. +# Данный файл содержит решене без решета Эратосфена. +# +def find_prime(up_to): + primes = [2, 3] + nth_prime = 5 + for i in range(2, up_to): + prime = True + for curr_prime in primes: + if i % curr_prime == 0: + prime = False + if prime: + primes.append(i) + if len(primes) >= nth_prime: + print('{: >2d}е простое число = {: >2d}'.format(nth_prime, primes[nth_prime - 1])) + else: + print('В диапазоне от 2 до {: >2d} найдено менее {: >2d}-ти простых чисел'.format(int(up_to), int(nth_prime))) + return primes + + +primes = find_prime(1000) +# +#============================================================================================================ +#поиск среди 100 натуральных чисел +# +#C:\Users\Serg_\PycharmProjects\Algorithms&Data_Structures\Lesson_4>python -m cProfile -s time task_2b.py +#5е простое число = 11 +# 34 function calls in 0.000 seconds +# +# Ordered by: internal time +# +# ncalls tottime percall cumtime percall filename:lineno(function) +# 1 0.000 0.000 0.000 0.000 task_2b.py:1(find_prime) +# 1 0.000 0.000 0.000 0.000 {built-in method print} +# 2 0.000 0.000 0.000 0.000 {built-in method charmap_encode} +# 1 0.000 0.000 0.000 0.000 {method 'format' of 'str' objects} +# 23 0.000 0.000 0.000 0.000 {method 'append' of 'list' objects} +# 2 0.000 0.000 0.000 0.000 cp866.py:18(encode) +# 1 0.000 0.000 0.000 0.000 task_2b.py:1() +# 1 0.000 0.000 0.000 0.000 {built-in method exec} +# 1 0.000 0.000 0.000 0.000 {built-in method len} +# 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} +# +#============================================================================================================ +#поиск среди 10000 натуральных чисел +# +#C:\Users\Serg_\PycharmProjects\Algorithms&Data_Structures\Lesson_4>python -m cProfile -s time task_2b.py +# 5е простое число = 11 +# 1238 function calls in 0.573 seconds +# +# Ordered by: internal time +# +# ncalls tottime percall cumtime percall filename:lineno(function) +# 1 0.573 0.573 0.573 0.573 task_2b.py:1(find_prime) +# 1 0.000 0.000 0.000 0.000 {built-in method print} +# 1227 0.000 0.000 0.000 0.000 {method 'append' of 'list' objects} +# 2 0.000 0.000 0.000 0.000 {built-in method charmap_encode} +# 1 0.000 0.000 0.000 0.000 {method 'format' of 'str' objects} +# 2 0.000 0.000 0.000 0.000 cp866.py:18(encode) +# 1 0.000 0.000 0.573 0.573 task_2b.py:1() +# 1 0.000 0.000 0.573 0.573 {built-in method exec} +# 1 0.000 0.000 0.000 0.000 {built-in method len} +# 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} +#============================================================================================================ +#поиск среди 100 натуральных чисел +# +#C:\Users\Serg_\PycharmProjects\Algorithms&Data_Structures\Lesson_4>python -m cProfile -s time task_2b.py +#5е простое число = 11 +# 177 function calls in 0.008 seconds +# +# Ordered by: internal time +# +# ncalls tottime percall cumtime percall filename:lineno(function) +# 1 0.008 0.008 0.008 0.008 task_2b.py:1(find_prime) +# 1 0.000 0.000 0.000 0.000 {built-in method print} +# 166 0.000 0.000 0.000 0.000 {method 'append' of 'list' objects} +# 2 0.000 0.000 0.000 0.000 {built-in method charmap_encode} +# 2 0.000 0.000 0.000 0.000 cp866.py:18(encode) +# 1 0.000 0.000 0.000 0.000 {method 'format' of 'str' objects} +# 1 0.000 0.000 0.008 0.008 task_2b.py:1() +# 1 0.000 0.000 0.008 0.008 {built-in method exec} +# 1 0.000 0.000 0.000 0.000 {built-in method len} +# 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} +#============================================================================================================ +# +# Можно предположить, что в данном случае имеется линейная зависимость т.е. O(n) \ No newline at end of file diff --git a/Algorithms&Data_Structures_5/task_1.py b/Algorithms&Data_Structures_5/task_1.py new file mode 100644 index 0000000..685f543 --- /dev/null +++ b/Algorithms&Data_Structures_5/task_1.py @@ -0,0 +1,34 @@ +#1. Пользователь вводит данные о количестве предприятий, их наименования +## и прибыль за 4 квартала для каждого предприятия. +# Программа должна определить среднюю прибыль (за год для всех предприятий) +# и вывести наименования предприятий, чья прибыль выше среднего +# и отдельно вывести наименования предприятий, чья прибыль ниже среднего. + +import collections + +fact_numb = int(input("Введите количество предприяний : ")) +fact_income = collections.defaultdict(int) +for i in range(fact_numb): + fact_name = input("введите название {: >2d}-го предприятия : ".format(i + 1)) + for j in range(1, 5): + profit = int(input("Введите его прибыль за {: >2d}-й квартал : ".format(j))) + fact_income[fact_name] += profit + print('I', fact_income[fact_name]) + fact_income[fact_name] /= 4 +all_fact_profit_sum = 0 +for key in fact_income.keys(): + all_fact_profit_sum += fact_income[key] +all_fact_average_profit = all_fact_profit_sum / fact_numb + +print("Средняя прибыль за год по всем предприятиям : ", all_fact_average_profit) + +print("Список предприятий с среднегодовой прибылью выше средней:") +for key in fact_income.keys(): + if fact_income[key] > all_fact_average_profit: + print(key, fact_income[key]) + +print("Список предприятий с среднегодовой прибылью ниже средней:") +for key in fact_income.keys(): + if fact_income[key] < all_fact_average_profit: + print(key, fact_income[key]) + diff --git a/Algorithms&Data_Structures_5/task_2.py b/Algorithms&Data_Structures_5/task_2.py new file mode 100644 index 0000000..c54c038 --- /dev/null +++ b/Algorithms&Data_Structures_5/task_2.py @@ -0,0 +1,126 @@ +#2. Написать программу сложения и умножения двух шестнадцатеричных чисел. +# При этом каждое число представляется как массив, элементы которого это цифры числа. +# +#Например, пользователь ввёл A2 и C4F. +#Сохранить их как [‘A’, ‘2’] и [‘C’, ‘4’, ‘F’] соответственно. +#Сумма чисел из примера: [‘C’, ‘F’, ‘1’]. +#Произведение - [‘7’, ‘C’, ‘9’, ‘F’, ‘E’]. + +DEBUGGING_RUN = False +import collections +import copy + +hex_values = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, + '9': 9, 'a': 10, 'b': 11, 'c': 12, 'd': 13, 'e': 14, 'f': 15, } + + +def value_to_hex(value): + keys = hex_values.keys() + values = hex_values.values() + for key in keys: + if hex_values[key] == value: + break + return key + +#================================================================================================================== +if not DEBUGGING_RUN: + print("Введите 1-е шестнадцатеричное число", end=' ') + hex_1_input = input("в виде строки символов[0-9]|[a-f], например: ab12345: ") + print("Введите 1-е шестнадцатеричное число", end=' ') + hex_2_input = input("в виде строки символов[0-9]|[a-f], например: ab12345: ") + operation = input("Введите символ операции +|* : ") +else: + operation = '+' + + hex_1_input = 'c4f' + hex_2_input = 'a2' + +#================================================================================================================== + +hex_1 = collections.deque(list((hex_1_input).lower())) +hex_2 = collections.deque(list((hex_2_input).lower())) + +#================================================================================================================== +def mult_hex(hex_1, hex_2): + hex_1c = copy.copy(hex_1) + hex_tmpresult = collections.deque([]) + hex_result = collections.deque([]) + hex_l_len = len(hex_1) + hex_2_len = len(hex_2) + for i in range(hex_l_len):# подготовка массивов для хранения промежуточных произведний + hex_tmpresult.append(collections.deque([])) + hex_result.append('0') + + for i in range(hex_l_len): + hex_dig_1 = hex_1c.pop() + carry = 0 + hex_2c = copy.copy(hex_2) + + for j in range(hex_2_len): + hex_dig_2 = hex_2c.pop() + res_dig = hex_values[hex_dig_1] * hex_values[hex_dig_2] + carry + if int(res_dig / 16) >= 1: + carry = int(res_dig / 16) + res_dig = res_dig % 16 + else: + carry = 0 + hex_tmpresult[i].appendleft(value_to_hex(res_dig)) + if carry != 0: + hex_tmpresult[i].appendleft(value_to_hex(carry)) + if i > 0: # компенсация того факта, что частичные умножения выполнялись без учета разряда множителей + for k in range(i): + hex_tmpresult[i].append('0') + for i in range(hex_l_len): + hex_result = sum_hex(hex_result, hex_tmpresult[i]) + #удалить незначащуе нули из старших разрядов + while hex_result[0] == '0': + hex_result.popleft() + return hex_result + + +#================================================================================================================== + +def sum_hex(hex_1, hex_2): + hex_1c = copy.copy(hex_1) + hex_2c = copy.copy(hex_2) + + #выравниваем числа по младшему (правому) разряду + if len(hex_1c) > len(hex_2c): + len_diff = len(hex_1c) - len(hex_2c) + for i in range(len_diff): + hex_2c.appendleft('0') + else: + len_diff = len(hex_2c) - len(hex_1c) + for i in range(len_diff): + hex_1c.appendleft('0') + #доплнительные нули для обработки переноса за старший разряд + hex_1c.appendleft('0') + hex_2c.appendleft('0') + + hex_result = collections.deque([]) + hex_len = len(hex_1c) + carry = 0 + for i in range(hex_len): + hex_dig_1 = hex_1c.pop() + hex_dig_2 = hex_2c.pop() + res_dig = hex_values[hex_dig_1] + hex_values[hex_dig_2] + carry + if res_dig >= 16: + res_dig -= 16 + carry = 1 + else: + carry = 0 + hex_result.appendleft(value_to_hex(res_dig)) + return hex_result + + +do = { + "+": sum_hex, + "*": mult_hex, +} + +result = do[operation](hex_1, hex_2) +print("Врезультате выполнения операции:") +print('\n', ''.join(list(hex_1)), operation, ''.join(list(hex_2)), ' = ', ''.join(list(result))) + + + diff --git a/Algorithms&Data_Structures_6/task_1.py b/Algorithms&Data_Structures_6/task_1.py new file mode 100644 index 0000000..fb42107 --- /dev/null +++ b/Algorithms&Data_Structures_6/task_1.py @@ -0,0 +1,78 @@ +#1. Подсчитать, сколько было выделено памяти под переменные в программах, разработанных +#на первых трех уроках. + +#8.ДЗ_3. Матрица 5x4 заполняется вводом с клавиатуры, кроме последних элементов строк. +# Программа должна вычислять сумму введенных элементов каждой строки и записывать ее +# в ее последнюю ячейку. В конце следует вывести полученную матрицу. + +import random +import sys +user_interaction = True +if not user_interaction: + print("\nВведите матрицу 5х4 из целых чисел, т.е. 4 раза по 5 чисел. ") + print("В конце ввода каждой строки из 5 чисел будет автоматически добавляться '0'. Не обращайте внмания!") + print("Если вообще не хотите вводить числа, введите 'S' вместо первого числа") + print("тогда матрица будет создана автоматически. И так начинаем:") + answer = input("Введите первое число или 'S': ") +else: + answer = 's' + +matrix = [[], [], [], []] +columns_numb = 5 +rows_numb = 4 +if answer.lower() == 's': + for j in range(0, rows_numb): + for i in range(0, columns_numb): + matrix[j].append(random.randint(1,20)) + else: + matrix[j].append(0) +else: + for j in range(0, rows_numb): + for i in range(0, columns_numb): + matrix[j].append(int(answer)) + answer = input("Введите следующее число: ") + else: + matrix[j].append(0) + +for j in range(0, rows_numb): + for i in range(0, columns_numb): + matrix[j][columns_numb] += matrix[j][i] +if not user_interaction: + print("\nВывод матрицы 5х4, последний 6й элемент каждой строки") + print(" - сумма всех элеменов данной строки матрицы:\n") + for j in range(0, rows_numb): + for i in range(0, columns_numb): + print(' |{: >3d} '.format(matrix[j][i]), end = '') + print (' | {: >3d} |'.format(matrix[j][columns_numb]), end = '') + print ('') +#======================================================================= + +if __name__ == "__main__": + def show_size(x, level=0): + print('\t'*level, 'type = {:s}'.format(x.__class__), 'size = {:d}'.format(sys.getsizeof(x)), 'object = ', x) + if hasattr(x, '__iter__'): + if hasattr(x, 'items'): + for y in x.items(): + show_size(y, level+1) + + elif not isinstance(x, str): + for y in x: + show_size(y, level+1) + + + print(show_size([[], [], []])) #первоначальный размер матрицы + print(show_size(matrix)) #окончательный размер матрицы + #сумма строк взаимодействия с пользователем + print (show_size("\n\nВведите матрицу 5х4 из целых чисел, т.е. 4 раза по 5 чисел. " \ + "В конце ввода каждой строки из 5 чисел будет автоматически добавляться '0'. " \ + "Не обращайте внмания! Если вообще не хотите вводить числа, введите 'S' " \ + "вместо первого числа тогда матрица будет создана автоматически. И так начинаем: " \ + "Введите первое число или 'S': Вывод матрицы 5х4, последний 6й элемент " \ + "каждой строки - сумма всех элеменов данной строки матрицы:\n")) +#============================================================================== +#Изначально под матрицу 5х4 резурвируется 48 байт +#после добавления в эту матрицу 20 элементов ее размер увеличивается до 52 байт +#очень большой объем занимают строки взаимодействия с пользователем около 870 байт +#можно предположить, что на этом фоне память, занимаемая переменными программы, +#врядли окажется сколь-нибудь существенной +#и того в конечном итоге программа расходовала около 1000 байт памяти \ No newline at end of file diff --git a/Algorithms&Data_Structures_7/task_1.py b/Algorithms&Data_Structures_7/task_1.py new file mode 100644 index 0000000..ba8d1d7 --- /dev/null +++ b/Algorithms&Data_Structures_7/task_1.py @@ -0,0 +1,35 @@ +# 1. Отсортировать по убыванию методом «пузырька» одномерный целочисленный массив, +# заданный случайными числами на промежутке [-100; 100). +# Вывести на экран исходный и отсортированный массивы. + +import random + +array_SIZE = 10 +#============================================================================== + +def buble_sort(array): + n = 1 + last_i = 1 + while n < len(array): + no_swaps = True + for i in range(len(array) - n): + if array[i] < array[i + 1]: + array[i], array[i + 1] = array[i + 1], array[i] + no_swaps = False + if no_swaps: + break # обменов не было массив отсортирован, продолжать нет смысла + n += 1 + +#============================================================================== + +if __name__ == "__main__": + array = [] + for i in range(array_SIZE): + array.append(random.randint(-100, 99)) + print("Исходный массив: ", end=' ') + print(array) + buble_sort(array) + print("Ссортированный массив:", end=' ') + print(array) + + diff --git a/Algorithms&Data_Structures_7/task_2.py b/Algorithms&Data_Structures_7/task_2.py new file mode 100644 index 0000000..172c855 --- /dev/null +++ b/Algorithms&Data_Structures_7/task_2.py @@ -0,0 +1,53 @@ +# 2. Отсортируйте по возрастанию методом слияния одномерный вещественный массив, +# заданный случайными числами на промежутке [0; 50). +# Выведите на экран исходный и отсортированный массивы. + + +import random + +array_SIZE = 10 + +# это не мой код, он взят с указанного далее сайта, сам я ничего прдумать не +# смог. Долго пытался понять, как он работает и почему не работает у меня. +# Причина неработоспособности было элементарна, но гоаорить о ней не хочется, +# Зато в коде разобрался. Было еще много других, но этот мне понравился больше +#===========http://www.cyberforum.ru/python/thread395180.html===================== +#================================================================================= + +def merge(left, right): + lst = [] + while left and right: + if left[0] < right[0]: + # в данном случае сортировка по возрастанию, для сортировки по убыванию + # нужно поменять знак равенства на обратный + lst.append(left.pop(0)) + else: + lst.append(right.pop(0)) + if left: + lst.extend(left) + if right: + lst.extend(right) + return lst + +#============================================================================== + +def merge_sort(lst): + length = len(lst) + if length >= 2: + mid = int(length / 2) + lst = merge(merge_sort(lst[:mid]), merge_sort(lst[mid:])) + return lst + +#============================================================================== + +if __name__ == "__main__": + array = [] + for i in range(array_SIZE): + array.append(random.uniform(0, 50 - 1e-100)) + print("Исходный массив: ", end=' ') + for number in array: + print('{: >7.4f}'.format(number), end=' ') + array = merge_sort(array) + print("\nОтсортированный массив:", end=' ') + for number in array: + print('{: >7.4f}'.format(number), end=' ') diff --git a/Algorithms&Data_Structures_7/task_3.py b/Algorithms&Data_Structures_7/task_3.py new file mode 100644 index 0000000..fc779e1 --- /dev/null +++ b/Algorithms&Data_Structures_7/task_3.py @@ -0,0 +1,31 @@ +# 3. Массив размером 2m + 1, где m – натуральное число, заполнен случайным образом. +# Найти в массиве медиану – элемент ряда, делящий его на две равные части: +# в одной находятся элементы, которые не меньше медианы, в другой – не больше медианы. +# Примечание: Задачу можно решить без сортировки исходного массива. +# Но если это слишком сложно, то используйте метод сортировки, который не рассматривался на уроках. + +import random +from task_1 import buble_sort + +m = 10 +array_SIZE = 2 * m + 1 +#================================================================================================== + + + + +if __name__ == "__main__": + array = [] + for i in range(array_SIZE): + array.append(random.randint(-100, 99)) + print("Исходный массив: ", end=' ') + print(array) + buble_sort(array) + # Применение здесь сортировки "пузырьком" - это не невнимательность. + # Я потратил много времени нак сортировку слиянием и на что-то еще меня уже не оставалось + print("Сортированный массив:", end=' ') + print(array) + mediana_indx = int((array_SIZE - -1) / 2) + print("Медиана: индекс= ", mediana_indx, "ее значение= ", array[mediana_indx]) + + diff --git a/Lesson4/SRHw04_easy.py b/Lesson4/SRHw04_easy.py new file mode 100644 index 0000000..80d81b9 --- /dev/null +++ b/Lesson4/SRHw04_easy.py @@ -0,0 +1,39 @@ +# ! + +# -1: +# , . +# , +# +# [1, 2, 4, 0] --> [1, 4, 16, 0] + +#============================================== + +L = [2, 10, -12, 2.5, 20, -11, 4, 4, 0] +lres = [x**2 for x in L] + +#============================================== + +# -2: +# . +# , . + +#============================================== +L1 = ["", "", "", "", "", "", "", "", "", "", ""] +L2 = ["", "", "", "", "", "", "", "", "", "", ""] +lres = [ x for x in L1 for y in L2 if x == y] + +#============================================== + +# -3: +# , . +# , : +# + 3 +# + +# + 4 + +#============================================== + +L = [2, 10, -12, 2.5, 20, 45, -11,39, 4, 4, 0, 12, 24, 9] +lres = [ x for x in L if (x>0) and not(x%3) and (x%4)] + +#============================================== diff --git a/Lesson4/SRHw04_hard.py b/Lesson4/SRHw04_hard.py new file mode 100644 index 0000000..7cddf59 --- /dev/null +++ b/Lesson4/SRHw04_hard.py @@ -0,0 +1,123 @@ +# Задание-1: +# Матрицы в питоне реализуются в виде вложенных списков: +# Пример. Дано: +matrix = [[1, 0, 8], + [3, 4, 1], + [0, 4, 2]] + +# Выполнить поворот (транспонирование) матрицы +# Пример. Результат: +# matrix_rotate = [[1, 3, 0], +# [0, 4, 4], +# [8, 1, 2]] + +# Суть сложности hard: Решите задачу в одну строку + +#==================================================================== + +res = list(zip(*matrix)) +#print( res ) +#res: [(1, 3, 0), (0, 4, 4), (8, 1, 2)] + +#==================================================================== + +# Задание-2: +# Найдите наибольшее произведение пяти последовательных цифр в 1000-значном числе. +# Выведите произведение и индекс смещения первого числа последовательных 5-ти цифр. +# Пример 1000-значного числа: +number = """ +73167176531330624919225119674426574742355349194934 +96983520312774506326239578318016984801869478851843 +85861560789112949495459501737958331952853208805511 +12540698747158523863050715693290963295227443043557 +66896648950445244523161731856403098711121722383113 +62229893423380308135336276614282806444486645238749 +30358907296290491560440772390713810515859307960866 +70172427121883998797908792274921901699720888093776 +65727333001053367881220235421809751254540594752243 +52584907711670556013604839586446706324415722155397 +53697817977846174064955149290862569321978468622482 +83972241375657056057490261407972968652414535100474 +82166370484403199890008895243450658541227588666881 +16427171479924442928230863465674813919123162824586 +17866458359124566529476545682848912883142607690042 +24219022671055626321111109370544217506941658960408 +07198403850962455444362981230987879927244284909188 +84580156166097919133875499200524063689912560717606 +05886116467109405077541002256983155200055935729725 +71636269561882670428252483600823257530420752963450""" + +#============================================================= +""" +number = "73167176531330624919225119674426574742355349194934"\ +"96983520312345607326239578318016984801869478851843"\ +"85861560789112949495459501737958331952853208805511"\ +"12540698747158523863050715693290963295227443043557"\ +"66896648950445244523161731856403098711121722383113"\ +"62229893423380308135336276614282806444486645238749"\ +"30358907296290491560440772390713810515859307960866"\ +"70172427121883998797908792274921901699720888093776"\ +"65727333001053367881220235421809751254540594752243"\ +"52584907711670556013604839586446706324415722155397"\ +"53697817977846174064955149290862569321978468622482"\ +"83972241375657056057490261407972968652414535100474"\ +"82166370484403199890008895243450658541227588666881"\ +"16427171479924442928230863465674813919123162824586"\ +"17866458359124566529476545682848912883142607690042"\ +"24219022671055626321111109370544217506941658960408"\ +"07198403850962455444362981230987879927244284909188"\ +"84580156166097919133875499200524063689912560717606"\ +"05886116467109405077541002256983155200055935729725"\ +"71636269561882670428252483600823257530420752963450" +""" +import re + +for i in range(1,6): + pattrn_str = str(i) + str(i+1) + str(i+2) + str(i+3) + str(i+4) + #print (pattrn_str) + result = pattern.search(number) + print (type(result)) + result_str = result.group() + start_at = result.start() + print(result_str, start_at, "print-0") + multipl = 1 + for j in range(0, len(result_str)): + print (i, multipl, int(result_str[j]), "print-1") + multipl = multipl * int(result_str[j]) + print (result_str, start_at, "print-2") +""" +#в исходном числе данный скрипт ничего не находит +#после добавлении во 2-й строке с 10й позиции числа '1234560' +#находит 2 паттерна и вычисляет их произведения, однако найти максимальное не получается +#как только очередной поиск оканчивается неудачей внешний цикл заканчивается с ошибкой: +#""ttributeError: 'NoneType' object has no attribute 'group'"" Попытки "нейтрализовать ее с помощью +проверок if (result != None) или if (type(result) == '_sre.SRE_Match') к успеху не привели... +#============================================================= + +# Задание-3 (Ферзи): +# Известно, что на доске 8×8 можно расставить 8 ферзей так, чтобы они не били +# друг друга. Вам дана расстановка 8 ферзей на доске. +# Определите, есть ли среди них пара бьющих друг друга. +# Программа получает на вход восемь пар чисел, +# каждое число от 1 до 8 — координаты 8 ферзей. +# Если ферзи не бьют друг друга, выведите слово NO, иначе выведите YES. + +#============================================================= + +queens_set1 = [(1,2), (2,4), (3,6), (4,8),(5,3), (6,1), (7,7), (8,5),] # good set +#queens_set1 = [(1,2), (2,4), (3,3), (4,8),(5,3), (6,1), (7,7), (8,5),] # bad set +#queens_set2 = [(1,3), (2,8), (3,4), (4,7),(5,1), (6,6), (7,2), (8,5),] #good set +result = "NO" # ферзи на доске не бьют друг друга +for i in range(len(queens_set1)): + curr_queen = queens_set1[i] + #print (curr_queen) + for j in range(i+1, len(queens_set1)): + curr_queen + tested_queen = queens_set1[j] + if curr_queen[0] == tested_queen[0] or curr_queen[1] == tested_queen[1]: + result = "YES" #эти ферзи находятся на одной горизонтале или вертикале + elif abs(curr_queen[0]-tested_queen[0]) == abs(curr_queen[1]-tested_queen[1]): + result = "YES" #эти ферзи находятся на одной диагонали +print (result) + +#============================================================= diff --git a/Lesson4/SRHw04_normal.py b/Lesson4/SRHw04_normal.py new file mode 100644 index 0000000..194b600 --- /dev/null +++ b/Lesson4/SRHw04_normal.py @@ -0,0 +1,88 @@ + +# -1: +# , +# 1 . +# .. "mtMmEZUOmcq" ['mt', 'm', 'mcq'] +# : re . + +line = 'mtMmEZUOmcqWiryMQhhTxqKdSTKCYEJlEZCsGAMkgAYEOmHBSQsSUHKvSfbmxULaysmNO'\ + 'GIPHpEMujalpPLNzRWXfwHQqwksrFeipEUlTLeclMwAoktKlfUBJHPsnawvjPhfgewVzK'\ + 'TUfSYtBydXaVIpxWjNKgXANvIoumesCSSvjEGRJosUfuhRRDUuTQwLlJJJDdkVjfSAHqn'\ + 'LxooisBDWuxIhyjJaXDYwdoVPnsllMngNlmkpYOlqXEFIxPqqqgAWdJsOvqppOfyIVjXa'\ + 'pzGOrfinzzsNMtBIOclwbfRzytmDgEFUzxvZGkdOaQYLVBfsGSAfJMchgBWAsGnBnWete'\ + 'kUTVuPluKRMQsdelzBgLzuwiimqkFKpyQRzOUyHkXRkdyIEBvTjdByCfkVIAQaAbfCvzQ'\ + 'WrMMsYpLtdqRltXPqcSMXJIvlBzKoQnSwPFkapxGqnZCVFfKRLUIGBLOwhchWCdJbRuXb'\ + 'JrwTRNyAxDctszKjSnndaFkcBZmJZWjUeYMdevHhBJMBSShDqbjAuDGTTrSXZywYkmjCC'\ + 'EUZShGofaFpuespaZWLFNIsOqsIRLexWqTXsOaScgnsUKsJxiihwsCdBViEQBHQaOnLfB'\ + 'tQQShTYHFqrvpVFiiEFMcIFTrTkIBpGUflwTvAzMUtmSQQZGHlmQKJndiAXbIzVkGSeuT'\ + 'SkyjIGsiWLALHUCsnQtiOtrbQOQunurZgHFiZjWtZCEXZCnZjLeMiFlxnPkqfJFbCfKCu'\ + 'UJmGYJZPpRBFNLkqigxFkrRAppYRXeSCBxbGvqHmlsSZMWSVQyzenWoGxyGPvbnhWHuXB'\ + 'qHFjvihuNGEEFsfnMXTfptvIOlhKhyYwxLnqOsBdGvnuyEZIheApQGOXWeXoLWiDQNJFa'\ + 'XiUWgsKQrDOeZoNlZNRvHnLgCmysUeKnVJXPFIzvdDyleXylnKBfLCjLHntltignbQoiQ'\ + 'zTYwZAiRwycdlHfyHNGmkNqSwXUrxGc' + +#=============================================================================== +import re +pattern = re.compile(r'[a-z]{2}([A-Z])[A-Z]{2}') +result = pattern.findall(line) +print (result) +""" +[line[i] for i in range(1,(len(line)-1)) if (65< ord(line[i] and ord(line[i])< 90) and +(97< ord(line[i-2]) and ord(line[i-2])< 122) and +(97< ord(line[i-1]) and ord(line[i-1])< 122) and +(65< ord(line[i+1]) and ord([line[i+1])< 90) and +#PyCharm ord([line[i+1])< 90) '] :"expected ','' or ']' +(65< ord(line[i+2]) and ord(line[i+2])< 90)] +# : ord(line[i+2])< 90) ']' ord(line[i+2])< 90) ")": "expected ')' or ']', "..." +""" + +#=============================================================================== + +# -2: +# , +# , - . +# .. +# "GAMkgAYEOmHBSQsSUHKvSfbmxULaysmNOGIPHpEMujalpPLNzRWXfwHQqwksrFeipEUlTLec" +# : ['AY', 'NOGI', 'P'] +# : re . + +line_2 = 'mtMmEZUOmcqWiryMQhhTxqKdSTKCYEJlEZCsGAMkgAYEOmHBSQsSUHKvSfbmxULaysm'\ + 'NOGIPHpEMujalpPLNzRWXfwHQqwksrFeipEUlTLeclMwAoktKlfUBJHPsnawvjPhfgewV'\ + 'fzKTUfSYtBydXaVIpxWjNKgXANvIoumesCSSvjEGRJosUfuhRRDUuTQwLlJJJDdkVjfSA'\ + 'HqnLxooisBDWuxIhyjJaXDYwdoVPnsllMngNlmkpYOlqXEFIxPqqqgAWdJsOvqppOfyIV'\ + 'jXapzGOrfinzzsNMtBIOclwbfRzytmDgEFUzxvZGkdOaQYLVBfsGSAfJMchgBWAsGnBnW'\ + 'etekUTVuPluKRMQsdelzBgLzuwiimqkFKpyQRzOUyHkXRkdyIEBvTjdByCfkVIAQaAbfC'\ + 'vzQWrMMsYpLtdqRltXPqcSMXJIvlBzKoQnSwPFkapxGqnZCVFfKRLUIGBLOwhchWCdJbR'\ + 'uXbJrwTRNyAxDctszKjSnndaFkcBZmJZWjUeYMdevHhBJMBSShDqbjAuDGTTrSXZywYkm'\ + 'jCCEUZShGofaFpuespaZWLFNIsOqsIRLexWqTXsOaScgnsUKsJxiihwsCdBViEQBHQaOn'\ + 'LfBtQQShTYHFqrvpVFiiEFMcIFTrTkIBpGUflwTvAzMUtmSQQZGHlmQKJndiAXbIzVkGS'\ + 'euTSkyjIGsiWLALHUCsnQtiOtrbQOQunurZgHFiZjWtZCEXZCnZjLeMiFlxnPkqfJFbCf'\ + 'KCuUJmGYJZPpRBFNLkqigxFkrRAppYRXeSCBxbGvqHmlsSZMWSVQyzenWoGxyGPvbnhWH'\ + 'uXBqHFjvihuNGEEFsfnMXTfptvIOlhKhyYwxLnqOsBdGvnuyEZIheApQGOXWeXoLWiDQN'\ + 'JFaXiUWgsKQrDOeZoNlZNRvHnLgCmysUeKnVJXPFIzvdDyleXylnKBfLCjLHntltignbQ'\ + 'oiQzTYwZAiRwycdlHfyHNGmkNqSwXUrxGC' +#=============================================================================== +iimport re +pattern = re.compile(r'[a-z]{2}([A-Z]*)[A-Z]{2}') +result = pattern.findall(line_2) +#print (result) +result2 = [x for x in result if x != ''] # : '*' +print(result2) +""" +[line_2[i] for i in range(2,(len(line_2)-2)) if (65< ord(line_2[i]) and ord(line_2[i])< 90) and +(97< ord(line_2[i-2]) and (ord(line_2[i-2])< 122) and +(97< ord(line_2[i-1]) and ord(line_2[i-1])< 122) and +(65< ord(line_2[i+1]) and ord([line_2[+1])< 90) and +(65< ord(line_2[i+2]) and ord(line_2[i+2])< 90)] +# , ???!!! :( +""" + + +#=============================================================================== + +# -3: +# , ( ) +# , +# 2500- . +# +# . \ No newline at end of file diff --git a/Lesson4/les4_normal-2.py b/Lesson4/les4_normal-2.py new file mode 100644 index 0000000..7dce0be --- /dev/null +++ b/Lesson4/les4_normal-2.py @@ -0,0 +1,40 @@ +# Задание-2: +# Вывести символы в верхнем регистре, слева от которых находятся +# два символа в нижнем регистре, а справа - два символа в верхнем регистре. +# Т.е. из строки +# "GAMkgAYEOmHBSQsSUHKvSfbmxULaysmNOGIPHpEMujalpPLNzRWXfwHQqwksrFeipEUlTLec" +# нужно получить список строк: ['AY', 'NOGI', 'P'] +# Решить задачу двумя способами: с помощью re и без. + + + +line_2 = 'mtMmEZUOmcqWiryMQhhTxqKdSTKCYEJlEZCsGAMkgAYEOmHBSQsSUHKvSfbmxULaysm'\ + 'NOGIPHpEMujalpPLNzRWXfwHQqwksrFeipEUlTLeclMwAoktKlfUBJHPsnawvjPhfgewV'\ + 'fzKTUfSYtBydXaVIpxWjNKgXANvIoumesCSSvjEGRJosUfuhRRDUuTQwLlJJJDdkVjfSA'\ + 'HqnLxooisBDWuxIhyjJaXDYwdoVPnsllMngNlmkpYOlqXEFIxPqqqgAWdJsOvqppOfyIV'\ + 'jXapzGOrfinzzsNMtBIOclwbfRzytmDgEFUzxvZGkdOaQYLVBfsGSAfJMchgBWAsGnBnW'\ + 'etekUTVuPluKRMQsdelzBgLzuwiimqkFKpyQRzOUyHkXRkdyIEBvTjdByCfkVIAQaAbfC'\ + 'vzQWrMMsYpLtdqRltXPqcSMXJIvlBzKoQnSwPFkapxGqnZCVFfKRLUIGBLOwhchWCdJbR'\ + 'uXbJrwTRNyAxDctszKjSnndaFkcBZmJZWjUeYMdevHhBJMBSShDqbjAuDGTTrSXZywYkm'\ + 'jCCEUZShGofaFpuespaZWLFNIsOqsIRLexWqTXsOaScgnsUKsJxiihwsCdBViEQBHQaOn'\ + 'LfBtQQShTYHFqrvpVFiiEFMcIFTrTkIBpGUflwTvAzMUtmSQQZGHlmQKJndiAXbIzVkGS'\ + 'euTSkyjIGsiWLALHUCsnQtiOtrbQOQunurZgHFiZjWtZCEXZCnZjLeMiFlxnPkqfJFbCf'\ + 'KCuUJmGYJZPpRBFNLkqigxFkrRAppYRXeSCBxbGvqHmlsSZMWSVQyzenWoGxyGPvbnhWH'\ + 'uXBqHFjvihuNGEEFsfnMXTfptvIOlhKhyYwxLnqOsBdGvnuyEZIheApQGOXWeXoLWiDQN'\ + 'JFaXiUWgsKQrDOeZoNlZNRvHnLgCmysUeKnVJXPFIzvdDyleXylnKBfLCjLHntltignbQ'\ + 'oiQzTYwZAiRwycdlHfyHNGmkNqSwXUrxGC' + +""" +import re +pattern = re.compile(r'[a-z]{2}([A-Z]*)[A-Z]{2}') +result = pattern.findall(line_2) +#print (result) +result2 = [x for x in result if x != ''] # удаление пустых строк +print(result2) + +[line_2[i] for i in range(2,(len(line_2)-2)) if (65< ord(line_2[i]) and ord(line_2[i])< 90) and +(97< ord(line_2[i-2]) and (ord(line_2[i-2])< 122) and +(97< ord(line_2[i-1]) and ord(line_2[i-1])< 122) and +(65< ord(line_2[i+1]) and ord([line_2[+1])< 90) and +(65< ord(line_2[i+2]) and ord(line_2[i+2])< 90)] +""" diff --git a/Lesson5/SRHw05_easy.py b/Lesson5/SRHw05_easy.py new file mode 100644 index 0000000..361361f --- /dev/null +++ b/Lesson5/SRHw05_easy.py @@ -0,0 +1,81 @@ +# Задача-1: +# Напишите скрипт, создающий директории dir_1 - dir_9 в папке, +# из которой запущен данный скрипт. +# И второй скрипт, удаляющий эти папки. + +#============================================================= +import os +def change_dir(dir_path): + if not os.path.exists(dir_path): + result = 2 # change fault, the directory is not exists + return result + try: + os.chdir(dir_path) + result = 0 # directory was changed + except: + result = 1 # directory was not changed + return result + +def delete_dir(dir_path): + try: + os.rmdir(dir_path) + result = 0 # directory was deleted + except: + result = 1 # directory was not deleted + return result + +def make_dir(dir_path): + if os.path.exists(dir_path): + result = 2 # Error: a directory with the same name is already exists + return result + try: + os.mkdir(dir_path) + result = 0 # was created + except: + result = 1 # directory was not created + return result + +""" +#=1)========================================================== +import os +result = SRHw05_easy.make_dir('.\dir_1') +if result: + print ("создать директорию '.\dir_1' не удалось") + if result == 2: + print ("создать директория с таким именем уже существует") +print ("директория '.\dir_1' успешно создана") + +result = SRHw05_easy.make_dir('.\dir_9') +if result: + print ("создать директорию '.\dir_9' не удалось") + if result == 2: + print ("создать директория с таким именем уже существует") +print ("директория '.\dir_9' успешно создана") + +#=2)========================================================== +import os +if not os.path.exists('.\dir_1'): + print ("директория '.\dir_1' не существует удалять нечего") +else: + SRHw05_easy.delete_dir(r'.\dir_1') +if not os.path.exists('.\dir_1'): + print ("директория '.\dir_1' успешно удалена") +if not os.path.exists('.\dir_9'): + print ("директория '.\dir_9' не существует удалять нечего") +else: + SRHw05_easy.delete_dir(r'.\dir_9') +if not os.path.exists('.\dir_9'): + print ("директория '.\dir_9' успешно удалена") +#=========================================================== +""" +# Задача-2: +# Напишите скрипт, отображающий папки текущей директории. +#=========================================================== +import os +def list_dir(path): + return [ elem for elem in os.listdir(r'.')], [ elem for elem in os.listdir(r'.') if os.path.isdir(elem)] + #возвражается кореж (все элементы: только дитрктории) +#=========================================================== + +# Задача-3: +# Напишите скрипт, создающий копию файла, из которого запущен данный скрипт. \ No newline at end of file diff --git a/Lesson5/SRHw05_normal.py b/Lesson5/SRHw05_normal.py new file mode 100644 index 0000000..8219e62 --- /dev/null +++ b/Lesson5/SRHw05_normal.py @@ -0,0 +1,50 @@ +# Задача-1: +# Напишите небольшую консольную утилиту, +# позволяющую работать с папками текущей директории. +# Утилита должна иметь меню выбора действия, в котором будут пункты: +# 1. Перейти в папку +# 2. Просмотреть содержимое текущей папки +# 3. Удалить папку +# 4. Создать папку +# При выборе пунктов 1, 3, 4 программа запрашивает название папки +# и выводит результат действия: "Успешно создано/удалено/перешел", +# "Невозможно создать/удалить/перейти" + +# Для решения данной задачи используйте алгоритмы из задания easy, +# оформленные в виде соответствующих функций, +# и импортированные в данный файл из easy.py + +import os +import SRHw05_easy + +Sleted_item='9' +print( "РАБОТА С ПАПКАМИ ТЕКУЩЕЙ ДИРЕКТОРИИ") +print( "===================================") +print ("выберите интересующее Вас действие:") +while Sleted_item != '0': + print("Просмотреть содержимое папки - введите 1") + print("Перейти в папку - введите 2") + print("Удалить папку - введите 4") + print("Создать папку - введите 3") + print("Для выхода - введите 0") + Sleted_item= input("Введите Ваш выбор: ") + print(Sleted_item) + if Sleted_item == '1' : + dir_name = input ("Введите путь папки: ") + print ("Все элементы: ", SRHw05_easy.list_dir(r'.')[0]) + print ("Из них директории: ", SRHw05_easy.list_dir(r'.')[1]) + elif Sleted_item == '2': + dir_name = input ("Введите путь папки: ") + SRHw05_easy.change_dir(dir_name) + elif Sleted_item == '3': + dir_name = input("Введите путь папки: ") + SRHw05_easy.make_dir(dir_name) + elif Sleted_item == '4': + dir_name = input("Введите путь папки: ") + SRHw05_easy.delete_dir(dir_name) + elif Sleted_item == '0' : + pass + else: + print("Такого пункта меню нет") +print("Работа завершена") + diff --git a/Lesson5/les5_hard.py b/Lesson5/les5_hard.py new file mode 100644 index 0000000..3608ed7 --- /dev/null +++ b/Lesson5/les5_hard.py @@ -0,0 +1,181 @@ +# Задание-1: SRHw05_hard.py +# Доработайте реализацию программы из примера examples/5_with_args.py, +# добавив реализацию следующих команд (переданных в качестве аргументов): +# cp - создает копию указанного файла +# rm - удаляет указанный файл (запросить подтверждение операции) +# cd - меняет текущую директорию на указанную +# ls - отображение полного пути текущей директории +# путь считать абсолютным (full_path) - +# в Linux начинается с /, в Windows с имени диска, +# все остальные пути считать относительными. + +# Важно! Все операции должны выполняться в той директории, в который вы находитесь. +# Исходной директорией считать ту, в которой был запущен скрипт. + +# P.S. По возможности, сделайте кросс-платформенную реализацию. + +# 5_with_args.py +# Данный скрипт можно запускать с параметрами: +# python with_args.py param1 param2 param3 +import os +import sys +import re +import SRHw05_easy + +def print_help(): + print("help - получение справки") + print("-md - создание директории") + print("-cp - копировать, указанный файл") + print("-rm - удаление, указанного файла") + print("-dd - удаление, указанной директории") + print("-cd - перейти в указанную директорию") + print("-ls - отображение полного пути текущей директории") + print("ping - тестовый ключ") + +dir_path = ' ' +def is_abs_filename(file_or_dir): + # возвращает 1 если это абсолютная директория, и 0 если относительная + pattern = re.compile(r'[A-Z]:\)', re.IGNORECASE) + return pattern.match(file_or_dir) != None + +def make_dir(): + if not file_dir_name: + print("Необходимо указать имя директории вторым параметром") + return + if is_abs_filename(file_dir_name): + dir_path = file_dir_name + else: + dir_path = os.path.join(os.getcwd(), file_dir_name) + result = SRHw05_easy.make_dir(dir_path) + if result: + print (result) + print ('создать директорию {} не удалось'.format(file_dir_name)) + if result == 2: + print('директория с именем {} уже существует'.format(file_dir_name)) + if result == 0: + print('директория {} успешно создана'.format(file_dir_name)) + +def show_dir(): + dir_path = os.getcwd() + print ("текущая директория: ", dir_path) + print ("Содержимое директории:") + for elem in SRHw05_easy.list_dir(dir_path)[0]: + print(elem) + print ("Элементы сами являющиеся директориями: ") + for elem in SRHw05_easy.list_dir(dir_path)[1]: + print(elem) + +def del_dir(): + if not file_dir_name: + print("Необходимо указать имя директории вторым параметром") + return + if is_abs_filename(file_dir_name): + dir_path = file_dir_name + else: + dir_path = os.path.join(os.getcwd(), file_dir_name) + if not os.path.exists(dir_path): + print ('директория {} не существует, удалять нечего!'.format(file_dir_name)) + else: + print("Вы действительно хотите удалить директорию '{}'".format(file_dir_name)) + answer = input("Ведите 'Y', если 'да' или 'N', если нет:") + if answer =='N' or answer == 'N': + print ("удаление отменено!") + return + elif answer !='Y' and answer != 'y': + print ("некорректный ответ, удаление не будет выполнено!") + return + SRHw05_easy.delete_dir(dir_path) + if not os.path.exists(dir_path): + print ('директория {} успешно удалена'.format(file_dir_name)) + +def change_dir(): + if not file_dir_name: + print("Необходимо указать имя директории вторым параметром") + return + if is_abs_filename(file_dir_name): + dir_path = file_dir_name + else: + dir_path = os.path.join(os.getcwd(), file_dir_name) + result = SRHw05_easy.change_dir(dir_path) + if result: + print ('перейти в директорию {} не удалось'.format(file_dir_name)) + if result == 2: + print('директория с именем {} уже существует'.format(file_dir_name)) + if result == 0: + print('переход в директорию {} успешно совершен'.format(file_dir_name)) + +def copy_dir(): + if not file_dir_name: + print("Необходимо указать имя файла вторым параметром") + return + if is_abs_filename(file_dir_name): + dir_path = file_dir_name + else: + dir_path = os.path.join(os.getcwd(), file_dir_name) + print("файл будет сохранен с именем", dir_path+'.bak') + if os.path.exists(dir_path+'.bak'): + print('файл с именем {} уже существует'.format(file_dir_name)+'.bak') + print("В случае продолжения копирования его первоначальное содержимое будет удалено!") + answer = input("Ведите 'Y', если ВЫ хотите продолжить копирование или 'N', если нет:") + if answer =='N' or answer == 'N': + print ("Копирование отменено!") + return + elif answer !='Y' and answer != 'y': + print ("некорректный ответ, копирование не будет выполнено!") + return +#собственно копирование файла ее не реализовано! + +def remove_file(): + if not file_dir_name: + print("Необходимо указать имя файла вторым параметром") + return + if is_abs_filename(file_dir_name): + dir_path = file_dir_name + else: + dir_path = os.path.join(os.getcwd(), file_dir_name) + if os.path.isfile(file_dir_name): + print("Вы действительно хотите удалить файл {}".format(file_dir_name)) + answer = input("Ведите 'Y', если 'да' или 'N', если нет:") + if answer =='N' or answer == 'N': + print ("удаление отменено!") + return + elif answer !='Y' and answer != 'y': + print ("некорректный ответ, удаление не будет выполнено!") + return + os.remove(file_dir_name) + if not os.path.isfile(file_dir_name): + print ('файл {} успешно удален'.format(file_dir_name)) + + +def ping(): + print("pong") + +do = { + "-h": print_help, + "help": print_help, + "-md": make_dir, + "-cd": change_dir, + "-cp": copy_dir, + "-rm": remove_file, + "-dd": del_dir, + "-ls": show_dir, + "-ping": ping +} + +try: + file_dir_name = sys.argv[2] +except IndexError: + file_dir_name = None + +try: + key = sys.argv[1] +except IndexError: + key = None + + +if key: + if do.get(key): + do[key]() + else: + print("Задан неверный ключ") + print("Укажите ключ help или -h для получения справки") diff --git a/Lesson6/SRHW06_hard.py b/Lesson6/SRHW06_hard.py new file mode 100644 index 0000000..d163635 --- /dev/null +++ b/Lesson6/SRHW06_hard.py @@ -0,0 +1,68 @@ +# Задание-1: Решите задачу (дублированную ниже): + +# Дана ведомость расчета заработной платы (файл "data/workers"). +# Рассчитайте зарплату всех работников, зная что они получат полный оклад, +# если отработают норму часов. Если же они отработали меньше нормы, +# то их ЗП уменьшается пропорционально, а за заждый час переработки они получают +# удвоенную ЗП, пропорциональную норме. +# Кол-во часов, которые были отработаны, указаны в файле "data/hours_of" + +# С использованием классов. +# Реализуйте классы сотрудников так, чтобы на вход функции-конструктора +# каждый работник получал строку из файла + +class Worker: + def __init__(self, name, surname, salary, position, norm_hours): + self.name = name + self.surname = surname + self.salary = int(salary) + self.position = position + self.norm_hours = int(norm_hours) + self.work_hours = 0 + + def read_work_hours(self): + with open('.\DATA\hours_of.txt', 'r', encoding='utf-8') as hours: + for i in hours.readlines(): + if i == "": + break + else: + curr_hours_data = [x for x in i.split(' ') if x != ''] + if curr_hours_data[0] == self.name and curr_hours_data[1] == self.surname: + self.work_hours = int(curr_hours_data[2]) + break + else: + continue + + def calc_salary(self): + real_work = self.work_hours/ self.norm_hours + return int((real_work * self.salary)) + + + def write_salary(self, salary): + with open('.\DATA\salary_for_all.txt', 'a', encoding='utf-8') as f: + f.write(self.name + ' ' + self.surname + ' ' + self.position + ' ' + str(salary)) + f.write('\n') + f.close() + + + +if __name__ == '__main__': + with open(r'.\data\workers.txt', 'r', encoding='UTF-8') as wokers: + print ('3', wokers) + for line in wokers.readlines(): + print('4', line) + if line == "": + + break + else: + splitted_line = [x for x in line.split(' ') if x != ''] + if splitted_line[0] == 'Имя': + continue #Это строка заголовка, пропустить ее + else: + workman = Worker(* splitted_line) + workman.read_work_hours() + salary = workman.calc_salary() + workman.write_salary(salary) + + + diff --git a/Lesson6/SRHw06_easy.py b/Lesson6/SRHw06_easy.py new file mode 100644 index 0000000..9018ac7 --- /dev/null +++ b/Lesson6/SRHw06_easy.py @@ -0,0 +1,86 @@ +# Задача-1: Написать класс для фигуры-треугольника, заданного координатами трех точек. +# Определить методы, позволяющие вычислить: площадь, высоту и периметр фигуры. + + +# Задача-2: Написать Класс "Равнобочная трапеция", заданной координатами 4-х точек. +# Предусмотреть в классе методы: +# проверка, является ли фигура равнобочной трапецией; +# вычисления: длины сторон, периметр, площадь. + +import math + +class Polygon: +#примает, хранит и обрабатывает координаты вершин многоугольника +#в виде кортежей (x,y), +# начиная от первой самой левой и нижней и далее по часовой чтрелке + polygon_vertices = () + def __init__(self, *vertices): + #сохранение координат вершин многоугльника + self.polygon_vertices = vertices + print ('0 -', self.polygon_vertices, len(self.polygon_vertices)) + + def sidesize(self, vert1, vert2): + #print('Ptint_A - ', vert1, vert2) + #вычисление длины стороны многоугольнка между вершинами 1 и 2 + #vetr1, vetr2, кординаты вершин 1 и 2 в виде (x,y) + #print ('print_B', math.sqrt((vert1[0]-vert2[0])**2 + (vert1[1] - vert2[1])**2)) + return math.sqrt((vert1[0]-vert2[0])**2 + (vert1[1] - vert2[1])**2) + + def polygon_perimeter(self): + self.perimeter = 0 + vetr_numb = len(self.polygon_vertices) + print ('Ptint_C - ', vetr_numb) + for i in range(vetr_numb-1): + self.perimeter += Polygon.sidesize(self, self.polygon_vertices[0], self.polygon_vertices[i]) + self.perimeter += Polygon.sidesize(self, self.polygon_vertices[i], self.polygon_vertices[i+1]) + perimetr += Polygon.sidesize(self, self.polygon_vertices[vetr_numb], self.polygon_vertices[0]) + print ('print_0', self.perimeter, self.polygon_vertices[0]) + return self.perimeter + +class Triangle(Polygon): + side1 = 0 + side2 = 0 + side3 = 0 + def triangle_area(self): + # вычисление площади треугольника по формуле Герона + half_perimeter = Polygon.polygon_perimeter(self)/2 + self.side1 = Polygon.sidesize(self, self.polygon_vertices[0], self.polygon_vertices[1]) + self.side2 = Polygon.sidesize(self, self.polygon_vertices[1], self.polygon_vertices[2]) + self.side3 = Polygon.sidesize(self, self.polygon_vertices[2], self.polygon_vertices[0]) + return math.sqrt(half_perimeter*(half_perimeter-side1)*(half_perimeter-side2)*(half_perimeter-side3)) + + def triangl_height(self): + return (self.triangle_area*2)/self.side1 + +#============================================================================================================ +class Isosceles_Tapezoid(Polygon): + side1 = 0 # левая боковая сторна + side2 = 0 # верхнее основание + side3 = 0 # правая боковая сторона + side4 = 0 # нижнее основание + area = 0 + hight = 0 + Tapezoid_perimeter = 0 + self.side1 = Polygon.sidesize(self, self.polygon_vertices[0], self.polygon_vertices[1]) + self.side2 = Polygon.sidesize(self, self.polygon_vertices[1], self.polygon_vertices[2]) + self.side3 = Polygon.sidesize(self, self.polygon_vertices[2], self.polygon_vertices[3]) + self.side4 = Polygon.sidesize(self, self.polygon_vertices[3], self.polygon_vertices[0]) + if self.side1 != self.side3: + check = False + + else: + check= True + self.Tapezoid_perimeter = Polygon.polygon_perimeter(self) + self.area = ((self.side2+self.side4)/2)* math.sqrt(self.side1**2 - ((self.side2 - self.side4)**2)/4) + self.hight = self.area / ((self.side2+self.side4)/2) + + + +if __name__ == '__main__': + tri1 = Triangle((0,0),(3,4),(6,0),) + print (tri1.polygon_perimeter, tri1.triangle_area, tri1.triangl_height) + #IsoTrap = Isosceles_Tapezoid((0,0), (3,4), (9,4), (12,0),) + #print(IsoTrap.area, IsoTrap.hight, IsoTrap.area.Tapezoid_perimeter) + + + diff --git a/Lesson7/SRHw7_loto.py b/Lesson7/SRHw7_loto.py new file mode 100644 index 0000000..fb7ff57 --- /dev/null +++ b/Lesson7/SRHw7_loto.py @@ -0,0 +1,125 @@ +#!/usr/bin/python3 + +""" +== Лото == + +Правила игры в лото. + +Игра ведется с помощью специальных карточек, на которых отмечены числа, +и фишек (бочонков) с цифрами. + +Количество бочонков — 90 штук (с цифрами от 1 до 90). + +Каждая карточка содержит 3 строки по 9 клеток. В каждой строке по 5 случайных цифр, +расположенных по возрастанию. Все цифры в карточке уникальны. Пример карточки: + +-------------------------- + 9 43 62 74 90 + 2 27 75 78 82 + 41 56 63 76 86 +-------------------------- + +В игре 2 игрока: пользователь и компьютер. Каждому в начале выдается +случайная карточка. + +Каждый ход выбирается один случайный бочонок и выводится на экран. +Также выводятся карточка игрока и карточка компьютера. + +Пользователю предлагается зачеркнуть цифру на карточке или продолжить. +Если игрок выбрал "зачеркнуть": + Если цифра есть на карточке - она зачеркивается и игра продолжается. + Если цифры на карточке нет - игрок проигрывает и игра завершается. +Если игрок выбрал "продолжить": + Если цифра есть на карточке - игрок проигрывает и игра завершается. + Если цифры на карточке нет - игра продолжается. + +Побеждает тот, кто первый закроет все числа на своей карточке. + +Пример одного хода: + +Новый бочонок: 70 (осталось 76) +------ Ваша карточка ----- + 6 7 49 57 58 + 14 26 - 78 85 +23 33 38 48 71 +-------------------------- +-- Карточка компьютера --- + 7 87 - 14 11 + 16 49 55 88 77 + 15 20 - 76 - +-------------------------- +Зачеркнуть цифру? (y/n) + +Подсказка: каждый следующий случайный бочонок из мешка удобно получать +с помощью функции-генератора. + +Подсказка: для работы с псевдослучайными числами удобно использовать +модуль random: http://docs.python.org/3/library/random.html + +""" +import random +import sys + +cask_MAX_NUMBER = 90 + +class Card(): + def __init__(self, name): + self.card_owners_name = name + self.card_lines = [[],[],[]] + for i in range(0,3): + for j in range(0,9): + self.card_lines[i].append(' ') + self.all_allowed_numbers = [x for x in range(1,cask_MAX_NUMBER+1)] + random.shuffle( self.all_allowed_numbers ) + + for j in range(0,3): + self.line = self.all_allowed_numbers[j*10: j*10+5] + del self.all_allowed_numbers[j*10: j*10+5] + self.line = sorted(self.line) + random.seed() + for x in range (0,5): + numb_ins = False + while not numb_ins: + k = random.randint(0,8) + if self.card_lines[j][k] == ' ': + self.card_lines[j][k] = self.line[x] + numb_ins = True + else: + numb_ins = False #выбраная ячейка уже занята, попробавать еще раз + pass + pass + + def _str__(self): + self.header = '{:-^37}\n'.format(self.card_owners_name) + self.full_card = '' + for i in range(0,3): + main_part = '|' + for j in range(0,9): + if self.card_lines[i][j] == ' ': + main_part += ' |' + else: + main_part += ('{: >3}'.format(self.card_lines[i][j]) +'|') + main_part +='\n' + self.full_card += main_part + self.full_card = self.header + self.full_card + '='*37 + return ('\n' + self.full_card) + + def check_number_in_card(self, cask_to_check): + for i in range(0,2): + if cask_to_check in self.card_lines[i]: + cask_found = True + cask_index1 = i + cask_index2 = self.card_lines[i].index(cask_to_check) + else: + cask_found = False + cask_index1 = 0 + cask_index2 = 0 + return cask_found, cask_index1, cask_index2 + + + +if __name__ == '__main__': + card1 = Card("игрок") + card2 = Card("компьютер") + print (card1) + print(card2) diff --git a/Lesson7/test2.py b/Lesson7/test2.py new file mode 100644 index 0000000..f024205 --- /dev/null +++ b/Lesson7/test2.py @@ -0,0 +1,132 @@ +import random +import sys + +cask_MAX_NUMBER = 90 +curr_cask = 0 +card_lines = [[],[],[]] +#========================================================================== + +def prepare_card(): + for i in range(0,3): + for j in range(0,9): + card_lines[i].append(' ') + all_allowed_numbers = [x for x in range(1,cask_MAX_NUMBER+1)] + random.shuffle( all_allowed_numbers ) + + for j in range(0,3): + line = all_allowed_numbers[j*10: j*10+5] + del all_allowed_numbers[j*10: j*10+5] + line = sorted(line) + random.seed() + for x in range (0,5): + numb_ins = False + while not numb_ins: + k = random.randint(0,8) + if card_lines[j][k] == ' ': + card_lines[j][k] = line[x] + numb_ins = True + else: + numb_ins = False #выбраная ячейка уже занята, попробавать еще раз + +#========================================================================== + # def _str__(self): +def print_card(): + card_owners_name = "игрок" + header = '{:-^37}\n'.format(card_owners_name) + + full_card = '' + for i in range(0,3): + main_part = '|' + for j in range(0,9): + if card_lines[i][j] == ' ': + main_part += ' |' + else: + main_part += ('{: >3}'.format(card_lines[i][j]) +'|') + main_part +='\n' + full_card += main_part + pass + full_card = header + full_card + '='*37 + print('\n') + print (full_card) + + +def casks_bag(): + random.seed() + #return curr_cask = random.randint(1,cask_MAX_NUMBER) + #получить заведомо сущнствующий номер на карте, для проверки + for i in range(0,2): + for j in range(0,9): + if card_lines[i][j] != ' ': + curr_cask = card_lines[i][j] + break + #casks_bag() + print("извечен боченокс номером: ", curr_cask) + return curr_cask + + +def check_number_in_card(): + for i in range(0,2): + if curr_cask in card_lines[i]: + cask_found = True + cask_index1 = i + cask_index2 = card_lines[i].index(curr_cask) + else: + cask_found = False + cask_index1 = 0 + cask_index2 = 0 + return cask_found, cask_index1, cask_index2 + +def erase_number(*check_result): + if check_result[0]: + card_lines[check_result[1]][check_result[2]] = ' ' + +#================================================================================ + +if __name__ == '__main__': + game_On = True + prepare_card() + while game_On: + print_card() + + curr_cask = casks_bag() + print (curr_cask) + + answer_again = True + print("На Вашей карточке есть такой номер, и Вы хотите его зачеркнуть?") + print("Если Вы ошибетесь и решите зачеркнуть несуществующий у Вас номер,") + print("то Вы проиграете!") + while answer_again: + answer = input("И так Ваше решение? Зачеркнуть номер? 'Да' или 'Нет' Y/N :") + if (answer.lower() != 'y' and answer.lower() != 'n'): + print("Введен некорректный символ : '", answer, "'") + print("Повторите ввод!") + else: + answer_again = False + answer = answer.lower() + + check_result = check_number_in_card() + if check_result[0]: + print("Номер найден на карте!", "строка= ", check_result[1]+1, "позиция =", check_result[2]+1) + else: + print("Номер на карте не найден!") + + + + if answer =='y': + if check_result[0]: + erase_number(*check_result) + print_card() + else: + print("Такого номера на карте нет; Вы проиграли!") + game_On = False + + answer = input("Вы хотите продолжать? 'Да' или 'Нет' Y/N :") + if (answer.lower() != 'y' and answer.lower() != 'n'): + print("Введен некорректный символ : '", answer, "'") + print("Повторите ввод!") + else: + answer_again = False + answer = answer.lower() + if answer == 'n': + print("Игра закончена!") + break \ No newline at end of file diff --git a/Lesson8/DATA/app.id b/Lesson8/DATA/app.id new file mode 100644 index 0000000..8d5ec61 --- /dev/null +++ b/Lesson8/DATA/app.id @@ -0,0 +1 @@ +b1b15e88fa797225412429c1c50c122a diff --git a/Lesson8/DATA/city.list.json.gz b/Lesson8/DATA/city.list.json.gz new file mode 100644 index 0000000..726be8e Binary files /dev/null and b/Lesson8/DATA/city.list.json.gz differ diff --git a/Lesson8/DATA/weather.json b/Lesson8/DATA/weather.json new file mode 100644 index 0000000..9b63448 --- /dev/null +++ b/Lesson8/DATA/weather.json @@ -0,0 +1 @@ +{"coord":{"lon":37.62,"lat":55.75},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01d"}],"base":"stations","main":{"temp":3,"pressure":1023,"humidity":93,"temp_min":3,"temp_max":3},"visibility":10000,"wind":{"speed":2,"deg":220},"clouds":{"all":0},"dt":1538287200,"sys":{"type":1,"id":7325,"message":0.0039,"country":"RU","sunrise":1538278228,"sunset":1538320042},"id":524901,"name":"Moscow","cod":200} \ No newline at end of file diff --git a/Lesson8/SQLite.py b/Lesson8/SQLite.py new file mode 100644 index 0000000..dd904a8 --- /dev/null +++ b/Lesson8/SQLite.py @@ -0,0 +1,8 @@ + +#import + +def open_SQLite_Data_Base(name): + return True + +def save_data_into_database(data): + return True diff --git a/Lesson8/export_openweather.py b/Lesson8/export_openweather.py new file mode 100644 index 0000000..b0cdced --- /dev/null +++ b/Lesson8/export_openweather.py @@ -0,0 +1,38 @@ +import json +import sys +from openweather import * +import SQLite + + +print('sys.argv = ', sys.argv) + +#if __name__ == '__main__': +export_type = sys.argv[1] +file_export_to = sys.argv[2] +city = sys.argv[3] +if file_export_to == "": + print ("необходимо задать имя файла лия сохранения результатов") +#city = sys.argv[3] +if city == "": + print ("необходимо указать город, чьей погодой интересуетесь") +else: + city = "Moscow" + + +get_openweather_map_city_list() + +check_result = check_city_in_base(city) + +if check_result[0]: + print ("OK! ", city," is in base, city ID: ", check_result[1]) + get_weather(check_result[1]) + with open(r'.\data\weather.json', 'r', encoding="utf-8") as fweath: + weather = json.loads(fweath.read()) + print (weather) + for key in weather: + print(key, weather[key]) +#===================================================== +# работа с базой данных требует отдельной реализации +#===================================================== + + diff --git a/Lesson8/openweather.py b/Lesson8/openweather.py new file mode 100644 index 0000000..e1d67d5 --- /dev/null +++ b/Lesson8/openweather.py @@ -0,0 +1,58 @@ +import json +import gzip +import os +def get_openweather_map_city_list(): + if not os.path.exists(r".\data\city.list.json"): + #===================================================== + inF = gzip.GzipFile(r".\data\city.list.json.gz", 'rb') + s = inF.read() + inF.close() + outF = open(r".\data\city.list.json", 'wb') + outF.write(s) + outF.close() + #===================================================== + return True + +def check_city_in_base(city_to_find): + city_to_find = "Moscow" + found_dict = [] + with open(r'.\data\city.list.json', 'r', encoding="utf-8") as fc: + data = json.loads(fc.read()) + for i in range (len(data)): + if data[i]["name"] == city_to_find: + found_dict.append(i) + if found_dict == "": + print("город в базе не найден") + elif len(found_dict) == 1: + city_ID = data[found_dict[0]]["id"] + else: + print ("В базе найдено", len(found_dict), "города с таким названием") + print("Необходимо уточнить страну!") + for j in range(0,len(found_dict)): + print (j+1, data[found_dict[j]]["name"], data[found_dict[j]]["country"], data[found_dict[j]]["coord"]) + answer = int(input("введите номер строки из приведенного выше списка: ")) + city_ID = data[found_dict[answer-1]]["id"] + return (True, city_ID) + + +def get_weather(city_ID): + appidF = open(r'.\data\app.id', 'r') + appID = appidF.readline() + print(appID) + url = ' http://api.openweathermap.org/data/2.5/weather?id=' + url += str(city_ID) + url += '&units=metric&appid=' + url += appID + #=================================================================== + # собственно чтение погоды для города с сайта openweathermap.org, + # #еще не реализовано, + #полученый файл записывается в r'.\data\weather.json' + #=================================================================== + + #=================================================================================== + # + # также требуется дополнительная реализация работы с базой SQLite в файле: SQLite.py + # if DB_id = open_SQLite_Data_Base(openweathermap): + # save_data_into_database(DB_id, data) + # + #=================================================================================== diff --git a/Level2_lesson_1/file.txt b/Level2_lesson_1/file.txt new file mode 100644 index 0000000..a46978b --- /dev/null +++ b/Level2_lesson_1/file.txt @@ -0,0 +1,48 @@ +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» \ No newline at end of file diff --git a/Level2_lesson_1/ping.txt b/Level2_lesson_1/ping.txt new file mode 100644 index 0000000..50ea55c --- /dev/null +++ b/Level2_lesson_1/ping.txt @@ -0,0 +1,28 @@ + + ⠬ wide-youtube.l.google.com [173.194.73.198] 32 ⠬ : +⢥ 173.194.73.198: ᫮ =32 ६=15 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=15 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=15 TTL=48 + +⨪ Ping 173.194.73.198: + ⮢: ࠢ = 19, 祭 = 19, ﭮ = 0 + (0% ) +ਡ⥫쭮 ६ ਥ-। : + 쭮 = 14ᥪ, ᨬ쭮 = 15 ᥪ, । = 14 ᥪ +Control-C diff --git a/Level2_lesson_1/task_1.py b/Level2_lesson_1/task_1.py new file mode 100644 index 0000000..4b26693 --- /dev/null +++ b/Level2_lesson_1/task_1.py @@ -0,0 +1,24 @@ +#1. Каждое из слов «разработка», «сокет», «декоратор» представить в строковом формате +#и проверить тип и содержание соответствующих переменных. +# Затем с помощью онлайн-конвертера преобразовать строковые представление в формат Unicode +# и также проверить тип и содержимое переменных. + +str_1 = "разработка" +print(str_1) +print(type(str_1)) +print(str_1.encode('utf-8')) +print(type(str_1.encode('utf-8'))) +print('='*80) + +str_2 = "сокет" +print(str_2) +print(type(str_2)) +print(str_2.encode('utf-8')) +print(type(str_2.encode('utf-8'))) +print('='*80) + +str_3 = "декоратор" +print(str_3) +print(type(str_3)) +print(str_3.encode('utf-8')) +print(type(str_3.encode('utf-8'))) diff --git a/Level2_lesson_1/task_2.py b/Level2_lesson_1/task_2.py new file mode 100644 index 0000000..d51c207 --- /dev/null +++ b/Level2_lesson_1/task_2.py @@ -0,0 +1,21 @@ +#2. Каждое из слов «class», «function», «method» записать в байтовом типе +# без преобразования в последовательность кодов (не используя методы encode и decode) +# и определить тип, содержимое и длину соответствующих переменных. + +str_1 = b"class" +print(str_1) +print(type(str_1)) +print('length = ', len(str_1)) +print('='*80) + +str_2 = b"function" +print(str_2) +print(type(str_2)) +print('length = ', len(str_2)) +print('='*80) + +str_3 = b"method" +print(str_3) +print(type(str_3)) +print('length = ', len(str_3)) +print('='*80) diff --git a/Level2_lesson_1/task_3.py b/Level2_lesson_1/task_3.py new file mode 100644 index 0000000..c585710 --- /dev/null +++ b/Level2_lesson_1/task_3.py @@ -0,0 +1,23 @@ +#3. Определить, какие из слов «attribute», «класс», «функция», «type» невозможно записать в байтовом типе. + +from sys import getdefaultencoding +str_1 = "attribute" +str_2 = "класс" +str_3 = "функцция" +str_4 = "type" +print("Defaultencoding = ", getdefaultencoding()) +print(str_1.encode("ascii", errors='ignore')) +print(str_1.encode("ascii", errors='replace')) +print('='*80) + +print(str_2.encode("ascii", errors='ignore')) +print(str_2.encode("ascii", errors='replace')) +print('='*80) + +print(str_3.encode("ascii", errors='ignore')) +print(str_3.encode("ascii", errors='replace')) +print('='*80) + +print(str_4.encode("ascii", errors='ignore')) +print(str_4.encode("ascii", errors='replace')) +print('='*80) diff --git a/Level2_lesson_1/task_4.py b/Level2_lesson_1/task_4.py new file mode 100644 index 0000000..22d4977 --- /dev/null +++ b/Level2_lesson_1/task_4.py @@ -0,0 +1,50 @@ +#4. Преобразовать слова «разработка», «администрирование», «protocol», «standard» из строкового представления +# в байтовое и выполнить обратное преобразование (используя методы encode и decode). + +str_1 = "разработка" +print(str_1) +print(type(str_1)) +str_1b = str_1.encode('utf-8') +print("encoded = ", str_1b) +print(type(str_1b)) +str_1d = str_1b.decode('utf-8') +print("decoded = ", str_1d) +print(type(str_1d)) +print("str_1 == str_1d :", str_1 == str_1d) +print('='*80) + +str_2 = "администрирование" +print(str_2) +print(type(str_2)) +str_2b = str_2.encode('utf-8') +print("encoded = ", str_2b) +print(type(str_2b)) +str_2d = str_2b.decode('utf-8') +print("decoded = ", str_2d) +print(type(str_2d)) +print("str_2 == str_2d :", str_2 == str_2d) +print('='*80) + +str_3 = "protocol" +print(str_3) +print(type(str_3)) +str_3b = str_3.encode('utf-8') +print("encoded = ", str_3b) +print(type(str_3b)) +str_3d = str_3b.decode('utf-8') +print("decoded = ", str_3d) +print(type(str_3d)) +print("str_3 == str_3d :", str_3 == str_3d) +print('='*80) + +str_4 = "standard" +print(str_4) +print(type(str_4)) +str_4b = str_4.encode('utf-8') +print("encoded = ", str_4b) +print(type(str_4b)) +str_4d = str_4b.decode('utf-8') +print("decoded = ", str_4d) +print(type(str_4d)) +print("str_4 == str_4d :", str_4 == str_4d) +print('='*80) diff --git a/Level2_lesson_1/task_5.py b/Level2_lesson_1/task_5.py new file mode 100644 index 0000000..b9c75e7 --- /dev/null +++ b/Level2_lesson_1/task_5.py @@ -0,0 +1,13 @@ +#5. Выполнить пинг веб-ресурсов yandex.ru, youtube.com +# и преобразовать результаты из байтовового в строковый тип на кириллице. + +ping_file = open(r'ping.txt', 'r') +for line in ping_file: + print(line.encode('utf-8', errors='replace').decode('cp866')) + #ни одна из использованных кодовых таблиц: + # koi8_r, cp866, windows-1251, cp819, + #не дали положительного результата. Кириллица MS-DOS в списке отсутствует + # + #print(line.decode('cp866').encode('utf-8')) + # показанная Вами на уроке на экране монитора приведенная выше строка + # неизменно выдавала онибку: 'str' object has no attribute 'decode' diff --git a/Level2_lesson_1/task_6.py b/Level2_lesson_1/task_6.py new file mode 100644 index 0000000..27b1a1a --- /dev/null +++ b/Level2_lesson_1/task_6.py @@ -0,0 +1,7 @@ +#6. Создать текстовый файл test_file.txt, заполнить его тремя строками: +#«сетевое программирование», «сокет», «декоратор». Проверить кодировку файла по умолчанию. +#Принудительно открыть файл в формате Unicode и вывести его содержимое. + +file = open(r'file2.txt', encoding='utf-8') +for line in file: + print(line) diff --git a/Level2_lesson_2/file.yaml b/Level2_lesson_2/file.yaml new file mode 100644 index 0000000..5a4580d --- /dev/null +++ b/Level2_lesson_2/file.yaml @@ -0,0 +1,6 @@ +1: Sergey R. +2: 20000€ +3: + 1: 100€ + 2: 50 + 3: 1 diff --git a/Level2_lesson_2/main_data.csv b/Level2_lesson_2/main_data.csv new file mode 100644 index 0000000..a70a585 --- /dev/null +++ b/Level2_lesson_2/main_data.csv @@ -0,0 +1,5 @@ +Изготовитель системы,Название ОС,Код продукта,Тип системы +Изготовитель системы,Название ОС,Код продукта,Тип системы +LENOVO,Microsoft Windows 7 Профессиональная ,00971-OEM-1982661-00231,x64-based PC +ACER,Microsoft Windows 10 Professional,00971-OEM-1982661-00231,x64-based PC +DELL,Microsoft Windows 8.1 Professional,00971-OEM-1982661-00231,x86-based PC diff --git a/Level2_lesson_2/order.json b/Level2_lesson_2/order.json new file mode 100644 index 0000000..ce885b4 --- /dev/null +++ b/Level2_lesson_2/order.json @@ -0,0 +1,7 @@ +{ + "buyer": "Sergey", + "data": "2018, 2, 10", + "item": "computer", + "price": "20000", + "quantity": 1 +} \ No newline at end of file diff --git a/Level2_lesson_2/task_1.py b/Level2_lesson_2/task_1.py new file mode 100644 index 0000000..1f8bc1d --- /dev/null +++ b/Level2_lesson_2/task_1.py @@ -0,0 +1,71 @@ +""" +1. Задание на закрепление знаний по модулю CSV. Написать скрипт, осуществляющий выборку +определенных данных из файлов info_1.txt, info_2.txt, info_3.txt и формирующий новый +«отчетный» файл в формате CSV. Для этого: +a. Создать функцию get_data(), в которой в цикле осуществляется перебор файлов с +данными, их открытие и считывание данных. В этой функции из считанных данных +необходимо с помощью регулярных выражений извлечь значения параметров +«Изготовитель системы», «Название ОС», «Код продукта», «Тип системы». Значения +каждого параметра поместить в соответствующий список. Должно получиться четыре +списка — например, os_prod_list, os_name_list, os_code_list, os_type_list. В этой же +функции создать главный список для хранения данных отчета — например, main_data +— и поместить в него названия столбцов отчета в виде списка: «Изготовитель +системы», «Название ОС», «Код продукта», «Тип системы». Значения для этих +столбцов также оформить в виде списка и поместить в файл main_data (также для +каждого файла); +b. Создать функцию write_to_csv(), в которую передавать ссылку на CSV-файл. В этой +функции реализовать получение данных через вызов функции get_data(), а также +сохранение подготовленных данных в соответствующий CSV-файл; +c. Проверить работу программы через вызов функции write_to_csv(). +""" +import csv +import re +import copy + + +def get_data(): + # имена подсписков в списке 'result_lists' + os_prod_list = 0 + os_name_list = 1 + os_code_list = 2 + os_type_list = 3 + + result_lists = [[], [], [], []] # списки для хранения промежуточных результатов чтения + main_data = [[], [], [], []] # списки формирования окончательных результатов + + csv_header = ['Изготовитель системы', 'Название ОС', 'Код продукта', 'Тип системы'] + + pattern = re.compile(r'^(\w[^:]+)+:\s+([^:\n]+)\s*$') + #pattern = re.compile(r'^(\w[^:]+).*:\s+([^:\n]+)\s*$') + + for file in ['info_1.txt', 'info_2.txt', 'info_3.txt']: + with open(file, 'r') as curr_file: + for curr_line in curr_file: + if pattern.match(curr_line) != None: + patterns = pattern.findall(curr_line) + for i in range(len(csv_header)): + if patterns[0][0] == csv_header[i]: + result_lists[i].append(patterns[0][1]) + break + #==================================================================================== + + zipped_elems = zip(result_lists[0], result_lists[1], result_lists[2], result_lists[3]) + main_data[0] = copy.copy(list(csv_header)) + i = 1 + for elem in zipped_elems: + main_data[i] = copy.copy(list(elem)) + i += 1 + return main_data + + +def write_to_csv(data_to_csv, filename): + with open(filename, 'w', encoding='utf8') as csv_out_file: + csv_file_writer = csv.writer(csv_out_file, delimiter=',') + csv_file_writer.writerow(data_to_csv[0]) + for i in range(len(data_to_csv)): + csv_file_writer.writerow(data_to_csv[i]) + return None + + +if __name__ == "__main__": + write_to_csv(get_data(), 'main_data.csv') diff --git a/Level2_lesson_2/task_2.py b/Level2_lesson_2/task_2.py new file mode 100644 index 0000000..f02f2ed --- /dev/null +++ b/Level2_lesson_2/task_2.py @@ -0,0 +1,59 @@ +""" +2. Задание на закрепление знаний по модулю json. Есть файл orders в формате JSON с +информацией о заказах. Написать скрипт, автоматизирующий его заполнение данными. Для +этого: +a. Создать функцию write_order_to_json(), в которую передается 5 параметров — товар +(item) , количество (quantity), цена (price), покупатель (buyer) , дата (date). Функция +должна предусматривать запись данных в виде словаря в файл orders.json. При +записи данных указать величину отступа в 4 пробельных символа; +b. Проверить работу программы через вызов функции write_order_to_json() с передачей +в нее значений каждого параметра. +""" +import json + + +order1 = { + 'item':'computer', + 'price':'20000', + 'quantity': 1, + 'buyer':'Sergey', + 'data':"2018, 2, 10",} +order2 = { + 'item':'printer', + 'price':'10000', + 'quantity': 1, + 'buyer':'Ivan', + 'data':"2017, 11, 20",} + +order3 = { + 'item':'mouse', + 'price':'3000', + 'quantity': 2, + 'buyer':'Tatiana', + 'data':"2017, 8, 5",} +orders = [order1, order2, order3] + +def write_order_to_json(item, price, quantity, buyer, data, filename): + dict_to_json ={ + 'item' : item, + 'price': price, + 'quantity': quantity, + 'buyer': buyer, + 'data': data, + } + print('dict_to_json: ', dict_to_json) + with open( filename, 'w+' ) as json_file: + json.dump(dict_to_json, json_file, sort_keys= True , indent= 4) + +def read_order_from_json(filename): + with open( filename, 'r', encoding="utf-8" ) as json_file: + python_data = json.load(json_file) + return python_data + + + +if __name__ == '__main__': + #print(orders) + write_order_to_json(order1['item'], order1['price'], order1['quantity'], \ + order1['buyer'], order1['data'], 'order.json') + print(read_order_from_json('order.json')) diff --git a/Level2_lesson_2/task_3.py b/Level2_lesson_2/task_3.py new file mode 100644 index 0000000..5169034 --- /dev/null +++ b/Level2_lesson_2/task_3.py @@ -0,0 +1,38 @@ +""" +3. Задание на закрепление знаний по модулю yaml. Написать скрипт, +автоматизирующий сохранение данных в файле YAML-формата. Для этого: +a. Подготовить данные для записи в виде словаря, в котором первому ключу +соответствует список, второму — целое число, третьему — вложенный словарь, где +значение каждого ключа — это целое число с юникод-символом, отсутствующим в +кодировке ASCII (например, €); +b. Реализовать сохранение данных в файл формата YAML — например, в файл +file.yaml. При этом обеспечить стилизацию файла с помощью параметра +default_flow_style, а также установить возможность работы с юникодом: +allow_unicode = True; +c. Реализовать считывание данных из созданного файла и проверить, +совпадают ли они с исходными. +""" + +import yaml + + +def write_to_yaml_file(data_to_yanl, yaml_file_name, fl_unicode): + with open(yaml_file_name, 'w', encoding='utf8') as yaml_file: + yaml.dump(data_to_yaml, yaml_file, default_flow_style=False, + allow_unicode=fl_unicode) + + +def read_from_yaml_file(yaml_file_name): + with open(yaml_file_name, 'r', encoding='utf8') as yaml_file: + return yaml.load(yaml_file) + + +if __name__ == '__main__': + data_to_yaml = {1: 'Sergey R.', 2: '20000€', + 3: {1: '100€', 2: 50, 3: 1, }} + write_to_yaml_file(data_to_yaml, 'file.yaml', True) + data_from_file = read_from_yaml_file('file.yaml') + print("В файл передано : ", data_to_yaml) + print("Из файла прочитано: ", data_from_file) + print("Прочитанные данные совпадают с исходными: ", data_to_yaml == + data_from_file) diff --git a/Level2_lesson_3/Client.py b/Level2_lesson_3/Client.py new file mode 100644 index 0000000..b67502f --- /dev/null +++ b/Level2_lesson_3/Client.py @@ -0,0 +1,44 @@ +# Программа клиента для отправки приветствия серверу и получения ответа +import sys +from socket import * +from datetime import datetime +import json + + +def client(IP_addr, port=777): + s = socket(AF_INET, SOCK_STREAM) # Создать сокет TCP + s.connect((IP_addr, int(port))) # соединиться с сервером + + timestamp = str(datetime.now()) + authen_msg = { + "action": "authenticate", + "time": timestamp, + "user": { + "account_name": "C0deMaverick", + "password": "CorrectHorseBatterStaple" + } + } + json_autent_msg = json.dumps(authen_msg) + s.send(json_autent_msg.encode('utf-8')) + data = s.recv(1000000) + server_answer = json.loads(data) + + print('Ответ сервера: ', data.decode('utf-8'), ', длиной ', + len(data), 'байт получен') + + if server_answer["response"] == 200: # код ответа сервера == 'OK!' + timestamp = str(datetime.now()) + presence_msg = {"action": "presence", "time": timestamp, + "type": "status", + "user": {"account_name": "CodeMaverick", + "status": "Yep, I am here!"}} + json_presence_msg = json.dumps(presence_msg) + s.send(json_presence_msg.encode('utf-8')) + else: + pass + + s.close() + + +if __name__ == "__main__": + client('127.0.0.1', 8080) diff --git a/Level2_lesson_3/Server.py b/Level2_lesson_3/Server.py new file mode 100644 index 0000000..e132625 --- /dev/null +++ b/Level2_lesson_3/Server.py @@ -0,0 +1,38 @@ +# программа сервера для получения приветствия от клиента и отпраки ответа +import sys +from socket import * +import json + + +def check_user_authority(user): + pass + return True + + +def server(IP_addr, port=777): + s = socket(AF_INET, SOCK_STREAM) # Создает сокет TCP + s.bind((IP_addr, int(port))) # Присваивает IP аддрес и порт + s.listen(5) # Переход в режим ожидания запросов; + # одновременно обслуживается не более + # 5 запросов + while True: + print('Before accept()') + client, addr = s.accept() + print('After accept()') + data = client.recv(1000000) + print('Сообщение: ', data.decode('utf-8'), 'длиной: ', len(data), + ' байт, было отправлено клиентом: ', addr) + client_query = json.loads(data) + if client_query["action"] == "authenticate": + if check_user_authority(client_query["user"]): + asnswer_msg = {"response": 200, "alert": "Connection allowed"} + json_snswer_msg = json.dumps(asnswer_msg) + else: + pass + + client.send(json_snswer_msg.encode('utf-8')) + client.close() + + +if __name__ == "__main__": + server('127.0.0.1', 8080) diff --git a/Level2_lesson_5/Client.py b/Level2_lesson_5/Client.py new file mode 100644 index 0000000..9000f1e --- /dev/null +++ b/Level2_lesson_5/Client.py @@ -0,0 +1,63 @@ +# Программа клиента для отправки приветствия серверу и получения ответа +import sys +from socket import * +from datetime import datetime +import json +import logging + +#cleint_log = logging.getLogger('messager') # для совместного логгирования +#в общий лог +cleint_log = logging.getLogger('client') +cleint_log.setLevel(logging.INFO) +format = logging.Formatter("%(asctime)s - %(filename)s - %(levelname)s - %(" + "message)s ") +client_file_handl = logging.FileHandler(r".\log\client_log.py", 'a', + encoding='utf-8') +client_file_handl.setFormatter(format) +cleint_log.addHandler(client_file_handl) +#======================================================================= + + +def client(IP_addr, port=777): + cleint_log.info('Запуск клиентской программы') + s = socket(AF_INET, SOCK_STREAM) # Создать сокет TCP + s.connect((IP_addr, int(port))) # соединиться с сервером + + timestamp = str(datetime.now()) + cleint_log.info('Запрос клиента на подключение к серверу и авторизацию') + authen_msg = { + "action": "authenticate", + "time": timestamp, + "user": { + "account_name": "C0deMaverick", + "password": "CorrectHorseBatterStaple" + } + } + json_autent_msg = json.dumps(authen_msg) + s.send(json_autent_msg.encode('utf-8')) + data = s.recv(1000000) + cleint_log.info( + 'Получение ответа сервера с разрешением или запретом подключения') + server_answer = json.loads(data) + + print('Ответ сервера: ', data.decode('utf-8'), ', длиной ', + len(data), 'байт получен') + + if server_answer["response"] == 200: # код ответа сервера == 'OK!' + timestamp = str(datetime.now()) + presence_msg = {"action": "presence", "time": timestamp, + "type": "status", + "user": {"account_name": "CodeMaverick", + "status": "Yep, I am here!"}} + cleint_log.info('Посылка клиентом сервисного сообщения о присутствии') + json_presence_msg = json.dumps(presence_msg) + s.send(json_presence_msg.encode('utf-8')) + else: + pass + + s.close() + cleint_log.info('Клиентская программа закрыта') + + +if __name__ == "__main__": + client('127.0.0.1', 8080) diff --git a/Level2_lesson_5/Server.py b/Level2_lesson_5/Server.py new file mode 100644 index 0000000..15c4d7d --- /dev/null +++ b/Level2_lesson_5/Server.py @@ -0,0 +1,68 @@ +# программа сервера для получения приветствия от клиента и отпраки ответа +import sys +from socket import * +import json +import logging + +#serv_log = logging.getLogger('messager') # для совместного логгирования в +#общий лог +serv_log = logging.getLogger('server') +serv_log.setLevel(logging.INFO) +format = logging.Formatter("%(asctime)s - %(filename)s - %(levelname)s - %(" + "message)s ") +serv_file_handl = logging.FileHandler(r".\log\server_log.py", 'a', + encoding='utf-8') +serv_file_handl.setFormatter(format) +serv_log.addHandler(serv_file_handl) +#======================================================================= + + +def check_user_authority(user): + if True: + serv_log.info("Проверка авторизации, соединение разрешено") + return True + else: + serv_log.critical("Проверка авторизации, в соединении отказано") + return False + + +def server(IP_addr, port=777): + serv_log.info('Запуск сервера') + s = socket(AF_INET, SOCK_STREAM) # Создает сокет TCP + s.bind((IP_addr, int(port))) # Присваивает IP аддрес и порт + s.listen(5) # Переход в режим ожидания запросов; + # одновременно обслуживается не более + # 5 запросов + while True: + print('Before accept()') + client, addr = s.accept() + print('After accept()') + data = client.recv(1000000) + print('Сообщение: ', data.decode('utf-8'), 'длиной: ', len(data), + ' байт, было отправлено клиентом: ', addr) + serv_log.info('Получено сообщение от клиента') + client_query = json.loads(data) + if client_query["action"] == "authenticate": + if check_user_authority(client_query["user"]): + asnswer_msg = {"response": 200, "alert": "Connection allowed"} + json_snswer_msg = json.dumps(asnswer_msg) + serv_log.info("Клиенту передано разрешение на соединение") + else: + pass + + client.send(json_snswer_msg.encode('utf-8')) + + try : + # имитация ошибки в работк сервера + raise ValueError("connection parameters error") + except ValueError: + serv_log.warning("Ошибка в параметрах связи, работоспособность " + "восстановлена") + + client.close() + cleint_log.info('Сервер закрыт') + + +if __name__ == "__main__": + server('127.0.0.1', 8080) + diff --git a/Level2_lesson_5/client_log.py b/Level2_lesson_5/client_log.py new file mode 100644 index 0000000..9b92ae7 --- /dev/null +++ b/Level2_lesson_5/client_log.py @@ -0,0 +1,20 @@ +2018-11-02 13:19:43,236 - Client.py - INFO - Запуск клиентской программы +2018-11-02 13:19:43,237 - Client.py - INFO - Запрос клиента на подключение к серверу и авторизацию +2018-11-02 13:19:43,238 - Client.py - INFO - Получение ответа сервера с разрешением или запретом подключения +2018-11-02 13:19:43,238 - Client.py - INFO - Посылка клиентом сервисного сообщения о присутствии +2018-11-02 13:19:43,238 - Client.py - INFO - Клиентская программа закрыта +2018-11-02 16:04:00,582 - Client.py - INFO - Запуск клиентской программы +2018-11-02 16:04:00,583 - Client.py - INFO - Запрос клиента на подключение к серверу и авторизацию +2018-11-02 16:04:00,584 - Client.py - INFO - Получение ответа сервера с разрешением или запретом подключения +2018-11-02 16:04:00,584 - Client.py - INFO - Посылка клиентом сервисного сообщения о присутствии +2018-11-02 16:04:00,584 - Client.py - INFO - Клиентская программа закрыта +2018-11-02 16:05:56,675 - Client.py - INFO - Запуск клиентской программы +2018-11-02 16:05:56,676 - Client.py - INFO - Запрос клиента на подключение к серверу и авторизацию +2018-11-02 16:05:56,677 - Client.py - INFO - Получение ответа сервера с разрешением или запретом подключения +2018-11-02 16:05:56,677 - Client.py - INFO - Посылка клиентом сервисного сообщения о присутствии +2018-11-02 16:05:56,677 - Client.py - INFO - Клиентская программа закрыта +2018-11-02 16:11:27,586 - Client.py - INFO - Запуск клиентской программы +2018-11-02 16:11:27,587 - Client.py - INFO - Запрос клиента на подключение к серверу и авторизацию +2018-11-02 16:11:27,588 - Client.py - INFO - Получение ответа сервера с разрешением или запретом подключения +2018-11-02 16:11:27,588 - Client.py - INFO - Посылка клиентом сервисного сообщения о присутствии +2018-11-02 16:11:27,588 - Client.py - INFO - Клиентская программа закрыта diff --git a/Level2_lesson_5/messager_log.py b/Level2_lesson_5/messager_log.py new file mode 100644 index 0000000..fcfe911 --- /dev/null +++ b/Level2_lesson_5/messager_log.py @@ -0,0 +1,20 @@ +2018-11-02 13:18:07,437 - Server.py - INFO - Запуск сервера +2018-11-02 13:18:10,567 - Client.py - INFO - Запуск клиентской программы +2018-11-02 13:18:10,568 - Client.py - INFO - Запрос клиента на подключение к серверу и авторизацию +2018-11-02 13:18:10,568 - Server.py - INFO - Получено сообщение от клиента +2018-11-02 13:18:10,568 - Server.py - INFO - Проверка авторизации, соединение разрешено +2018-11-02 13:18:10,568 - Server.py - INFO - Клиенту передано разрешение на соединение +2018-11-02 13:18:10,569 - Client.py - INFO - Получение ответа сервера с разрешением или запретом подключения +2018-11-02 13:18:10,569 - Client.py - INFO - Посылка клиентом сервисного сообщения о присутствии +2018-11-02 13:18:10,569 - Client.py - INFO - Клиентская программа закрыта +2018-11-02 16:09:01,880 - Client.py - INFO - Запуск клиентской программы +2018-11-02 16:10:09,475 - Server.py - INFO - Запуск сервера +2018-11-02 16:10:12,836 - Client.py - INFO - Запуск клиентской программы +2018-11-02 16:10:12,837 - Client.py - INFO - Запрос клиента на подключение к серверу и авторизацию +2018-11-02 16:10:12,838 - Server.py - INFO - Получено сообщение от клиента +2018-11-02 16:10:12,838 - Server.py - INFO - Проверка авторизации, соединение разрешено +2018-11-02 16:10:12,838 - Server.py - INFO - Клиенту передано разрешение на соединение +2018-11-02 16:10:12,838 - Server.py - WARNING - Ошибка в параметрах связи, работоспособность восстановлена +2018-11-02 16:10:12,838 - Client.py - INFO - Получение ответа сервера с разрешением или запретом подключения +2018-11-02 16:10:12,839 - Client.py - INFO - Посылка клиентом сервисного сообщения о присутствии +2018-11-02 16:10:12,839 - Client.py - INFO - Клиентская программа закрыта diff --git a/Level2_lesson_5/server_log.py b/Level2_lesson_5/server_log.py new file mode 100644 index 0000000..7474e77 --- /dev/null +++ b/Level2_lesson_5/server_log.py @@ -0,0 +1,18 @@ +2018-11-02 13:19:40,456 - Server.py - INFO - Запуск сервера +2018-11-02 13:19:43,237 - Server.py - INFO - Получено сообщение от клиента +2018-11-02 13:19:43,237 - Server.py - INFO - Проверка авторизации, соединение разрешено +2018-11-02 13:19:43,238 - Server.py - INFO - Клиенту передано разрешение на соединение +2018-11-02 16:03:56,564 - Server.py - INFO - Запуск сервера +2018-11-02 16:04:00,583 - Server.py - INFO - Получено сообщение от клиента +2018-11-02 16:04:00,584 - Server.py - INFO - Проверка авторизации, соединение разрешено +2018-11-02 16:04:00,584 - Server.py - INFO - Клиенту передано разрешение на соединение +2018-11-02 16:05:53,099 - Server.py - INFO - Запуск сервера +2018-11-02 16:05:56,676 - Server.py - INFO - Получено сообщение от клиента +2018-11-02 16:05:56,676 - Server.py - INFO - Проверка авторизации, соединение разрешено +2018-11-02 16:05:56,676 - Server.py - INFO - Клиенту передано разрешение на соединение +2018-11-02 16:05:56,677 - Server.py - WARNING - Ошибка в параметрах связи работоспособность восстановлена +2018-11-02 16:11:24,200 - Server.py - INFO - Запуск сервера +2018-11-02 16:11:27,587 - Server.py - INFO - Получено сообщение от клиента +2018-11-02 16:11:27,587 - Server.py - INFO - Проверка авторизации, соединение разрешено +2018-11-02 16:11:27,587 - Server.py - INFO - Клиенту передано разрешение на соединение +2018-11-02 16:11:27,587 - Server.py - WARNING - Ошибка в параметрах связи, работоспособность восстановлена diff --git a/Level2_lesson_6/Client.py b/Level2_lesson_6/Client.py new file mode 100644 index 0000000..b9c0ded --- /dev/null +++ b/Level2_lesson_6/Client.py @@ -0,0 +1,63 @@ +# Программа клиента для отправки приветствия серверу и получения ответа +import sys +from socket import * +from datetime import datetime +import json +import logging +from main_logger import log + +#cleint_log = logging.getLogger('messager') # для совместного логгирования +#в общий лог +cleint_log = logging.getLogger('client') +cleint_log.setLevel(logging.INFO) +format = logging.Formatter("%(asctime)s - %(levelname)s - %(""message)s ") +client_file_handl = logging.FileHandler(r".\log\client.log", 'a',encoding='utf-8') +client_file_handl.setFormatter(format) +cleint_log.addHandler(client_file_handl) +#======================================================================= + + +@log +def client(IP_addr, port=777): + cleint_log.info('Запуск клиентской программы') + s = socket(AF_INET, SOCK_STREAM) # Создать сокет TCP + s.connect((IP_addr, int(port))) # соединиться с сервером + + timestamp = str(datetime.now()) + cleint_log.info('Запрос клиента на подключение к серверу и авторизацию') + authen_msg = { + "action": "authenticate", + "time": timestamp, + "user": { + "account_name": "C0deMaverick", + "password": "CorrectHorseBatterStaple" + } + } + json_autent_msg = json.dumps(authen_msg) + s.send(json_autent_msg.encode('utf-8')) + data = s.recv(1000000) + cleint_log.info( + 'Получение ответа сервера с разрешением или запретом подключения') + server_answer = json.loads(data) + + print('Ответ сервера: ', data.decode('utf-8'), ', длиной ', + len(data), 'байт получен') + + if server_answer["response"] == 200: # код ответа сервера == 'OK!' + timestamp = str(datetime.now()) + presence_msg = {"action": "presence", "time": timestamp, + "type": "status", + "user": {"account_name": "CodeMaverick", + "status": "Yep, I am here!"}} + cleint_log.info('Посылка клиентом сервисного сообщения о присутствии') + json_presence_msg = json.dumps(presence_msg) + s.send(json_presence_msg.encode('utf-8')) + else: + pass + + s.close() + cleint_log.info('Клиентская программа закрыта') + + +if __name__ == "__main__": + client('127.0.0.1', 8080) diff --git a/Level2_lesson_6/Server.py b/Level2_lesson_6/Server.py new file mode 100644 index 0000000..e347844 --- /dev/null +++ b/Level2_lesson_6/Server.py @@ -0,0 +1,65 @@ +# программа сервера для получения приветствия от клиента и отпраки ответа +import sys +from socket import * +import json +import logging +from main_logger import log + +serv_log = logging.getLogger('server') +serv_log.setLevel(logging.INFO) +format = logging.Formatter("%(asctime)s - %(levelname)s - %(""message)s ") +serv_file_handl = logging.FileHandler(r".\log\server.log", 'a', + encoding='utf-8') +serv_file_handl.setFormatter(format) +serv_log.addHandler(serv_file_handl) +#======================================================================= + +def check_user_authority(user): + if True: + serv_log.info("Проверка авторизации, соединение разрешено") + return True + else: + serv_log.critical("Проверка авторизации, в соединении отказано") + return False + +@log +def server(IP_addr, port=777): + serv_log.info('Запуск сервера') + s = socket(AF_INET, SOCK_STREAM) # Создает сокет TCP + s.bind((IP_addr, int(port))) # Присваивает IP аддрес и порт + s.listen(5) # Переход в режим ожидания запросов; + # одновременно обслуживается не более + # 5 запросов + while True: + print('Before accept()') + client, addr = s.accept() + print('After accept()') + data = client.recv(1000000) + print('Сообщение: ', data.decode('utf-8'), 'длиной: ', len(data), + ' байт, было отправлено клиентом: ', addr) + serv_log.info('Получено сообщение от клиента') + client_query = json.loads(data) + if client_query["action"] == "authenticate": + if check_user_authority(client_query["user"]): + asnswer_msg = {"response": 200, "alert": "Connection allowed"} + json_snswer_msg = json.dumps(asnswer_msg) + serv_log.info("Клиенту передано разрешение на соединение") + else: + pass + + client.send(json_snswer_msg.encode('utf-8')) + + try : + # имитация ошибки в работк сервера + raise ValueError("connection parameters error") + except ValueError: + serv_log.warning("Ошибка в параметрах связи, работоспособность " + "восстановлена") + + client.close() + cleint_log.info('Сервер закрыт') + + +if __name__ == "__main__": + server('127.0.0.1', 8080) + diff --git a/Level2_lesson_6/client.log b/Level2_lesson_6/client.log new file mode 100644 index 0000000..6f80a5f --- /dev/null +++ b/Level2_lesson_6/client.log @@ -0,0 +1,30 @@ +2018-11-06 15:21:49,122 - INFO - Запуск клиентской программы +2018-11-06 15:21:49,122 - INFO - Запрос клиента на подключение к серверу и авторизацию +2018-11-06 15:21:49,138 - INFO - Получение ответа сервера с разрешением или запретом подключения +2018-11-06 15:21:49,138 - INFO - Посылка клиентом сервисного сообщения о присутствии +2018-11-06 15:21:49,138 - INFO - Клиентская программа закрыта +2018-11-06 15:44:56,921 - INFO - Запуск клиентской программы +2018-11-06 15:44:56,921 - INFO - Запрос клиента на подключение к серверу и авторизацию +2018-11-06 15:44:56,921 - INFO - Получение ответа сервера с разрешением или запретом подключения +2018-11-06 15:44:56,921 - INFO - Посылка клиентом сервисного сообщения о присутствии +2018-11-06 15:44:56,921 - INFO - Клиентская программа закрыта +2018-11-06 15:46:11,614 - INFO - Запуск клиентской программы +2018-11-06 15:46:11,614 - INFO - Запрос клиента на подключение к серверу и авторизацию +2018-11-06 15:46:11,614 - INFO - Получение ответа сервера с разрешением или запретом подключения +2018-11-06 15:46:11,614 - INFO - Посылка клиентом сервисного сообщения о присутствии +2018-11-06 15:46:11,614 - INFO - Клиентская программа закрыта +2018-11-06 15:49:25,349 - INFO - Запуск клиентской программы +2018-11-06 15:49:25,349 - INFO - Запрос клиента на подключение к серверу и авторизацию +2018-11-06 15:49:25,349 - INFO - Получение ответа сервера с разрешением или запретом подключения +2018-11-06 15:49:25,349 - INFO - Посылка клиентом сервисного сообщения о присутствии +2018-11-06 15:49:25,349 - INFO - Клиентская программа закрыта +2018-11-06 15:50:18,623 - INFO - Запуск клиентской программы +2018-11-06 15:50:18,623 - INFO - Запрос клиента на подключение к серверу и авторизацию +2018-11-06 15:50:18,623 - INFO - Получение ответа сервера с разрешением или запретом подключения +2018-11-06 15:50:18,623 - INFO - Посылка клиентом сервисного сообщения о присутствии +2018-11-06 15:50:18,623 - INFO - Клиентская программа закрыта +2018-11-06 15:52:40,568 - INFO - Запуск клиентской программы +2018-11-06 15:52:40,568 - INFO - Запрос клиента на подключение к серверу и авторизацию +2018-11-06 15:52:40,568 - INFO - Получение ответа сервера с разрешением или запретом подключения +2018-11-06 15:52:40,568 - INFO - Посылка клиентом сервисного сообщения о присутствии +2018-11-06 15:52:40,568 - INFO - Клиентская программа закрыта diff --git a/Level2_lesson_6/main_logger.log b/Level2_lesson_6/main_logger.log new file mode 100644 index 0000000..37284a9 --- /dev/null +++ b/Level2_lesson_6/main_logger.log @@ -0,0 +1,2 @@ +2018-11-06 15:52:37,741 - INFO - Программа: server запущена с параметрами: ('127.0.0.1', 8080), {} +2018-11-06 15:52:40,568 - INFO - Программа: client запущена с параметрами: ('127.0.0.1', 8080), {} diff --git a/Level2_lesson_6/main_logger.py b/Level2_lesson_6/main_logger.py new file mode 100644 index 0000000..324f5bb --- /dev/null +++ b/Level2_lesson_6/main_logger.py @@ -0,0 +1,24 @@ +# программа сервера для получения приветствия от клиента и отпраки ответа +import sys +from socket import * +import json +import logging +from functools import wraps + +#======================================================================= +def log(func): + @wraps(func) + def wrapper(*args, **kwargs): + print(func.__name__) + main_logger_log = logging.getLogger('main_logger') + main_logger_log.setLevel(logging.INFO) + format = logging.Formatter("%(asctime)s - %(levelname)s - %(""message)s ") + serv_file_handl = logging.FileHandler(r".\log\main_logger.log", 'a', + encoding='utf-8') + serv_file_handl.setFormatter(format) + main_logger_log.addHandler(serv_file_handl) + main_logger_log.info("Программа: "+func.__name__+" запущена с параметрами: " + +str(args)+', '+str(kwargs)) + return func(*args, **kwargs) + return wrapper +#======================================================================= diff --git a/Level2_lesson_6/server.log b/Level2_lesson_6/server.log new file mode 100644 index 0000000..7b3862d --- /dev/null +++ b/Level2_lesson_6/server.log @@ -0,0 +1,30 @@ +2018-11-06 15:21:45,860 - INFO - Запуск сервера +2018-11-06 15:21:49,122 - INFO - Получено сообщение от клиента +2018-11-06 15:21:49,122 - INFO - Проверка авторизации, соединение разрешено +2018-11-06 15:21:49,122 - INFO - Клиенту передано разрешение на соединение +2018-11-06 15:21:49,138 - WARNING - Ошибка в параметрах связи, работоспособность восстановлена +2018-11-06 15:44:54,456 - INFO - Запуск сервера +2018-11-06 15:44:56,921 - INFO - Получено сообщение от клиента +2018-11-06 15:44:56,921 - INFO - Проверка авторизации, соединение разрешено +2018-11-06 15:44:56,921 - INFO - Клиенту передано разрешение на соединение +2018-11-06 15:44:56,921 - WARNING - Ошибка в параметрах связи, работоспособность восстановлена +2018-11-06 15:46:09,270 - INFO - Запуск сервера +2018-11-06 15:46:11,614 - INFO - Получено сообщение от клиента +2018-11-06 15:46:11,614 - INFO - Проверка авторизации, соединение разрешено +2018-11-06 15:46:11,614 - INFO - Клиенту передано разрешение на соединение +2018-11-06 15:46:11,614 - WARNING - Ошибка в параметрах связи, работоспособность восстановлена +2018-11-06 15:49:22,829 - INFO - Запуск сервера +2018-11-06 15:49:25,349 - INFO - Получено сообщение от клиента +2018-11-06 15:49:25,349 - INFO - Проверка авторизации, соединение разрешено +2018-11-06 15:49:25,349 - INFO - Клиенту передано разрешение на соединение +2018-11-06 15:49:25,349 - WARNING - Ошибка в параметрах связи, работоспособность восстановлена +2018-11-06 15:50:15,360 - INFO - Запуск сервера +2018-11-06 15:50:18,623 - INFO - Получено сообщение от клиента +2018-11-06 15:50:18,623 - INFO - Проверка авторизации, соединение разрешено +2018-11-06 15:50:18,623 - INFO - Клиенту передано разрешение на соединение +2018-11-06 15:50:18,623 - WARNING - Ошибка в параметрах связи, работоспособность восстановлена +2018-11-06 15:52:37,741 - INFO - Запуск сервера +2018-11-06 15:52:40,568 - INFO - Получено сообщение от клиента +2018-11-06 15:52:40,568 - INFO - Проверка авторизации, соединение разрешено +2018-11-06 15:52:40,568 - INFO - Клиенту передано разрешение на соединение +2018-11-06 15:52:40,568 - WARNING - Ошибка в параметрах связи, работоспособность восстановлена diff --git a/ReadMe.txt b/ReadMe.txt new file mode 100644 index 0000000..831f00f --- /dev/null +++ b/ReadMe.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SRHw03_easy.py b/SRHw03_easy.py new file mode 100644 index 0000000..2d23d07 --- /dev/null +++ b/SRHw03_easy.py @@ -0,0 +1,50 @@ +# Задание-1: +# Напишите функцию, округляющую полученное произвольное десятичное число +# до кол-ва знаков (кол-во знаков передается вторым аргументом). +# Округление должно происходить по математическим правилам (0.6 --> 1, 0.4 --> 0). +# Для решения задачи не используйте встроенные функции и функции из модуля math. + +#def my_round(number, ndigits): + # pass +#===================================================== + def my_round(number, ndigits): + numb1 = number * (10**ndigits) + int_part = numb1//1 + rational_part = numb1 - int_part + if (rational_part >= 0.5): + int_part +=1 + result = int_part/(10**ndigits) + return result + + +print(my_round(2.1234567, 5)) +print(my_round(2.1999967, 5)) +print(my_round(2.9999967, 5)) + +#===================================================== + +# Задание-2: +# Дан шестизначный номер билета. Определить, является ли билет счастливым. +# Решение реализовать в виде функции. +# Билет считается счастливым, если сумма его первых и последних цифр равны. +# !!!P.S.: функция не должна НИЧЕГО print'ить +# +#===================================================== + +def lucky_ticket(ticket_number): + + def sum_digits(digits_str): + sum1 = 0 + for i in range(len(digits_str)): + sum1 += int(digits_str[i]) + return sum1 + + if len(ticket_number)%2: + print ("Ошибка: чтобы проверить счастливый это номер билета или нет,он должен иметь четное количество цифр") + return False + numb_str = '%6s' % ticket_number + return sum_digits(numb_str[0:4]) == sum_digits(numb_str[3:]) + +print(lucky_ticket(123006)) +print(lucky_ticket(12321)) +print(lucky_ticket(436751)) \ No newline at end of file diff --git a/SRHw03_hard.py b/SRHw03_hard.py new file mode 100644 index 0000000..8629224 --- /dev/null +++ b/SRHw03_hard.py @@ -0,0 +1,111 @@ +# Задание-1: +# Написать программу, выполняющую операции (сложение и вычитание) с простыми дробями. +# Дроби вводятся и выводятся в формате: +# n x/y ,где n - целая часть, x - числитель, у - знаменатель. +# Дроби могут быть отрицательные и не иметь целой части, или иметь только целую часть. +# Примеры: +# Ввод: 5/6 + 4/7 (всё выражение вводится целиком в виде строки) +# Вывод: 1 17/42 (результат обязательно упростить и выделить целую часть) +# Ввод: -2/3 - -2 +# Вывод: 1 1/3 + +# Конечно, хорошо бы воспользовать регулятные выражения, но я пока, увы, слаб... +$и до упрощения тоже не добрался +""" +print("введите строку выражения с простыми дробями: дробь +(или)- дробь") +expression = input("дроби в формате n x/y ,где n - целая часть(не обязательная), x - числитель, у - знаменатель: ") +""" +expression = '2 5/6 + 3 4/7' + +def analyse_fraction(fraction_str): + whole = 0 # предполагаем, сто целой части нет + if (' ' in fraction_str): + #дробь имеет целую часть + whole =int(fraction_str.split(' ')[0]) + rational_part = fraction_str.split(' ')[1] + else: + rational_part = fraction_str + if ('/' in rational_part): + fr1 = rational_part.split('/') + divident = int(fr1[0]) + divisor = int(fr1[1]) + else: + whole = int(rational_part) + divident = 1 + divisor = 1 + return (whole, divident, divisor) + +splitted_expression = expression.split(' ') +if not ('/' in splitted_expression[0]): + #splitted_expression[0] - это целая часть дроби + fraction1 = splitted_expression[0]+' '+ splitted_expression[1] + sign_of_operation = splitted_expression[2] +else: + fraction1 = splitted_expression[0] + sign_of_operation = splitted_expression[1] +if (not('/' in splitted_expression[-2])) and (splitted_expression[-2]!='+'and (splitted_expression[-2]!= '-')): + #splitted_expression[-2] - это возможно целая часть второй дроби + fraction2 = splitted_expression[-2] +' '+ splitted_expression[-1] +else: + fraction2 = splitted_expression[-1] +fraction1_parts = analyse_fraction(fraction1) +#print(fraction1_parts) +fraction2_parts = analyse_fraction(fraction2) +#print(fraction2_parts) +if (sign_of_operation == '+') or (sign_of_operation == '-'): + operand1 = (fraction1_parts[1]*fraction2_parts[2]) + operand2 = (fraction2_parts[1]*fraction1_parts[2]) + if (sign_of_operation == '+'): + work_result_divident = operand1 + operand2 + else: + work_result_divident = operand1 - operand2 + result_divisor = fraction2_parts[2]*fraction1_parts[2] + whole_result = fraction1_parts[0] + fraction2_parts[0] + (work_result_divident//result_divisor) + result_divident = (work_result_divident % result_divisor) + print (expression, " = ", whole_result, result_divident,"/", result_divisor) + +#=================================================== + +# Задание-2: +# Дана ведомость расчета заработной платы (файл "data/workers"). +# Рассчитайте зарплату всех работников, зная что они получат полный оклад, +# если отработают норму часов. Если же они отработали меньше нормы, +# то их ЗП уменьшается пропорционально, а за заждый час переработки +# они получают удвоенную ЗП, пропорциональную норме. +# Кол-во часов, которые были отработаны, указаны в файле "data/hours_of" + + +# Задание-3: +# Дан файл ("data/fruits") со списком фруктов. +# Записать в новые файлы все фрукты, начинающиеся с определенной буквы. +# Т.е. в одном файле будут все фрукты на букву “А”, во втором на “Б” и т.д. +# Файлы назвать соответственно. +# Пример имен файлов: fruits_А, fruits_Б, fruits_В …. +# Важно! Обратите внимание, что нет фруктов, начинающихся с некоторых букв. +# Напишите универсальный код, который будет работать с любым списком фруктов +# и распределять по файлам в зависимости от первых букв, имеющихся в списке фруктов. +# Подсказка: +# Чтобы получить список больших букв русского алфавита: +# print(list(map(chr, range(ord('А'), ord('Я')+1)))) + +#=================================================== + +fruits=[] +for line in open(r'.\data\fruits.txt', 'r'): + fruits.append(line) + fruits.sort() +files_names = {} +for fruit in (fruits): + files_names[fruit[0]] = [('open_'+fruit[0]), False, fruit[0]] +for fruit in (fruits): + if not files_names[fruit[0]][1]: + #Значение False, т.е. файл для буквы "А" еще не открыт, открыть! + files_names[fruit[0]][0] = open(r'.\data\file_'+files_names[fruit[0]][2]+'.txt', 'w') + files_names[fruit[0]][1] = True + files_names[fruit[0]][0].write(fruit) + else: + files_names[fruit[0]][0].write(fruit) + +for key in files_names: + files_names[key][0].flush() + files_names[key][0].close() \ No newline at end of file diff --git a/SRHw03_normal.py b/SRHw03_normal.py new file mode 100644 index 0000000..19c6624 --- /dev/null +++ b/SRHw03_normal.py @@ -0,0 +1,74 @@ +# Задание-1: +# Напишите функцию, возвращающую ряд Фибоначчи с n-элемента до m-элемента. +# Первыми элементами ряда считать цифры 1 1 + +#===================================================== + +def fibonacci(n, m): + fibonacci_serie = [] + def fib(n): + if n<2: + return n + curr = fib(n-1) + fib(n-2) + return curr + for i in range(n, m): + fibonacci_serie.append(fib(i)) + return fibonacci_serie + +#===================================================== + +# Задача-2: +# Напишите функцию, сортирующую принимаемый список по возрастанию. +# Для сортировки используйте любой алгоритм (например пузырьковый). +# Для решения данной задачи нельзя использовать встроенную функцию и метод sort() + +#===================================================== + +def sort_to_max(origin_list): + new_list = origin_list[:] + for i in range(1,(len(new_list)-1)): + for j in range((len(new_list)-i)): + if int(new_list[j]) > int(new_list[j+1]): + (new_list[j]), (new_list[j+1]) = (new_list[j+1]), (new_list[j]) + return new_list + +sort_to_max([2, 10, -12, 2.5, 20, -11, 4, 4, 0]) +#===================================================== + +# Задача-3: +# Напишите собственную реализацию стандартной функции filter. +# Разумеется, внутри нельзя использовать саму функцию filter. + +#===================================================== + +def my_filter(function, iterable): + new_list =[] + for i in range(len(iterable)-1): + if function(iterable[i]): + new_list.append(iterable[i]) + return new_list + +#print(my_filter((lambda x: (x > 0)), [2, 10, -12, 2.5, 20, -11, 4, 4, 0])) + +#===================================================== + +# Задача-4: +# Даны четыре точки А1(х1, у1), А2(x2 ,у2), А3(x3 , у3), А4(х4, у4). +# Определить, будут ли они вершинами параллелограмма. + +""" +print("Введите, координаты 4х точек") +a1_x,a1_y = input("Введите координату 1й точки через ',': x,y : ") +a2_x,a2_y = input("Введите координату 1й точки через ',': x,y : ") +a3_x,a3_y = input("Введите координату 1й точки через ',': x,y : ") +a4_x,a4_y = input("Введите координату 1й точки через ',': x,y : ") +""" +a1_x,a1_y = 2,4 +a2_x,a2_y = 2,4 +a3_x,a3_y = 6,3 +a4_x,a4_y = 6,3 +#параллелограмм - это четырехугольник противоположные стороны которого попарно равны +if (abs(a1_x - a4_x) == abs(a2_x - a3_x)) and (abs(a1_y - a4_y) == abs(a2_y - a3_y)): + print ("данные точки являются вершинами параллелограмма") +else: + print ("данные точки не являются вершинами параллелограмма") diff --git a/SRhw02_easy.py b/SRhw02_easy.py new file mode 100644 index 0000000..5826f4e --- /dev/null +++ b/SRhw02_easy.py @@ -0,0 +1,65 @@ + +# -1: +# . +# , , +# . + +# : +# : ["", "", "", ""] +# : +# 1. +# 2. +# 3. +# 4. + +# : .format() + +#========================================================= + +fruits = ["", "", "", ""] +n_fruits = len(fruits) +i=0 +while i < n_fruits: + print ('%d %s' % ((i+1), fruits[i])) + i +=1 + +#========================================================= + +# -2: +# . +# , . + +#========================================================= + +list1 =[1, 2, 4, 5, 6, 2, 5, 2, 10, 25, 3, 8, 7] +list2 =[1, 2, 4, 5, 6, 2, 5, 2] +l1 = set(list1) +l2 = set(list2) +list1a = list(l1 - l2) +print(" =", list1) +print(" =", list2) +print(" , : ", list1a) + +#========================================================= + + +# -3: +# . +# , : +# , 4, , . +#========================================================= + +l =[1, 2, 4, 5, 6, 2, 5, 2, 10, 25, 3, 8, 7] +l2 = [] +i = 0 +while i < len(l): + a = int(l[i]) + if (a%2): + l2.append(a*2) + else: + l2.append(a/4) + i+=1 +print (" :", l) +print(":", l2) + +#========================================================= diff --git a/SRhw02_hard.py b/SRhw02_hard.py new file mode 100644 index 0000000..126d946 --- /dev/null +++ b/SRhw02_hard.py @@ -0,0 +1,78 @@ +# Задание-1: уравнение прямой вида y = kx + b задано в виде строки. +# Определить координату y точки с заданной координатой x. + +equation = 'y = -12x + 11111140.2121' +x = 2.5 +# вычислите и выведите y + +#Результатом вычисления по любому будет: y=11111140.212 10^1 первого слагаемого и 10^6 второго +#но, если как в армии:: "выполнить и доложить", то: +a = 'y = -12x + 11111140.2121' +c=a.split('x') +a1 = float(c[0].split('= ')[1]) +b = float(c[1].split('+ ')[1]) +x = 2.5 +y = a1*x + b +print (y) +#======================================================================= + +# Задание-2: Дата задана в виде строки формата 'dd.mm.yyyy'. +# Проверить, корректно ли введена дата. +# Условия корректности: +# 1. День должен приводиться к целому числу в диапазоне от 1 до 30(31) +# (в зависимости от месяца, февраль не учитываем) +# 2. Месяц должен приводиться к целому числу в диапазоне от 1 до 12 +# 3. Год должен приводиться к целому положительному числу в диапазоне от 1 до 9999 +# 4. Длина исходной строки для частей должна быть в соответствии с форматом +# (т.е. 2 символа для дня, 2 - для месяца, 4 - для года) + +# Пример корректной даты +date = '01.11.1985' + +# Примеры некорректных дат +date = '01.22.1001' +date = '1.12.1001' +date = '-2.10.3001' + +#======================================================================= +# Задачу не понял, не ясно по какому правилу приводить месяц в диапазон от1 до 12 +#перевести остаок в годы и добавить к числу лет? А куда переводит год 3001, +#он уже в целый и в доложном дипазоне?... +#======================================================================= + + +# Задание-3: "Перевёрнутая башня" (Задача олимпиадного уровня) +# +# Вавилонцы решили построить удивительную башню — +# расширяющуюся к верху и содержащую бесконечное число этажей и комнат. +# Она устроена следующим образом — на первом этаже одна комната, +# затем идет два этажа, на каждом из которых по две комнаты, +# затем идёт три этажа, на каждом из которых по три комнаты и так далее: +# ... +# 12 13 14 +# 9 10 11 +# 6 7 8 +# 4 5 +# 2 3 +# 1 +# +# Эту башню решили оборудовать лифтом --- и вот задача: +# нужно научиться по номеру комнаты определять, +# на каком этаже она находится и какая она по счету слева на этом этаже. +# +# Входные данные: В первой строчке задан номер комнаты N, 1 ≤ N ≤ 2 000 000 000. +# +# Выходные данные: Два целых числа — номер этажа и порядковый номер слева на этаже. +# +# Пример: +# Вход: 13 +# Выход: 6 2 +# +# Вход: 11 +# Выход: 5 3 + +#======================================================================= +#К сожалению решить не успеваю, ;о( +#Пока сдаю все, что успел решить, +#может успею позде, если задача не будет разбираться на уроке +#======================================================================= diff --git a/SRhw02_normal.py b/SRhw02_normal.py new file mode 100644 index 0000000..ff2dc5d --- /dev/null +++ b/SRhw02_normal.py @@ -0,0 +1,131 @@ + +# -1: +# , , , +# , +# +# +# : : [2, -5, 8, 9, -25, 25, 4] : [3, 5, 2] + +#========================================== + +import math +l =[1, 2, 4, -5, -6, 2, 8, 9, 10, 25, 3, 8, 7] +l2 = [] +i = 0 +while i < len(l): + if l[i]>0: + a = math.sqrt(l[i]) + b = '%3.3f' %a + c = b.split('.') + decimal_part = int(c[1]) + if (decimal_part == 0): + l2.append(int(c[0])) + i+=1 +print (" :", l) +print(":", l2) + +#========================================== + +# -2: dd.mm.yyyy, : 02.11.2013. +# , : 2013 . +# (2000 , 2010 ) + +datas_names = { +1: "", +2: "", +3: "", +4: "", +5: "", +6: "", +7: "", +8: "", +9: "", +10: "", +11: "", +12: "", +13: "", +14: "", +15: "", +16: "", +17: "", +18: "", +19: "", +20: "", +30: "", +} + +month_names = { +1: "", +2: "", +3: "", +4: "", +5: "", +6: "", +7: "", +8: "", +9: "", +10: "", +11: "", +12: "", +} + +data = "02.11.2013" +data2 = data.split('.') +day = int(data2[0]) +month = int(data2[1]) +if (day<20): + day_text = datas_names[day] +elif ( 20 <= day < 32 ): + day2 = (int(day/10))*10 + day3 = int(day%10) + if (day3 == 0): + day_text = datas_names[day2][:-1] +"" + else: + day_text = datas_names[day2] +" "+ datas_names[day3] +full_data = day_text +" "+ month_names[month] +" "+ data2[2] +" " +print (" dd.mm.yyyy:", data) +print (" :", full_data) + +#========================================== + +# -3: , +# -100 100. n - . +# : +# randint() random + +#========================================== + +import random +a = [] +n = 10 +for i in range( n ): + a.append(random.randint(-100,100)) +print (a) +#========================================== + +# -4: , . +# , : +# ) : +# , lst = [1, 2, 4, 5, 6, 2, 5, 2], lst2 = [1, 2, 4, 5, 6] +# ) , : +# , lst = [1 , 2, 4, 5, 6, 2, 5, 2], lst2 = [1, 4, 6] + +#=)======================================== +lst = [1, 2, 4, 5, 6, 2, 5, 2] +lst2 = [] +for elem in lst: + if (not (elem in lst2)): + lst2.append(elem) +print (lst2) +#=)======================================== +lst = [1, 2, 4, 5, 6, 2, 5, 2] +l = [] +lst2 =[] +for i in range (0, len(lst)-1): + l.append([lst[i], lst.count(lst[i])]) +for i in range (0, len(l)-1): + if (l[i][1]==1): + lst2.append(l[i][0]) +print (lst2) +#========================================== +