Нескладна задачка, з якою не змогла впоратися жодна LLM [C++, preprocessor]

💡 Усі статті, обговорення, новини про AI — в одному місці. Приєднуйтесь до AI спільноти!

Задача:

Write on boost::preprocessor a macros, that take three sequences and produce a cartesian product for each of several.

For example input:

IMPLEMENT_X_3ARG_FN_TBL((0)(1), (2)(3)(4), (5)(6)(7)(8)) should produce:

{

{

{0_2_5, 0_2_6, 0_2_7, 0_2_8},

{0_3_5, 0_3_6, 0_3_7, 0_3_8},

{0_4_5, 0_4_6, 0_4_7, 0_4_8},

},

{

{1_2_5, 1_2_6, 1_2_7, 1_2_8},

{1_3_5, 1_3_6, 1_3_7, 1_3_8},

{1_4_5, 1_4_6, 1_4_7, 1_4_8},

}

}

Де можна спробувати те що генерує LLM (та моє рішення)

Пробував ChatGPT (той версії яка мені доступна), DeepSeek, Claude та Gemini.

👍ПодобаєтьсяСподобалось1
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Gemini3 — не впоралась.

Періодично тицяю паличкою в різні ЛЛМ з проханням довести що трикутник рівнобедрений, якщо дві бісектриси рівні.
Вони знають що то відома теорема Штейнера-Лемуса, значить точно в навчальному датасеті була інформація про її доведення, вони починають накидати щось зі спробою рішення, але навіть якщо годинами макати в помилки, все одно буде галюцинувати до нескінченності, не бажаючи ні загуглити одне з рішень, ні визнати що не може.

Ліниво перевіряти на інших тестах, але приклад парцює:

#include

// Helper to concatenate three elements with underscores
#define CONCAT3(a, b, c) BOOST_PP_CAT(a, BOOST_PP_CAT(_, BOOST_PP_CAT(b, BOOST_PP_CAT(_, c))))

// Generate inner-most values: {a_b_c, a_b_c, ...}
#define GEN_ROW(r, product) CONCAT3(BOOST_PP_SEQ_ELEM(0, product), BOOST_PP_SEQ_ELEM(1, product), BOOST_PP_SEQ_ELEM(2, product))

// Wrap each row with braces
#define GEN_ROW_SEQ(seq) { BOOST_PP_SEQ_ENUM(seq) }

// Wrap each block (i.e., all rows for one A element) with braces
#define GEN_BLOCK(seq) { BOOST_PP_SEQ_ENUM(seq) }

// For a given A and B, generate a row of all C combinations
#define GEN_C_ROWS(r, abc, C) \
GEN_ROW_SEQ(BOOST_PP_SEQ_TRANSFORM(GEN_C_CELL, abc, C))

#define GEN_C_CELL(s, abc, c) CONCAT3(BOOST_PP_TUPLE_ELEM(0, abc), BOOST_PP_TUPLE_ELEM(1, abc), c)

// For a given A, generate rows for each B
#define GEN_B_BLOCK(r, A, B_C) \
GEN_BLOCK(BOOST_PP_SEQ_TRANSFORM(GEN_B_ROW, A, B_C))

#define GEN_B_ROW(s, a, bc) GEN_C_ROWS(s, (a, BOOST_PP_TUPLE_ELEM(0, bc)), BOOST_PP_TUPLE_ELEM(1, bc))

// Entry macro
#define IMPLEMENT_X_3ARG_FN_TBL(A, B, C) \
{ BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_TRANSFORM(GEN_A_BLOCK, A, (B)©)) }

#define GEN_A_BLOCK(s, a, bc) \
GEN_BLOCK(BOOST_PP_SEQ_TRANSFORM(GEN_B_ROW, BOOST_PP_SEQ_REPLACE(BOOST_PP_NIL, 0, a), bc))

Це написав ChatGPT 4o от прямо зараз по вашому запиту, який я просто скопіював ;-)

Те що він там щось написав, не означає що воно працює як від ньго хочуть. :-) Ось що воно проодюсить: godbolt.org/z/KcKb4WM15

без петиції на виключення metaprogramming with macros — не враховується

штучка інтелекту ще не доросла до блмдіверсіті

меседжі як аргументовані так і змістовні, нічого нового)

Макроси як і усе інше, це інструмент.

усе для дебілів!!!!MISRA forever!!!!

місра писана кров"ю автомотіва

уся та «кров» потекла виключно з усім відомих причин найму дешевої робочої сили з відповідної країни.

А десь можна подивитися як це зробити?
Бо якось складно, сходу не видно чи дозволяють макроси взагалі таку гнучкість (можу помилятися)

Я ж дав лінку на моє рішення, і якщо захочете ще поганяти LLM-ки там же можете спробувати.

І що? Ну не було достатньо таких задач в навчальному наборі, ось LLM й дофантазовують.

LLM чудова для автоматизації рутинних задач. А якісь складні чи нетипові задачі їй не під силу. Стосовно вашої задачі — як щодо constexpr замість макросів?

Так умовах до задачі написанно — макроси треба.

Я ж просто цікавлюсь, чому саме макроси. Старий компілятор?

Старий код, згенерованний.

Ну різниця таки є.
Constexpr на виході повинна генерувати щось c++ typed, ну хай там -
vector< vector< string>> буде.
А ось ця стара фігня (макроси) просто якийсь текстовий буфер генерує.

Так краще ж згенерувати вже той тип, який треба.

А якщо треба використати декілька разів? Наприклад

#define COLORS(X) \
    X(RED, 0xFF0000) \
    X(GREEN, 0x00FF00) \
    X(BLUE, 0x0000FF) \

#define ENUM_ITEM(name, value) COLOR_##name,
#define CASE_ITEM(name, value) case COLOR_##name: return #name;

enum colors {
    COLORS(ENUM_ITEM)
};

const char* color_name(enum colors c) {
    switch(c) {
        COLORS(CASE_ITEM)
    }
}

Як можна зробити на constexpr, щоб новий колір додавався простим X(BLACK, 0x000000) \<code>?

Ідея декартового добутку в принципі така ж сама, ми робимо

#define VALUES(M) M(1) M(2) M(3)
#define TYPES(T) T(int) T(char)

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

Буває, звісно, і така необхідність. До речі, з enum можна зробити так:

#include <magic_enum/magic_enum.hpp>
#include <iostream>

enum class Color { RED = -10, BLUE = 0, GREEN = 10 };

int main() {
  Color c1 = Color::RED;
  std::cout << magic_enum::enum_name(c1) << std::endl; // RED
  return 0;
}
В C++26 обіцяють підтримувати це нативно, без всяких хаків.

Ну... мова йде не тільки про enum. Це лише окремий невеличкий приклад використання.

#define ERRORS(X) \
    X(ADDRESS_IN_USER, ADDRINUSE, "Address in use, cannot open the given port") \
    X(REVOKED_CERTIFICATE, 0xBEBC32C, "Sertificate had been revoked") \
    X(HANDSHAKE_FAILURE, -100, "Protocol error: (handshake failed)") \

Там можуть бути якість інші дані, таблиці, таке інше.

LLM чудова для автоматизації рутинних задач. А якісь складні чи нетипові задачі їй не під силу.

AI agents get office tasks wrong around 70% of the time, and a lot of them aren’t AI at all

по суті на сьогодні аі то є калькулятор ери появи електронних калькуляторів як то зокрема інженерних або переходу від ручних обрахунків до компютерного фортрану

youtu.be/AFhlb-PdZjg?t=4

А якісь складні чи нетипові задачі їй не під силу.

але без людей воно не працює взагалі від слова взагалі навіть на рівні щоб якось поставити реальної автоматизації без прямого мікро менеджменту щоб йому прямо казати що робити конкретно детально

... і не відомо коли би воно могло з’явитися але вже зараз є певні питання що до енергетики питання як то прямого питання енергетики як то все це живити вже навіть зараз ))

Все питання в очікуваннях від AI. Якщо працювати з ним, як з розумним текстовим редактором — то все буде добре, а якщо очікувати, що AI буде робити за вас вашу роботу, а ви будете лежати десь на пляжі — то ні.

Останні апдейти Visual Code & Visual Studio просто вразили. Якщо пишеш сам (тут було багато тексту про індуський код, але ж це не толерастнісь, то ж видалив )), то реально бере на себе більшу частину рутини. Оце, реальна користь АИ

тіпа «автозаповнення та підсвітка синтаксису»...
недавно в одному відосі почув як вже безробітний пристаркуватий чудак колись давно працював більше року просто в редакторі, а не ІДЕ, і саме переключення з редактора в ІДЕ дало йому буст в продуктивності.
Але якби до того він більше року не користав тільки простий редактор, то так би лишився кодером звичайним.

по суті на сьогодні аі то є калькулятор ери появи електронних калькуляторів як то зокрема інженерних або переходу від ручних обрахунків до компютерного фортрану

тобто костяшками рахівниці, таблицями Брадіса і лографмічною лінійкою потрібно було кожне обчислення на калькуляторі перепровіряти?

сорі я не догнав що це

це про «довіру» калькулятору/ШІ

ну для калькулятора є детермінована доказовість його відповідальності

і лографмічною лінійкою потрібно було кожне обчислення на калькуляторі перепровіряти?

тобто люди зібралися придумали калькулятора з детермінованим відповідями на ввідні дані перевірили логаритмічної лінійки вірність відповідних ввідних даних до вивідних і сказали так це працює

є певні ліміти як то з точністями обчислення як то представлення чисел самим калькулятора на що окремо зібралися придумали детерміновані процеси мінімізації накопичення помилки перевірили вхідні та вихідні дані логаритмічної лінійки і сказали так працює

ніт сказали ставити запитання the Ultimate Question of Life Universe and Everything нізя на такоє наш калькулятор не розраховні сорі нах. ідіть он ші єсть котіків малює вот єто всьо нах. єто туда

селяві просто бізнес

Куди не кину оком стомленим — кругом х.йня © Лесь

і не відомо коли би воно могло з’явитися але вже зараз є певні питання що до енергетики питання як то прямого питання енергетики як то все це живити вже навіть зараз ))

кажуть, що мозок гомосапієнса сапієнса найбільш енергоємний орган, тому легше працювати кайлом чим думати, і якщо вірити в теорію еволюції, то на тюнінг пішли сотні мільярди років, і ще геть далеко до досконалості

то на тюнінг пішли сотні мільярди років

там просто купа throttling and shortcuts по научному зветься cognitive biases (можу трохи плутати останній термін але він про це)

фактично якраз сучасна «людська думка» сучасна починаючи з платона арістотеля якраз і займалася замислилися тим як розробити систему щоб усі ці biases системно обходити як то філософія логіка та науковий підхід як то і зокрема інженерія

і ще геть далеко до досконалості

і фішечка якраз в тім що сучасної збірної потужності по популяції уже не вистачає на само підтримку прогресу просто виходячи з самої ідеї що більш менш мислити можуть лише 14% популяції а реально мислити так і то є 2%

ЗЫ: і то є ще окрема думка що не факт що то є відноситься або до усіх раз або до усіх соціально культурних ідеологічних у т.ч. устроїв

«штовхачів прогресу» (пасіонаріїв) і так завжди було мало, а тепер ще плюс до цього «мораль», і «загниваючий Захід»

можна розглянути ще кілька концептів:
1. Що прогрес 18..20 ст. не то що прогрес, а «повернення до норми» після якоїсь катастрофи
2. Знання беруться з якось там «носфери» чи від «космічного розуму»
3. Рептилоїди та інші теорії змови, коли знання даються дозовано (як допомога «партнерів» неньці).

п.с.
та і взгалі, тема що прогрес має бути прогресивний, а ріст ВВП ростучий трохи сумнівна.
От допустим у всіх всьо є («6 м2 з ліжкомісцем в кондоміумі, «гумова» жінка/чоловік з ШІ блондинки/блондина, стабільна дення порція мівіни/дошираку з БАДами, гаджет з підключенням в соціалку, роботу роблять в основному роботи) і куди далі прогресувати? А ресурси обмежені і скінченні.

там просто купа throttling and shortcuts по научному зветься cognitive biases (можу трохи плутати останній термін але він про це)

думаю, там трейдофф IQ EQ, або іншими словами «рептилоідного мозку» та «логічного мозку», тобто «швидко/автоматично/з мін. затратами енергії/на емоціях» та «повільно/думаючи/логічно/раціонально/енергозатратно»

Підписатись на коментарі