Công Cụ Xác Minh Giải Pháp Trong Lập Trình Thi Đấu

Trong lập trình thi đấu, việc kiểm tra độ chính xác của giải pháp thông qua so sánh đầu ra là phương pháp hiệu quả. Dưới đây là triển khai công cụ xác minh trên hệ điều hành Windows với khả năng phát hiện lỗi trong thời gian thực.

// validator.cpp
#include <iostream>
#include <cstdlib>
#include <windows.h>
#include <string>

void ThietLapMauSac(int mauChu, int nen) {
    HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(console, (nen << 4) | (mauChu & 0x0F));
}

int main() {
    system("cls");
    std::string chuongTrinhChuan, chuongTrinhKiemTra;
    
    std::cout << "Ten chuong trinh chuan: ";
    std::cin >> chuongTrinhChuan;
    std::cout << "Ten chuong trinh kiem tra: ";
    std::cin >> chuongTrinhKiemTra;

    chuongTrinhChuan += ".exe < input.tmp > output_chuan.tmp";
    chuongTrinhKiemTra += ".exe < input.tmp > output_kiemtra.tmp";

    const int SO_LUOT_KIEM_TRA = 50;
    int luotThanhCong = 0;
    
    while (luotThanhCong < SO_LUOT_KIEM_TRA) {
        system("generator > input.tmp");
        system(chuongTrinhChuan.c_str());
        system(chuongTrinhKiemTra.c_str());
        
        if (system("fc /w output_chuan.tmp output_kiemtra.tmp >nul 2>nul") == 0) {
            ThietLapMauSac(FOREGROUND_GREEN | FOREGROUND_INTENSITY, 0);
            std::cout << "[PASS] Kiem tra thanh cong #" << luotThanhCong + 1 << "\n";
            ThietLapMauSac(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, 0);
        } else {
            ThietLapMauSac(FOREGROUND_RED | FOREGROUND_INTENSITY, 0);
            std::cout << "[FAIL] Loi o luot #" << luotThanhCong + 1 << "\n";
            std::cout << "===== NOI DUNG DAU VAO =====\n";
            system("type input.tmp");
            std::cout << "\n===== SO SANH KET QUA =====\n";
            system("fc /w output_chuan.tmp output_kiemtra.tmp");
            return 1;
        }
        luotThanhCong++;
    }
    
    ThietLapMauSac(FOREGROUND_GREEN | FOREGROUND_INTENSITY, 0);
    std::cout << "Hoan tat " << SO_LUOT_KIEM_TRA << " luot kiem tra khong loi!";
    ThietLapMauSac(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, 0);
    return 0;
}

Công cụ sinh bộ test ngẫu nhiên sử dụng thư viện sinh số ngẫu nhiên hiện đại:

// generator.cpp
#include <iostream>
#include <random>
#include <chrono>

constexpr int GIA_TRI_TOI_DA = 100;

int main() {
    auto thoiGianHat = std::chrono::high_resolution_clock::now().time_since_epoch().count();
    std::mt19937 sinhNgauNhien(thoiGianHat);
    
    // Sinh so nguyen trong pham vi [1, GIA_TRI_TOI_DA]
    std::uniform_int_distribution<int> phanPhoi(1, GIA_TRI_TOI_DA);
    
    // Xuat du lieu test theo yeu cau bai toan
    std::cout << phanPhoi(sinhNgauNhien) << "\n";
    return 0;
}

Quy trình vận hành:

  1. Triển khai chuongTrinhChuan.cpp (giải pháp tham chiếu) và generator.cpp
  2. Biên dịch thành file thực thi: chuongTrinhChuan.exe và generator.exe
  3. Chạy thử nghiệm với test mẫu để đảm bảo chuongTrinhKiemTra.exe hoạt động cơ bản
  4. Biên dịch validator.cpp và thực thi, nhập tên 2 chương trình cần so sánh
  5. Điều chỉnh hằng số SO_LUOT_KIEM_TRA trong validator.cpp để kiểm soát số lượng test

Hệ thống sử dụng lệnh fc của Windows để so sánh đầu ra với tùy chọn /w bỏ qua khoảng trắng thừa, đồng thời thay đổi màu sắc đầu ra để trực quan hóa kết quả kiểm tra.

Thẻ: windows-api File-Comparison competitive-programming Test-Generation

Đăng vào ngày 26 tháng 6 lúc 16:54