Карманный Скайнет

По наводке ув. ny-quant. На видеокарте я запустить не смог, потому что у меня лапки. С форком GPT4AllGPU почему-то надо приставлять отдельную модель LLaMa, которую надо скачивать самому, и я не смог разобраться, какую. Поэтому запустил на процессоре.

С трудом, надо сказать, запустил. У меня восемь пеньков i7 десятого поколения и 64 гектара памяти:

Ответ на простой вопрос (как лучше всего гладить кошку) занимает минуту-две. А вот креативная деятельность (напиши мне поэму про сисадмина) уже йок, может пиликать минут десять и больше.

Запускаю через третий питон внутри WSL2.

Установить:

pip3 install nomic

Потом в интерактивном python3:

from nomic.gpt4all import GPT4All (в первый раз занимает очень много времени, скачивает натренированную модель)
m = GPT4All()
m.open()
m.prompt(“Write me a short story about a kitten”)

Я нарисовал простейший код чтобы общаться. Увы, грёбаное форматирование наверняка похоронит отступы:

#!/usr/bin/python3
from nomic.gpt4all import GPT4All
m=GPT4All()
m.open()
while(True):
prompt = input("Please ask me something or say STOP to quit: ")
if (prompt == "STOP"):
break
else:
response = m.prompt(prompt)
print(response)

Поиграюсь, но ресурсоёмкость, конечно, аховая.

Update: барахло полное. ЧатЖПТ хотя бы правильно на простые вопросы отвечал. Этот даже не знает, как запустить внешнюю программу с указанием параметров из скрипта на ПауэрШелле.

Адобе Светлячок

Ув. dibr высказался, мол, в последнее время системы ИИ вдруг полезли как чортики из табакерки. Выкатили DALL-E и как плотину прорвало — тут же появился Миджёрни, Стейбл Диффьюжен и прочая. Появился ChatGPT и ОПА — тут же выскочил Микрософт со своим роботом-говорилкой, Гугл подсуетился.

И это действительно так. По-моему, внутри технологических компаний назрела какая-то критическая масса наработок на нейронных сетях, сейчас она рванула и мы наблюдаем этот ядерный взрыв и разлёт осколков.

И говорилки теперь могут действительно многое. Например, у меня был вопрос в области IT как сделать одну вещь на ПауэрШелле. Я долго и безуспешно искал ответ в интернетах, и никак не мог найти. Сотрудник надоумил — “спроси у ChatGPT!” И действительно, спросил — и мне тут же дали 100% рабочее решение. Робот-говорилка во много раз круче поисковых систем.

Что до наличия тут какого-то разума… дорогие мои читатели, я не вижу тут разума. Есть такая вещь — цепь Маркова. Её придумал выдающийся русский математик Андрей Андреевич Марков-старший. Что это такое? Ну, детали можно найти хоть в Википедии, но вот на простом примере можно взять любое слово. Последовательность букв в нём неслучайна. Например, после согласных чаще идёт гласная, чем согласная. И все эти вероятности можно вычислить, после чего написать генератор слов, где вероятность возникновения одной буквы после другой будет совпадать с нашими изысканиями. К слову скажу, что цепи Маркова широко употребляются для взлома паролей, так как пароли, созданные человеком, тоже подчиняются определённым законам.

Все эти роботы-говорилки — это МЕГА-натренированные МЕГА-сложные МЕГА-генераторы МЕГА-цепей Маркова, их более расширенного варианта, в которых не буквы, а слова зависят друг от друга, от их последовательности в предложении, и от других предложений. Это, безусловно, очень круто, и действительно заслуживает похвал, но это не делает систему разумной. Во всяком случае, ПОКА, на текущий момент.

Скажу только, что на мой взгляд, наличие разума предполагает наличие сознания, но что такое сознание, определение я дать уже не возьмусь, кроме как через революционное чутьё, а по-другому я не дорос ишшо.

Всё это была присказка.

Хотел я поделиться ещё одним инструментом для создания “картинок из текста”, Адобе Файрфлай (Светлячок), который сейчас проходит бета-тестирование. Так как я рисовать не умею от слова “совсем”, к моим кривым рукам приходится приставлять робота, нехай рисует за меня.

Скажу вот что. Как настоящему художнику, так и художнику, вооружённому ИИ, проще всего рисовать то, чего нет. Как гласит древняя легенда, рисовать демона проще, чем собаку — ибо демон есть существо воображаемое, каким ты его видишь — таким он и есть. А как выглядят собаки, знают все, и нарисовать её так, чтобы было понятно, что это собака — уже непросто. Даёшь задачу ИИ нарисовать инопланетный корабль — оно рисует. И хрен придерёшься, ты что ли, сам его видел, чтобы сказать, что “непохоже”? А вот дать задачу рисовать что есть, особенно людей — и на выходе получается настолько забористая пурга, что никаких грибов с кетамином не надо.

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

“Красивая улыбающаяся азиатская молодая женщина, одетая в платье в красную клеточку, собирает светящиеся цветы на закате в лесу”:

Через откровенную жопь тут сделана только одна деталь — рукава на платье не совпадают, они разные. И воротник какой-то странный. Но вы поглядите на этот свет! И как хорошо он показан — как закатный, так и свет от цветов! Я впечатлён, серьёзно.

И ещё одна. Вот тут уже есть серьёзные артефакты — пальцы, артефакты на платье. Но очень недурно, на мой взгляд. Если не с колёс публиковать, а хотя бы доработать в Шопе — вполне норм!

Свет отработан отлично. Рекомендую.

Кроме того, когда Светлячка наконец допилят, его картинки с гарантией не будут нарушать ничей копирайт — Адобе клянётся-божится, что тренировал нейросети на своих собственных стоковых картинках (которых у него до пупа) и на картинках с открытым копирайтом. Учитывая наличие уже существующией толпы судебных исков, кому-то может быть критично.

Лопух, а не дальнобойщик

Целую неделю занимался своим полуприцепом: докрашивал, доваривал, досверливал и допаивал. Наконец-то почти всё доделал — за одним небольшим, но очень неприятным исключением.

Прицепы положено не только надёжно сцеплять с тягачом, но и подключать на них светотехнику: стоп-сигналы, габариты, поворотники, и прочая. На большинстве стандартных американских полуприцепов используется плоский четырёхконтактный разъём (flat four plug): масса, левый поворотник, правый, габариты. А где стоп-сигнал? Стоп сигнал — оба поворотника включаются сразу. Так что стандартный американский полуприцеп показывает поворот одним из стоп-сигналов. А фонарь заднего хода тут отсутствует как класс.

На моём пикапе семиконтактный разъём. Ну, я подумал, что он более продвинутый, разлысил лоб и установил в полуприцеп задние фонари с прицепа как у больших бородатых дальнобойщиков. Чтобы, понимаешь, и фонарь заднего хода был и поворотники были ж0лтенькие — так в моём понимании эстетичнее и правильнее, чем стопами сигналить. И угодил в фигачечную — ибо три дополнительных контакта добавляют только лишний провод с +12 (включать, например, в буксируемом доме на колёсах свет), контакт для электромеханических тормозов и фонарь заднего хода. А выделенных поворотников там как не было, так и нет.

Очень обидно стало, в первую очередь — на себя. Прицепил сейчас так, чтобы сигналить стопами, а поворотники у меня сейчас так, получаются… для мебели.

Однако быстро выяснилось, что не я один такой. И что, оказывается есть такая штука, которая из двух проводов для поворотников/стоп-сигналов делает три — два поворотника плюс стоп-сигнал. Но она стоит денег, во-вторых, боится влаги, а в-третьих, в интернетах пишут, что у неё внутре… нет, не неонка, а обычное реле, и что она из-за этого очень плохо работает со светодиодами — надо нагрузочные резисторы вешать.

Я начал думать, и в принципе-то не должно же быть так сложно — нельзя ли тут обойтись тупо логическими элементами XOR и AND с обвязкой? AND — если оба поворотника включены, то это не поворотники, а стопы. А если только один (XOR) — то поворотник.

Но тут же осознал, что не получится — а как быть, если при торможении включить поворотник? Тогда ведь во время отключении при мигании одного из поворотников XOR решит, что он один такой включён — и зажжёт поворотник противоположный, потенциально создавая нехорошую ситуацию на дороге. И что теперь? Микроконтроллер, что ли, туда запихивать, с отслеживанием состояний? “А пять секунд назад начали торможение, значит, теперь прерывание одного рассматривать как поворотник”? Нет, я могу, конечно, но… блин.

Мне даже интересно стало, а как же в конвертере они эту проблему решили. Неужели там микроконтроллер? Что-то я недопетриваю, должно всё быть проще.

PS: Роскошное сочетание тегов, раскошное. Люблю, когда так получается — сразу много всего.
PPS: Интересно, можно ли модифицировать разъём так, чтобы стопы не посылать на поворотники? Тогда я бы стопы брал с контакта для электромеханических тормозов.

PZEM-004

У меня дома с электричеством как-то не очень в последнее время. Откуда-то прилетает очень много гармоник, а один из моих бесперебойников часто щёлкает релюшками.

Решил померять, как у меня вообще с напряжением, может быть действительно часто пропадает? Долго чесал репу, думал покупать трансформатор для дверных звонков, делать развязку… но всё оказалось проще. По совету ув. ua9uqb купил плату серии PZEM-004, где всё это уже было.

Плату разрабатывали и делали китайцы, но я был очень приятно удивлён её продуманностью.

Основой платы является какая-то ИС V9881D, на которую я сходу не нашёл никакой документации. Предположу, что это какая-то китайская схема для электрических счётчиков.

Вид платы сверху:

Слева у этой штуки торчит серийный порт, отвязанный от основной платы оптронами Сити Микро CT817C (два белых прямоугольничка). Причём под ними в плате с запасом сделан вырез, что абсолютно верно — чтобы не было пробоя, если на плате будет осадок в виде пыли, конденсации, и прочего.

Снизу плата тоже сделана хорошо. Пурпурненьким я обвёл контакт, куда подводится фаза. Между ней и нулём тоже сделан вырез, и земляной полигон отделён от неё почтительным расстоянием:

В-общем, когда её делали, люди думали, чтобы не йохнуло. Хотя видно, что паяли руками, а флюс-то неплохо было бы отмыть. Но ладно, работе электроники это не препятствует.

Кто-то подцепляется к ней через ардуино и прочие микроконтроллеры, но я поступил проще — приобрёл с ней в комплекте шнурок USB-serial, и подцепил к старенькому нетбуку под Убунтой Мейт. Если таки йохнет, то не жалко.

За что мы любим язык программирования Питон? Не за косорукий синтаксис и не за неудобство дебаггинга. Мы любим язык программирования Питон за то, что для него есть туева хуча библиотек, способных решать самые разные проблемы. В том числе — и библиотека с общением с модулями PZEM-004, modbus-tk, вот так, например.

Поэтому вся программа сводится к десяти строчкам кода, выводящим всё в файл CSV, который затем можно скормить чему угодно, хоть экселю. Считывать показания модуля получается примерно два раза в секунду, так что за три дня я насобирал статистики аж на сто двадцать мегабайт. Эксель и Пауэр Би-Ай долго кряхтели, но визуализировать всё это так и не смогли — у меня кончилось терпение.

Опять же, друзья, за что мы любим Питон? За то, что там есть plotly и pandas, при помощи которых в три строчки можно визуализировать хоть чорта бритого, хоть лысого, хоть бородатого.

Получилось, в общем, не очень интересно — напряжение держалось очень неплохо, от 119.0 вольт до 122.3. Ну, отрицательный результат — тоже результат. Значит, не в электричестве было дело. Бесперебойник такой. Надо будет его заменить, пока он мне батарейку не испортил.

А модуль PZEM-004 крайне рекомендую, полезный.

Pwn2Own

Есть такая забава у хакеров, что-то типа Олимпиады, называется Pwn2Own. Собираются разные команды, озвучиваются цели, например, “Ломаем защиту Ворда” или “Хакаем аутентификацию у Микрософт Тимз”. Команды затем подписываются выполнить различного рода задачи, и по общему количеству задач и их сложности получаются очки и зарабатываются места в общем зачёте. Также команды получают неплохие денежные призы — ибо конторы обычно платят несколько десятков тысяч долларов за обнаруженные дыры.

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

Лидером по взломанности оказался полностью пропатченный телефон Самсунг S22 на ОС Андроид (гы-гы-гы). Его взломали в первый же день, а на третий день состязания его взломали всего за 55 секунд, что стало новым рекордом состязания Pwn2Own. Использовалась дыра в недостаточно хорошей валидации ввода (блин, до сих пор? в 2022 году? рехнуться). Вообще этот несчастный телефон суммарно изнасиловали раз десять. Ждите обновлений от Самсунга.

А знаете, какие телефоны ни одна команда не взялась ломать?

Гугл Пиксель и Эппл айФон.

О чем это говорит? Да о том, блин, о чём я уже сколько раз писал в этой стенгазете — когда одна и та же контора делает и само железо телефона, и она же пишет к нему ОС — получается намного более непробиваемая и намного менее глючная платформа, чем когда одни шлёпают железо, а другие рисуют к нему операционку. Когда “айн фирма, айн бетрибссистем, айн телефон” — возникает некая синергия, недоступная просто сборищу смежников.

Делайте выводы. Самсунгу пламенный привет в очередной раз.

https://www.zerodayinitiative.com/blog/2022/5/18/pwn2own-vancouver-2022-the-results

Производительность PowerShell

Слушайте, почему встроенные в шелл объекты данных имеют такую жуткую производительность?

Вот создал я динамиццкий массив:

$array = @()

И после этого я добавляю в него записи:

$array += $record

Как только количество записей в нём становится более примерно двух тысяч, оно начинает просто ДИЧАЙШЕ тормозить. measure-command говорит, что на каждую операцию уходит аж до 10 миллисекунд! Что, кажется быстро? Создать массив из 50 тысяч записей (по современным меркам — это вообще ни о чём) потребует почти десяти минут времени.

Хорошо хоть, что шелл умеет в использование дотнетовских объектов:

$array = [System.Collections.ArrayList]::new()

После чего $array.Add($record) на 50 килозаписей улетает по трубам процессора просто со свистом.

Но чрезвычайно низкая производительность встроенных структур данных, прямо скажем, удивила. Я, конечно, не ожидал производительности Джавы, но как-то оно тово, удручает.

Искусственный Шишкин

Я всегда очень любил картины Шишкина. Все они по-своему прекрасны, и тенистые “Пейзаж с охотником”, “Лес вечером” и светлые, воздушные, прозрачные “Рожь” или “Полдень”.

Но увы, Аллах обделил меня талантом художника. Вернее, скажем так — он обделил меня способностью получать удовольствие от процесса рисования. Никто из нас не умеет писать картины от рождения. Но те, кто ЛЮБЯТ рисовать, и получают от этого удовольствие, НЕ МОГУТ НЕ рисовать, и рано или поздно, постоянно практикуясь, могут развить нешуточный дар живописца.

Это справедливо для любой области человеческой деятельности. Вот я получаю удовольствие от играния с компьютерами — ну, вот я этим и занимаюсь, а так как мне этот процесс интересен, то я практикуюсь в этом постоянно, и постепенно научился всякому. То же самое можно сказать про кого угодно. Писатели не могут не писать, певцы не могут не петь, гитаристы не могут не играть на гитаре, и так далее.

Ну, а меня от процесса рисования не прёт, поэтому рисовать я так никогда и не научился.

Зато знаете кто научился рисовать? Искуственный интеллект! Эти самые нейросети, в которые я уже давно безнадёжно влюбился с того времени, когда создал свою первую сеть и научил её всякому. Современная техника дошла до того, что ей можно сказать примерно вот так: а здесь пусть будет лес, кустарник, и чтобы речка была, а на горизонте — чтобы горы. И чтобы солнце, песочек, и облачка. И представляете себе — оно таки рисует.

Вот что у меня получилось всего после 15 минут прыгания по кнопкам в программе NVidia Canvas:

Чо, круто??? Не, ну, понятно, что не Шишкин. Но для меня, для которого “палка-палка-огуречик” это крупное достижение, это просто охрененно. Ну, и оленя справа я в Фотошопе вклеил.

Конечно, видно, что лесокустарник рисован как бы паттернами, взятыми из фотографий, на которых эти сети тренировали. Но думаю, что это дело наживное — NVidia Canvas сейчас только в бета-версии, и её ещё допилят.

А как выглядело то, что делал я, указывая сети “а вот тут лес, а вот тут речка”? А вот так:

Программа NVidia Canvas распространяется бесплатно, но имеет нешуточные системные требования. Понадобится видеокарта не ниже NVidia RTX. Я как раз сегодня проапгрейдился на RTX 3080, и немедленно наживил! Кому бы спасибо сказать, что грёбаный биткоин рухнул, и криптопидарасы перестали отрывать видеокарты с руками?

Кстати, интересный правовой вопрос — а КОМУ в данном случае принадлежит копирайт на эту картину? Мне? Или программе NVidia Canvas? А где находится эта тонкая грань? А когда ИИ будет обладать всё большей и большей автономностью, куда она сдвинется? А какие вообще у нас права будут даны полному ИИ?

И вот уже на нас ласково смотрит старина Филип К. Дик, в обнимку с Риком Декардом. За что мы любим научную фантастику? Не только за то, что “там круто и про роботов”. А в первую очередь за то, что именно фантасты задают вопросы, до которых человечество ещё не додумалось. А рано или поздно на них придётся отвечать. Как уже сейчас приходится отвечать на вопросы “кого будет давить насмерть робот-автомобиль, если столкновение неизбежно?” Одного ребёнка или десять бабушек?

Вперёд, к тёплому ламповому аналогу!

Очень интересные нынче развития технологий намечаются. Огромной основой большого количества современных программ являются нейросети. Нейросети у нас нынче растут аки это самое в деревенском сортире, куда дрожжи кинули. Адски растёт количество параметров (взвешенных связей) между нейронами.

Набор параметров кажого нейрона представляет собой матрицу, и чтобы посчитать, активируется ли нейрон или нет, надо помножить вес каждой связи на входное значение этой связи, и смотреть, что получится. Математически выражаясь, считается скалярное произведение.

Количество параметров гугловской нейросети Inception третей версии — примерно 12 миллионов. То-есть, каждый раз мы считаем скалярное произведение матрицы с 12 миллионами элементов с точно такой же матрицей. Очень, очень вычислительно дорогое удовольствие.

Что с этим можно сделать? А, например, вот что. Можно каждый параметр представить резистором. Входное значение — поданное на него напряжение, вес — проводимость. Проводимость — величина, обратная сопротивлению: G = 1/R или же R = 1/G

А теперь закон Ома:

I = U/R, а R заменим 1/G: I = U/(1/G), упростим: I = UG. Подаём входное напряжение, и меряем ток. Вот вам и скалярное произведение, причём чисто аналоговыми методами.

Но хардверный резистор, разумеется, не очень удобно. Зато знаете, что удобно? Флеш-память! Флеш представляет собой миллиарды полевых транзисторов с изолированным затвором, ведущих себя как резисторы. Изначально на них хранили только 0 или 1, ток выше или ниже порогового значения считывался как ноль или единица. Потом сделали многоуровневую флеш-память, и на современных твёрдотельниках QLC каждая ячейка хранит аж 16 значений (4 бита). Теперь пошли дальше, и на этих электрически программируемых резисторах научились производить самые настоящие аналоговые вычисления, очень интересным применением которых и являются расчёты скалярных произведений для работы нейросетей.

Очень, очень интересные нынче вещи придумывают. Как вам такое — расчёты на жёстком диске?

Конечно, у подобного подхода есть недостатки: более низкая точность вычислений. Но нейросети, вообще-то и так работают по вероятностному принципу. Какая тебе, в сущности, разница, если нейросеть определяет фотки котиков с 99% точностью или “только” с 95%?

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

Игра для мальчишек и дяденек

С огромным удовольствием режусь со старшим сыном в прекрасную игру Scrap Mechanic. Это, как бы сказать, Майнкрафт с инженерным уклоном.

Фабула такова: ты совершаешь аварийную посадку на какой-то планете с некогда высокоразвитой агроцивилизацией. Люди на этой планете практически исчезли, и остались только агротехнические роботы, которые от времени разладились и ведут себя, прямо скажем, неподобающе. Например, норовят засадить вилами прямо по башке. Или скосить игрока огромным серпом вместе с сеном и полить его ядохимикатами.

Смысл игры в том, чтобы выжить и не умереть с голоду. Точно так же, как и в Майнкрафте, нужно добывать себе еду. Съедобная фауна хоть и существует (и представлена симпатичными коровами), но непроста в приготовлении, поэтому лучше сконцентрироваться на выращивании овощей. В этом тоже есть свои сложности: если засеять сразу слишком большое поле, то набегут роботы и попытаются все посевы уничтожить — на этой планете выращивать еду разрешено только автоматам. Большие поля называются “нелегальными” и ночью к тебе приходит массовка роботов с целью разобраться, чьи в лесу шишки. И чем поле больше, и чем более ценные овощи там выращиваются (например, очень ценны брокколи), тем более крупная и опасная тусовка к тебе заявляется. Поэтому приходится выкручиваться: засевать много маленьких полей или же обильно удобрять поля с целью ускорить созревание овощей, чтобы успеть убрать урожай до прибытия аграрной полиции.

Но самый смак игры — в построении разного рода техники: автомобилей, грузовиков, тягачей, буровых установок, танков для борьбы с роботами, и так далее. Физика в игре сделана очень неплохо, и можно даже построить летающую технику. Но, опять же, из-за неплохой физики управлять ею крайне непросто. У меня ушёл битый час, чтобы сконструировать квадкоптер, на котором я бы не разбивался сразу же после взлёта. И ещё полчаса — чтобы научиться более-менее прилетать туда, куда надо мне, а не куда боги пришлют.

Есть самые разные строительные блоки, из которых можно собрать технику: двигатели бензиновые и электрические, подшипники, поршни, фары, таймеры, трубы самых разных длин и ориентаций, стекла, амортизаторы, шины, оптические сенсоры… Система крафтинга похожа на Майнкрафт: чтобы сделать тот же амортизатор, надо сначала добыть железо, которое можно либо набурить, либо переплавить незадачливого робота, предварительно огретого по кумполу кувалдой. Потом из железа надо сделать сталь, то-есть понадобится уголь. И нужна нефть для гидравлической жидкости. Нефть можно либо накачать в пустыне, либо достать со дна моря.

Но и это ещё не всё. В игре есть пара моментов, которые делают её интересной не только мальчишкам, но и дяденькам с высшим компьютерным образованием. Так, в игре есть логические элементы, что значит, что на их базе можно построить компьютер. Вот, например, я построил двоичный восьмибитный сумматор с последовательным переносом. Складываются числа 163 и 29 (10100011 и 00011101 соответственно). Результат, конечно, 192 (11000000).

Конечно, можно не только складывать, но и вычитать. Разумеется, компьютеры вычитать не умеют. Когда компьютеры вычитают, например, 29 из 163, они складывают 163 и -29. В двоичной системе, чтобы получить отрицательное число, надо все биты перевернуть и добавить единицу. Так что складываем 10100011 и 11100011 и получаем 10000110 (134). Ну, а грозно горящий красным индикатор переполнения игнорируем…

Элементы сумматора — пять логических элементов: два XOR, два AND и один OR. Проще не придумалось.

В-общем, в игре каждый может найти что-то своё, интересное лично ему. Кто-то любит драться с роботами. Кто-то строит огромные мощные седельные тягачи. Другой — автоматизирует выращивание овощей. Ну, а кто-то рисует логические цепи в творческом режиме — точно такой же режим есть в Майнкрафте. В нём нет врагов, и доступны все строительные блоки. Развлекайся как хочешь.

Крайне рекомендую, игра находится в активной разработке (т.н. early access), но уже стоит того, чтобы её купить. Есть на Стиме.

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

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

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

Но зато я могу написать алгоритм, который любую из подобных задач решает за доли секунды. Любые самые зубодробительные судоку я могу решить за 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)

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

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