«Тетрис» на Brainfuck ★
Ну разумеется я вчера не смог уснуть без того, чтобы не посмотреть что ещё мог бы написать ИИ на «Брейнфаке»! Попробовал написать «Тетрис», тем более что у меня были готовые идеи как это сделать. Правда для этого пришлось модифицировать интерпретатор. Свой собственным, разумеется, который я начал писать ещё
Дело в том, что у «Брейнфака» нет рандомизации и ввод устроен очень просто — есть инструкцию чтения символа и всё. Правда сам язык не определяет подробности чтения символа, поэтому реализации отличаются. В основном авторы интерпретаторов делают буферизированный ввод, дожидаясь нажатия кнопки «Ввод». Правда тут тоже есть нюансы —
Чтобы приступить к «Тетрису» пришлось сделать две модификации.
Все расширения я сделал включаемыми и отключаемыми при помощи ключей интерпретатора, тем более у меня их уже и так было немало — некоторые существующие программы отличаются в своих ожиданиях относительно деталей реализации.
Чтобы каждый раз не вспоминать какие ключи нужны программе, я придумал способ как их указывать — если в начале программы на «Брейнфаке» стоит обычный шебанг, я беру параметры интерпретатора оттуда.
Как легко догадаться по скриншотам, нейросеть (я использовал
Я даже сделал в своём интерпретаторе поддержку сжатия исходников. Наверное никому раньше не приходило в голову этим заниматься — как правило программы на «Брейнфаке» пишут люди и до таких размеров они их не доводят.
Трансляция такого огромного файла и применение оптимизаций занималось около 15—20 секунд на моём ноутбуке, так что пришлось применить ряд оптимизаций — немного переписать парсер интерпрератора, сделать кеширование и поработать над уменьшением размера кода «Тетриса».
«Тетрис» работает в консоли и, надеюсь, никому не надо объяснять, что для раскрашивания блоков и позиционирования тут широко применяются
Единственное о чём надо рассказать — как регулируется скорость игры. В «Брейнфаке» нет ничего, чтобы создавать паузы заданной длительности, но некоторые программы работают ощутимо долго. Хотя у меня и оптимизирующий интерпретатор, всё оптимизировать он не может. Поэтому мы с нейросетью просто «на глазок» подобрали код, который достаточно плохо оптимизируется и тормозит на моём ноутбуке ровно насколько, чтобы играть было комфортно.
ИИ: Brainfuck
Три года назад я в шутку предлагал программистам переходить на «Брейнфак» — эзотерический язык программирования из восьми конструкций, который плохо давался нейросеткам.
Я пропустил момент, когда модели научились на нём писать. Буквально вчера догадался снова попробовать, оказалось — могут! Программу на скриншоте мне «Курсор» написал в режиме «Авто», где выбираются, в основном, слабые модели. Топовые справляются даже с такими заданиями как написать несложный эмулятор командной строки с несколькими основными командами и небольшой файловой системой!
Для человека это уже
Две вещи, с которыми модели ещё не справляются — это написание «квайна» (программы, которая выводит сама себя) и оптимизация программ на «Брейнфаке» по размеру. Даже топовые модели наотрез у меня отказываются такое писать. Даже после прямого приказа.
Интересно будет помучить этой задачкой новую модель «Антропика», которая должна появиться летом — я считаю их модели лучшими, хотя их последний «Опус» несколько разочаровал.
Добавлено позднее: справедливости ради насколько простую программу, как на картинке выше, нейросети и сейчас могут написать оптимальнее:
Семидесятипятилетнее вино
Папе в марте исполнилось 75 лет — юбилей и довольно значительная дата. Поэтому хотелось поздравить его
С идеей выручила жена — папа хорошо относится к качественному вину, вот она и предложила найти ему бутылочку вина семидесятипятилетней выдержки. Мне сразу показалось, что это шикарный подарок, но найти его в Казани оказалось нереально.
Хорошо, что у нас есть интернет! Искомое нашлось на одном из сайтов, правда там ничего не было сказано про доставку, но после звонка и почти двухчасового обсуждения всех деталей по «Телеграму» вино было упаковано и в тот же день поехало в Казань.
Я сильно переживал как оно доедет — консультант в магазине сказал, что не все бутылки могут пережить транспортировку, поскольку в некоторых бывают трещины. Он выбрал без видимых трещин и тщательно упаковал, но я всё равно волновался.
Доехало всё шикарно, в целостности и сохранности. Сегодня подарок вручили, надеюсь и до Лениногорска он доберётся без эксцессов.
Коммунистический массив
Я тут в мемах, которые кинули бывшие коллеги, увидел «коммунистическую сортировку» — она каждому присваивает среднее значение, и не смог пройти мимо. Написал «коммунистический массив»:
class CommunistArray extends \ArrayObject
{
public function __construct(array $array = [])
{
parent::__construct(self::createCommunistArray($array));
}
public function offsetSet(mixed $key, mixed $value): void
{
parent::offsetSet($key, $value);
$this->redistribute();
}
public function offsetUnset(mixed $key): void
{
$first = $this->getIterator()->key();
if ($first !== null) {
$this[$first] += $this[$key];
parent::offsetUnset($key);
$this->redistribute();
}
}
private static function createCommunistArray(array $array): array
{
if ($array) {
$avg = array_sum($array) / sizeof($array);
return array_fill_keys(array_keys($array), $avg);
}
return [];
}
private function redistribute(): void
{
(void) $this->exchangeArray(self::createCommunistArray((array) $this));
}
}Он делает всех равными и перераспределяет блага автоматически:
$comrades = new CommunistArray([0b1, 0o0, 3e1, 0x45]);
print_r($comrades); # 25, 25, 25, 25
$comrades[2] = 4;
print_r($comrades); # 19.75, 19.75, 19.75, 19.75
unset($comrades[0]);
print_r($comrades); # 24.6875, 24.6875, 24.6875Книга с Некрасова
Недели две назад приезжал в отпуск бывший казанский краевед.
Зашли в дом на Некрасова, куда меня приглашали
Мы туда соваться, понятное дело, не стали, зашли в крепкую половину дома. На наше счастье бомжи не мёрзли — в одном из углов обнаружилась солидная стопка советских книг по химии, в которой нашлись две книги
Мне достался первый томик «Химии жизни» 1923 года в отличном состоянии. Книжка редкая — тираж всего 3000 экземпляров, но вряд ли востребованная — думаю за сто с лишним лет её научная ценность упала ниже нуля.
Интересно, что её автор биохимик Владимир Сергеевич Садиков был
На двух её страницах виден круглый штамп, но он сильно выцвел, мало что можно разобрать, кроме того, что это штамп
Книги: «Возвращение Синей Бороды»
Трудно сказать, почему я до сих пор сохранял веру в то, что Пелевин ещё напишет
Многие говорят, что он давно исписался, я, наверное, с этим тоже согласен,
Не скажу, что мне каждый раз приходилось делать над собой усилие: некоторые его вещи давались мне легче, другие труднее, но ни через одну я не продирался так, как через текст его свежей книги «Возвращение Синей Бороды». Тут я окончательно завяз. Примерно на половине я сообразил, что мне совершенно не хочется её дочитывать.
Я очень не люблю бросать книги, возможно это
Есенин
Никогда не любил и не понимал стихи Есенина, мне всегда больше нравился Маяковский. Впрочем, кроме Маяковского меня вообще мало какие стихи привлекают — в этом смысле я однолюб. Впрочем, я давно догадывался, что дело в подаче. Наверное с тех пор, как услышал стихи Олеси Балтусовой в её собственном исполнении. Мы дружим больше 20 лет, но я до сих пор не воспринимаю её стихов в виде текста.
Только потом я узнал, что это стихи Есенина и попробовать послушать тоже самое в исполнении Безрукова. Мне совершенно не понравилось. В исполнении Легенары эти стихи звучат очень лирично,
В общем, в восприятии стихов я очень нуждаюсь в помощи исполнителя.
Наверняка это очень примитивно — не уметь видеть стихотворную красоту самостоятельно, но что делать, пока не научился. Собственно, целенаправленного я для этого делал очень мало, нет сильной потребности, что ли…
Мурчащий котик
У дочки в школе есть так называемая «проектная деятельность». Не особо понимаю, почему она есть в школе, а заниматься ей приходится дома, но да ладно — ещё больше я не понимаю, почему там не помогают ребёнку выбрать проект по силам.
Проект, который дочь выбрала — робокот, который должен ходить и мяукать. Насколько я понял, купить готового не вариант, надо сделать своего.
Наверное это вполне по силам девятилетнему ребёнку, который занимается робототехникой, но у дочки такого предмета в школе нет. И в тематический кружок она тоже не ходит. Так случилось, что я тоже роботов строить не умею.
У жены я не спросил, но подозреваю, что и она тоже — мы 19 лет вместе и я её ни разу не заставал за сборкой робота.
В общем, робот нам не по силам. В итоге дома сторговались с дочкой на статичного, но мурчащего кота, тем более в прошлом году была мысль его сделать и под этот проект даже была куплена китайская хреновинка, умеющая записывать звук небольшой длительности.
На принтере был срочно распечатан кот — я взял первую попавшуюся модель и увеличил её. Напечатанного кота я вскрыл снизу простым советским консервным ножом, а потом выдолбил изнутри при помощи отвёртки и узкогубцев.
Китайская хреновинка оказалась глуховатой, поэтому мурчание пришлось записывать с «Алисы», выведенной на максимальную громкость. По громкости получилось нормально, а по качеству — терпимо. Но когда я вынул хреновинку из корпуса и начал запихивать в кота по частям, оказалось, что криворукие сборщики паяли не припоем, а своими соплями — провода начали просто отламываться от места пайки.
Пришлось расчехлять купленный
Чинить настолько сложные паяльники я умею примерно так же, как делать роботов, так что сделал то, что пришло в голову, — обновил на нём прошивку и перепривязал жало к станции. Это не помогло, но зато теперь в паяльнике у меня есть русский язык.
Выручила инструкция: пока читал, как обновить паяльник, увидел, что «CONFIG» означает
После «починки» я воспрял духом и работа пошла побыстрее. Быстро перепаял отвалившиеся провода (помогла привычка фотографировать всё, что я разбираю) и заодно вывел кнопку запуска мурчания коту на холку. Это место я накрыл картонной полоской, чтобы увеличить площадь нажатия.
Динамик вывел на пузико, где прореза́л отверстие и закрыл его пропитанной для жёсткости клеем кружевной тряпочкой от старой детской майки, после чего передал эстафету жене с дочкой — их задача обшить котика мехом.
Задняя часть Афины
Новость прочитал, что в турецкой Лаодикее нашли статую Афины высотой два метра. Наверняка это важное открытие, но мне интереснее оказалось другое: статуя очень искусно вырезана спереди, а сзади почти никак не оформлена. Причём это законченная работа.
Сразу вспомнилось, как в советские годы мы из экономии не клеили обои за «стенкой» — мебельным гарнитуром в зале. Её всё равно невозможно было поставить
Кощей
Читал тут русские берестяные грамоты и наткнулся на одну, где упоминается имя или прозвище «Кощей». Таких грамот нашлось три штуки, и, наверное, есть ещё.
Я
Интересно всё же — сказочный Кощей получил имя по существовавшему
Краеведение: что под штукатуркой?
Вот непонятно, как это вообще работает. Я уже 15 лет работаю
Это историческое здание, а я, как знают постоянные читатели моих заметок, очень люблю такие здания осматривать и подмечать на них различные детали.
Что там было в тот год, когда я переехал, неизвестно. Годом позже, в 2012 году, на нечёткой фотографии «Яндекс.Карт» видна вмятина, как будто Халк легонько ткнул мизинцем. Вряд ли она заинтересовала бы меня и сейчас. Но в 2016 году на «Гугл.Картах» уже
Из года в год он проступал всё сильнее, и лет шесть назад, судя по фото, его было сложно не заметить. Но я
Поспрашивал знакомых краеведов, но никто не знает, что там. Я думаю, что там
Как это проверить, ума не приложу, разве что гипотетическая табличка окажется металлической. Надо бы разыскать свой пинпоинтер, он лежит
Мир в бутылке: графика
Хочу немного остановиться на том, откуда взялась графика моего проекта, который я условно пока называю «Мир в бутылке», и какие нейросети я использовал для рисования.
Первых персонажей для будущего перформанса я нарисовал в «ЧатеГПТ 5.4». На вход дал несложный промпт,
нарисуй 10 характерных
персонажей-человечков в пиксельном стиле маленького размера. референс в картинке
В качестве референса был приложен первый попавшийся скрин
Собственно, этот спрайт плюс небольшое текстовое техническое задание, где я поверхностно описал, какими возможностями будут обладать будущие персонажи, я и подал на вход «Опусу 4.7».
Картинки я на спрайты не резал: нейросеть справилась с этим самостоятельно — вырезала, сделала им прозрачный фон и даже добавила простенькую анимацию ходьбы. Кстати, позже я обнаружил, что у меня в коде оказалось два варианта спрайтов — для ходьбы влево и вправо, — и попросил оставить только один вариант, а второй делать поворотом спрайта.
Травку, камешки, насекомых и игровые предметы мне рисовал уже «Опус». С мелкими предметами он справился хорошо, а с теми, что покрупнее, — хуже. В итоге котёл, костёр, сундук и так далее я снова попросил нарисовать «ЧатГПТ». На мой взгляд, он их нарисовал слишком детализированно:
Поскольку их надо было сделать сильно меньше, «Опус» перерисовал новую версию «по мотивам». В итоге качество меня устроило. Текущий вариант лучше, чем было раньше, но выглядит менее натурально, чем то, что нарисовал «ЧатГПТ». В силу того, что я придерживаюсь
Гидру я рисовал в «Нанобанане 2», приложив как референс картинки персонажей. Текущий результат получился примерно с четвёртой или пятой попытки и, если честно, не кажется мне идеальным, но мне больше хотелось проектировать мир, а не возиться с графикой настолько долго.
Претензия всё та же: по сравнению с персонажами гидра чересчур детализирована.
Что делать дальше я пока не решил. Либо доделаю этот мир — там осталась ещё одна нереализованная задумка, либо перейду на другую платформу
Кафе: второй зал
Поэтому всё немного в недоделанном состоянии, но народу как будто в кафе стало намного больше, пришлось даже расширять цех, так что, видимо, управляющая всё делает правильно.
Инженерное меню в мониторе Kuycon
Искал, как обновить прошивку своего нового монитора «Куйкон», и случайно нашёл инженерное меню. Нужно зажать клавишу «≡» на пульте до его появления.
Большинство опций понятны — настройка соотношения цветов при разных точках белого, уровень подсветки, отключение показа логотипа. Термин «
Единственное, что ставит в тупик, — непонятная опция «DefLAN», которая, судя по всему,
Добавлено: один из читателей расшифровал — «Default Language» («язык по умолчанию»).
Я в Кибердянске
А я тут, оказывается,
Мир в бутылке: поведение ведьмы
Вчерашняя идея прикрутить небольшую нейросетку, которая будет выстраивать поведение ведьмы,
Обидно, досадно, но ладно. Там было пространство для манёвра, но слишком медленно тренируется. Чтобы ускорить, нужно переписывать весь игровой мир
Решил пойти другим путём — попробовать «дерево решений», оно легче в обучении и его проще потом разбирать. Это помогло — эксперименты пошли бойчее, и я довольно быстро увеличил метрику с 1,715601 до 1,933353, что довольно много на самом деле. Метрика там по простенькой формуле учитывает результативность кампании — удалось ли убить гидру и сколько народу выжило.
Потом «Курсор» просто разобрал мне получившееся дерево и перенес ту же логику в правила. Следующий шаг — хочу расширить количество «решений», которые может принять ведьма и посмотреть что получится.
ИИ: Claude Mythos и поиск уязвимостей
Я давно предсказывал, а месяц назад даже об этом написал, что нейросети в этом году побьют все прежние рекорды по поиску уязвимостей. Прогноз уже начинает сбываться: компания «Антропик» не стала публиковать свою модель следующего поколения «Мифос», потому что она исключительно хороша в поиске уязвимостей.
Вроде обещают показать летом, когда все крупные поставщики софта закроют выявленные этой моделью уязвимости.
Я сразу заподозрил в этом заявлении изрядную долю маркетинга и оказался прав: как показало исследование, изрядную часть уязвимостей, которые раскрыли, нашли также и модели предыдущего поколения. Тем не менее я охотно верю, что «Мифос» сильнее «Опуса», просто не думаю, что настолько, насколько это хотят показать.
В конце концов, это хороший
Мир в бутылке: гидра и ведьма
Довольно интересно получается вместе с дочкой проектировать игровой мир через нейросети. Ей не хватает усидчивости, чтобы довести дело до конца, но пока я его создавал, она иногда прибегала и вкидывала
Эта гидра — то, что называется «боссом», то есть сильный монстр, для убийства которого требуются усилия большинства персонажей. Гидра сильно спутала мне карты, так как, по сути, все мои персонажи — одиночки. Да, они могут подлечивать друг друга и воскрешать, но основной алгоритм у них написан так, чтобы зачищать свою окрестность от врагов и не умирать.
Появление босса попило мне немало крови — пришлось переосмысливать поведение всех персонажей, а некоторые из них до сих пор ведут себя странно. Ни я, ни нейросеть пока с этой проблемой не справились. Труднее всего было с лекарем и ведьмой. Оба персонажа нужны как поддержка: лечить и оживлять других членов команды. Поэтому к ним другие требования, отличающиеся от тех, кто атакует — держаться на периферии, не умирать и лечить всех остальных.
Не бог весть какая стратегия, но я до сих пор с ней бьюсь. Пришлось выделить поведенческий код в отдельный модуль и проводить симуляции на тысячах прогонов, чтобы отладить логику. Так удалось отладить поведение лекаря (я в разговоре с ИИ называю её «девочка»), а вот ведьма пока далека от идеала.
С алгоритмом ведьмы я бился несколько часов: у неё есть особенность — для лечения ей нужно варить зелья на стационарной площадке, которая может быть занята гидрой. В этом случае ведьма эффективнее в дистанционных атаках — и это она тоже умеет.
С ней я тоже провёл ряд симуляций, чтобы выровнять поведение, но она всё равно либо пёрла на гидру и умирала, либо делала
Выживаемость резко подскочила, но когда в открыл мир, чтобы посмотреть что вышла, то обнаружил, что ведьма теперь со всех ног улепётывает к краю экрана, стоит гидре выйти из пещеры. В общем, стоит тщательнее описывать что считается успехом для каждого персонажа и его выживаемость — это не единственный критерий, который надо максимизировать.
Я
Мир в бутылке: а где лошадка?
Пока программировал свой «Мир в бутылке», пришли жена и дочка и, как фанатки лошадей, потребовали ввести в игру лошадку. Я согласился с условием, что дочка нарисует прототип и хоть немного продумает механику — как именно лошадка будет себя вести.
В итоге, дочка
С игровой механикой
Мир в бутылке: сжатие в картинку
Вчера я писал, что код и вероятности перехода в цепях Маркова упакованы в картинку, но не объяснил что это и для чего сделано.
Про эту технику несколько раз писали, но она остаётся малоизвестной. Суть в том, что мы, пользуясь тем, что любая картинка — формат со сжатием, кодируем в её пикселях текст нашей программы.
Это позволяет,
Сжатие при этом реализовывать в ДжаваСкрипте не нужно — браузер за нас распаковывается картинку, а мы её просто попиксельно читаем.
Поскольку веса для цепей Маркова занимают аж 3,5 мегабайта в джейсоне, я воспользовался этой идеей, чтобы поэффективнее его ужать, бинарно сериализуя его в картинку, а потом затянул туда и остальное — основной код и спрайты.