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 . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.