Trên trang Code Fights (tôi đã giới thiệu về trang web này ở bài viết: Thử tài tìm lỗi của mã lập trình với Code Fights) có mục Challenge (tạm dịch là Thách thức). Ở đây người ta sẽ đưa ra một bài toán yêu cầu người tham gia giải quyết và bài giải tối ưu là bài giải có lời giải… ngắn nhất.
Hôm rồi có yêu cầu như thế này.
Tạm dịch là: Cho một mảng các số chứa một số không được lặp và nhiệm vụ người tham gia là viết mã để tìm ra số đó.
Tôi bắt đầu hiểu là có thể chuỗi chứa nhiều giá trị không lặp nên code xuất ra mảng chứa các phần tử đó. Máy không chịu vậy là hiểu nó chỉ lấy một giá trị và tôi viết đoạn mã này và vượt qua được tất cả các bộ test.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | function oddElement(a) { var result = false; var arr_length = a.length; for(i=0; i<arr_length; i++){ var has_loop = 0; for(j=0; j<arr_length; j++){ if(i != j) if(a[i] == a[j]) has_loop = 1; } if(has_loop == 0){ var result = a[i]; }; } return result; } |
Thật ra lúc đầu tôi không để ý lắm đến tiêu chí đánh giá (lời giải càng ngắn càng tốt) nên viết cố gắng càng tường minh càng tốt nhưng sau này mới nhận ra tiêu chí nên bắt đầu sửa. Một số mẹo vặt để tối ưu lời giải cho bài toán này:
- Người ra đề chỉ yêu cầu mảng chứ 1 số thỏa điều kiện đó nên gặp là trả về luôn khỏi kiểm tra tiếp.
- Thay vì đặt biến tên dài lằng ngoằng để tường minh thì có thể đặc là: a, b, c… cho ngắn.
- Giá trị nào lặp nhiều lần mà số ký tự dài thì nên gán là: a, b, c… cho rút ngắn ký tự khi gọi lại.
- Loại bỏ hết các dấu mở ngoặc nhọn, đóng ngoặc nhọn ({}), chấm phảy (;) nếu có thể.
Ấy vậy mà vẫn không rút ngắn được bao nhiêu và đây là bài giải của người mà mình phải gọi là thánh. Một dòng duy nhất. Quá kinh!
1 2 3 | function oddElement(a) { return eval(a.join('^')) } |
Chia sẻ với các bạn cho vui. Các bạn học CNTT mới nhập môn lập trình thì có thể tham khảo thuật toán.
Thật ra khi kết thúc cuộc thi với bài toán này mình xem ra thì thấy có nhiều đoạn mã viết rất hay nếu xét về độ tối ưu thì mình thấy OK nhưng ngặt nổi ở đây tối ưu là lời giải ngắn nên đành chịu thôi ^^!
PS: Ở đây mình viết bằng Javascript.
Huỳnh Mai Anh Kiệt