Алгоритм Луна: Перевірка номерів кредитних карток за наносекунди

pic

Фото кредитної картки для підвищення залученості (від Openclipart, автор Jmlevick)

Чи траплялося вам помилково ввести номер кредитної картки на сайті і миттєво отримати повідомлення про помилку? Досить зручно, правда? Але ось цікава частина — сайту не потрібно перевіряти з бекендом Visa чи Mastercard, щоб зрозуміти, що ви зробили помилку. "Масова перевірка бази даних" насправді вирішується за допомогою хитрої математики з 1950-х років, яку називають алгоритмом Луна (формула Луна). Той самий принцип використовують усюди — від номерів посвідчення особи та податкових номерів до VIN-кодів автомобілів і ISBN номерів — що дозволяє виявляти прості помилки набору, не здійснюючи жодного запиту до мережі.… Читати далі

Створення гри в жанрі Tower Defense, день 6

Сьогодні ми зосередимося на реалізації системи атаки для турелей.

pic

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

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

pic

Для вибору турелі, по якій ми будемо стріляти, спочатку нам потрібно створити список і змінну для ігрових об'єктів.

pic

Звідти нам … Читати далі

Як реалізувати попередній перегляд камери за допомогою API Windows Media Foundation у C++

У попередній статті ми розробили бібліотеку LiteCam для доступу до камери на Linux. Щоб розширити її функціональність для Windows, ми скористаємося API Media Foundation.
Ця стаття розглядає, як використовувати Media Foundation для доступу до камери на Windows, інтегрувати її з бібліотекою LiteCam і повторно використовувати існуючий код для сканування штрих-кодів для створення сканера штрих-кодів на базі камери для Windows.

Демонстраційне відео з камери для Windows

Реалізація функцій, пов'язаних з камерою, для Windows

Оновлення заголовочного файлу для підтримки як Windows, так і Linux

Щоб підтримати як Windows, так і Linux, заголовочний файл Camera.h потребує наступних оновлень:

  • Додати специфічні для платформи
Читати далі

Створення RESTful API інтерфейсів на C++

pic

Вступ

Як ефективно та потужно створювати RESTful-сервіси? Використовуючи можливості продуктивності C++. Ми навчимося налаштовувати сервер, обробляти HTTP-запити та парсити JSON за допомогою таких бібліотек, як Boost.Beast та nlohmann/json.

RESTful API на C++

Що таке RESTful API?

Це основа сучасної веб-розробки для стандартизованого та масштабованого взаємодії клієнтських додатків із серверами. REST розшифровується як REpresentational State Transfer, що в перекладі означає «передача стану представлення». Це архітектурний стиль, за допомогою якого для доступу до веб-ресурсів та роботи з ними використовується протокол передачі даних без збереження стану, зазвичай HTTP.

RESTful API є ефективними та зручними завдяки дотриманню ряду принципів та обмежень:

1.… Читати далі

`enable_if` проти концептів C++20

enable_if та концепти C++20 — це два способи обмеження шаблонів для певних типів. Давайте порівняємо ці два методи.

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

#include <iostream>

template <typename T> 
void print(T a){  
    std::cout << "Це число: " << a << std::endl;  
}  

int main(){  
    const int a = 2;  
    const long b = 3;  
    const float c = 4;  
    const double d = 5;  

    print(a);  
    print(b);  
    print(c);  
    print(d);  
}

Компіляція за допомогою g++ main.cpp і виконання дає результат:

Це число: 
Читати далі

Подвійно зв’язкові списки: захоплююча подорож через зв’язану інформацію

Що таке двозв'язаний список?

Уявіть собі двозв'язаний список як потяг, де кожен вагон (вузол) може рухатися як вперед, так і назад. Кожен вагон знає, який вагон перед ним, а який — позаду. Як і в потязі, ви можете йти по ньому в обох напрямках!

Порівняння швидкості

Давайте порівняємо, як швидко працюють різні структури даних.

Уявімо, що у нас є три різні способи організації даних: Масив (як автобус), Однозв'язний список (як велосипед) та Двозв'язний список (як потяг).

Операція | Масив | Однозв'язний список | Двозв'язний список
---|---|---|---
Вставка на початку | O(n) — Повільно | O(1) — Швидко | O(1) — … Читати далі

На межі можливого в C++: Як я створював бібліотеку для constexpr циклів

текст перекладу
pic

Опис

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

C++ було спочатку створено як надбудову над C. У C програмування на етапі компіляції в основному обмежено макросами, системою, яка здебільшого призначена для зміни тексту коду. Макроси є потужними, але можуть бути схильні до помилок, оскільки їхні правила значно відрізняються від "нормального" C. Окрім макросів, C++11 має ще два механізми для програмування на етапі компіляції: шаблони … Читати далі

Unreal Engine C++: Система м’якого блокування цілі

Система м'якої прив'язки — це така система, в якій камера не прив'язана до напрямку, в якому персонаж буде завдавати удару. Замість цього персонаж обертатиметься до найбільш відповідної цілі, на основі напрямку, в якому гравець хоче атакувати. Перевага цього підходу полягає в тому, що гравець не повинен "націлювати" свої удари, що може бути незручним, особливо при використанні клавіатури та миші. Копіюючи код нижче, не забудьте оновити свій заголовочний файл і замінити ім'я класу на ваше.

Основні кроки в цьому посібнику виглядають наступним чином:
1. Знаходження цілі для фокусування атак

  1. Перевірка, чи знаходиться ціль в межах досяжності

  2. Поворот персонажа до цілі перед

Читати далі

C++ з алгоритмами та структурами даних: День 1

1. Розуміння основ C++

C++ — це мова програмування, яка поєднує процедурне програмування (як у C) з об'єктно-орієнтованим програмуванням.

1. Загальні відомості про C++

C++ — це мова програмування, яка поєднує процедурне програмування (як у C) з об'єктно-орієнтованим програмуванням. Вона широко використовується для системного програмного забезпечення, розробки ігор та змагань з програмування.

Основний синтаксис

Кожна програма на C++ починається з функції main().

Використовуйте #include для виконання операцій вводу/виводу.

cout використовується для виведення, а cin — для введення.

Приклад:

#include <iostream>  // Підключення стандартної бібліотеки  
using namespace std; // Використання стандартного простору імен

int main() {  
 cout << "Привіт, Світ!"; // 
Читати далі

Автоматичне диференціювання на C з використанням LibGMP

Я ПІДТРИМУЮ ТІЛЬКИ ДОБАВЛЕННЯ ТА МНОЖЕННЯ ДЛЯ МОГО FFGEMM

#include   
#include   
#include   
#include   
#include   

enum OperationEnum{ADD,MULTIPLY,OPERATION_LENGTH};  
typedef struct value_struct *Value;  

struct value_struct  
{  
 mpz_t number;  
 mpz_t gradient;  
 Value children[2];  
 int numberOfChildren;  
 int operationIndex;  
 void (*backward)(struct value_struct*);  
};  



Value CreateNewValue(mpz_t value)  
{  
 Value newValue = malloc(sizeof(*newValue));  
 mpz_init(newValue->number);mpz_set(newValue->number, value);  
 mpz_init(newValue->gradient);mpz_set_ui(newValue->gradient, 0);  
 newValue->children[0] = NULL;  
 newValue->children[1] = NULL;  
 newValue->numberOfChildren = 0;  
 newValue->operationIndex = 0;  
 newValue->backward = NULL;  
 return newValue;  
}  

void PrintValue(Value value)  
{  
 if(value != NULL)  
 {
gmp_printf("Значення(value = %n", value->number, value->gradient);  
 }  
}  

void DestroyValue(Value value)  
{  
 mpz_clear(value->number);  
 mpz_clear(value->gradient);  
 free(value);  
}  

void AddBack(Value v)  
{  
 mpz_add(v->children[0]->gradient, v->children[0]->gradient, v->gradient);  
 mpz_add(v->children[1]->gradient, v->children[1]->gradient, v->gradient);  
 
Читати далі