├── recursion ├── fibonacci.py ├── gen_recurse.py ├── grasshopper.py ├── merge_sort.py ├── turtle_koh.py └── matroska.py ├── numbers ├── one-way.py ├── digits.py ├── real2016-27.py ├── demo2016-27.py └── max3_number.py ├── README.md ├── catch_the_ball ├── game_canvas.py ├── widgets_testing.py └── ball.py ├── life_game ├── cell_automat.py ├── life_game.py ├── map1.txt └── map2.txt ├── .gitignore ├── x_and_o └── x_and_o_ai.py ├── graphs ├── count_components.py └── input_graph.py ├── massives └── sorting.py ├── волновой алгоритм └── task.py ├── the_gun └── gun.py └── LICENSE /recursion/fibonacci.py: -------------------------------------------------------------------------------- 1 | def fib(n): 2 | if n <= 1: 3 | return n 4 | else: 5 | return fib(n-1) + fib(n-2) 6 | 7 | -------------------------------------------------------------------------------- /recursion/gen_recurse.py: -------------------------------------------------------------------------------- 1 | def gen(n, prefix = []): 2 | if len(prefix) == n: 3 | print(*prefix) 4 | else: 5 | for digit in range(1, n+1): 6 | if digit not in prefix: 7 | gen(n, prefix + [digit]) 8 | 9 | gen(4) 10 | -------------------------------------------------------------------------------- /numbers/one-way.py: -------------------------------------------------------------------------------- 1 | N = 4 2 | m1 = None 3 | for i in range(N): 4 | x = int(input()) 5 | if x%2 == 0: 6 | if m1 == None or x > m1: 7 | m1 = x 8 | if m1 != None: 9 | print('максимальное чётное', m1) 10 | else: 11 | print('чётных чисел не было') -------------------------------------------------------------------------------- /numbers/digits.py: -------------------------------------------------------------------------------- 1 | x = int(input()) 2 | n = 0 3 | s = 0 4 | p = 1 5 | while x: 6 | digit = x%10 7 | n += 1 8 | s += digit 9 | p *= digit 10 | 11 | x //= 10 12 | 13 | print('количество цифр:', n) 14 | print('сумма цифр:', s) 15 | print('произведение цифр:', p) 16 | print('среднее арифметическое:', s/n) 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # kpk2016 2 | Репозиторий для сдачи проектов учащимися КПК Фоксфорд 2016 по информатике. 3 | Здесь будет находиться код Т.Ф., а также лучшие дополнения, прошедшие модерацию. 4 | Для собственных изменений просьба сделать себе форк данного репозитория и прислать на почту tkhirianov на сайте foxford.ru запрос: "КПК2016 нужна проверка" с указанием логина на GitHub. 5 | -------------------------------------------------------------------------------- /numbers/real2016-27.py: -------------------------------------------------------------------------------- 1 | N = int(input()) 2 | k = 2 3 | bad_delta = 20001 4 | s = 0 5 | delta_min = bad_delta 6 | for i in range(N): 7 | x, y = [int(word) for word in input().split()] 8 | s += min(x, y) 9 | if abs(x-y)%k != 0 and abs(x-y) < delta_min: 10 | delta_min = abs(x-y) 11 | if s%k != 0: 12 | print(s) 13 | elif delta_min != bad_delta: 14 | print(s + delta_min) 15 | else: 16 | print(0) 17 | -------------------------------------------------------------------------------- /recursion/grasshopper.py: -------------------------------------------------------------------------------- 1 | def find_shortest_path(price, n): 2 | C = [float('inf'), price[1]] + [0]*(n-1) 3 | for i in range(2, n+1): 4 | C[i] = price[i] + min(C[i-1], C[i-2]) 5 | print(*enumerate(C)) 6 | 7 | path = [n] 8 | i = n 9 | while i != 1: 10 | if C[i-1] < C[i-2]: 11 | i = i-1 12 | else: 13 | i = i-2 14 | path.append(i) 15 | path[:] = path[::-1] 16 | return path 17 | 18 | price = [0, 10, 2, 2, 1, 6, 2, 3, 0, 1, 3] 19 | path = find_shortest_path(price, 10) 20 | -------------------------------------------------------------------------------- /numbers/demo2016-27.py: -------------------------------------------------------------------------------- 1 | N = int(input()) 2 | # считываем в очередь первые 6 чисел 3 | Q = [int(input()) for i in range(6)] 4 | min_even = 1001 5 | beta = 1000001 6 | pos = 0 7 | for i in range(N-6): 8 | # первый элемент покидает очередь - и соревнуется с текущими минимальными 9 | x = Q[pos%6] 10 | min_x = min(min_x, x) 11 | if x%2 == 0 and x < min_even: 12 | min_even = x 13 | x = int(input()) 14 | beta = min(beta, x*min_even) 15 | if x%2 == 0: 16 | beta = min(beta, x*min_x) 17 | 18 | Q[pos%6] = x 19 | pos += 1 -------------------------------------------------------------------------------- /numbers/max3_number.py: -------------------------------------------------------------------------------- 1 | x = int(input()) 2 | m1 = m2 = m3 = -100000 3 | 4 | while x != 0: 5 | # обработка x: 6 | if x > m1: 7 | m1, m2, m3 = x, m1, m2 8 | m1_n, m2_n, m3_n = 1, m1_n, m2_n 9 | elif x == m1: 10 | m1_n += 1 11 | elif x > m2: 12 | m2, m3 = x, m2 13 | m2_n, m3_n = 1, m2_n 14 | elif x == m2: 15 | m2_n += 1 16 | elif x > m3: 17 | m3 = x 18 | m3_n = 1 19 | elif x == m3: 20 | m3_n += 1 21 | # считывание x для следующей итерации: 22 | x = int(input()) -------------------------------------------------------------------------------- /recursion/merge_sort.py: -------------------------------------------------------------------------------- 1 | def merge_sort(A): 2 | if len(A) <= 1: 3 | return A 4 | middle = len(A)//2 5 | L = merge_sort(A[:middle]) 6 | R = merge_sort(A[middle:]) 7 | return merge(L, R) 8 | 9 | def s(A): 10 | return A if len(A) <= 1 else merge(s(A[:len(A)//2]), 11 | s(A[len(A)//2:])) 12 | 13 | def merge(A, B): 14 | i = 0 15 | k = 0 16 | n = 0 17 | C = [0]*(len(A)+len(B)) 18 | while i < len(A) and k < len(B): 19 | if A[i] < B[k]: 20 | C[n] = A[i] 21 | i += 1 22 | else: 23 | C[n] = B[k] 24 | k += 1 25 | n += 1 26 | C[n:] = A[i:] + B[k:] 27 | return C 28 | 29 | -------------------------------------------------------------------------------- /catch_the_ball/game_canvas.py: -------------------------------------------------------------------------------- 1 | import tkinter 2 | 3 | 4 | def paint(event): 5 | """ Обработчик событий для холста canvas 6 | :param event: событие 7 | :return: ничего 8 | """ 9 | print(event.x, event.y) 10 | if event.widget != canvas: 11 | print('Странно, ведь paint() привязывали только к canvas...') 12 | return 13 | canvas.coords(line, 0, 0, event.x, event.y) 14 | 15 | 16 | root = tkinter.Tk() 17 | 18 | canvas = tkinter.Canvas(root, background='white', width=400, height=400) 19 | canvas.bind("", paint) 20 | canvas.pack() 21 | 22 | line = canvas.create_line(0, 0, 10, 10) 23 | for i in range(10): 24 | canvas.create_oval(2+i*40, 2+i*40, i*40+30, i*40+30, width=2, fill='green') 25 | 26 | root.mainloop() 27 | print("Эта строка будет достигнута только при выходе из приложения.") -------------------------------------------------------------------------------- /recursion/turtle_koh.py: -------------------------------------------------------------------------------- 1 | from turtle import * 2 | 3 | 4 | def koh_forward(L, n): 5 | if n == 0: 6 | t.forward(L) 7 | else: 8 | koh_forward(L/3, n-1) 9 | t.left(60) 10 | koh_forward(L/3, n-1) 11 | t.right(120) 12 | koh_forward(L/3, n-1) 13 | t.left(60) 14 | koh_forward(L/3, n-1) 15 | 16 | def demo(): 17 | for n in range(0, 4): 18 | t.color(colors[n]) 19 | t.penup() 20 | t.goto(-200, 0) 21 | t.pendown() 22 | koh_forward(300, n) 23 | 24 | def snowflake(): 25 | t.penup() 26 | t.goto(-150, 100) 27 | t.color('black', 'cyan') 28 | t.pendown() 29 | t.begin_fill() 30 | for edge in range(3): 31 | koh_forward(300, 4) 32 | t.right(120) 33 | t.end_fill() 34 | 35 | t = Turtle(shape='turtle') 36 | colors = ['gray', 'green', 'blue', 'orange', 'black', 'magenta', 'cyan'] 37 | t.speed(10) 38 | snowflake() 39 | -------------------------------------------------------------------------------- /life_game/cell_automat.py: -------------------------------------------------------------------------------- 1 | # -. coding: utf8 .- 2 | __author__ = "Timofey Khirianov" 3 | 4 | N = 150 5 | 6 | def cell_calculate(left, current, right): 7 | return left^right 8 | 9 | def calculate_field(field): 10 | """field -- список из N ноликов или единичек""" 11 | new_field = [0]*N 12 | for i in range(1, N-1): 13 | new_field[i] = cell_calculate(field[i-1], field[i], field[i+1]) 14 | field[:] = new_field 15 | 16 | def generate_field(): 17 | field = [0]*N 18 | x = N//2 19 | field[x] = 1 20 | return field 21 | 22 | def print_field(field): 23 | for cell in field: 24 | print('۞' if cell else ' ' , end = '') 25 | print() 26 | 27 | def modelling(): 28 | """ цикл моделирования клеточного автомата """ 29 | field = generate_field() 30 | print_field(field) 31 | for t in range(50): 32 | calculate_field(field) 33 | print_field(field) 34 | 35 | if __name__ == '__main__': 36 | modelling() 37 | -------------------------------------------------------------------------------- /recursion/matroska.py: -------------------------------------------------------------------------------- 1 | def matroska(n): 2 | if n == 1: 3 | print(' '*n + 'матрёшечка') 4 | else: 5 | print(' '*n + 'матрёшка №', n, '(верх)') 6 | matroska(n-1) 7 | print(' '*n + 'матрёшка №', n, '(низ)') 8 | 9 | def factorial(n): 10 | if n == 0: 11 | return 1 12 | else: 13 | print(' '*n + 'n =', n) # прямой ход рекурсии 14 | result = factorial(n-1)*n 15 | print(' '*n + 'n =', n) # обратный ход рекурсии 16 | return result 17 | 18 | counter = 0 19 | 20 | def power(a, n): 21 | global counter 22 | counter += 1 23 | 24 | if n == 0: 25 | return 1 26 | elif n%2 == 0: 27 | return power(a*a, n//2) 28 | else: # n - нечётное 29 | return power(a, n-1)*a 30 | 31 | def gcd(a, b): 32 | if b == 0: 33 | return a 34 | else: 35 | return gcd(b, a%b) 36 | 37 | def gcd(a, b): 38 | return a if b == 0 else gcd(b, a%b) 39 | 40 | 41 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | 27 | # PyInstaller 28 | # Usually these files are written by a python script from a template 29 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 30 | *.manifest 31 | *.spec 32 | 33 | # Installer logs 34 | pip-log.txt 35 | pip-delete-this-directory.txt 36 | 37 | # Unit test / coverage reports 38 | htmlcov/ 39 | .tox/ 40 | .coverage 41 | .coverage.* 42 | .cache 43 | nosetests.xml 44 | coverage.xml 45 | *,cover 46 | .hypothesis/ 47 | 48 | # Translations 49 | *.mo 50 | *.pot 51 | 52 | # Django stuff: 53 | *.log 54 | local_settings.py 55 | 56 | # Flask stuff: 57 | instance/ 58 | .webassets-cache 59 | 60 | # Scrapy stuff: 61 | .scrapy 62 | 63 | # Sphinx documentation 64 | docs/_build/ 65 | 66 | # PyBuilder 67 | target/ 68 | 69 | # IPython Notebook 70 | .ipynb_checkpoints 71 | 72 | # pyenv 73 | .python-version 74 | 75 | # celery beat schedule file 76 | celerybeat-schedule 77 | 78 | # dotenv 79 | .env 80 | 81 | # virtualenv 82 | venv/ 83 | ENV/ 84 | 85 | # Spyder project settings 86 | .spyderproject 87 | 88 | # Rope project settings 89 | .ropeproject 90 | -------------------------------------------------------------------------------- /catch_the_ball/widgets_testing.py: -------------------------------------------------------------------------------- 1 | import tkinter 2 | 3 | 4 | def button1_command(): 5 | print('Button 1 default command.') 6 | 7 | 8 | def print_hello(event): 9 | print(event.num) 10 | print(event.x, event.y) 11 | #print(event.x_root, event.y_root) 12 | me = event.widget 13 | # что можно сделать с me? 14 | if me == button1: 15 | print('Hello!') 16 | elif me == button2: 17 | print('You pressed button 2!') 18 | else: 19 | raise ValueError() 20 | 21 | 22 | def init_main_window(): 23 | """ 24 | Инициализация главного окна: создание всех необходимых виджетов и их упаковка. 25 | :return: 26 | """ 27 | global root, button1, button2, label, text, scale 28 | 29 | root = tkinter.Tk() 30 | 31 | button1 = tkinter.Button(root, text="Button 1", command=button1_command) 32 | button1.bind("