Что делать дураку

Я очень хреново играю в игры, которые требуют построения глубокого дерева решений. Например, в шахматы. Даже на небольшой сложности практически любая шахматная программа меня нагибает. Вот почему-то мне это не даётся, и никогда не давалось. Больше скажу — мне настолько неприятно пытаться заставить мой мозг учиться это делать, что скорее всего, я никогда этому искусству и научусь.

То же самое касается решения каких-то математических головоломок. Каким-то хитрым образом сложить вместе цифры, чтобы получить что-то нужное у меня просто не получается. Какие-нибудь судоку, например. Ненавижу их.

Но зато я могу написать алгоритм, который любую из подобных задач решает за доли секунды. Любые самые зубодробительные судоку я могу решить за 0.24 секунды (засекал, программа на Джаве). Интересно даже, что те судоку, что считаются наиболее сложными для человека, программа решает быстрее, чем те, которые считаются простыми. Видимо, что просто для человека, сложно для компьютера, и наоборот.

Натолкнулся на подобную задачку у avva. Берём четыре заданных числа. Можно переставлять их как хочется. Из инструментов — все четыре действия арифметики и скобки. Сумма должна получиться 24.

Простая задачка:

2,3,3,6

2 * 3 * 3 + 6 = 24

Сложная задачка:

1, 3, 4, 6

6 / (1 – 3/4) = 6/(1/4) = 6*4 = 24

Вы думаете, я руками решал? Да ну нахер такое, ненавижу.

Это менее 20 строчек на Питоне (на чём же ещё, если надо быстро):

from itertools import permutations

all_numbers = ['1','3','4','6']
all_actions = ['*','/','+','-']
all_parens = [['','','','','',''],['(','',')','','',''],['','(','','',')',''],['','','','(','',')'],['(','','','',')',''],['','(','','','',')'],['(','',')','(','',')']]

numbers = list(permutations(all_numbers))

for number in numbers:
	for i in range(0,len(all_actions)):
		for j in range(0,len(all_actions)):
			for k in range(0,len(all_actions)):
				for parens in all_parens:
					try:
						if (eval(parens[0] + number[0] + all_actions[i] + parens[1] + number[1] + parens[2] + all_actions[j] + parens[3] + number[2] + parens[4] + all_actions[k] + number[3] + parens[5]) == 24):
							print(parens[0] + number[0] + all_actions[i] + parens[1] + number[1] + parens[2] + all_actions[j] + parens[3] + number[2] + parens[4] + all_actions[k] + number[3] + parens[5])
							quit()	
					except ZeroDivisionError as e:
						print(e)

Не получилось только как-то алгоритмизировать создание скобок. Скобки, они, блин, хитрые. ()(), например, не палиндром. А ())( — палиндром. Поэтому в лоб написал все возможные варианты, благо, их немного.

Что делать дураку? Писать алгоритмы!!!