Вопросы с собеседований
От: avovana Россия  
Дата: 15.11.21 05:59
Оценка: 14 (3)
Добрый день, дорогие форумчане!

Предлагаю делиться техническими вопросами с собеседований.
Раньше были примеры и обсуждения.
Сейчас предлагаю немного структурировать иерархически сообщения.
Есть корень — это сообщение. В детях делаем новое сообщение с заданием/решением/обсуждение:

Корень
-Набор 20 задач с финтеха
--Обсуждение
---....
-Задача на наследование с вызовом виртуальных функций из базового класса
--Обсуждение
и т.д.

Стартую своими.
Сохранял как в текстовом, так и в графическом виде. Где-то есть решения.
Отредактировано 15.11.2021 20:09 avovana . Предыдущая версия . Еще …
Отредактировано 15.11.2021 6:01 avovana . Предыдущая версия .
Набор 20 задач с финтеха
От: avovana Россия  
Дата: 15.11.21 06:02
Оценка:
На решение был 1 час в домашней обстановке.


Отредактировано 15.11.2021 6:03 avovana . Предыдущая версия .
Задача на наследование с вызовом виртуальных функций
От: avovana Россия  
Дата: 15.11.21 06:07
Оценка:
На собеседование были:
1) Эти 2 задачи
2) "Какие паттерны проектирования вы знаете?"
3) "Как решаете задачи? Знаете ли UML? Рисуете ли диаграмму?"


Отредактировано 15.11.2021 6:08 avovana . Предыдущая версия . Еще …
Отредактировано 15.11.2021 6:08 avovana . Предыдущая версия .
Re: Набор 20 задач с финтеха
От: Максим Россия  
Дата: 15.11.21 07:02
Оценка: +3
A>На решение был 1 час в домашней обстановке.

По поводу первого задания есть сомнения, что пункты 2 и 3 равнозначны. const указывает на константность того, что стоит слева от него, а тут в одном случае значение, а в другом указатель.

    int* const pi1 = &i;
    int const *pi2 = &i;


https://wandbox.org/permlink/tmjl6UKrDphGww83

Дальше пока не смотрел
Errare humanum est
Отредактировано 15.11.2021 7:05 Максим . Предыдущая версия .
Re[2]: Набор 20 задач с финтеха
От: night beast СССР  
Дата: 15.11.21 07:06
Оценка: +3
Здравствуйте, Максим, Вы писали:

A>>На решение был 1 час в домашней обстановке.


М>По поводу первого задания есть сомнения, что пункты 2 и 3 равнозначны. const указывает на константность того, что стоит слева от него, а тут в одном случае значение, а в другом указатель.


видимо, имелось в виду 3 и 1
или пункты перепутаны, потому как const T * -- указатель на кост.объект
Отредактировано 15.11.2021 7:07 night beast . Предыдущая версия .
Re: Задача на наследование с вызовом виртуальных функций
От: B0FEE664  
Дата: 15.11.21 10:59
Оценка: +1 -1
Здравствуйте, avovana, Вы писали:

Безумный код иногда меня ставит в тупик:
A>Image: fm1.png
Вызов виртуального метода из не виртуального деструктора...
По стандарту (11.10.4/4) должен быть вызван метод A::printFromDestructor(), значит ответ: ~A, а не ~B, как ошибочно указано в комментарии.
И каждый день — без права на ошибку...
Re: Набор 20 задач с финтеха
От: qaz77  
Дата: 15.11.21 13:21
Оценка:
Здравствуйте, avovana, Вы писали:
A>На решение был 1 час в домашней обстановке.

Простенькие такие задачки на отсев тех, кто вообще не в теме.
Я в свое время, когда набирал джуниоров в проект, тоже в таком духе давал.

P.S. От CStatusBar ностальгией по старым временам пахнуло))
Re[2]: Задача на наследование с вызовом виртуальных функций
От: Patalog Россия  
Дата: 15.11.21 13:41
Оценка: +1
Здравствуйте, B0FEE664, Вы писали:

хъ

BFE>По стандарту (11.10.4/4) должен быть вызван метод A::printFromDestructor(), значит ответ: ~A, а не ~B, как ошибочно указано в комментарии.


Это ж вроде UB — удаление объекта по указателю на базу, а деструктор не виртуальный?
Почетный кавалер ордена Совка.
Re[2]: Набор 20 задач с финтеха
От: reversecode google
Дата: 15.11.21 13:50
Оценка:
это задачки что бы отобрать исключительно джунов которые только только от учебника С++ оторвались
Re[3]: Задача на наследование с вызовом виртуальных функций
От: reversecode google
Дата: 15.11.21 13:52
Оценка: -1
если бы это было уб, то куча софта бы не работало))
Re[2]: Набор 20 задач с финтеха
От: Максим Россия  
Дата: 15.11.21 15:09
Оценка:
Q>P.S. От CStatusBar ностальгией по старым временам пахнуло))

Смотрите что нашел http://rsdn.org/forum/mfc/1358317.hot
Автор: Ellin
Дата: 01.09.05
Errare humanum est
Re[3]: Набор 20 задач с финтеха
От: watchmaker  
Дата: 15.11.21 15:12
Оценка: +1
Здравствуйте, night beast, Вы писали:

NB>видимо, имелось в виду 3 и 1

NB>или пункты перепутаны

Так ответы бывают
  1. правильные;
  2. те, которые ожидает получить интервьюер;
  3. те, которые даёт кандидат.
В идеале все три должны совпадать. Но так бывает не всегда.
Как я понимаю, на скриншотах avovana приводит ответы из третьей категории
Re[3]: Задача на наследование с вызовом виртуальных функций
От: B0FEE664  
Дата: 15.11.21 15:31
Оценка:
Здравствуйте, Patalog, Вы писали:

BFE>>По стандарту (11.10.4/4) должен быть вызван метод A::printFromDestructor(), значит ответ: ~A, а не ~B, как ошибочно указано в комментарии.

P>Это ж вроде UB — удаление объекта по указателю на базу, а деструктор не виртуальный?

Хмм. Действительно:
С++14
5.3.5/3

In the first alternative (delete object), if the static type of the object to be deleted is different from its dynamic type, the static type shall be a base class of the dynamic type of the object to be deleted and the static type shall have a virtual destructor or the behavior is undefined. In the second alternative (delete array) if the dynamic type of the object to be deleted differs from its static type, the behavior is undefined.


С++20
7.6.2.8/3

In a single-object delete expression, if the static type of the object to be deleted is different from its dynamic type and the selected deallocation function (see below) is not a destroying operator delete, the static type shall be a base class of the dynamic type of the object to be deleted and the static type shall have a virtual destructor or the behavior is undefined. In an array delete expression, if the dynamic type of the object to be deleted differs from its static type, the behavior is undefined.

И каждый день — без права на ошибку...
Re: Вопросы с собеседований
От: reversecode google
Дата: 17.11.21 00:16
Оценка: 4 (1)
помню позвал хр прособеседоваться в их hft ко,
делать было нечего, дай попробую

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

вопрос с hft ко,
— есть двух мерная матрица знаковых целых чисел(кажется целых вот точно не помню этот момент)
и у нас есть алгоритм, который суммирует сначала по вертикали а потом по горизонтали складывает вертикальные суммы
и есть алгоритм который суммирует сначала по горизонтали а потом по вертикали складывает горизонтальные суммы

так вот, будет ли всегда одинаковыми эти суммы в двух алго?

я подумал что знак по идеи может прыгать и в переносе он не участвует
значит суммы могут быть разными

наверное в фин области это сакральные знания, жаль мне в моих областях(а их много) за 10+ лет не понадобились

так что увы если ошибся с ответом, но и мне правильного ответа так и не сказали
Re[2]: Вопросы с собеседований
От: SomeOne_TT  
Дата: 17.11.21 02:58
Оценка:
Здравствуйте, reversecode, Вы писали:

R>вопрос с hft ко,

R>- есть двух мерная матрица знаковых целых чисел(кажется целых вот точно не помню этот момент)
R>и у нас есть алгоритм, который суммирует сначала по вертикали а потом по горизонтали складывает вертикальные суммы
R>и есть алгоритм который суммирует сначала по горизонтали а потом по вертикали складывает горизонтальные суммы


R>так что увы если ошибся с ответом, но и мне правильного ответа так и не сказали


Если с плавающей точкой, то может, т.к. точка может необратимо прыгать вперед на разряды и тогда мелкие слагаемые просто будут игнорироваться.
    float __1 = 10000000;
    float __2 = 0.5;
    float sum_float = __2 +__2 + __1;
    float sum_float2 = __1 +__2 + __2;
Re[2]: Вопросы с собеседований
От: LaptevVV Россия  
Дата: 17.11.21 07:15
Оценка:
R>- есть двух мерная матрица знаковых целых чисел(кажется целых вот точно не помню этот момент)
R>и у нас есть алгоритм, который суммирует сначала по вертикали а потом по горизонтали складывает вертикальные суммы
R>и есть алгоритм который суммирует сначала по горизонтали а потом по вертикали складывает горизонтальные суммы
R>так вот, будет ли всегда одинаковыми эти суммы в двух алго?
Для целых — всегда одинаковая, так как равна сумме всех элементов.
Достаточно представить себе двумерный массив как линейный по строкам.
То ли ты складываешь подряд, то ли через n — общая сумма от этого не меняется.
Для дробных, как тут уже сказали, ошибки точности могут быть из-за слишком большой разницы в числах.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Вопросы с собеседований
От: Максим Россия  
Дата: 17.11.21 07:29
Оценка:
Здравствуйте, LaptevVV, Вы писали:

R>>- есть двух мерная матрица знаковых целых чисел(кажется целых вот точно не помню этот момент)

LVV>Для целых — всегда одинаковая, так как равна сумме всех элементов.

Это в теории, а на практике может быть UB при переполнении для знаковых целых. Пример

100000 100000 ... 1000000
-100000 -100000 ... -1000000
100000 100000 ... 1000000
-100000 -100000 ... -1000000
100000 100000 ... 1000000
-100000 -100000 ... -1000000
....

При одном способе обхода будет 0, а при другом все, что угодно.
Errare humanum est
Re[4]: Вопросы с собеседований
От: LaptevVV Россия  
Дата: 17.11.21 09:32
Оценка:
М>При одном способе обхода будет 0, а при другом все, что угодно.
Это понятно.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Вопросы с собеседований
От: Sharov Россия  
Дата: 17.11.21 11:13
Оценка:
Здравствуйте, reversecode, Вы писали:

R>помню позвал хр прособеседоваться в их hft ко,

R>делать было нечего, дай попробую

R>все вопросы были фигня, но на один я задумался и ответил что в голову пришло, только что бы дальше двигаться и услышать другие


R>вопрос с hft ко,

R>- есть двух мерная матрица знаковых целых чисел(кажется целых вот точно не помню этот момент)
R>и у нас есть алгоритм, который суммирует сначала по вертикали а потом по горизонтали складывает вертикальные суммы
R>и есть алгоритм который суммирует сначала по горизонтали а потом по вертикали складывает горизонтальные суммы
R>я подумал что знак по идеи может прыгать и в переносе он не участвует
R>значит суммы могут быть разными
R>наверное в фин области это сакральные знания, жаль мне в моих областях(а их много) за 10+ лет не понадобились
R>так что увы если ошибся с ответом, но и мне правильного ответа так и не сказали

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

А я вот задумался -- а double или float могут переполняться, или просто точность потеряют?
Кодом людям нужно помогать!
Реализовать класс индекса
От: avovana Россия  
Дата: 17.11.21 11:15
Оценка:

// Требуется реализовать класс индекса, для хранения данных по 3-м вложенным текстовым ключам
//
//     index["key1"]["key2"]["key3"] = data;
//
// в последнем уровне индекса содержатся данные объект класса Data
//
// Пример заполнение данных по ключам выглядит так:
//
//  Data  data1, data2;
//  Index idx;
//  idx.set("key1").set("key2").set("key3").set(data1);
//  idx.set("key1.1").set("key2.1").set("key3.1").set(data2);
//
// Пример доступа к данным по ключам:
//
//  data1 = idx.get("key1").get("key2").get("key3").get();
//
// в реализации предусмотреть раcширение глубины индексов


class Data {
};

class Index {
};


int main()
{
    Data data1, data2, data3;
    Index idx;
    
    // добавление в индекс
    
    //idx.set("key1").set(data1);
    
    idx.set("key1").set("key2").set("key3").set(data1);
    idx.set("key1.1").set("key2.1").set("key3.1").set(data2);
    idx.set("key1.2").set("key2.2").set("key3.2").set(data3);
    
    // получение данных из индекса
    
    data1 = idx.get("key1").get("key2").get("key3").get();
    data2 = idx.get("key1.1").get("key2.1").get("key3.1").get();
    data3 = idx.get("key1.2").get("key2.2").get("key3.2").get();

    return 0;
}
Отредактировано 17.11.2021 12:30 avovana . Предыдущая версия .
Re[3]: Вопросы с собеседований
От: qaz77  
Дата: 17.11.21 11:21
Оценка: 8 (1) +1
Здравствуйте, Sharov, Вы писали:
S>А я вот задумался -- а double или float могут переполняться, или просто точность потеряют?

Могут, конечно.
Представление экспоненты не бесконечно.
Умножить DBL_MAX * DBL_MAX и получим floating point overflow.
Распарсить typescript.ts и вывести
От: avovana Россия  
Дата: 17.11.21 19:08
Оценка:
Здесь не совсем понял что надо сделать.
Может парсер typescript? Тогда почему такие же С++ классы уже есть в файлах?
Зачем что-то с чем-то связывать внутри биндингами?



Есть уже заготовленный регистратор объектов.
Была идея:
1. Парсить *.ts файл с описанием классов
2. Разбивать на токены(ни разу не делал. Что это даёт? Разные сущности?)
3. Получать что-то
4. Это что-то зачем-то связывать с уже готовыми такими же С++ классами.
5. Вывести в стиле рефлексии

А как вы считаете, что хотят и как этого добиться?
Отредактировано 17.11.2021 19:09 avovana . Предыдущая версия .
Re: Набор 20 задач с финтеха
От: SkyDance Земля  
Дата: 18.11.21 02:11
Оценка:
A>На решение был 1 час в домашней обстановке.

Нормально. Если за час не смогли загуглить решения к тем, что не помнят назубок, — вполне годится в качестве проверки.

Непонятно, правда, что именно проверяется. Если б вопрос стоял как "в каком случае лучше использовать const/.../..., для решения каких проблем придуман volatile, и решает ли он эти проблемы" — оно как-то логичнее было бы, что ли.
Re: Распарсить typescript.ts и вывести
От: avovana Россия  
Дата: 20.11.21 19:49
Оценка:
Получается есть набор С++ классов под стать классам из *.ts файла.
На входе *.ts файл может менять. В нём могут быть данные классы в разной последовательности.
Суть программы — получая такой *.ts файл выводить такой же.
Сделать это через связывание уже готовых С++ классов.
struct MarketPolicy {};

struct LimitPolicy {
    double price;
    std::optional<double> stop;
};


Гарантируется что в *.ts файле могут быть только классы, которые уже подготовлены в С++ исполнение.

Алгоритм программы вкратце:
Комбинация ts классов -> выставление соответствия из уже готовых С++ файлов -> вывод.

В репе есть пример как это делать вручную.
А как автоматизировать?
Наверное:
1. Считать входной *.ts файл.
2. Выцепить названия классов
3. Поместить их в контейнер

4. Пройтись по контейнеру
5. получая очередное имя создавать биндинг, в котором еще в зависимости от имени проставляется тип:

Binder<MarketPolicy> binder("MarketPolicy");


Таким образом получим контейнер биндеров. Что с ними делать?

6. Поместить в некий ObjectRegistry
7. Вызвать метод render()

Не всё понятно. Не понятна наводка что за проставление свойств у такого биндинга, если вдруг у класса есть поля:
Binder<LimitPolicy> binder("LimitPolicy");
binder.set("price", &LimitPolicy::price);
binder.set("stop", &LimitPolicy::stop);



Смысл в том, что на входе(*.ts) мы получаем не объекты, а классы:
class MarketPolicy {
};

class LimitPolicy {
    price: number;
    stop?: number;
};

class Order {
    symbol: string;
    quantity: number;
    isBuy: boolean;
    policy: MarketPolicy | LimitPolicy;
};

class Balance {
    free: number;
    locked: number;
};
Re[2]: Распарсить typescript.ts и вывести
От: avovana Россия  
Дата: 21.11.21 07:14
Оценка:

make *.ts definitions according to the C++ classes in a simple way for the user of "your library".


Всё наоборот. Нужно сделать подобие рефлекшена. Дана уже какая-то объектная модель.
Т.е. на входе С++ классы. А на выходе *.ts.
Отредактировано 21.11.2021 13:04 avovana . Предыдущая версия . Еще …
Отредактировано 21.11.2021 7:36 avovana . Предыдущая версия .
Re[4]: Вопросы с собеседований
От: sergii.p  
Дата: 21.11.21 10:24
Оценка: :)))
Здравствуйте, Максим, Вы писали:

М>Это в теории, а на практике может быть UB при переполнении для знаковых целых


хороший вопрос на собеседование: приведите любой возможный код на C++ без UB.
Re[4]: Вопросы с собеседований
От: Hobbes Россия  
Дата: 23.11.21 11:11
Оценка:
Здравствуйте, Максим, Вы писали:

М>Это в теории, а на практике может быть UB при переполнении для знаковых целых. Пример


Переполнение знаковых целых это UB? Я-то думал, что на практике все целочисленные вычисления, хоть с переполнением, хоть без, выполняются по модулю 2^32 или 2^64.
Re[5]: Вопросы с собеседований
От: Максим Россия  
Дата: 23.11.21 18:57
Оценка: 1 (1)
H>Переполнение знаковых целых это UB?

Да.

https://en.cppreference.com/w/cpp/language/ub
undefined behavior — there are no restrictions on the behavior of the program. Examples of undefined behavior are data races, memory accesses outside of array bounds, signed integer overflow, null pointer dereference, more than one modifications of the same scalar in an expression without any intermediate sequence point (until C++11)that are unsequenced (since C++11), access to an object through a pointer of a different type, etc. Compilers are not required to diagnose undefined behavior (although many simple situations are diagnosed), and the compiled program is not required to do anything meaningful.
Errare humanum est
Re[3]: Распарсить typescript.ts и вывести
От: avovana Россия  
Дата: 27.11.21 19:53
Оценка:
В общем, всё свелось к тому, что надо вывести тип в шаблонном методе и записать его строкой исходя из такой странной записи передачи поля класса по ссылке &LimitPolicy::price:

К примеру, класс:
struct LimitPolicy {
double price;
std::optional<double> stop;
};

Метод:
template <typename Attribute>
void set(std::string name, Attribute attribute){
    // <----- получить std::string от Attribute
};
И вот как передают поле:
set("price", &LimitPolicy::price);


Надо внутри set записать тип переданного поля в строку
Re[4]: Распарсить typescript.ts и вывести
От: reversecode google
Дата: 27.11.21 20:05
Оценка:
?
https://en.cppreference.com/w/cpp/language/typeid
в бусте по моему свою имплементацию типайди написали, можно взглянуть для примера
Re[5]: Распарсить typescript.ts и вывести
От: avovana Россия  
Дата: 28.11.21 09:09
Оценка:
Здравствуйте, reversecode, Вы писали:

R>?

R>https://en.cppreference.com/w/cpp/language/typeid
R>в бусте по моему свою имплементацию типайди написали, можно взглянуть для примера

Понятно, спасибо. В описание просили только плюсы использовать. Предпочтительно С++17.
Т.е. узнать тип можно только в рантайм?
И что это за ссылка на поле класса? До этого примера такого нигде не встречал.
Re[6]: Распарсить typescript.ts и вывести
От: watchmaker  
Дата: 29.11.21 17:50
Оценка:
Здравствуйте, avovana, Вы писали:

A>Здравствуйте, reversecode, Вы писали:


R>>https://en.cppreference.com/w/cpp/language/typeid


A>Т.е. узнать тип можно только в рантайм?


Например, в случае
Base* b = (rand() % 2 == 0) ? new Derived1 : new Derived2;

report(typeid(*b));
конкретный тип принципиально не будет известен без выполнения программы.
typeid и нужен для выяснения динамического типа, который неизвестен во время компиляции. Ну и ещё для пары сценариев: для type_index и для отладочной печати из макросов/шаблонов (самое полезное!).



И главное: typeid для этой задачи использовать не надо.
В общем случае он не позволит её решить, а частные случаи будут либо бесполезны с практической точки зрения (например, предварительная регистрация всех возможных комбинаций поддерживаемых type_index), либо очень сложны и непереносимы (вроде запуска name-demangle над typeid(f).name() и анализа результатов).


Эта задача совсем на другое: на написание кода, который умеет доставать из шаблонного аргумента типы, которые он содержит, и который умеет сопоставлять его с другими стандартными шаблонами (вроде std::optional, std::variant), чтобы преобразовать последние в соответствующие typescript-конструкции.


A>И что это за ссылка на поле класса? До этого примера такого нигде не встречал.


Нет тут ссылок. В этом контексте — это взятие адреса. На выходе — обычный pointer to (data) member.
Его тип как раз содержит всё что нужно: и тип поля, и тип класса, в котором это поле находится.
Общие вопросы
От: avovana Россия  
Дата: 04.12.21 18:14
Оценка: 6 (1)
Отредактировано 04.12.2021 18:15 avovana . Предыдущая версия .
Реализовать класс индекса
От: avovana Россия  
Дата: 04.12.21 18:16
Оценка:
Разреженная матрица?

// Требуется реализовать класс индекса, для хранения данных по 3-м вложенным текстовым ключам
//
//     index["key1"]["key2"]["key3"] = data;
//
// в последнем уровне индекса содержатся данные объект класса Data
//
// Пример заполнение данных по ключам выглядит так:
//
//  Data  data1, data2;
//  Index idx;
//  idx.set("key1").set("key2").set("key3").set(data1);
//  idx.set("key1.1").set("key2.1").set("key3.1").set(data2);
//
// Пример доступа к данным по ключам:
//
//  data1 = idx.get("key1").get("key2").get("key3").get();
//
// в реализации предусмотреть раcширение глубины индексов


class Data {
};

class Index {
};


int main()
{
    Data data1, data2, data3;
    Index idx;
    
    // добавление в индекс
    
    //idx.set("key1").set(data1);
    
    idx.set("key1").set("key2").set("key3").set(data1);
    idx.set("key1.1").set("key2.1").set("key3.1").set(data2);
    idx.set("key1.2").set("key2.2").set("key3.2").set(data3);
    
    // получение данных из индекса
    
    data1 = idx.get("key1").get("key2").get("key3").get();
    data2 = idx.get("key1.1").get("key2.1").get("key3.1").get();
    data3 = idx.get("key1.2").get("key2.2").get("key3.2").get();

    return 0;
}
Отредактировано 04.12.2021 18:16 avovana . Предыдущая версия .
Re: Общие вопросы
От: reversecode google
Дата: 04.12.21 18:21
Оценка:
не боитесь что компании могут сильно обидится и начать бороться с тем что вы выставляете годами вымученные тестовые задание-вопросы ?

лоу летенси трейдинг и питон, вызывают смех

а про погуглить тем более, некоторым и погуглить не поможет

а очень разносторонние девелоперы, вообще он хот знание не держат в голове, иначе сума сойдут
Аллокация памяти и тредовый робот
От: avovana Россия  
Дата: 04.12.21 18:21
Оценка: 3 (1)
1. Cколько запросов на выделение памяти из кучи будет сделано при вызове каждой из данных функций?

void f1() {
    std::string s = "hello world"; // const char* 12 байт // SSO < 16 байт
}

void f2() {
    char const* s = "hello world"; // 12 байт // только для чтения
}

void f3() {
    std::unique_ptr<int> i(new int); // int на куче - 4 байт
}

void f4() {
    std::shared_ptr<int> i(new int); // 2 указателя . 1 - на выделенный объект, 2ой на счетчик
}

void f5(std::vector<int>& v, int i) { // int - в хорошем случае. size < capacity. | size == capacity => нету места для нового int. 1. аллокация. 2. переместить. 3. создать новый объект. 4. деаллцировать старую память
    v.push_back(i);
}

void f6(std::list<int>& l, int i) { // new int
    l.push_back(i);
}

void f7(std::vector<int>& v1, const std::vector<int>& v2) {
    v1 = v2; // operator=. сравнить size(). 1. v1 size достаточно. 2. v1.clear() 
}

void f8(std::list<int>& l1, const std::list<int>& l2) {
    l1 = l2;
}

void f9(std::string& s1, const std::string& s2) {
    s1 = s2;
}

void f10(std::vector<int>& v1, std::vector<int>& v2) { // ни одноой аллок
    v1.swap(v2);
}

void f11(std::list<int>& l1, std::list<int>& l2) {
    l1.swap(l2);
}

void f12(std::map<std::string, int>& m, char const* k) {
    int i = m[k]; 1. constr
}

void f13() {
    struct S {
        const char const* s;
        S(char const* const s) : s(s) {}
    };
    char storage[2 * sizeof(S)];
    S* s = reinterpret_cast<S*>(storage);
    new(s) S("hello world");
}

// Как сделать чтобы робот шагал сначала левой, потом правой, левой, правой...?
// Обобщить до 40жки, чтобы каждая нога двигалась за предыдущей
===========

int main()
{
    std::thread first([]()
        {
            while(true)
            {
                std::cout << "First" << std::endl;
            }
        }
    );
    std::thread second([]()
        {
            while(true)
            {
                std::cout << "Second" << std::endl;
            }
        }
    );
    first.join();
    second.join();

    return 0;
}
Отредактировано 04.12.2021 18:25 avovana . Предыдущая версия .
Re[2]: Общие вопросы
От: avovana Россия  
Дата: 04.12.21 18:25
Оценка:
Здравствуйте, reversecode, Вы писали:

R>не боитесь что компании могут сильно обидится и начать бороться с тем что вы выставляете годами вымученные тестовые задание-вопросы ?

Ну да, это к тому, что:
1) Ок для соискателя, если человеку дали вопросы, он погуглил, нашел эту тему — старается.
2) Ок для компании, что если пару лет были одни и теже вопросы, можно придумать что-то новенькое.

R>а очень разносторонние девелоперы, вообще он хот знание не держат в голове, иначе сума сойдут

Хорошее замечание. Последнее время спрашиваю вопросы и материалы для подготовки. Что интересно — hr'ы говорят. Им дают обратную связь кандидаты или сами компании могут нормально к этому относится и сами советуют. Мне сейчас по postgresql посоветовали по конкурентную запись почитать, индексы и т.п. для следующего этапа.
Игра "Сапер"
От: avovana Россия  
Дата: 04.12.21 18:29
Оценка:
3 этапа:
1. Создать поле. Расставить бомбы
2. Расставить цифры, которые говорят, сколько бомб вокруг
3. Кликнуть по полю, получить результат:
а) Пустое место. Открываются все пустые рядом и пустые рядом с ними и т.д.
б) Цифра
в) Бомба

Сделал 2 этапа:
int x, y, bombs;

//======================

vector<vector<int>> table;
table.resize(x);

for(auto & col: table)
    col.resize(y);

// 9 == bomba
// 0 == empty

for (int i = 0; i < bombs; ++i) {
    int row = srand(time_now()) % x;
    int col = srand(time_now()) % y;

    if(table[col][row] == 9) {
        --i;
        continue;
            }
    
    table[col][row] = 9;
}

//======================

for(int col = 0; col < x; ++col) {
    for(int row = 0; row < y; ++row) {
        
        if(table[col][row] == 9)
            continue;

        /*        
            col - 1, row
        col + 1, row
        col    , row - 1
        col    , row + 1
        col    , row
        col - 1, row - 1
        col + 1, row - 1
        col - 1, row + 1
        col + 1, row + 1            
        */
    
        int bombs_around = 0;    
        
        int cols[] = [col - 1, col, col + 1];
        int rows[] = [row - 1, row, row + 1];
                
        for(int l = 0; l < 3; ++l) {
            for(int k = 0; k < 3; ++k) {
                if(cols[l] < 0 || cols[l] > x - 1 || rows[k] < 0 || rows[k] > y - 1)
                    continue;
                    
                if(table[cols[l]][rows[k]] == 9)
                    bombs_around++;
            }
        }
        
        table[col][row] = bombs_around;
}
Отредактировано 04.12.2021 18:29 avovana . Предыдущая версия .
Re[3]: Общие вопросы
От: reversecode google
Дата: 04.12.21 18:29
Оценка:
что то не припомню что бы мне что то посоветовали хоть раз перед собеседованием
причем несколько последних раз я сам несколько раз хр спросил, что будут спрашивать, и к чему готовится
проигнорили мой вопрос
вообщем я всегда собеседуюсь не готовясь
Функция zip, join Postgresql
От: avovana Россия  
Дата: 04.12.21 18:32
Оценка:
Требуется реализовать функцию zip, которая соединяет элементы двух слайсов в слайс пар

func main() {
    s1, s2 := []int{1, 2, 3}, []int{4, 5, 6, 7, 8}
    fmt.Println(zip(s1, s2)) // [[1 4] [2 5] [3 6]]
}

func zip(s1 []int, s2 []int) [][]int {
    //...
}
// Моё решение. Сделал объединение в пары:
std::vector<int> s1 {1, 2, 3};
std::vector<int> s2 {4, 5, 6, 7, 8};

std::vector<std::pair<int, int>> zip(std::vector<int> s1, std::vector<int> s2) {
    std::vector<std::pair<int, int>> res;
    int size = std::min(s1.size(), s2.size());
    res.reserve(size);

    for(int i = 0; i < size; ++i) {
        int el1 = s1[i];
        int el2 = s2[i];

        std::pair<int, int> pair = {s1[i], s2[i]};
        res.push_back(pair);
    }
    return res;
}

//----------------------

Есть база с такой схемой данных

// user
id | firstname | lastname | birth
1  | Ivan      | Petrov   | 1996-05-01
2  | Anna      | Petrova  | 1999-06-01      

// purchase
sku   | price | user_id | date
11111 | 5500  | 1       | 2021-02-15
22222 | 4000  | 1       | 2021-02-14
33333 | 8000  | 2       | 2021-03-01
44444 | 400   | 2       | 2021-03-02

// ban_list
user_id | date   
1       | 2021-03-08

Нужно вывести:
Список уникальных клиентов и купленных ими товаров в феврале
Отредактировано 04.12.2021 18:32 avovana . Предыдущая версия .
replace
От: avovana Россия  
Дата: 04.12.21 18:35
Оценка:
// написать функцию replace c 3-мя входными аргументами, возвращающую новую строку
//
// список аргументов:
// 1 - входная строка
// 2 - что ищем во входной строке
// 3 - чем заменяем
//
// примеры выполнения:
// replace("aabbcc", "b", "B")    -> "aaBBcc"
// replace("aabbcc", "bb", "B")   -> "aaBcc"
// replace("aabbbcc", "bb", "B")  -> "aaBbcc"
// replace("aabbcc", "b", "BB")   -> "aaBBBBcc"


std::string replace(std::string input, std::string substr, std::string replace_to) {
    std::string res;
    int idx_of_substr = 0;
    ind end_idx_copied = 0;

    for(int i = 0; i < input.size(); ++i) {
        idx_of_substr = input.find(substr, idx_of_substr);
        if(idx_of_substr != std::string::npos) {
            res.append(input.substr(end_idx_copied, idx_of_substr));
            res.append(replace_to);

            i = i + substr.size() - 1;
            end_idx_copied = i;
        }
    }

    res.append(input.substr(end_idx_copied, input.size() - 1));
}


Сначала сам стал пытаться реализовать поиск substr. Подсказали, что можно взять готовую.
Успел основное решение. Еще краевой случай, чтобы индекс не вышел за границу.
Отредактировано 04.12.2021 18:36 avovana . Предыдущая версия .
Красивые числа
От: avovana Россия  
Дата: 04.12.21 18:47
Оценка: 3 (1)

Тестовое задание.
В данной задаче будут рассматриваться 13-ти значные числа в тринадцатиричной системе исчисления(цифры 0,1,2,3,4,5,6,7,8,9,A,B,C) с ведущими нулями.
Например, ABA98859978C0, 6789110551234, 0000007000000
Назовем число красивым, если сумма его первых шести цифр равна сумме шести последних цифр.
Пример:
Число 0055237050A00 — красивое, так как 0+0+5+5+2+3 = 0+5+0+A+0+0
Число 1234AB988BABA — некрасивое, так как 1+2+3+4+A+B != 8+8+B+A+B+A 
Задача:
написать программу на С/С++ печатающую в стандартный вывод количество 13-ти значных красивых чисел с ведущими нулями в тринадцатиричной системе исчисления.
В качестве решения должен быть предоставлено:
1) ответ — количество таких чисел. Ответ должен быть представлен в десятичной системе исчисления.
2) исходный код программы.


Это задача на перестановки(permutation) с повторами. К примеру, есть пин код.
Может быть цифра 1-9 в любой из 4ёх позиций. Причём, не так, что раз 1 уже была, то её нельзя поставить в другую позицию. Может быть код и 1111.
Т.е. сами цифры могут повторяться.

Есть формула. Там учитывается:
1) кол-во возможных чисел. Здесь 13ть
2) кол-во мест для перестановки. Здесь 6

Шаги:
1. Находим для каждой суммы кол-во возможных комбинаций
2. Допустим, для суммы 39 есть 195042 возможных комбинаций цифр.
Это в левой части. И в правой, получается, тоже 195042.
К примеру, ССС000, 000ССС, 0С0С0С (если бы было всего 3 возможных сочетаний цифр, которые дают сумму 39)
Теперь нужно по каждой такой сумме найти кол-во сочетаний:
1 ССС000 = ССС000
2 ССС000 = 000ССС
3 ССС000 = 0С0С0С
4 000ССС = ССС000
5 000ССС = 000ССС
6 000ССС = 0С0С0С
7 0С0С0С = ССС000
8 0С0С0С = 000ССС
9 0С0С0С = 0С0С0С
Сейчас просто смотрим по той формуле, что есть цифра 3. 3 уникальных сочетания с каждой из 2ух сторон.

Сделал. Ответ оказался неверным. Может, найдёте ошибку?

// pretty_numbers = 707972099625

#include <iostream>

#include <string>
#include <map>

using namespace std;

std::map<int, int> sum_numbers;
unsigned long long counter = 0;

void count_sums(const char str[], int sum, int n, int lenght) {
    if (lenght == 1) {
        for (int j = 0; j < n; j++) {
            int current = str[j] - 48;
            if(current >= 10)
                current = current - 7;

            sum_numbers[sum + current]++;
        }
    } else {
        for (int i = 0; i < n; i++) {
            int current = str[i] - 48;
            if(current >= 10)
                current = current - 7;

            count_sums(str, sum + current, n, lenght - 1);
        }
    }
}

void permutations(int n, int lenght) {
    if (lenght == 1) {
        for (int j = 0; j < n; j++)
            counter++;
    } else {
        for (int i = 0; i < n; i++)
            permutations(n, lenght - 1);
    }
}

int main() {
    int lenght = 6;
    char str[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C'};
    int n = sizeof str;
    count_sums(str, 0, n, lenght);

    /*
    for(auto [sum, unique_numbers] : sum_numbers)
        cout << sum << ":" << unique_numbers << endl;

    ...
    39:195042
    40:187803
    41:178878
    ...
    */

    unsigned long long pretty_numbers = 0;

    for(auto [sum, unique_numbers] : sum_numbers) {
        permutations(unique_numbers, 2);
        cout << "sum: " << sum << " : " << unique_numbers << " : " << counter << " : " << pretty_numbers << endl;
        pretty_numbers += counter;
        counter = 0;
    }

    pretty_numbers = pretty_numbers - 2;
    cout << "pretty_numbers = " << pretty_numbers;

    return 0;
}


/*
sum: 0 : 1 : 1 : 0
sum: 1 : 6 : 36 : 1
sum: 2 : 21 : 441 : 37
sum: 3 : 56 : 3136 : 478
sum: 4 : 126 : 15876 : 3614
sum: 5 : 252 : 63504 : 19490
sum: 6 : 462 : 213444 : 82994
sum: 7 : 792 : 627264 : 296438
sum: 8 : 1287 : 1656369 : 923702
sum: 9 : 2002 : 4008004 : 2580071
sum: 10 : 3003 : 9018009 : 6588075
sum: 11 : 4368 : 19079424 : 15606084
sum: 12 : 6188 : 38291344 : 34685508
sum: 13 : 8562 : 73307844 : 72976852
sum: 14 : 11592 : 134374464 : 146284696
sum: 15 : 15378 : 236482884 : 280659160
sum: 16 : 20013 : 400520169 : 517142044
sum: 17 : 25578 : 654234084 : 917662213
sum: 18 : 32137 : 1032786769 : 1571896297
sum: 19 : 39732 : 1578631824 : 2604683066
sum: 20 : 48378 : 2340430884 : 4183314890
sum: 21 : 58058 : 3370731364 : 6523745774
sum: 22 : 68718 : 4722163524 : 9894477138
sum: 23 : 80262 : 6441988644 : 14616640662
sum: 24 : 92547 : 8564947209 : 21058629306
sum: 25 : 105378 : 11104522884 : 29623576515
sum: 26 : 118518 : 14046516324 : 40728099399
sum: 27 : 131698 : 17344363204 : 54774615723
sum: 28 : 144627 : 20916969129 : 72118978927
sum: 29 : 157002 : 24649628004 : 93035948056
sum: 30 : 168518 : 28398316324 : 117685576060
sum: 31 : 178878 : 31997338884 : 146083892384
sum: 32 : 187803 : 35269966809 : 178081231268
sum: 33 : 195042 : 38041381764 : 213351198077
sum: 34 : 200382 : 40152945924 : 251392579841
sum: 35 : 203658 : 41476580964 : 291545525765
sum: 36 : 204763 : 41927886169 : 333022106729
sum: 37 : 203658 : 41476580964 : 374949992898
sum: 38 : 200382 : 40152945924 : 416426573862
sum: 39 : 195042 : 38041381764 : 456579519786
sum: 40 : 187803 : 35269966809 : 494620901550
sum: 41 : 178878 : 31997338884 : 529890868359
sum: 42 : 168518 : 28398316324 : 561888207243
sum: 43 : 157002 : 24649628004 : 590286523567
sum: 44 : 144627 : 20916969129 : 614936151571
sum: 45 : 131698 : 17344363204 : 635853120700
sum: 46 : 118518 : 14046516324 : 653197483904
sum: 47 : 105378 : 11104522884 : 667244000228
sum: 48 : 92547 : 8564947209 : 678348523112
sum: 49 : 80262 : 6441988644 : 686913470321
sum: 50 : 68718 : 4722163524 : 693355458965
sum: 51 : 58058 : 3370731364 : 698077622489
sum: 52 : 48378 : 2340430884 : 701448353853
sum: 53 : 39732 : 1578631824 : 703788784737
sum: 54 : 32137 : 1032786769 : 705367416561
sum: 55 : 25578 : 654234084 : 706400203330
sum: 56 : 20013 : 400520169 : 707054437414
sum: 57 : 15378 : 236482884 : 707454957583
sum: 58 : 11592 : 134374464 : 707691440467
sum: 59 : 8562 : 73307844 : 707825814931
sum: 60 : 6188 : 38291344 : 707899122775
sum: 61 : 4368 : 19079424 : 707937414119
sum: 62 : 3003 : 9018009 : 707956493543
sum: 63 : 2002 : 4008004 : 707965511552
sum: 64 : 1287 : 1656369 : 707969519556
sum: 65 : 792 : 627264 : 707971175925
sum: 66 : 462 : 213444 : 707971803189
sum: 67 : 252 : 63504 : 707972016633
sum: 68 : 126 : 15876 : 707972080137
sum: 69 : 56 : 3136 : 707972096013
sum: 70 : 21 : 441 : 707972099149
sum: 71 : 6 : 36 : 707972099590
sum: 72 : 1 : 1 : 707972099626
pretty_numbers = 707972099625
*/


Ответ оказался
Отредактировано 04.12.2021 19:00 avovana . Предыдущая версия .
Re[4]: Общие вопросы
От: avovana Россия  
Дата: 04.12.21 20:14
Оценка:
Здравствуйте, reversecode, Вы писали:

R>что то не припомню что бы мне что то посоветовали хоть раз перед собеседованием

R>причем несколько последних раз я сам несколько раз хр спросил, что будут спрашивать, и к чему готовится
R>проигнорили мой вопрос
R>вообщем я всегда собеседуюсь не готовясь

Сейчас, похоже, всё больше скатывается к ФААНГ стилю:
1) Порешай алгоритм
2) Построй систему
3) Пообщаемся
В Яндекс такое, наверное, давно. Сейчас Тиньков подъехал. 2 года назад еще не было. Сейчас ввели.
Re: Аллокация памяти и тредовый робот
От: reversecode google
Дата: 05.12.21 01:56
Оценка:
два треида печатающих first second это к роботу правой левой ?
std::atomic_wait что бы красивее, вместо кондишин переменной
Re: Набор 20 задач с финтеха
От: RedUser Россия  
Дата: 05.12.21 07:57
Оценка:
2. Есть ещё константные методы.
19.1. Внезапно, зависит от алгоритма сортировки. И для чисел может быть N.
Re: replace
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 05.12.21 08:08
Оценка:
Здравствуйте, avovana, Вы писали:


A>[ccode]

A>// написать функцию replace c 3-мя входными аргументами, возвращающую новую строку
A>//
A>// список аргументов:
A>// 1 — входная строка
A>// 2 — что ищем во входной строке
A>// 3 — чем заменяем
A>//
A>// примеры выполнения:
A>// replace("aabbcc", "b", "B") -> "aaBBcc"
A>// replace("aabbcc", "bb", "B") -> "aaBcc"
A>// replace("aabbbcc", "bb", "B") -> "aaBbcc"
A>// replace("aabbcc", "b", "BB") -> "aaBBBBcc"

Недавно на собеседовании решал очень похожую, но с дополнительным наворотом в виде "аргументы 2 и 3 взаимозаменяемы" — надо заменять тот, что нашел первым на противоположный.
Отредактировано 05.12.2021 8:12 kaa.python . Предыдущая версия .
Re[5]: Общие вопросы
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 05.12.21 08:20
Оценка:
Здравствуйте, avovana, Вы писали:

A>В Яндекс такое, наверное, давно. Сейчас Тиньков подъехал. 2 года назад еще не было. Сейчас ввели.


До "язык не имеет значения" уже доросли или еще нет? Яндекс, я слышал, дорос.
Re[7]: Распарсить typescript.ts и вывести
От: avovana Россия  
Дата: 05.12.21 12:59
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Нет тут ссылок. В этом контексте — это взятие адреса. На выходе — обычный pointer to (data) member.

W>Его тип как раз содержит всё что нужно: и тип поля, и тип класса, в котором это поле находится.

Да, спасибо. Получилось разобраться. Тип дан. Через _PRETTY_FUNCTION_ можно его получить и распарсить.
Re[2]: Аллокация памяти и тредовый робот
От: avovana Россия  
Дата: 05.12.21 13:00
Оценка:
Здравствуйте, reversecode, Вы писали:

R>два треида печатающих first second это к роботу правой левой ?


Ну да, показывают что есть два треда, которые должны быть как-то синхронизированы, попеременно выдавая output.
Re[8]: Распарсить typescript.ts и вывести
От: watchmaker  
Дата: 06.12.21 02:03
Оценка:
Здравствуйте, avovana, Вы писали:

A> Через _PRETTY_FUNCTION_ можно его получить и распарсить.


Предполагаешь использовать _PRETTY_FUNCTION_ в решении? Это очень плохая идея и неправильный путь.
Re: Красивые числа
От: watchmaker  
Дата: 06.12.21 02:06
Оценка: 6 (1) +1
Здравствуйте, avovana, Вы писали:


A>Тестовое задание.
A>В данной задаче будут рассматриваться 13-ти значные числа в тринадцатиричной системе исчисления(цифры 0,1,2,3,4,5,6,7,8,9,A,B,C) с ведущими нулями.
A>Например, ABA98859978C0, 6789110551234, 0000007000000
A>Назовем число красивым, если сумма его первых шести цифр равна сумме шести последних цифр.


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


Глобальные переменные.
Ладно бы в них хранилось какое-то глобальное состояние, но нет: сугубо локальные счётчики.
Будет это работать, если запустить два потока? — Нет, они перезатрут друг-друга.
Будет это работать, если запустить функцию ещё раз? — Нет, от предыдущей итерации остался мусор.

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


Безумный способ умножения чисел:
Написан фрагмент
unsigned long long counter = 0;

void permutations(int n, int lenght) {
    if (lenght == 1) {
        for (int j = 0; j < n; j++)
            counter++;
    } else {
        for (int i = 0; i < n; i++)
            permutations(n, lenght - 1);
    }
}

///
{
      permutations(unique_numbers, 2);
      // ...
      pretty_numbers += counter;
      counter = 0;
}

который делает (N2) операций инкремента.

Когда нужно написать вместо него
    pretty_numbers += unique_numbers * unique_numbers;

— умножение за время O(1). И без всякого глобального счётчика.


Граничные условия и рекурсия
Даже если считать, что рекурсия тут нужна, то видно, что нет сноровки в работе с граничными случаями.
Зачем-то обрабатывается случай (lenght == 1) и не обрабатывается случай равенства нулю.
Который не только нужен для всеобщности, но позволяет не делать в обоих ветках одинаковые действия.
В функции permutations повторяется блок for (int i = 0; i < n; i++), а в функции count_sums уже целая секция
        for (int j = 0; j < n; j++) {
            int current = str[j] - 48;
            if(current >= 10)
                current = current - 7;

Зачем? Это же...


Копипаста.
Даже если предположить, что вышеприведённые одинаковые фрагменты нужны, а не возникли из-за неправильного использования рекурсии, то почему они сделаны копированием? Почему это не функции с понятными именами?


Магические константы.
Тут нулевая поддерживаемость:
        for (int j = 0; j < n; j++) {
            int current = str[j] - 48;
            if(current >= 10)
                current = current - 7;
            sum_numbers[sum + current]++;
        }

Откуда 48? почему 10? зачем 7?

И как ты всё это предлагаешь обобщать на систему счисления основанием не 13, а 313, например?

Не говоря уж о том, что если считать, что этот фрагмент нужен, то короче, понятнее и универсальные он записывается так:
        for (int j = 0; j < n; j++) {
            sum_numbers[sum + j]++;
        }



Универсальность
Собственно, насколько удобно код использовать для решения похожих задач? Посчитать число счастливых автобусных билетов или оценить число коллизий в наивной хэш-функции?
В программе есть один параметр: int lenght = 6; — размер левой или правой половины. Но как задать число цифр в середине? Или изменить основание системы счисления?
Вот это, кстати, жесть:
    char str[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C'};
    int n = sizeof str;

Ну какая разница какими там буквами или цифрами что записывается?
Почему если я тут изменю ABC на АБВ, то программу разнесёт?


Алгоритм.
Архимедленное умножение через рекурсию и инкремент выше уже видели. Но и способ подсчёта числа способов набрать заданную сумму ему не уступает. Тоже инкременты. А если понадобится 13 заменить на 20, то сколько это работать будет? Даже если не выписывать комбинаторную формулу, то уж динамическим программированием можно за O(Base*Length) посчитать вместо O(BaseLength) в текущем варианте.


Тестирование и краевые случаи.
Выше ты говоришь, что ответ получился неправильный. А почему ты сам не протестировал программу?
Не на каких-то там больших числах, а на самых простых примерах.
Например, сколько есть красивых чисел длиной 1 в унарной системе счисления? Программа выдаёт ответ, что немногим больше 18 квинтиллионов? Ладно, это по модулю 264 получилось. Без него всего-лишь количество чисел выходит отрицательным — похож какой-либо их этих ответов на правильный?
Я бы предложил проверить программу на ещё более простом примере: сколько есть красивых числе длины 0, — но у тебя она упадёт с переполнением стека (к вопросу об универсальности и обработке граничных условий).





Последнее довольно печально: как можно писать код и не проверить его в уме хотя бы на игрушечных примерах?

На фоне этих проблем уже кажется мелочами другие небрежности:

Вердикт: no hire.
Re[2]: Красивые числа
От: reversecode google
Дата: 06.12.21 02:23
Оценка:
миль пардон
но всегда относился и буду относиться к задачам на собеседовании
как к задачам у которых одна цель — показать правильный выполняемый результат

и никогда не буду тратить время,
>Который должен быть понятным, поддерживаемым, переиспользуемым, и т.п.

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

соответственно что бы критиковать или делать вердикт про, но хире по этим критерием
надо было их предварительно в постановке задаче все обозначить


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

и потом отписывала что конечно же — "вы нам не подходите"
Re[2]: Красивые числа
От: avovana Россия  
Дата: 06.12.21 10:50
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Последнее довольно печально: как можно писать код и не проверить его в уме хотя бы на игрушечных примерах?


Спасибо за развёрнутую обратную связь! Действительно, делал напором, чтобы быстрее получить результат. Это было тех задание на дом. Не хотелось много времени тратить.
Для меня прорыв был в том смысле, что пару лет назад я встречал такую задачу и вообще не смог понять, что делать.

Сейчас порадовался, что:
1) Понял принцип
2) Взялся за код
3) Получил output

Следующий этап — осмысление. Благодаря вашей обратной связи смогу качественней осмыслить пример. Будет время, желание, переделаю. Может, еще раз отошлю hr'у.
Re[4]: Задача на наследование с вызовом виртуальных функций
От: σ  
Дата: 06.12.21 11:11
Оценка:
BFE>>>По стандарту (11.10.4/4) должен быть вызван метод A::printFromDestructor(), значит ответ: ~A, а не ~B, как ошибочно указано в комментарии.
P>>Это ж вроде UB — удаление объекта по указателю на базу, а деструктор не виртуальный?
BFE>Хмм. Действительно
Какой опыт кодинга на цепепе?
Re[2]: Задача на наследование с вызовом виртуальных функций
От: σ  
Дата: 06.12.21 11:11
Оценка:
BFE>Безумный код иногда меня ставит в тупик:
A>>Image: fm1.png
BFE>Вызов виртуального метода из не виртуального деструктора...
Чем-то отличается от вызова виртуального метода из виртуального деструктора?
(Это безотносительно UB при удалении).
Re[5]: Задача на наследование с вызовом виртуальных функций
От: B0FEE664  
Дата: 06.12.21 13:08
Оценка:
Здравствуйте, σ, Вы писали:

BFE>>>>По стандарту (11.10.4/4) должен быть вызван метод A::printFromDestructor(), значит ответ: ~A, а не ~B, как ошибочно указано в комментарии.

P>>>Это ж вроде UB — удаление объекта по указателю на базу, а деструктор не виртуальный?
BFE>>Хмм. Действительно
σ>Какой опыт кодинга на цепепе?
29 лет. А что?
И каждый день — без права на ошибку...
Re[3]: Задача на наследование с вызовом виртуальных функций
От: B0FEE664  
Дата: 06.12.21 13:51
Оценка:
Здравствуйте, σ, Вы писали:

BFE>>Безумный код иногда меня ставит в тупик:

A>>>Image: fm1.png
BFE>>Вызов виртуального метода из не виртуального деструктора...
σ>Чем-то отличается от вызова виртуального метода из виртуального деструктора?
Возможно, что да, так как производный объект не был разрушен, значит члены производного объекта ещё существуют. На старых компиляторах такой код приводил к утечкам памяти, если у производного классы были члены заказывавшие память в куче. Конкретно этот код отработал бы без проблем и распечатал бы ~B. Более то, у MS компилятора были опции (может и сейчас есть) регулирующие время конструирования таблиц виртуальных методов: можно было сконструировать все таблицы виртуальных методов до создания объекта и тогда вызов виртуального метода в конструкторе приводил к вызову метода ещё несконструированного объекта, а в деструкторе к вызову метода уже разрушенного объекта. В данном коде объект B не разрушен, так что код может отработать без проблем, а так как значение указателя на базовый и производных класс в данном случает совпадает, то и освобождение памяти может отработать корректно, без утечек (из-за отсутствия членов у класса B). В современных компиляторах раз на раз не приходится и предсказать результат UB невозможно. В любом случае, если такой безумный код на собеседовании, то надо быть готовым к низкой культуре программирования.
И каждый день — без права на ошибку...
Re[4]: Задача на наследование с вызовом виртуальных функций
От: σ  
Дата: 06.12.21 14:01
Оценка:
BFE>>>Безумный код иногда меня ставит в тупик:
A>>>>Image: fm1.png
BFE>>>Вызов виртуального метода из не виртуального деструктора...
σ>>Чем-то отличается от вызова виртуального метода из виртуального деструктора?
BFE>Возможно, что да, так как производный объект не был разрушен…
Я имел в виду в случае, когда UB нет.
Re[4]: Задача на наследование с вызовом виртуальных функций
От: reversecode google
Дата: 06.12.21 14:08
Оценка:

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


какая то дичь, реверсил код который генерил еще 5 версия компилера msvc, т.е. уж очень древняя версия
и в мс ничего в инициализации виртуальных методов не менялось никогда

чуть по другому было в гцц старых около 3 версии
там виртуальная таблица была толще, потому что у них pfn занимал 8 байт даже на 32битах, сейчас она стала такой же как и в msvc
т.е 4 байта на 32 бита, 8 на 64 бита

а так таблицы уже все готовы, только указатель на них устанавливается в начале инициализации очередного конструктора
Re[5]: Задача на наследование с вызовом виртуальных функций
От: B0FEE664  
Дата: 06.12.21 14:27
Оценка:
Здравствуйте, reversecode, Вы писали:

R>какая то дичь, реверсил код который генерил еще 5 версия компилера msvc, т.е. уж очень древняя версия

R>и в мс ничего в инициализации виртуальных методов не менялось никогда

Не самих таблиц, а таблиц с точки зрения объекта.

R>а так таблицы уже все готовы, только указатель на них устанавливается в начале инициализации очередного конструктора

Ну да. И вот указатель на таблицу можно установить заранее, а не менять в конструкторах.

PS Скорее всего это опция включала или выключала __declspec(novtable) атрибут через какой-нибудь дефайн, но это было так давно, что точно не скажу.
И каждый день — без права на ошибку...
Re: Функция zip, join Postgresql
От: Chorkov Россия  
Дата: 07.12.21 16:33
Оценка: 6 (1) +1
Здравствуйте, avovana, Вы писали:

A>Требуется реализовать функцию zip, которая соединяет элементы двух слайсов в слайс пар


Подозреваю, что хотели увидеть не просто перекладывание из контейнера в контейнер, а виртуальный контейнер, в духе std::ranges::zip_view (по возможности, без копирования).
Примерно так:
#include <iostream>
#include <algorithm>
#include <tuple>
#include <iterator>
#include <ranges>
#include <string>
#include <vector>
#include <list>
#include <map>
#include <utility>
#include <cassert>


template< typename T >
struct container_traits
{
    using iterator = decltype( std::begin( std::declval<T>() ) );
    using value_type  = typename std::iterator_traits< iterator >::value_type;
    using reference_type = typename std::iterator_traits< iterator >::reference;
    using container = T;
};

template< typename T >
struct container_traits< std::reference_wrapper<T> >
{
    using iterator = typename container_traits<T&>::iterator ;
    using value_type  = typename container_traits<T&>::reference_type;
    using reference_type = value_type;
    using container = T&;
};


template< typename T1, typename T2 >
class zip : std::pair< typename container_traits<T1>::container ,
                       typename container_traits<T2>::container >
{
    using  base = std::pair< typename container_traits<T1>::container ,
                             typename container_traits<T2>::container >;

    using _iterator_1 = typename container_traits<T1>::iterator;
    using _iterator_2 = typename container_traits<T2>::iterator;

    using _value_type_1 =  typename container_traits<T1>::value_type;
    using _value_type_2 =  typename container_traits<T2>::value_type;

public:
    using base::base;

    using value_type = std::pair< _value_type_1, _value_type_2 >;
    class iterator : public std::pair< _iterator_1, _iterator_2 >
            // for C++14 and older:
            // ,public std::iterator< std::input_iterator_tag, vlaue_type >
    {
        using base = std::pair< _iterator_1, _iterator_2 >;
public:
        using base::base;

        iterator operator++() { return { first++, second++ }; }
        iterator operator++(int) {return { ++first, ++second }; }

        bool operator == ( const iterator& r ) const { return static_cast<const base&>(*this) == r;  }
        bool operator != ( const iterator& r ) const { return static_cast<const base&>(*this) != r;  }

        vlaue_type operator*() const { return { *first, *second }; }
    };
    using const_iterator = iterator;

    size_t size() const  { return std::min( std::size(first), std::size(second) );    }
    value_type operator[]( size_t index ) const  {  return { first[index], second[index] };  }
    value_type at( size_t index ) const { return { first.at(index), second.at(index) };    }

    iterator begin() const  {   return { first.begin(), second.begin() }; }
    iterator end  () const  {   return { first.end  (), second.end  () }; }
};
template< typename T1, typename T2 >
zip(T1,T2) -> zip<T1,T2>;


using namespace std;

int main()
{
    auto i = zip( std::vector{1,2,3}, std::vector{"a"s, "b"s, "c"s} )[1];
    assert( ( i==std::pair{2,"b"s} ) );

    // support of conteiner with no 'operator[]'
    auto j= * std::begin( zip( std::list{1,2,3}, std::list{"a"s, "b"s, "c"s} ) );
    assert( ( j==std::pair{1,"a"s} ) );

    // TODO: support of std::initializer_list
    // auto p = * std::begin( zip( {1,2,3}, {"a"s, "b"s, "c"s} ) );
    // assert( ( p==std::pair{1,"a"s} ) );

    // test 'size'
    assert( zip( std::vector{1,2,3}, std::vector{"a"s, "b"s, "c"s, "d"s} ).size() == 3 );

    // test for-each loop
    for( auto i : zip( std::vector{1,2,3}, std::vector{"a"s, "b"s, "c"s} ) )
        std::cout << i.first << " " << i.second << std::endl;


    // modification via reference:
    std::vector<int> a={1,2,3,4,};
    std::vector<int> b={1,2,3,4,};
    zip(std::ref(a),std::ref(b))[1] = std::pair{ 5,6 };
    assert( a[1] == 5 );
    assert( b[1] == 6 );

    return 0;
}
Re[6]: Задача на наследование с вызовом виртуальных функций
От: σ  
Дата: 08.12.21 14:30
Оценка: :))
BFE>>>>>По стандарту (11.10.4/4) должен быть вызван метод A::printFromDestructor(), значит ответ: ~A, а не ~B, как ошибочно указано в комментарии.
P>>>>Это ж вроде UB — удаление объекта по указателю на базу, а деструктор не виртуальный?
BFE>>>Хмм. Действительно
σ>>Какой опыт кодинга на цепепе?
BFE>29 лет. А что?
Не возраст, а опыт в C++.
Re[7]: Задача на наследование с вызовом виртуальных функций
От: B0FEE664  
Дата: 08.12.21 15:00
Оценка: 2 (1) :)
Здравствуйте, σ, Вы писали:

BFE>>>>>>По стандарту (11.10.4/4) должен быть вызван метод A::printFromDestructor(), значит ответ: ~A, а не ~B, как ошибочно указано в комментарии.

P>>>>>Это ж вроде UB — удаление объекта по указателю на базу, а деструктор не виртуальный?
BFE>>>>Хмм. Действительно
σ>>>Какой опыт кодинга на цепепе?
BFE>>29 лет. А что?
σ>Не возраст, а опыт в C++.
А это и есть опыт: начинал на MS-DOS + Borland Turbo C++. Но это С++, а на C я ещё перфоленты застал (это после Фортрана и перфокарт). Но к чему все эти вопросы?
И каждый день — без права на ошибку...
Re[8]: Задача на наследование с вызовом виртуальных функций
От: reversecode google
Дата: 08.12.21 15:08
Оценка: :)))
это собеседование
Re[9]: Задача на наследование с вызовом виртуальных функций
От: B0FEE664  
Дата: 08.12.21 15:38
Оценка:
Здравствуйте, reversecode, Вы писали:

R>это собеседование


Что я могу сказать...
Омега, конечно, знает стандарт, но собеседование пройду я: доказательство.
И каждый день — без права на ошибку...
Re[10]: Задача на наследование с вызовом виртуальных функций
От: reversecode google
Дата: 08.12.21 16:24
Оценка:
так и хочется посмотреть в глаза комитету
что же это за уб по стандарту, если все существующие компиляторы выдают один и тот же результат
Re[2]: replace
От: avovana Россия  
Дата: 08.12.21 17:54
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Недавно на собеседовании решал очень похожую, но с дополнительным наворотом в виде "аргументы 2 и 3 взаимозаменяемы" — надо заменять тот, что нашел первым на противоположный.


Разрешили библиотечной функцией поиска подстроки пользоваться?
Re[2]: Функция zip, join Postgresql
От: avovana Россия  
Дата: 08.12.21 17:54
Оценка:
Здравствуйте, Chorkov, Вы писали:

A>>Требуется реализовать функцию zip, которая соединяет элементы двух слайсов в слайс пар



Ого, мощно!
Re: Функция zip, join Postgresql
От: avovana Россия  
Дата: 08.12.21 17:56
Оценка:
По sql сейчас почитал по запросам.
Такое придумал. Насколько правильно?

select firstname.user, sku.purchase from user, purchase               // Показываю столбцы
where id.user=user_id.purchase                                        // объединенные кросс join'ом. Показываю лишь те строки, у которых id из этих столбцов равны
and 
purchase.date between 2021-02-01 and 2021-02-27                       // причем покажу только строки в которых значение даты купленного товара из интервала
and 
where not id.user in (select user_id.ban_list from ban_list)  // уберу такие, у которых id.user из списка, который получил вложенным подзапросом
Отредактировано 08.12.2021 18:10 avovana . Предыдущая версия .
Re: Красивые числа
От: iriska2  
Дата: 09.12.21 00:25
Оценка:
Здравствуйте, avovana, Вы писали:


A>

A>Тестовое задание.
A>В данной задаче будут рассматриваться 13-ти значные числа в тринадцатиричной системе исчисления(цифры 0,1,2,3,4,5,6,7,8,9,A,B,C) с ведущими нулями.
A>Например, ABA98859978C0, 6789110551234, 0000007000000
A>Назовем число красивым, если сумма его первых шести цифр равна сумме шести последних цифр.
A>Пример:
A>Число 0055237050A00 — красивое, так как 0+0+5+5+2+3 = 0+5+0+A+0+0
A>Число 1234AB988BABA — некрасивое, так как 1+2+3+4+A+B != 8+8+B+A+B+A
A>Задача:
A>написать программу на С/С++ печатающую в стандартный вывод количество 13-ти значных красивых чисел с ведущими нулями в тринадцатиричной системе исчисления.
A>В качестве решения должен быть предоставлено:
A>1) ответ — количество таких чисел. Ответ должен быть представлен в десятичной системе исчисления.
A>2) исходный код программы.


from functools import cache

nums = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

@cache
def num_ways(n, depth, numbers):
    if n < 0:
        return 0
    if depth == 0:
        return 1 if n == 0 else 0
    ans = 0
    for number in numbers:
        ans += num_ways(n-number, depth-1, numbers)
    return ans

count = 0
for s in range(0, 73):
    cnt = num_ways(s, 6, nums)
    print(s,'     ', cnt)
    count += cnt*cnt
print(count)


0 1
1 6
2 21
3 56
4 126
5 252
6 462
7 792
8 1287
9 2002
10 3003
11 4368
12 6188
13 8562
14 11592
15 15378
16 20013
17 25578
18 32137
19 39732
20 48378
21 58058
22 68718
23 80262
24 92547
25 105378
26 118518
27 131698
28 144627
29 157002
30 168518
31 178878
32 187803
33 195042
34 200382
35 203658
36 204763
37 203658
38 200382
39 195042
40 187803
41 178878
42 168518
43 157002
44 144627
45 131698
46 118518
47 105378
48 92547
49 80262
50 68718
51 58058
52 48378
53 39732
54 32137
55 25578
56 20013
57 15378
58 11592
59 8562
60 6188
61 4368
62 3003
63 2002
64 1287
65 792
66 462
67 252
68 126
69 56
70 21
71 6
72 1
707972099627

Разве не так?
Отредактировано 09.12.2021 0:31 iriska2 . Предыдущая версия .
Re[3]: replace
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 09.12.21 12:28
Оценка: +1
Здравствуйте, avovana, Вы писали:

A>Разрешили библиотечной функцией поиска подстроки пользоваться?


Да, вполне, я сделал через string::find/erase/insert, вроде всем понравилось. Там вообще было два джависта и их внутренности плюсов мало интересовали
Re[11]: Задача на наследование с вызовом виртуальных функций
От: B0FEE664  
Дата: 09.12.21 12:59
Оценка:
Здравствуйте, reversecode, Вы писали:

R>так и хочется посмотреть в глаза комитету

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

Не вижу ничего удивительного в том, что в некоторых частных случаях UB совпадает с интуитивно ожидаемым поведением.
И каждый день — без права на ошибку...
Re[2]: Аллокация памяти и тредовый робот
От: σ  
Дата: 09.12.21 13:05
Оценка:
R>два треида печатающих first second это к роботу правой левой ?
R>std::atomic_wait что бы красивее, вместо кондишин переменной
https://stackoverflow.com/questions/70228390/c20-how-is-the-returning-from-atomicwait-guaranteed-by-the-standard
Re: Аллокация памяти и тредовый робот
От: σ  
Дата: 09.12.21 13:12
Оценка:
A>
void f13() {
    struct S {
        const char const* s;
        S(char const* const s) : s(s) {}
    };
    char storage[2 * sizeof(S)];
    S* s = reinterpret_cast<S*>(storage);
    new(s) S("hello world");
}

Я бы поинтересовался почему не S* s = new(storage) S("hello world"); вместо последних двух строк и в чём разница с дальнейшим использованием s (слева) в s->s.
Re[12]: Задача на наследование с вызовом виртуальных функций
От: reversecode google
Дата: 09.12.21 13:16
Оценка: +1
здесь надо углубляться в саму суть проблемы и почему по стандарту это уб?
это из той же серии почему до сих пор ++i + i++ уб ?
комитет не может определиться как обходить дерево?

и тогда на вопрос при собеседовании — что выведет тот код с не виртуальными деструкторами использующие виртуальные методы
вы вы как практикующий программист с пруфами на все существующие компилеры скажете ?

>from A

>the end

хотя вопрос будет наверняка провокационным и задающий будет ожидать ответа — уб

и я в +100500 раз бы повторил, лавер с++ != программист с++
этот точно так же как гражданин страны не обязан знать наизусть все законы той страны где он проживает,
иначе юристы бы померли от голода
Re[3]: Аллокация памяти и тредовый робот
От: reversecode google
Дата: 09.12.21 13:25
Оценка:
если бы они были практикующими программистами
они бы знали что мемори ордер в имплементации wait не используется
Re[13]: Задача на наследование с вызовом виртуальных функций
От: σ  
Дата: 09.12.21 13:28
Оценка:
R>здесь надо углубляться в саму суть проблемы и почему по стандарту это уб?
Ответ очень простой: а почему должно быть не UB? "Потому что все известные мне реализации ведут себя одинаково" это не ответ.
Re[13]: Задача на наследование с вызовом виртуальных функций
От: B0FEE664  
Дата: 09.12.21 16:16
Оценка:
Здравствуйте, reversecode, Вы писали:

R>здесь надо углубляться в саму суть проблемы и почему по стандарту это уб?

Потому, что после delete мы имеем объект частично разрушенный. После этого ничего разумного с таким объектом сделать не можно.

R>это из той же серии почему до сих пор ++i + i++ уб ?

Это потому, что ++i и i++ могут выполнятся параллельно. Теоретически (но это пока).

R>комитет не может определиться как обходить дерево?

Не в этом дело.

R>и тогда на вопрос при собеседовании — что выведет тот код с не виртуальными деструкторами использующие виртуальные методы

R>вы вы как практикующий программист с пруфами на все существующие компилеры скажете ?

Да как обычно: этот код следует переписать, так как он не соответствует общепринятой практике. Любой инструмент проверки кода укажет, что деструктор в данном случае должен быть виртуальным.

>>from A

>>the end
R>хотя вопрос будет наверняка провокационным и задающий будет ожидать ответа — уб
Ну..., я сразу назвал код безумным.

R>и я в +100500 раз бы повторил, лавер с++ != программист с++

R>этот точно так же как гражданин страны не обязан знать наизусть все законы той страны где он проживает,
R>иначе юристы бы померли от голода
Тут ведь как: незнание законов не освобождает от ответственности.
И каждый день — без права на ошибку...
Re[6]: Задача на наследование с вызовом виртуальных функций
От: Kolesiki  
Дата: 10.12.21 17:53
Оценка: :)
Здравствуйте, B0FEE664, Вы писали:

σ>>Какой опыт кодинга на цепепе?

BFE>29 лет. А что?

Вы страшный человек! Кодить на сипипях, имея уже лет как 20 C#, это надо очень сильно себя не любить.
Re[7]: Задача на наследование с вызовом виртуальных функций
От: B0FEE664  
Дата: 11.12.21 22:36
Оценка:
Здравствуйте, Kolesiki, Вы писали:

K>Вы страшный человек! Кодить на сипипях, имея уже лет как 20 C#, это надо очень сильно себя не любить.


Ха! Текущий проект в котором я работаю (и который уже в эксплуатации), это переписывание с C# на С++. Это всё из-за того, что в MS не предполагают продлевать поддержку Windows CE. В результате огромное количество всякого встроенного будет переведено на Debian + QT.
И каждый день — без права на ошибку...
Re[2]: Красивые числа
От: avovana Россия  
Дата: 15.12.21 18:13
Оценка:
Здравствуйте, iriska2, Вы писали:

I>707972099627

I>[/q]
I>Разве не так?

Узнал. Ответ не верный.
Re: Аллокация памяти и тредовый робот
От: B0FEE664  
Дата: 16.12.21 14:12
Оценка: +2 :)
Здравствуйте, avovana, Вы писали:


A>// Как сделать чтобы робот шагал сначала левой, потом правой, левой, правой...?

A>// Обобщить до 40жки, чтобы каждая нога двигалась за предыдущей
A>===========
  Скрытый текст
A>
A>int main()
A>{
A>    std::thread first([]()
A>        {
A>            while(true)
A>            {
A>                std::cout << "First" << std::endl;
A>            }
A>        }
A>    );
A>    std::thread second([]()
A>        {
A>            while(true)
A>            {
A>                std::cout << "Second" << std::endl;
A>            }
A>        }
A>    );
A>    first.join();
A>    second.join();
A>    return 0;
A>}
A>

int main()
{
  while(true)
  {
    std::cout << "First" << std::endl;
    std::cout << "Second" << std::endl;
    // ...
  }
  return 0;
}

И каждый день — без права на ошибку...
Re[2]: Аллокация памяти и тредовый робот
От: B0FEE664  
Дата: 16.12.21 15:43
Оценка:
Здравствуйте, σ, Вы писали:

A>>
σ>void f13() {
σ>    struct S {
σ>        const char const* s;
σ>        S(char const* const s) : s(s) {}
σ>    };
σ>    char storage[2 * sizeof(S)];
σ>    S* s = reinterpret_cast<S*>(storage);
σ>    new(s) S("hello world");
σ>}
σ>

σ>Я бы поинтересовался почему не S* s = new(storage) S("hello world"); вместо последних двух строк и в чём разница с дальнейшим использованием s (слева) в s->s.

А она (разница) есть? storage не выровнен => s — unspecified. Разве нет?
И каждый день — без права на ошибку...
Re[3]: Аллокация памяти и тредовый робот
От: σ  
Дата: 16.12.21 15:48
Оценка:
A>>>
σ>>void f13() {
σ>>    struct S {
σ>>        const char const* s;
σ>>        S(char const* const s) : s(s) {}
σ>>    };
σ>>    char storage[2 * sizeof(S)];
σ>>    S* s = reinterpret_cast<S*>(storage);
σ>>    new(s) S("hello world");
σ>>}
σ>>

σ>>Я бы поинтересовался почему не S* s = new(storage) S("hello world"); вместо последних двух строк и в чём разница с дальнейшим использованием s (слева) в s->s.

BFE>А она (разница) есть? storage не выровнен => s — unspecified. Разве нет?


Выравнивание… Ну да, может не быть недостаточным, но это не то, про что я думал. Можно считать что с ним всё ок.
Re[3]: Красивые числа
От: watchmaker  
Дата: 16.12.21 19:03
Оценка:
Здравствуйте, avovana, Вы писали:

A>Узнал. Ответ не верный.





Когда я советовал
Автор: watchmaker
Дата: 06.12.21
сделать sanity check и посчитать число красивых чисел из одной цифры, я не шутил.
Вот серьёзно, нужно ответить на простой вопрос: сколько красивых чисел из одной цифры существует? Тут достаточно выписать этот (очень короткий) список на листке бумаги или посчитать их буквально на пальцах (у большинства людей пальцев хватит). А потом подставить эти входные данные в программу и мгновенно найти место, где появляется расхождение, и которое нужно поправить.


Это к обоим программам([1]
Автор: avovana
Дата: 04.12.21
[2]
Автор: iriska2
Дата: 09.12.21
) относится — эту ошибку в логике они разделяют.
Re[4]: Красивые числа
От: iriska2  
Дата: 17.12.21 00:01
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Здравствуйте, avovana, Вы писали:


A>>Узнал. Ответ не верный.


W>



W>Когда я советовал
Автор: watchmaker
Дата: 06.12.21
сделать sanity check и посчитать число красивых чисел из одной цифры, я не шутил.

W>Вот серьёзно, нужно ответить на простой вопрос: сколько красивых чисел из одной цифры существует? Тут достаточно выписать этот (очень короткий) список на листке бумаги или посчитать их буквально на пальцах (у большинства людей пальцев хватит). А потом подставить эти входные данные в программу и мгновенно найти место, где появляется расхождение, и которое нужно поправить.


W>Это к обоим программам([1]
Автор: avovana
Дата: 04.12.21
[2]
Автор: iriska2
Дата: 09.12.21
) относится — эту ошибку в логике они разделяют.

Не очень понимаю этот вопрос красивых чисел из одной цифры 0, из двух цифр 13. Какое это имеет отношение к логике решения?
Re: Красивые числа
От: Максим Россия  
Дата: 17.12.21 07:59
Оценка:
A>

A>Тестовое задание.
A>В данной задаче будут рассматриваться 13-ти значные числа в тринадцатиричной системе исчисления(цифры 0,1,2,3,4,5,6,7,8,9,A,B,C) с ведущими нулями.
A>Например, ABA98859978C0, 6789110551234, 0000007000000
A>Назовем число красивым, если сумма его первых шести цифр равна сумме шести последних цифр.
A>Пример:
A>Число 0055237050A00 — красивое, так как 0+0+5+5+2+3 = 0+5+0+A+0+0
A>Число 1234AB988BABA — некрасивое, так как 1+2+3+4+A+B != 8+8+B+A+B+A 
A>Задача:
A>написать программу на С/С++ печатающую в стандартный вывод количество 13-ти значных красивых чисел с ведущими нулями в тринадцатиричной системе исчисления.
A>В качестве решения должен быть предоставлено:
A>1) ответ — количество таких чисел. Ответ должен быть представлен в десятичной системе исчисления.
A>2) исходный код программы.


У меня получилось 9203637295151
П.С.
Написал также программу которая в лоб считает, на малых числах вроде сходятся результаты.
Errare humanum est
Re[2]: Красивые числа
От: Максим Россия  
Дата: 17.12.21 08:09
Оценка:
I> count += cnt*cnt
I>Разве не так?

Выше Вы не учитываете, что между двумя частями может еще стоять одно из 13 чисел.
count += cnt*cnt*13

должно давать правильный ответ (но остальную программу я не проверял)
Errare humanum est
Отредактировано 17.12.2021 10:19 Максим . Предыдущая версия . Еще …
Отредактировано 17.12.2021 8:31 Максим . Предыдущая версия .
Re[2]: Красивые числа
От: avovana Россия  
Дата: 18.12.21 09:50
Оценка: 2 (1)
Здравствуйте, Максим, Вы писали:

М>У меня получилось 9203637295151

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

Да, точно, ответ правильный!
Re[3]: Красивые числа
От: iriska2  
Дата: 20.12.21 00:21
Оценка:
Здравствуйте, Максим, Вы писали:

I>> count += cnt*cnt

I>>Разве не так?

М>Выше Вы не учитываете, что между двумя частями может еще стоять одно из 13 чисел.

М>
М>count += cnt*cnt*13
М>

М> должно давать правильный ответ (но остальную программу я не проверял)
Да точно, про центральное число я забыл. Достаточно мой ответ умножить на 13, почти правильно))
Re[5]: Задача на наследование с вызовом виртуальных функций
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 20.12.21 05:27
Оценка:
Здравствуйте, reversecode, Вы писали:

R>чуть по другому было в гцц старых около 3 версии

R>там виртуальная таблица была толще, потому что у них pfn занимал 8 байт даже на 32битах, сейчас она стала такой же как и в msvc
R>т.е 4 байта на 32 бита, 8 на 64 бита

Сказки какие-то.
Маньяк Робокряк колесит по городу
Re[4]: Красивые числа
От: avovana Россия  
Дата: 20.12.21 13:24
Оценка:
Здравствуйте, iriska2, Вы писали:

I>Да точно, про центральное число я забыл. Достаточно мой ответ умножить на 13, почти правильно))


А что за центральное число? Никак не пойму.
Слева 6, справа 6 штук.
Re[5]: Красивые числа
От: Максим Россия  
Дата: 20.12.21 13:47
Оценка:
A>А что за центральное число? Никак не пойму.
A>Слева 6, справа 6 штук.

Смотрите, у вас, например, слева AAAAAA и справа АААААА. Их можно объеденить 13 способами.

AAAAAA 0 АААААА
AAAAAA 1 АААААА
AAAAAA 2 АААААА
...
AAAAAA B АААААА
AAAAAA C АААААА

И так для любых левых и правых половинок сумма чисел которых равна.
Errare humanum est
Отредактировано 20.12.2021 13:53 Максим . Предыдущая версия . Еще …
Отредактировано 20.12.2021 13:52 Максим . Предыдущая версия .
Re: Красивые числа
От: avovana Россия  
Дата: 20.12.21 15:25
Оценка:
Спрашивают, пойду ли я дальше.
На мой вопрос — к чему готовиться, очень мутно ответила hr.
Привожу пример, что другие дают список материалов для подготовки.
В ответ — "Всё, что знаю, 2 более тяжелые задачи. По моему опыту, если так... не сразу решили эту, то... обычно, кандидаты не решали те, которые на собеседование более тяжелые".
Допытал до примера. Покопалась по записям:
1) Задача на язык
2) Задача, как сказал один прошлый кандидат, которую можно и не решить длинной арифметикой. И следующая, которую можно решить длинной арифметикой
Т.е. либо 3 задачи. Либо даже про язык нету.

"Я, конечно, могу им отправить ваше резюме. И они позовут на интервью(очное). Просто, как правило, если эта задача была тяжела, то и те не получиться сделать. Подумайте, стоит ли тратить время".
Как думаете? Если почитать про эту арифметику, может попробовать?
Говорил, что раз математика, пускай, хотя бы, 3 рекомендованных учебника по матану выдадут.
Еще вопрос, если там и не было задачи на плюсы. И если 2 задачи чисто математические, то, может они там математические гики? Что мне там делать? Гуру олимпиадники?
Занимаются алго торговлей. Но я-то на прикладного инженера претендую, а не на кванта.
Re[2]: Красивые числа
От: Максим Россия  
Дата: 20.12.21 19:44
Оценка:
A>Спрашивают, пойду ли я дальше.

Это WunderFund? На мой взгляд, надо для себя решить в какой области Вы хотите развиваться. Если это алготрейдинг/hft/и подобное, то ничего не поделаешь, придется учиться решать задачи по комбинаторике, теории вероятностей и теории игр. Таковы правила игры, увы. Но может Вам оно и не надо, на них свет клином не сошелся, есть куча других интересных областей.
Errare humanum est
Re[3]: Красивые числа
От: avovana Россия  
Дата: 21.12.21 05:22
Оценка:
Здравствуйте, Максим, Вы писали:

A>>Спрашивают, пойду ли я дальше.


М>Это WunderFund? На мой взгляд, надо для себя решить в какой области Вы хотите развиваться. Если это алготрейдинг/hft/и подобное, то ничего не поделаешь, придется учиться решать задачи по комбинаторике, теории вероятностей и теории игр. Таковы правила игры, увы. Но может Вам оно и не надо, на них свет клином не сошелся, есть куча других интересных областей.


IT Prime.
Спасибо за обратную связь. Как смотрю по рынку — это наибольшие зп по С++. 300+ по идее можно.
Какие еще есть интересные области применения С++? И какие из них могут дать такие зп?

Еще момент с востребованностью.
Был свидетелем выхода на рынок middle QA manual. Он же junior QA java auto. Опыт в банке.
Пару часов открытого резюме — 30 откликов. За неделю — 10 собеседований, 4 оффера. Близко к 200к.

А здесь С++ + алгофонды.
6.5 фондов на всю Россию. Все они в Москве. У каждого могут быть или не быть адекватной вакансии.
Вот и вышел узкий специалист в узкой сфере.

П.С. как там в WunderFund? Видел вакансию.
Re[4]: Красивые числа
От: Максим Россия  
Дата: 21.12.21 08:31
Оценка: +1
A>Спасибо за обратную связь. Как смотрю по рынку — это наибольшие зп по С++. 300+ по идее можно.
A>Какие еще есть интересные области применения С++? И какие из них могут дать такие зп?

Мне какжется, что по нынешним временам 300+, это не что-то такое грандиозное. В том же Яндексе можно столько заполучить (а с RSU и больше). Да практически во всех крупных конторах от Джетбрейнс до Касперского такие зарплаты есть. Выбирайте, что Вам интересно (спектр задач огромен, от теории компиляторов до систем хранения).
Errare humanum est
Re[2]: Аллокация памяти и тредовый робот
От: reversecode google
Дата: 21.12.21 09:19
Оценка:
потому что вопрос на уб
без реинтерпрет не уб
Re[8]: Задача на наследование с вызовом виртуальных функций
От: σ  
Дата: 21.12.21 17:43
Оценка: :)
BFE>>>>>>>По стандарту (11.10.4/4) должен быть вызван метод A::printFromDestructor(), значит ответ: ~A, а не ~B, как ошибочно указано в комментарии.
P>>>>>>Это ж вроде UB — удаление объекта по указателю на базу, а деструктор не виртуальный?
BFE>>>>>Хмм. Действительно
σ>>>>Какой опыт кодинга на цепепе?
BFE>>>29 лет. А что?
σ>>Не возраст, а опыт в C++.
BFE>А это и есть опыт
Сорян, очень не хочется тебя расстраивать, но судя по https://rsdn.org/forum/cpp/8132925.1
Автор: B0FEE664
Дата: 15.11.21
и https://rsdn.org/forum/cpp/8133246.1
Автор: B0FEE664
Дата: 15.11.21
, у тебя 29 лет стажа, а не опыта.
Отредактировано 21.12.2021 17:44 σ . Предыдущая версия .
Re[9]: Задача на наследование с вызовом виртуальных функций
От: B0FEE664  
Дата: 22.12.21 08:39
Оценка:
Здравствуйте, σ, как обычно Вы написали бесполезный пост.
И каждый день — без права на ошибку...
Re[4]: Аллокация памяти и тредовый робот
От: B0FEE664  
Дата: 22.12.21 08:52
Оценка:
Здравствуйте, σ, Вы писали:

A>>>>
σ>>>void f13() {
σ>>>    struct S {
σ>>>        const char const* s;
σ>>>        S(char const* const s) : s(s) {}
σ>>>    };
σ>>>    char storage[2 * sizeof(S)];
σ>>>    S* s = reinterpret_cast<S*>(storage);
σ>>>    new(s) S("hello world");
σ>>>}
σ>>>

σ>>>Я бы поинтересовался почему не S* s = new(storage) S("hello world"); вместо последних двух строк и в чём разница с дальнейшим использованием s (слева) в s->s.

BFE>>А она (разница) есть? storage не выровнен => s — unspecified. Разве нет?

σ>Выравнивание… Ну да, может не быть недостаточным, но это не то, про что я думал. Можно считать что с ним всё ок.
σ, о чём вы подумали догадаться не сложно, вы лучше скажите, зачем объём storage равен удвоенному размеру S.
И каждый день — без права на ошибку...
Re[5]: Аллокация памяти и тредовый робот
От: σ  
Дата: 23.12.21 09:12
Оценка:
A>>>>>
σ>>>>void f13() {
σ>>>>    struct S {
σ>>>>        const char const* s;
σ>>>>        S(char const* const s) : s(s) {}
σ>>>>    };
σ>>>>    char storage[2 * sizeof(S)];
σ>>>>    S* s = reinterpret_cast<S*>(storage);
σ>>>>    new(s) S("hello world");
σ>>>>}
σ>>>>

σ>>>>Я бы поинтересовался почему не S* s = new(storage) S("hello world"); вместо последних двух строк и в чём разница с дальнейшим использованием s (слева) в s->s.

BFE>>>А она (разница) есть? storage не выровнен => s — unspecified. Разве нет?

σ>>Выравнивание… Ну да, может не быть недостаточным, но это не то, про что я думал. Можно считать что с ним всё ок.
BFE>σ, о чём вы подумали догадаться не сложно, вы лучше скажите, зачем объём storage равен удвоенному размеру S.
Это вопрос к составителям теста.
нелады у вас с ответами
От: жванецкий.головного.мозга Интернет https://youtube.com/shorts/eapWB7W8hEE
Дата: 05.01.22 22:29
Оценка:
Здравствуйте, avovana, Вы писали:

A>На решение был 1 час в домашней обстановке.

A>Image: scal1.pn
static_assert(std::is_same<const int*, int const* >::value, "is not equal");
Отредактировано 06.01.2022 1:49 ботаныч . Предыдущая версия .
Re[13]: таблица виртуальных функций
От: незнайка.незнаек Интернет https://youtube.com/shorts/eapWB7W8hEE
Дата: 10.01.22 04:21
Оценка:
Здравствуйте, reversecode, Вы писали:

R>и тогда на вопрос при собеседовании — что выведет тот код с не виртуальными деструкторами использующие виртуальные методы

R>вы вы как практикующий программист с пруфами на все существующие компилеры скажете ?

>>from A

>>the end
Я конечно могу быть неправым, но это происходит в силу логики переопределения указателя на таблицу виртуальных функций на т.текущего класса. любой имплементер бы сделал без вопросов если есть ненулевой указатель на т.в.ф (а где оно будет заменой указателя на this, или просто сменой указателя в рантайме в сях опять кто его знает, что это будет?), и безусловно сделал бы этот вызов до вызова деструктора. Потому оно и вероятно везде одинаковое. Но это — детали реализации и стандарт это не обсуждает. В силу чего в теории, ткскть стандарта может присутствовать только УБ. и вот это УБ меня лично вполне удовлетворяет. и знаете почему?

R>хотя вопрос будет наверняка провокационным и задающий будет ожидать ответа — уб

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


R>и я в +100500 раз бы повторил, лавер с++ != программист с++

R>этот точно так же как гражданин страны не обязан знать наизусть все законы той страны где он проживает,

R>иначе юристы бы померли от голода

От зря вы эту тему подняли. Юристы вообще не оперируют формальными языками, они условно говоря "чешут от балды" вроде бы некоторые мысли, которые еще проверять и проверять на однозначность, хотя вероятность нелогичного противоречивого бреда коррелирует с "положением дел", хотя кто и как это посчитает эту противоречивость, особенно, если она преднамеренная, да? Но вот опыта общения с юристами в своей области у меня был. так, что и непреднамеренной неоднозначности от них хватает).
Отредактировано 10.01.2022 4:40 ботаныч . Предыдущая версия .
Многопоточно распарсить файл с fix сообщениями
От: avovana Россия  
Дата: 14.01.22 14:27
Оценка:
Добрый день, дорогие форумчане!

Задача на многопоточность на парсинг файла.
На вход приходит файл под 1 Мб c сообщениями FIX формата
Прикрепляю фотку как это выглядит на облачном диске и как в реале, если открыть Notepad++.

В основном, сообщение это тег=значениеSOHтег=значениеSOH
SOH — это такой символ-разделитель.
В начале каждого сообщения 8=FIX.4.4.
Т.е. отдельное сообщение будет выглядеть:
8=FIX.4.4SOH9=75SOH35=0SOH49=MFIXTradeIDSOH56=MU0319300002SOH34=4949SOH52=20211215-20:10:16.250076549SOH10=244SOH

Нужно выдать на выходе подмножество сообщений:
1) Используя самописный пул поток распарсить файл
2) Давая возможность юзеру задать временной интервал. В сообщение есть метка времени в теге 52. Собственно, проверить, входит ли значение в интервал
3) Еще юзер может задать доп фильтрацию. Типа хочет сообщения еще у которых тег1=значение1 && тег2=значение1 ...
4) Пользоваться только С++ и std. Не пользоваться регулярками.

Пример вывода:
8=FIX.4.4|9=11|35=0|49=some1|12=mp2|52=20221016-10:12:15|10=2|
8=FIX.4.4|9=22|35=0|49=some2|12=mp2|52=20221016-10:13:16|10=2|
8=FIX.4.4|9=33|35=0|49=some3|12=mp2|52=20221016-10:14:46|10=2|

====================

Придумал такое решение:

а) Разделить исходный файл на куски == количеству ядер == количеству потоков
б) Каждому потоку отдать свой кусок и условие для фильтрации
в) Каждый поток:
-парсит свой кусок выделяя сообщения. Сохраняет очередное сообщение в map<сообщение, hash_map<тег, значение>>
-перебирает map проверяя условия — временная метка входит ли в интервал, теги имеют ли нужные значения
-добавляет отфильтрованные сообщения в результирующий вектор
-возвращает результирующий вектор
г) Основной поток main:
-дожидается результата=результирующих векторов от всех потоков.
-складывает все вектора в итоговый
-возвращает в stdout итоговый
Отредактировано 15.01.2022 9:04 avovana . Предыдущая версия .
Re: Многопоточно распарсить файл с fix сообщениями
От: Максим Россия  
Дата: 15.01.22 21:28
Оценка: +1
A>Придумал такое решение:
A>а) Разделить исходный файл на куски == количеству ядер == количеству потоков
A>б) Каждому потоку отдать свой кусок и условие для фильтрации

Когда в дело вступает "диск", сложно обходиться теоретическими рассуждениями, все надо мерить на конкретной системе. Возможно быстрее будет работать подход, когда только один поток читает данные с диска и "накидывает" их пулу обработчиков.

П.С.
Владимир, как собеседования продвигаются? Понравились какие-нибудь конторы?

Смотрю сейчас канал парня, который активно, в данный момент, ходит по собеседованиям, может будет полезно и Вам https://www.youtube.com/channel/UC99om0N3qZc5t8iSy2QrHZA/videos
Вот, например, интересные, на мой взгляд, задачки https://www.youtube.com/watch?v=UdY_YMFx7SY

Дан отсортированный массив целых чисел, нужно вернуть отсортированный массив квадратов этих чисел.

(с 40 минуты)
Errare humanum est
Отредактировано 15.01.2022 21:35 Максим . Предыдущая версия .
Re: Многопоточно распарсить файл с fix сообщениями
От: AndrewJD США  
Дата: 18.01.22 17:14
Оценка:
Здравствуйте, avovana, Вы писали:

A>Задача на многопоточность на парсинг файла.

A>На вход приходит файл под 1 Мб c сообщениями FIX формата

A>Придумал такое решение:

A>а) Разделить исходный файл на куски == количеству ядер == количеству потоков
A>б) Каждому потоку отдать свой кусок и условие для фильтрации

Пара замечаний:
1. если файл всего 1 Мб, то быстрее его распарсить в один поток.
2. Как разделить файл на части, ведь одно сообщение может попасть в разные куски?
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[2]: Многопоточно распарсить файл с fix сообщениями
От: PM  
Дата: 18.01.22 20:23
Оценка: 3 (1)
Здравствуйте, Максим, Вы писали:

М>Смотрю сейчас канал парня, который активно, в данный момент, ходит по собеседованиям, может будет полезно и Вам https://www.youtube.com/channel/UC99om0N3qZc5t8iSy2QrHZA/videos

М>Вот, например, интересные, на мой взгляд, задачки https://www.youtube.com/watch?v=UdY_YMFx7SY
М>

М>Дан отсортированный массив целых чисел, нужно вернуть отсортированный массив квадратов этих чисел.

М>(с 40 минуты)

Видео лень смотреть, но в конце код выглядит сложновато. Решение из серии "переверни строку", что-то типа
vector<int> sortedSquares(vector<int>& A)
{
    vector<int> ret(A.size());
    int r=A.size()-1,l=0;
    for(int i=r;i>=0;i--)
    {
        if(abs(A[r])>abs(A[l]))
            ret[i]=A[r]*A[r--];
        else
            ret[i]=A[l]*A[l++];
    }
    return ret;
}


https://marcoarena.wordpress.com/2019/11/28/tale-of-an-insight/
Re: Многопоточно распарсить файл с fix сообщениями
От: avovana Россия  
Дата: 13.02.22 17:45
Оценка:
Моя реализация:
https://github.com/avovana/temp/tree/master/filter_FIX_message_with_thread_pool

П.С. Подсчитывал время, сколько на него потратил. Попробуйте угадать
Re[2]: Многопоточно распарсить файл с fix сообщениями
От: reversecode google
Дата: 13.02.22 17:47
Оценка:
A>П.С. Подсчитывал время, сколько на него потратил. Попробуйте угадать

>CMakeLists.txt

>Added FIX messages filtering
>25 days ago
Re[2]: Многопоточно распарсить файл с fix сообщениями
От: avovana Россия  
Дата: 13.02.22 17:49
Оценка:
Здравствуйте, AndrewJD, Вы писали:

AJD>Пара замечаний:

AJD>1. если файл всего 1 Мб, то быстрее его распарсить в один поток.
AJD>2. Как разделить файл на части, ведь одно сообщение может попасть в разные куски?

Ответил на своё же сообщение ссылкой на гитхаб.
1. Как оказалось, надо было уточнять. Похоже, входящий поток может быть и больше.
2. Верно подмечено. В реализации в моменте как-раз и добегал до окончания сообщения прежде чем кинуть весь кусок в поток. Чтобы очередному потоку пошёл кусок, который начинается с начала очередного сообщения.
Re[2]: Многопоточно распарсить файл с fix сообщениями
От: avovana Россия  
Дата: 13.02.22 17:51
Оценка:
Здравствуйте, Максим, Вы писали:

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

Это интересно! Измерения не делал. Как бы Вы их сделали?

М>Владимир, как собеседования продвигаются? Понравились какие-нибудь конторы?

Спасибо, что поинтересовались. Устраиваюсь на новую работу.
Даже хотел статью написать. Точнее, цикл. Первая статья готова. Осталось картинку вставить и нажать "Отправить" из черновика хабра. Что-то не нажму всё никак)

Спасибо за ссылку!
Re: replace
От: sergii.p  
Дата: 14.02.22 09:01
Оценка:
Здравствуйте, avovana, Вы писали:

A>// написать функцию replace c 3-мя входными аргументами, возвращающую новую строку


input копируете и никак потом не используете. Тогда уж лучше по string_view передавать. substr и replace_to — тоже самое. Результирующая строка res гарантированно расширяется и неизбежны переаллокации памяти. Надо reserve добавить, как минимум.
Ну и куча мутабельных состояний, из-за чего алгоритм нечитабелен.

Мой вариант:

std::string replace_impl(std::string source, std::string_view from, std::string_view to, const std::string::size_type start_idx)
{
    const auto pos = source.find(from, start_idx);
    if(pos == std::string::npos) {
        return source;
    }
    else {
        source.replace(pos, from.size(), to);
        return replace_impl(std::move(source), from, to, pos + to.size());
    }
}

std::string replace_all(std::string source, std::string_view from, std::string_view to)
{
    return replace_impl(std::move(source), from, to, 0);
}
Re: Вопросы с собеседований
От: _NN_ www.nemerleweb.com
Дата: 18.02.22 17:44
Оценка:
В нескольких компаниях спрашивали как написать планировщик.
Ещё из вопросов как наиболее быстро фильтровать поступающие данные.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Вопросы с собеседований
От: reversecode google
Дата: 18.02.22 17:47
Оценка: +1 :)
это наверное на джуниорские позиции ?
обычно синьорам дают написать имплементацию strlen или strcpy
Re[3]: Вопросы с собеседований
От: _NN_ www.nemerleweb.com
Дата: 18.02.22 18:15
Оценка:
Здравствуйте, reversecode, Вы писали:

R>это наверное на джуниорские позиции ?

Синьор, принципал.
R>обычно синьорам дают написать имплементацию strlen или strcpy

Такое никто не просил
Одну-две задачки в стиле leetcode, разного уровня сложности это да.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Реализация тредпула с отложенным выполнением
От: avovana Россия  
Дата: 08.10.22 08:07
Оценка:
Вот приходите на интервью и вам говорят сделать:
"Реализацию тредпула с отложенным выполнением".

О чём в первую очередь подумаете когда услышите такую формулировку?
Какие есть мысли по реализации?
Какие есть хорошие примеры?

Я накопал в интернете несколько примеров:

======1========
Комбинация:
queue<function<void()>> jobs — в неё пишут функции для исполнения, из неё выгребают потоки пула чтобы исполнить.
vector<thread> — набор потоков для исполнения задач. В инициализации определяем сколько будет потоков.
mutex — один мьютекс на доступ записи в очередь очередной задачи, выбирания потоками на исполнение.
condition variable — сигнал от писателя, что есть данные в очереди. Потоки засыпают и ждут на ней пока не появятся данные.

// Использование:
thread_pool->QueueJob([] { /* ... */ });

class ThreadPool {
public:
    void Start();
    void QueueJob(const std::function<void()>& job);
    void Stop();
    void busy();

private:
    void ThreadLoop();

    bool should_terminate = false;           // Tells threads to stop looking for jobs
    std::mutex queue_mutex;                  // Prevents data races to the job queue
    std::condition_variable mutex_condition; // Allows threads to wait on new jobs or termination 
    std::vector<std::thread> threads;
    std::queue<std::function<void()>> jobs;
};

void ThreadPool::Start() {
    const uint32_t num_threads = std::thread::hardware_concurrency(); // Max # of threads the system supports
    threads.resize(num_threads);
    for (uint32_t i = 0; i < num_threads; i++) {
        threads.at(i) = std::thread(ThreadLoop);
    }
}

void ThreadPool::ThreadLoop() {
    while (true) {
        std::function<void()> job;
        {
            std::unique_lock<std::mutex> lock(queue_mutex);
            mutex_condition.wait(lock, [this] {
                return !jobs.empty() || should_terminate;
            });
            if (should_terminate) {
                return;
            }
            job = jobs.front();
            jobs.pop();
        }
        job();
    }
}

void ThreadPool::QueueJob(const std::function<void()>& job) {
    {
        std::unique_lock<std::mutex> lock(queue_mutex);
        jobs.push(job);
    }
    mutex_condition.notify_one();
}

void ThreadPool::busy() {
    bool poolbusy;
    {
        std::unique_lock<std::mutex> lock(queue_mutex);
        poolbusy = jobs.empty();
    }
    return poolbusy;
}

void ThreadPool::Stop() {
    {
        std::unique_lock<std::mutex> lock(queue_mutex);
        should_terminate = true;
    }
    mutex_condition.notify_all();
    for (std::thread& active_thread : threads) {
        active_thread.join();
    }
    threads.clear();
}

thread_pool->QueueJob([] { /* ... */ });


======2========
Реализация с помощью:
1) future + deferred. Как-то странно. Т.е. в пул как обычно кинули задачу. Внутри пул её обернули в future+deferred, положил в очередь. Поток проснулся, взял её. Выполнил get. Зачем эта связка — future + deferred? В этом же потоке происходит исполнение
2) Прокидывание аргументов — хорошая фича. Нет ограничений в сравнение с прошлым примером
Самый понятный и простой на данный момент пул.
#pragma once

#include <future>
#include <thread>
#include <condition_variable>
#include <atomic>
#include <queue>
#include <vector>
#include <tuple>
#include <functional>
#include <utility>

class ThreadPool {
using Task = std::future<void>;
public:
    explicit ThreadPool(std::size_t threads_num);
    ~ThreadPool();

    template <typename F, typename ... Args>
    void addTask(F f, Args&& ... args) {
        {
            std::lock_guard<std::mutex> l(cv_m_);
            if (quit_) {
                throw std::runtime_error("adding task to stopped threadpool");
            }
            tasks_.emplace(std::async(std::launch::deferred, std::forward<F>(f), std::forward<Args>(args)...));
        }
        condition_.notify_one();
    }

private:
    std::mutex cv_m_;
    std::condition_variable condition_;
    std::atomic_bool quit_ = false;
    std::queue<Task> tasks_;
    std::vector<std::thread> workers_;
};

ThreadPool::ThreadPool(std::size_t threads_num)
{
    for (std::size_t i = 0; i < threads_num; ++i) {
        workers_.emplace_back(
                [this](){
                    while (true) {
                        std::unique_lock<std::mutex> lk(this->cv_m_);
                        condition_.wait(lk, [this](){
                            return !this->tasks_.empty() || this->quit_;
                        });
                        if (this->quit_ && this->tasks_.empty()) {
                            return;
                        }
                        if (!this->tasks_.empty()) {
                            auto f = std::move(this->tasks_.front());
                            this->tasks_.pop();
                            lk.unlock();
                            f.get();
                        }
                    }
                }
        );
    }
}

ThreadPool::~ThreadPool() {
    quit_ = true;
    condition_.notify_all();
    for (auto& worker : workers_) {
        worker.join();
    }
}
Re[2]: Реализация тредпула с отложенным выполнением
От: reversecode google
Дата: 08.10.22 13:08
Оценка:
если вы хотите дальше ходить по собеседованием и делать тупые никому не нужные задания
то вы все делаете правильно продолжайте

если хотите найти работу, то сразу переходите в нападение
и сразу заявляйте что никаких тестовых заданий вы делать не будете, вам это не интересно
Re[4]: Вопросы с собеседований
От: GarryIV  
Дата: 08.10.22 19:37
Оценка:
Здравствуйте, Максим, Вы писали:

М> 100000 100000 ... 1000000

М>-100000 -100000 ... -1000000
М> 100000 100000 ... 1000000
М>-100000 -100000 ... -1000000
М> 100000 100000 ... 1000000
М>-100000 -100000 ... -1000000
М>....

М>При одном способе обхода будет 0, а при другом все, что угодно.


А можно пример кода когда на одной и той же платформе, ключах компилятора и тд будут действительно разные результаты?
Это реально вообще?
WBR, Igor Evgrafov
Re: Красивые числа
От: s_aa Россия  
Дата: 11.10.22 06:31
Оценка:
Заинтересовался что-то, тем более правильный ответ есть.
Вот вариант на JS

// число цифр слева и справа от центральной
const m = 6;
// общее количество цифр - оно же система счисления
const n = m * 2 + 1;
// последняя цифра в системе счисления по основанию n
const lastNumber = n - 1;
// максимальная сумма m цифр
const maxSum = lastNumber * m;
// массив для подсчета количества вариантов разных значений суммы m цифр
const aSum = new Array(maxSum + 1).fill(0);

// максимальное число, которое можно представить m разрядами в системе счисления по основанию n
let maxNumber = 0; 
for (let i = 0; i < m; ++i) {
    maxNumber += n ** i * lastNumber;
}

// перебираем все варианты расположения цифр в m разрядах
// и подсчитываем в массиве aSum количество значений суммы
for (let i = 0; i <= maxNumber; ++i) {
    const s = changeBaseNumber(i, n).reduce((partialSum, a) => partialSum + a, 0);
    aSum[s]++;
}

// вычисляем общее количество "красивых" чисел
const result = aSum.reduce((partialSum, a) => partialSum + a * a * n, 0);
// сверяем с правильным результатом
console.log(result === 9203637295151);

/**
 * Возвращает массив цифр для системы счисления по основанию osn для числе i
 * @param {number} i 
 * @param {number} osn 
 * @returns 
 */
function changeBaseNumber(i, osn) {
    const aOsn = [];
    let i0 = i;
    let j = 1;
    while (true) {
        const ost = i0 % osn;
        i0 = (i0 - ost) / osn;
        aOsn.push(ost);
        if (i0 === 0) break;
        j++;
    }
    return aOsn;
}
Жизнь не обязана доставлять удовольствие. Достаточно отсутствия страданий.
Отредактировано 11.10.2022 8:17 s_aa . Предыдущая версия .
Re[2]: Красивые числа
От: s_aa Россия  
Дата: 11.10.22 09:14
Оценка:
C++
#include <iostream>
#include <vector>
using namespace std;

int _pow(int i, int j)
{
    int result = 1;
    for (int k = 0; k < j; ++k)
    {
        result *= i;
    }
    return result;
}

vector<int> changeBaseNumber(int i, int osn)
{
    vector<int> aOsn;
    int i0 = i;
    int j = 1;
    while (true)
    {
        int ost = i0 % osn;
        i0 = (i0 - ost) / osn;
        aOsn.push_back(ost);
        if (i0 == 0) break;
        j++;
    }
    return aOsn;
}


int main()
{
    int m = 6;
    int n = m * 2 + 1;
    int lastNumber = n - 1;
    int maxSum = lastNumber * m;
    vector<int> aSum(maxSum + 1, 0);

    int maxNumber = 0;
    for (int i = 0; i < m; ++i)
    {
        maxNumber += _pow(n, i) * lastNumber;
    }

    for (int i = 0; i <= maxNumber; ++i)
    {
        int s = 0;
        for (auto& v : changeBaseNumber(i, n))
        {
            s += v;
        }
        aSum[s]++;
    }

    long long result = 0;
    for (auto& v : aSum)
    {
        result += (long long)v * v * n;
    }

    cout << result << endl;
    cout << (result == 9203637295151 ? "True" : "False") << endl;
}
Жизнь не обязана доставлять удовольствие. Достаточно отсутствия страданий.
Re[2]: Реализация тредпула с отложенным выполнением
От: B0FEE664  
Дата: 11.10.22 16:24
Оценка:
Здравствуйте, avovana, Вы писали:

  Это что? тест на внимательность?
void ThreadPool::busy() {
    bool poolbusy;
    {
        std::unique_lock<std::mutex> lock(queue_mutex);
        poolbusy = jobs.empty();
    }
    return poolbusy;
}

  Правильное название функции: Wait_for_all_tasks_to_complete
void ThreadPool::Stop() {
    {
        std::unique_lock<std::mutex> lock(queue_mutex);
        should_terminate = true;
    }
    mutex_condition.notify_all();
    for (std::thread& active_thread : threads) {
        active_thread.join();
    }
    threads.clear();
}
И каждый день — без права на ошибку...
Re: Набор 20 задач с финтеха
От: Osaka  
Дата: 22.12.22 16:49
Оценка:
A>Image: scal1.png
A>Image: scal2.png
A>Image: scal3.png
А каким боком тут финтех?
Хоть бы сложный % какой спросили...
Re[2]: Вопросы с собеседований
От: avovana Россия  
Дата: 18.03.23 14:37
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>В нескольких компаниях спрашивали как написать планировщик.

_NN>Ещё из вопросов как наиболее быстро фильтровать поступающие данные.

И как написать планировщик?
Какое конкретное задание предполагалось?
Re: Игра "Сапер"
От: avovana Россия  
Дата: 18.03.23 14:38
Оценка:
Здравствуйте, avovana, Вы писали:

Встретил такую задачу в "CRACKING CODING INTERVIEW 189 Programming Questions and Solutions".
Re: Общие вопросы
От: avovana Россия  
Дата: 18.03.23 14:58
Оценка:
Подъехали вопросы общего плана с последнего weekend offer собеседования в топовую российскую компанию. Как бы вы ответили?
Можно кратко. Можно и расширенно. Почему бы и нет
Мне было немного не комфортно отвечать, т.к. отвечал кратко, но интервьюер отвечал как-то, что как-будто я не то сказал. Я начинал говорить больше. И боялся, что сам себя закапывал. Хотя говорил, вроде, нормально)
Не понимал, ответил ли я то что интервьюер хотел услышать/мог отметить у себя галочкой в тетрадке.

Короче, не часто бывает такое ощущение не понимания насколько попал, хотя говорил, вроде нормально.

Сами вопросы достаточно классные. Пожалуй, если можете ответить, думаю, можно спокойно пробоваться в текущие топ российские компании.
1. Что такое указатель?
2. Как он работает?
3. Из чего он состоит?
4. Что такое segfault? Объясните механику процесса.
5. Есть процесс с 1 Тб данных. Сделали форк. Насколько быстро отработает? Оцените количественно.
6. Что такое top load average?
7. Что лучше — мьютексы или атомики?
8. Что за засыпание потока на мьютексе?
9. Сложность поиска в отсортированном массиве?
10. Есть бинарное дерево. За сколько будет поиск?
11. Есть элементы со свойством "приоритет". Какую использовать структуру данных, чтобы быстро выполнять операции put, get. get выбирает элемент с макс. приоритетом и удаляет его.
12. Виртуальные таблицы. Что это? Как работают? Как их применяют? Где они хранятся? И кто и как их туда кладёт?
13. Как устроен weak_ptr?
14. Есть iterator на элемент в std::map. В std::map добавили новый элемент. Валиден ли итератор?
15. Есть iterator на элемент в std::vector. В std::vector добавили новый элемент. Валиден ли итератор?
16. Есть iterator на элемент в std::unordered_map. В std::unordered_map добавили новый элемент. Валиден ли итератор?
17. В чём отличие tcp и udp?
18. Что происходит при вызове write, send в tcp socket? Что означает выполнение этих функций?

Интервьюер до старта этих вопросов сказал, что есть опросник с вопросами на пол часа. Если нормально проходимся, то дадут задачку. Задачку после моих ответов дали. Значит ответил в целом норм)
Re[3]: Вопросы с собеседований
От: _NN_ www.nemerleweb.com
Дата: 19.03.23 12:19
Оценка: +1
Здравствуйте, avovana, Вы писали:

A>Здравствуйте, _NN_, Вы писали:


_NN>>В нескольких компаниях спрашивали как написать планировщик.

_NN>>Ещё из вопросов как наиболее быстро фильтровать поступающие данные.

A>И как написать планировщик?

Есть много вариантов.
Вам идея нужна или код ?
Быстрый поиск в github выдает кучу результатов для просмотра.

Скажем такой варинат
https://github.com/pplux/px/blob/master/README_px_sched.md

A>Какое конкретное задание предполагалось?

Идею как написать.
Какие проблемы могут возникнуть, как их решить.

Скажем, планировщик задач где каждая задача это поток, а в винде есть ограничение у WaitForMultipleObjects не позволяющее ожидать сигнлаов более чем от 64-х объектов.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Реализация тредпула с отложенным выполнением
От: sergii.p  
Дата: 20.03.23 17:16
Оценка: 1 (1)
Здравствуйте, avovana, Вы писали:

A>Вот приходите на интервью и вам говорят сделать:

A>"Реализацию тредпула с отложенным выполнением".

можно чуть упростить, используя stop_token

class ThreadPool {
using Task = std::future<void>;
public:
    explicit ThreadPool(std::size_t threads_num);
    ~ThreadPool();

    template <typename F, typename ... Args>
    void addTask(F f, Args&& ... args) {
        {
            std::lock_guard<std::mutex> l(cv_m_);
            tasks_.emplace(std::async(std::launch::deferred, std::forward<F>(f), std::forward<Args>(args)...));
        }
        condition_.notify_one();
    }

private:
    std::mutex cv_m_;
    std::condition_variable_any condition_;
    std::queue<Task> tasks_;
    std::vector<std::jthread> workers_;
};

ThreadPool::ThreadPool(std::size_t threads_num)
{
    for (std::size_t i = 0; i < threads_num; ++i) {
        workers_.emplace_back(
                [this](std::stop_token stop_token){
                    while (true) {
                        std::unique_lock<std::mutex> lk(this->cv_m_);
                        condition_.wait(lk, stop_token, [this](){
                            return !this->tasks_.empty();
                        });
                        if (stop_token.stop_requested()) {
                            return;
                        }
                        if (!this->tasks_.empty()) {
                            auto f = std::move(this->tasks_.front());
                            this->tasks_.pop();
                            lk.unlock();
                            f.get();
                        }
                    }
                }
        );
    }
}

// ~ThreadPool() неявно вызовет дестукторы у jthread, jthread вызовет request_stop() и join().
Re[3]: Красивые числа
От: MTimur  
Дата: 23.03.23 16:39
Оценка:
Здравствуйте, avovana, Вы писали:

A>Здравствуйте, iriska2, Вы писали:


I>>707972099627

I>>[/q]
I>>Разве не так?

A>Узнал. Ответ не верный.


Нужно умножить на 13 (циферка посередине)
Re[9]: Задача на наследование с вызовом виртуальных функций
От: alpha21264 СССР  
Дата: 25.03.23 22:08
Оценка: +1
Здравствуйте, σ, Вы писали:

BFE>>А это и есть опыт

σ>Сорян, очень не хочется тебя расстраивать, но судя по https://rsdn.org/forum/cpp/8132925.1
Автор: B0FEE664
Дата: 15.11.21
и https://rsdn.org/forum/cpp/8133246.1
Автор: B0FEE664
Дата: 15.11.21
, у тебя 29 лет стажа, а не опыта.


Начиная с третьего года опыта ты просто научаешься не писать двусмысленные конструкции.
Поэтому я на 90% этих вопросов не знаю ответы. Знал до 2000-го года, а сейчас забыл.
Не нужно это на практике.


PS.
Я бы лучше именование переменных проэкзаменовал.
Как Вы назовёте такую-то сучность по-английски и по-русски?

PS2.
И пишете ли вы козлы документацию на свой код?

Течёт вода Кубань-реки куда велят большевики.
Re[4]: Вопросы с собеседований
От: avovana Россия  
Дата: 31.03.23 15:33
Оценка:
Здравствуйте, _NN_, Вы писали:

A>>И как написать планировщик?

_NN>Есть много вариантов.
_NN>Вам идея нужна или код ?

Посмотрел, спасибо!
А если словами — что просили сделать? То есть, в гитхабе там на все случаи жизни со всеми возможными обработками ошибок.
Интересно, что в рамках собеса было. Как формулировалась задача. Чётко, или нет? Насколько уточняли, что нужно сделать? И что реализовали за отведенное время? Какие идеи и как?
Всё это очень интересно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.