Кто каким ИИ пользуется для написания скетчей?

xDrivеr не дают спать… я даже могу доказать что 8 битами можно записать и прочитать больше 256 значений!)))(не гигабайт конечно, но если способ есть, значит можно сокращать, просто надо найти алгоритм) и без двойственности информации! правда вы это не так себе представляете скорее всего в данный момент… спорить будем ?))) более того даже послушал бы теоретические и бредовые алгоритмы сокращения, но тут наверное многие дураками не захотят выглядеть, и нечего не предложат)))

p.s. но это все же не точно, сейчас во мне говорит адреналин раш, а с ним кажется что любой код по плечу)))

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

да тоже самое, что и тебе мешает, третью неделю, представить нам обещанное окно, в которое невозможно послать мессагу из Delphi приложения, зато запросто можно это сделать из связки Excel/VBA.

Вы ошибаетесь. Я писал, что проще, а не невозможно.

Почему не даём? Вот, например, держите. Можете запустить на Uno, всё работает.

мигает светодиодами с 6 по 13, каждый со своей длительностью.
#define dr(n,X) (n,X)
#define cat(a, ...) primitive_cat(a, __VA_ARGS__)
#define primitive_cat(a, ...) a ## __VA_ARGS__
#define iif(c) primitive_cat(iif_, c)
#define iif_0(t, ...) __VA_ARGS__
#define    p6(n) (n+6)
#define iif_1(t, ...) t
#define check_n(x, n, ...) n
#define check(...) check_n(__VA_ARGS__, 0,)
#define probe(x) x, 1,
#define empty()
#define defer(id) id empty()
#define obstruct(...) __VA_ARGS__ defer(empty)()
#define expand(...) __VA_ARGS__
#define dec1(x) primitive_cat(dec1_, x)
#define    m6(_) (p6(_),_>=0)
#define dec1_0 0
#define dec1_1 0
#define dec1_2 1
#define dec1_3 2
#define dec1_4 3
#define dec1_5 4
#define dec1_6 5
#define dec1_7 6
#define dec1_8 7
#define dec1_9 8
#define _not_(x) check(primitive_cat(not_, x))
#define not_0 probe(~)
#define M(i, _) pinMode m6(i);
#define _compl(b) primitive_cat(_compl_, b)
#define _compl_0 1
#define _compl_1 0
#define _bool_(x) _compl(_not_(x))
#define _if_(c) iif(_bool_(c))
#define eat(...)
#define expand(...) __VA_ARGS__
#define when(c) _if_(c)(expand, eat)
#define eval(...)  eval1(eval1(eval1(__VA_ARGS__)))
#define eval1(...) eval2(eval2(eval2(__VA_ARGS__)))
#define eval2(...) eval3(eval3(eval3(__VA_ARGS__)))
#define eval3(...) eval4(eval4(eval4(__VA_ARGS__)))
#define eval4(...) eval5(eval5(eval5(__VA_ARGS__)))
#define    m20(_) ((_+1)*(20-_))
#define eval5(...) __VA_ARGS__
#define drr(n) dr(n,!digitalRead(n))
#define repeat(count, macro, ...) when(count) (obstruct(repeat_indirect) () (dec1(count), macro, __VA_ARGS__) obstruct(macro) (dec1(count), __VA_ARGS__))
#define S(i, _) digitalWrite drr(p6(i));delay m20(i);digitalWrite drr(p6(i));
#define repeat_indirect() repeat
void setup(void) { eval(repeat(8, M, ~)) }
void loop(void) { eval(repeat(8, S, ~)) }

Был бы Вам очень признателен, если бы Вы спросили у своих знакомых ИИ, что он делает и показали мне их ответы.

Например, GigaChat толково и правильно расписал, что и, главное, как здесь делается и сделал правильный вывод о назначении программы, за что ему большой респект!

ща у бабоса случится


:smiley:
“А и Б сидели на трубе” :smile:

Что делает этот конкретный код?

Если вкратце: этот код автоматически генерирует настройки и действия для 8 пинов микроконтроллера (вероятно, Arduino), создавая эффект «бегущего огня» или последовательного переключения с динамической задержкой.

Вот как работают ключевые части:

  1. Генерация циклов (repeat, eval): В C++ препроцессор не умеет в циклы for. Этот код обходит ограничение с помощью рекурсивного развертывания макросов. eval многократно перечитывает строку, чтобы «раскрыть» вложенные макросы.
  2. Логика (iif, check, when): Самодельная реализация условий if/else. Препроцессор проверяет наличие аргументов и выбирает, какой текст подставить дальше.
  3. Математика пинов:
  • p6(n) превращает индекс 0-7 в номера пинов 6-13.
  • m20(i) вычисляет задержку delay по формуле (i+1)*(20-i).
  1. Функции setup и loop:
  • В setup: Разворачивается в 8 вызовов pinMode(pin, INPUT/OUTPUT).
  • В loop: Разворачивается в последовательность digitalWrite, delay и повторный digitalWrite для каждого из 8 пинов.

Зачем так сложно?

Автор кода использует функциональное программирование на макросах, чтобы:

  • Избежать написания повторяющегося кода вручную.
  • Сделать так, чтобы итоговый бинарный файл был максимально компактным (так как всё вычисляется до компиляции).
  • Продемонстрировать мощь препроцессора (это своего рода «спортивное программирование»).

Это гугл поиск.

Спасибо.

дипсик:

Спойлер

Представленный код предназначен для Arduino Nano и использует сложные макросы препроцессора C для генерации повторяющихся конструкций. Давайте разберём его по частям и выясним, что он должен делать (и какие ошибки в нём есть).

Общая структура

Код определяет множество вспомогательных макросов, реализующих:

  • условные выражения (iif, _if_, when);
  • арифметику и логику на этапе препроцессора (dec1, _not_, _bool_);
  • механизм рекурсивного повтора (repeat, obstruct, defer);
  • конкретные действия для пинов (M – настройка режима, S – переключение состояния с задержкой).

В setup() и loop() используются вызовы:

eval(repeat(8, M, ~))
eval(repeat(8, S, ~))

которые должны развернуться в 8 вызовов макросов M и S с параметром от 0 до 7.

Что делают основные макросы

Вспомогательные макросы для управления препроцессором

  • cat(a, ...) и primitive_cat(a, ...) – конкатенация токенов.
  • iif(c) – выбирает между iif_0 (возвращает второй аргумент) и iif_1 (возвращает первый) в зависимости от c.
  • check(...) – используется для проверки наличия аргументов.
  • probe(x) и empty() – для создания условных выражений.
  • defer(id) и obstruct(...) – для отсрочки раскрытия макросов, что позволяет строить рекурсию.
  • expand(...) – просто убирает скобки.
  • when(c) – если c не ноль, то раскрывается в expand, иначе в eat (пустой макрос).
  • dec1(x) – уменьшает число от 0 до 9 на 1 (например, dec1(5) → 4).

Механизм повторения repeat

Макрос repeat(count, macro, ...) реализует цикл на этапе препроцессора:

#define repeat(count, macro, ...) when(count) ( \
    obstruct(repeat_indirect) () (dec1(count), macro, __VA_ARGS__) \
    obstruct(macro) (dec1(count), __VA_ARGS__) \
)

Если count не ноль, when(count) выбирает expand, и тогда всё, что в скобках, раскрывается в два выражения:

  1. obstruct(repeat_indirect) () (dec1(count), macro, __VA_ARGS__) – это рекурсивный вызов repeat с уменьшенным счётчиком.
  2. obstruct(macro) (dec1(count), __VA_ARGS__) – вызов заданного макроса с аргументами (текущий индекс и ~).

Благодаря obstruct эти вызовы не раскрываются немедленно, что предотвращает бесконечную рекурсию. В итоге для count=8 получается последовательность вызовов macro для индексов от 0 до 7 (порядок: сначала 0, потом 1, … 7).

Макросы для работы с пинами

  • p6(n)(n+6) – смещение номера пина.
  • m6(_) определён как (p6(_), _>=0), что раскрывается в кортеж (n+6, n>=0).
  • M(i, _)pinMode m6(i); → после подстановки получается pinMode (i+6, i>=0);.
    • Второй аргумент i>=0 для i от 0 до 7 всегда истинен (равен 1), что в Arduino соответствует OUTPUT. Таким образом, M устанавливает пины 6…13 в режим выхода.
  • m20(_)((_+1)*(20-_)) – вычисляет задержку для индекса i:
    • i=0: 20, i=1: 38, i=2: 54, i=3: 68, i=4: 80, i=5: 90, i=6: 98, i=7: 104 (мс).
  • drr(n)dr(n,!digitalRead(n)), где dr(n,X) определён как (n,X). То есть drr(n) раскрывается в (n, !digitalRead(n)).
  • S(i, _)digitalWrite drr(p6(i)); delay m20(i); digitalWrite drr(p6(i));
    • После подстановки drr(p6(i)) даёт (i+6, !digitalRead(i+6)). Тогда digitalWrite (i+6, !digitalRead(i+6)) – это вызов digitalWrite с одним аргументом, которым является выражение с запятой. В языке C такой аргумент вычисляется как значение правой части (т.е. !digitalRead(i+6)), а номер пина игнорируется.

Что происходит в setup() и loop()

  • setup(): eval(repeat(8, M, ~)) разворачивается в 8 вызовов:

    pinMode (6, 1);
    pinMode (7, 1);
    ...
    pinMode (13, 1);
    

    Но из-за синтаксиса pinMode (6, 1) (один аргумент в скобках) это вызовет ошибку компиляции, так как pinMode ожидает два отдельных аргумента. Однако если бы компилятор это пропустил, то фактически был бы установлен режим OUTPUT для пинов 6–13 (поскольку второй операнд кортежа равен 1).

  • loop(): eval(repeat(8, S, ~)) разворачивается в 8 вызовов вида:

    digitalWrite (6, !digitalRead(6)); delay 20; digitalWrite (6, !digitalRead(6));
    digitalWrite (7, !digitalRead(7)); delay 38; digitalWrite (7, !digitalRead(7));
    ...
    digitalWrite (13, !digitalRead(13)); delay 104; digitalWrite (13, !digitalRead(13));
    

    Здесь digitalWrite также получает один аргумент – значение !digitalRead(...), что недопустимо (нужны два аргумента: номер пина и значение). Если бы синтаксис позволял, то такой вызов просто записал бы на тот же пин? Нет, без указания пина – бессмысленно.

Задумка автора (вероятная)

Судя по логике, автор хотел:

  • В setup() настроить пины 6…13 как выходы.
  • В loop() последовательно для каждого пина (с 6 по 13) инвертировать его состояние (прочитать и записать противоположное), подождать разное время (зависящее от номера пина), затем снова инвертировать (вернуть в исходное). Таким образом, на каждом пине формируется импульс длительностью, задаваемой delay. Импульсы идут друг за другом.

Для этого макрос S должен был выглядеть так:

#define S(i, _) digitalWrite(p6(i), !digitalRead(p6(i))); delay m20(i); digitalWrite(p6(i), !digitalRead(p6(i)));

Но из-за ошибочного определения dr и drr (которые вместо digitalWrite генерируют просто кортеж) код не компилируется.

Вывод

Код пытается реализовать на препроцессоре цикл для последовательного переключения пинов 6–13 с разными задержками. Однако из-за некорректного определения dr (и как следствие drr) вызовы pinMode и digitalWrite становятся синтаксически неверными. Если исправить dr на digitalWrite(n, X), программа бы работала и мигала светодиодами (или управляла нагрузкой) на указанных пинах, создавая последовательность импульсов разной длины.

Также стоит отметить, что использование ~ как фиктивного аргумента в repeat не несёт смысловой нагрузки и просто необходимо для соответствия количеству параметров макросов M и S.

Ой, спасибо!

У этого чуть похуже,. Вроде, рассуждает нормально, но что-то перемудрил и сделал неверный вывод, что программа не работает.

Но, в любом случае, впечатляет как они справляются!

А у @Corp с кем беседа состоялась?

Я ж написал. Просто у гугла спросил.

спасибище, а то от этих жмотов не дождешься….

Этот код представляет собой чрезвычайно изощренный пример метапрограммирования на препроцессоре C, написанный специально для Arduino. Давайте разберем его подробно.

Общая структура кода
Код создает эффект цикла for (от 0 до 7) на уровне препроцессора, то есть еще до компиляции. Он генерирует 8 вызовов pinMode в setup() и 8 последовательностей операций с задержками в loop().

Подробный разбор макросов
Базовые строительные блоки
c
#define dr(n,X) (n,X)
#define cat(a, ...) primitive_cat(a, __VA_ARGS__)
#define primitive_cat(a, ...) a ## __VA_ARGS__
dr просто создает пару значений, используется для передачи аргументов

cat и primitive_cat выполняют конкатенацию токенов - ключевая операция для генерации кода

Условные конструкции
c
#define iif(c) primitive_cat(iif_, c)
#define iif_0(t, ...) __VA_ARGS__
#define iif_1(t, ...) t
#define _not_(x) check(primitive_cat(not_, x))
#define not_0 probe(~)
#define _compl(b) primitive_cat(_compl_, b)
#define _compl_0 1
#define _compl_1 0
#define _bool_(x) _compl(_not_(x))
#define _if_(c) iif(_bool_(c))
Это реализация условных выражений в препроцессоре:

iif(1)(a, b) вернет a, iif(0)(a, b) вернет b

_not_, _compl и _bool_ реализуют булеву логику

not_0 определен как probe(~), что позволяет проверять на 0

Проверка и логические операции
c
#define check_n(x, n, ...) n
#define check(...) check_n(__VA_ARGS__, 0,)
#define probe(x) x, 1,
#define empty()
#define defer(id) id empty()
#define obstruct(...) __VA_ARGS__ defer(empty)()
Эти макросы реализуют хитрый механизм отложенного выполнения:

probe создает пару с числом 1, что позволяет проверять наличие аргументов

defer и obstruct предотвращают немедленное раскрытие макросов, создавая задержку выполнения

Работа с числами
c
#define dec1(x) primitive_cat(dec1_, x)
#define dec1_0 0
#define dec1_1 0
#define dec1_2 1
#define dec1_3 2
#define dec1_4 3
#define dec1_5 4
#define dec1_6 5
#define dec1_7 6
#define dec1_8 7
#define dec1_9 8
Это реализация декремента (уменьшения на 1) для чисел 0-9. Обратите внимание: dec1_1 равно 0, dec1_2 равно 1 и т.д.

Многократное выполнение (цикл)
c
#define repeat(count, macro, ...) when(count) (obstruct(repeat_indirect) () (dec1(count), macro, __VA_ARGS__) obstruct(macro) (dec1(count), __VA_ARGS__))
#define repeat_indirect() repeat
#define when(c) _if_(c)(expand, eat)
#define eat(...)
#define expand(...) __VA_ARGS__
Это рекурсивный макрос, который выполняет другой макрос заданное количество раз:

when(count) проверяет, нужно ли продолжать (count > 0)

obstruct предотвращает немедленную рекурсию

Вызывает macro с текущим индексом, затем рекурсивно вызывает repeat с уменьшенным счетчиком

Многоуровневое раскрытие
c
#define eval(...) eval1(eval1(eval1(__VA_ARGS__)))
#define eval1(...) eval2(eval2(eval2(__VA_ARGS__)))
#define eval2(...) eval3(eval3(eval3(__VA_ARGS__)))
#define eval3(...) eval4(eval4(eval4(__VA_ARGS__)))
#define eval4(...) eval5(eval5(eval5(__VA_ARGS__)))
#define eval5(...) __VA_ARGS__
Поскольку препроцессор имеет ограничение на количество проходов раскрытия, эти макросы принудительно выполняют много проходов, чтобы полностью раскрыть все рекурсивные макросы.

Функции работы с пинами
c
#define p6(n) (n+6)
#define m6(_) (p6(_),_>=0)
#define m20(_) ((_+1)*(20-_))
#define drr(n) dr(n,!digitalRead(n))
p6(n) добавляет 6 к индексу (используются пины 6-13)

m6 создает проверку индекса

m20 вычисляет задержку: (i+1)*(20-i)

drr создает пару для digitalRead с инверсией

Основные макросы программы
c
#define M(i, _) pinMode m6(i);
#define S(i, _) digitalWrite drr(p6(i));delay m20(i);digitalWrite drr(p6(i));
M генерирует pinMode(6+i, OUTPUT) для i от 0 до 7

S генерирует последовательность: установить пин, задержка, сбросить пин

Итоговый сгенерированный код
После работы препроцессора код превращается примерно в следующее:

cpp
void setup(void) {
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(9, OUTPUT);
    pinMode(10, OUTPUT);
    pinMode(11, OUTPUT);
    pinMode(12, OUTPUT);
    pinMode(13, OUTPUT);
}

void loop(void) {
    digitalWrite(6, !digitalRead(6)); delay(20); digitalWrite(6, !digitalRead(6));
    digitalWrite(7, !digitalRead(7)); delay(36); digitalWrite(7, !digitalRead(7));
    digitalWrite(8, !digitalRead(8)); delay(48); digitalWrite(8, !digitalRead(8));
    digitalWrite(9, !digitalRead(9)); delay(56); digitalWrite(9, !digitalRead(9));
    digitalWrite(10, !digitalRead(10)); delay(60); digitalWrite(10, !digitalRead(10));
    digitalWrite(11, !digitalRead(11)); delay(60); digitalWrite(11, !digitalRead(11));
    digitalWrite(12, !digitalRead(12)); delay(56); digitalWrite(12, !digitalRead(12));
    digitalWrite(13, !digitalRead(13)); delay(48); digitalWrite(13, !digitalRead(13));
}
Зачем так сложно?
Этот код - гимн избыточности и демонстрация возможностей. В реальной практике такое писать не нужно, потому что:

Обычный цикл проще: for(int i=0; i<8; i++) понятнее и короче

Сложность отладки: Ошибки в таких макросах очень трудно отследить

Производительность: На микроконтроллерах с ограниченной памятью лучше иметь простой код

Что делает программа на Arduino?
Она создает эффект "бегущей волны" на пинах 6-13:

Сначала все пины настраиваются как выходы

В цикле каждый пин переключается (инвертируется), затем идет задержка, затем снова переключается

Задержки разные: сначала растут до середины, потом убывают (пик на 10-11 пинах)

Фактически, это создает эффект движения по светодиодам туда и обратно с ускорением/замедлением в середине.

Этот код - блестящий пример того, как можно заставить препроцессор C делать невероятные вещи, которые он никогда не должен был делать!

ну вообще надо сформировать на что надо обратить внимание, но примерно такой ответ, дипсик)))

лень заниматься одному не понятной фигней))))

Это называется не так.

В одной старой писульке в советское время была описана ситуация.

Девочка с красным дипломом по программированию написала код на фортране и долго возмущалась, что она не выполняется, а она получает JCL ERROR.

@BABOS напишите 1 маленькую программу на ассемблере x86, которая выводит на экран строку. Вариант с DOS - прокатит потому, что запустится на Вашем компе. А потом подумайте - почему там столько всего еще написано.

Спасибо, мужики. Порадовали меня эти ИИ. Здорово!

Можно ли доверять ИИ написание программ после его ответа вот на какой мой вопрос:
“На взлетном режиме винт самолета АН2 вращается с частотой 2200 об/мин. Если я, обладая неимоверной силой приделаю к этому винту педали и раскручу его до таких оборотов, то самолет взелтит”?

после короткого спора с ним о крутящем моменте и мощности вот что он мне ответил:

Итог

Если подвести итог этому мысленному эксперименту:

  1. Да, самолет взлетит. Неимоверная сила с лихвой заменяет отсутствие двигателя внутреннего сгорания.
  2. Проблема №1: Вы разрушите трансмиссию самолета своей силой, если не усилите её.
  3. Проблема №2: Вам придется очень быстро соображать с управлением шагом винта, чтобы не потерять эффективность на высокой скорости.
  4. Проблема №3: Ваша неимоверная сила, скорее всего, разгонит Ан-2 до скоростей, на которых у него просто отвалятся крылья (максимальная скорость Ан-2 по документам всего около 260 км/ч, а вы, судя по всему, сможете преодолеть и звуковой барьер, что для биплана с расчалками смерти подобно).

Вывод: Самолет взлетит, но, скорее всего, разрушится в полете от перегрузок, если вы не будете дозировать свою неимоверную силу. Так что будьте аккуратнее с педалями!

Нанюхаются своего криптонита и еропланы разрушают!

Тьфу…

надеюсь это не сарказм))) а то я еще не выспался, и не анализировал код, и если там еще какое то второе дно есть, или он делает что то еще, я сразу не увижу это, но он дает столько пищи для размышления… вам спасибо)))