Thuật Toán An Sao Tử Vi: Lập Trình Tính Vị Trí 108+ Sao
Chuyên mục: Lập trình × Huyền học
An sao Tử Vi là quá trình xác định vị trí từng sao trên 12 cung. Bài viết phân tích thuật toán đằng sau việc lập trình một engine tử vi hoàn chỉnh.
1. Cấu Trúc Dữ Liệu: 12 Cung
Lá số Tử Vi gồm 12 cung xếp theo hình chữ nhật 4×3, mỗi cung chứa: tên cung, danh sách sao, Thiên Can-Địa Chi, và Tràng Sinh vị trí.
const CUNG_ORDER = [
'Mệnh', 'Huynh Đệ', 'Phu Thê', 'Tử Tức',
'Tài Bạch', 'Tật Ách', 'Thiên Di', 'Nô Bộc',
'Quan Lộc', 'Điền Trạch', 'Phúc Đức', 'Phụ Mẫu'
];
// Mỗi cung = 1 Địa Chi (Tý...Hợi), xoay theo Mệnh cung
2. Bước 1: Xác Định Cục Số
Cục số (2, 3, 4, 5, hoặc 6) quyết định cách an Tử Vi. Phụ thuộc vào Thiên Can năm sinh + tháng sinh âm lịch. Thuật toán:
function cucSo(amLichMonth, yearStem) {
// Bước 1: Tìm Ngũ Hành Nạp Âm của Can-Chi cung Mệnh
// Bước 2: Cục = mapping từ Ngũ Hành:
// Thủy=2, Mộc=3, Kim=4, Thổ=5, Hỏa=6
const NH = napAmNguHanh(menhCungCanChi);
return {Thủy:2, Mộc:3, Kim:4, Thổ:5, Hỏa:6}[NH];
}
3. Bước 2: An Tử Vi Tinh
Vị trí sao Tử Vi = f(ngày sinh âm lịch, cục số). Đây là bảng tra 30×5 (30 ngày × 5 cục):
// Công thức tổng quát (đơn giản hóa):
// tuViPosition = (ngayAm - 1 + offset[cucSo]) mod 12
// Bảng offset phụ thuộc cục số:
const TV_TABLE = {
2: [/* 30 entries */], // Thủy nhị cục
3: [/* 30 entries */], // Mộc tam cục
4: [/* 30 entries */], // Kim tứ cục
5: [/* 30 entries */], // Thổ ngũ cục
6: [/* 30 entries */], // Hỏa lục cục
};
4. Bước 3: An Các Sao Còn Lại
Sau khi an Tử Vi, các sao khác được an theo quy luật:
- 14 chính tinh: Vị trí tương đối so với Tử Vi (lookup table cố định)
- Lục Cát: Văn Xương, Văn Khúc, Tả Phụ, Hữu Bật, Thiên Khôi, Thiên Việt — theo Can/Chi năm/giờ
- Lục Sát: Kình Dương, Đà La, Hỏa Tinh, Linh Tinh, Thiên Không, Địa Kiếp — theo Can năm + Chi giờ
- Tứ Hóa: Hóa Lộc/Quyền/Khoa/Kỵ — lookup theo Thiên Can (10 bộ × 4 hóa = 40 entries)
5. Complexity Analysis
Toàn bộ quá trình an sao:
- Input: 5 tham số (năm, tháng, ngày âm lịch, giờ, giới tính)
- Output: 12 cung × N sao (108-115 sao tùy trường phái)
- Thuật toán: O(N) — chỉ là lookup table, không có computation nặng
- Bottleneck: Chuyển đổi dương lịch → âm lịch (cần VSOP87) là bước tốn nhất
Toàn bộ engine chạy dưới 10ms trên máy hiện đại — phần lớn thời gian dành cho rendering UI.