Nâng cao

MỤC TIÊU
-------------------------------------------------------------------------------
• Tính toán từ chuỗi ký tự như máy tính tay/Excel.
• Hỗ trợ 3 chế độ nhập: 
  (1) Một biểu thức duy nhất; 
  (2) Hai dòng: Dòng 1 gán biến, Dòng 2 biểu thức; 
• Hỗ trợ toán học, so sánh, logic, if, random, mod/div, min/max nhiều tham số.
• Bổ sung tiện ích tìm tọa độ gần nhất / xa nhất từ định dạng “x.y-x2.y2-…”.

-------------------------------------------------------------------------------
CÁCH TÍCH HỢP NHANH 
-------------------------------------------------------------------------------
1) Một biểu thức (không cần biến)   
   Truyền vào tham số đầu : 3+3
Kết quả : 6
2) Hai dòng (Dòng 1 gán biến; Dòng 2 biểu thức)
   Truyền vào tham số đầu : x=2; y=3
   Truyền vào tham số sau : pow(x,y)+1
Kết quả : 9

4) Tọa độ gần nhất / xa nhất
   Truyền vào tham số đầu : 133.150
   Truyền vào tham số sau : 136.131-148.129-133.90-96.128-133.164-170.128
Kết quả gần nhất : 133.164
Kết quả gần nhất : 133.90

-------------------------------------------------------------------------------
QUY TẮC ĐỊNH DẠNG & GÁN BIẾN
-------------------------------------------------------------------------------
• Số thập phân trong BIỂU THỨC: dùng dấu chấm (.)  — ví dụ 3.14
• Dòng gán biến cho phép dấu phẩy => tự đổi sang dấu chấm.
  Ví dụ: "x=3,14; y=2" tương đương "x=3.14; y=2"
• Tên biến: bắt đầu bằng chữ hoặc '_', sau đó là chữ/số/'_'. Không phân biệt hoa/thường.
• Biến chưa gán → báo lỗi: “Biến chưa gán: <tên>”.

-------------------------------------------------------------------------------
TOÁN TỬ & ƯU TIÊN
-------------------------------------------------------------------------------
(Thấp)  or, || 
        and, && 
        =, ==, !=, <>, >, <, >=, <=
        +, -
        *, /, %, div (và // là alias của div)
(Cao)   ^
        not, !, + đơn ngôi, - đơn ngôi

• ^ kết hợp-phải: 2^3^2 = 2^(3^2) = 512
• %, div, *, / cùng mức, tính trái → phải.
• div: chia nguyên kiểu truncate (Math.Truncate).

-------------------------------------------------------------------------------
HẰNG & HÀM DÙNG SẴN
-------------------------------------------------------------------------------
HẰNG: pi, e, tau (=2*pi)

HÀM (1 tham số): 
  abs, sqrt, exp, ln, log10, round, floor, ceil, sin, cos, tan, asin, acos, atan, deg(rad→độ), rad(độ→rad), not

HÀM (2 tham số): pow(x,y), atan2(y,x)

HÀM (3 tham số): clamp(x,lo,hi), if(cond, a, b)

HÀM (biến số – nhiều tham số): 
  min(a,b,c,...) ; max(a,b,c,...)

HÀM random: 
  random()      → [0,1)
  random(max)   → [0,max)
  random(lo,hi) → [lo,hi)

-------------------------------------------------------------------------------
VÍ DỤ CƠ BẢN
-------------------------------------------------------------------------------
• Một biểu thức:
  "3+3"                         → "6"
  "(2+3)*5"                     → "25"
  "2^3^2"                       → "512"
  "10 % 3"                      → "1"
  "10 div 3" hoặc "10 // 3"     → "3"
  "max(1,5,3,9)"                → "9"
  "min(2,7,1,4)"                → "1"
  "sin(rad(30))"                → "0.5"
  "if(3>5,10,20)"               → "20"

• Hai dòng:
  D1: "x=2; y=3"
  D2: "pow(x,y)+1"              → "9"

-------------------------------------------------------------------------------
VÍ DỤ THỰC TẾ (NHIỀU BIẾN)
-------------------------------------------------------------------------------
1) Tính tổng & VAT
   D1: "sp1=120; sp2=80; vat=0.1"
   D2: "(sp1+sp2)*(1+vat)"           → "220"

2) Chiết khấu
   D1: "gia=500; giam=0.15"
   D2: "if(giam>0, gia*(1-giam), gia)" → "425"

3) Chọn lớn nhất trong nhiều số
   D1: "a=3; b=5; c=2; d=9; e=4"
   D2: "max(a,b,c,d,e)"              → "9"

4) Điều kiện nhiều tầng
   D1: "x=8; y=10; z=5"
   D2: "if(x>y, x, if(y>z, y, z))"   → "10"

5) Lượng giác (độ)
   D1: "deg=30"
   D2: "sin(rad(deg))"               → "0.5"

6) Mod + div
   D1: "a=23; b=6"
   D2: "a % b + (a div b)"           → "3 + 3 = 6"  (vì 23%6=5; 23 div 6=3; 5+3=8) *Ví dụ chuẩn: "a % b"=5 ; "a div b"=3 ; thay bằng biểu thức bạn cần.*

-------------------------------------------------------------------------------
TỌA ĐỘ (ĐẶC THÙ x.y)
-------------------------------------------------------------------------------
Định dạng:
• Tọa độ đơn: "x.y"  (x là hoành độ, y là tung độ); bắt buộc dùng dấu chấm giữa x & y.
• Danh sách: "x1.y1-x2.y2-…"

Ví dụ :
  Tọa độ hiện tại = "133.150"
  Danh sách tọa độ cần kiểm tra   = "136.131-148.129-133.90-96.128-133.164-170.128"
  Gần nhất  → "133.164"  (khoảng cách = 14)
  Xa nhất   → "133.90"   (khoảng cách = 60)

Lưu ý:
• Bỏ qua điểm sai định dạng trong danh sách (không làm lỗi toàn bộ).

-------------------------------------------------------------------------------
ĐỊNH DẠNG KẾT QUẢ
-------------------------------------------------------------------------------
• Trả về chuỗi: 
  - Nếu là số nguyên (sai số ≤ 1e-12) → in không có phần thập phân (ví dụ "10")
  - Ngược lại → định dạng "0.###########"
• Tọa độ in dạng "x.y" với mỗi tọa độ đã được rút gọn .0 nếu không cần.

-------------------------------------------------------------------------------
XỬ LÝ LỖI & GỢI Ý SỬA
-------------------------------------------------------------------------------
• “Biến chưa gán: x” → Thêm x=... ở dòng gán (TwoLines/Auto).
• “Thiếu '(' / Thiếu ')'” → Kiểm tra cặp ngoặc.
• “Toán tử không hợp lệ: …” → Kiểm tra chính tả/toán tử.
• “... cần N tham số, nhận M” → Kiểm tra số tham số khi gọi hàm.
• Kết quả khác mong đợi:
  - Kiểm tra ưu tiên toán tử; thêm ngoặc nếu cần.
  - Với “a % b + (a div b)”, nhớ rằng 10%5=0; 10 div 5=2 → tổng = 2.

-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
FAQ
-------------------------------------------------------------------------------
Q1. Có cho “min/max” nhiều tham số không? 
    → Có. Ví dụ: max(1,2,3,4,5)

Q2. random có bao nhiêu dạng?
    → random(), random(max), random(lo,hi)

Q3. Có hỗ trợ dấu phẩy thập phân trong BIỂU THỨC không?
    → Không. Biểu thức sử dụng dấu chấm. Dòng gán biến thì chấp nhận dấu phẩy.

Q4. Vì sao "(a % b + a div b)" cho ra 2 với a=10,b=5?
    → 10%5=0; 10 div 5=2 → tổng=2.

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