import random

# Крестик и нолик (Обучающая выборка)
cross = list(
    '10001'+
	'01010'+
	'00100'+
	'01010'+
	'10001')
zero = list(
    '11111'+
	'10001'+
	'10001'+
	'10001'+
	'11111')

# Список всех вышеуказанных фигур
training = [zero, cross]
 
# Виды фигур (Тестовая выборка)
test1 = list(	#нолик
    '10111'+
	'10001'+
	'10001'+
	'01001'+
	'11111')
test2 = list(	#нолик
    '11111'+
	'10001'+
	'10001'+
	'01001'+
	'01110')
test3 = list(	#нолик
    '10111'+
	'01001'+
	'10001'+
	'01001'+
	'01110')
test4 = list(	# крестик
    '00001'+
	'01010'+
	'00100'+
	'01010'+
	'10010')
test5 = list(	# крестик
    '10010'+
	'01010'+
	'00100'+
	'01010'+
	'10001')
test6 = list(	# крестик
    '10001'+
	'01010'+
	'01100'+
	'00101'+
	'11000')
 
# Инициализация весов сети
weights = []
for i in range(25):
    weights.append(0)
 
# Порог функции активации
bias = 11
 
# Является ли данная фигура крестиком
def proceed(figure):
    # Рассчитываем взвешенную сумму
    net = 0
    for i in range(15):
        net += int(figure[i])*weights[i]
 
    # Превышен ли порог? (Да - сеть думает, что это крестик. Нет - сеть думает, что это нолик)
    return net >= bias
 
# Уменьшение значений весов, если сеть ошиблась и выдала 1
def decrease(figure):
    for i in range(15):
        # Возбужденный ли вход
        if int(figure[i]) == 1:
            # Уменьшаем связанный с ним вес на единицу
            weights[i] -= 1
 
# Увеличение значений весов, если сеть ошиблась и выдала 0
def increase(figure):
    for i in range(15):
        # Возбужденный ли вход
        if int(figure[i]) == 1:
            # Увеличиваем связанный с ним вес на единицу
            weights[i] += 1
 
def result(figure):
    if proceed(figure):
        return "Крестик"
    else:
        return "Нолик"
 
# Тренировка сети
for i in range(10000):
    # Генерируем случайное число от 0 до 1
    option = random.randint(0, 1)
    figure = training[option]
	
    # Если получился нолик
    if option == 0:
        # Если сеть выдала True/Да/1, то наказываем ее
        if proceed(figure):
            decrease(figure)
    # Если получился крестик
    else:
        # Если сеть выдала False/Нет/0, то показываем, что эта фигура - то, что нужно
        if not proceed(figure):
            increase(figure)

# Прогон по обучающей выборке
print("zero - какая  фигура? ", result(training[0]), '\n')

print("cross - какая фигура? ", result(training[1]), '\n')
 
# Прогон по тестовой выборке
print("Test1 (нолик): ", result(test1))
print("Test2 (нолик): ", result(test2))
print("Test3 (нолик): ", result(test3))
print("Test4 (крестик): ", result(test4))
print("Test5 (крестик): ", result(test5))
print("Test6 (крестик): ", result(test6))