Đề bài:
Nhớ hồi làm game Shark Dash, có cái phone Droid X gì gì đó cùi bắp, GPU ko hỗ trợ lệnh if và biểu thức điều kiện trong code shader. Ai có hứng thú thì vào giải cho vui: có 4 biến float dương a, b, c, d, hãy viết lại đoạn code C sau mà ko dùng if hay biểu thức điều kiện: if (a < b) a = c; else a = d; được phép thoải mái dùng các hàm math như sin, cos, sqrt, abs, min, max, round, floor, ceil.
Bài giải:
Code C hay OpenGL thì bây giờ quên hết rồi, đành chịu , còn Java mất 10 phút (xem comment).
Bạn nào có cách giải khác thì cũng comment vô cho vui :D (any language welcome).
./.
My solution:
a = c * Math.round(Math.max((Math.abs(b – a) + b – a) / (2 * (b – a)), 0)) + d * Math.round(Math.max((Math.abs(a – b) + a – b) / (2 * (a – b)), 0)) + d * (1 – Math.round((a – b) / (a – b)));
–Duc
Cách giải ở trên có thể applied được với các trường hợp giá trị âm, dương, 0 … Và thậm chí cả trường hợp a=b (nhờ hàm Math.round của Java). Nếu ta chỉ cần tính trường hợp dương và a != b thì sẽ đơn giản hơn, chỉ cần min() với max() là đủ , không cần cả abs()
Hàm cho số thực của C/C++ là fmin() và fmax() .
Pingback: Sprint end DoW | DucQuoc's Blog