Vài one-line solution trick đơn giản như đang giỡn (cùng Java và Javascript)

One-line solution, hay được gọi là đoạn code chỉ đúng 1 dòng nhằm giải quyết một vấn đề nào đó, cùng mình tìm hiểu vài solution đơn giản như đang giỡn qua vài ví dụ “khá là thực tế” trong bài viết này nhé.

Kiểm tra mảng có chứa phần tử trùng nhau

Thằng em fresher vừa vào team và được giao chức năng code random bộ câu hỏi trong ngân hàng đề vài nghìn câu, là một tester, bạn muốn thử chạy random vài trăm bộ đề và muốn kiểm tra xem có xảy ra trường hợp có câu hỏi nào bị trùng nhau trong bất kì bộ đề được tạo ra hay không.

Dĩ nhiên, yêu cầu chỉ cần bạn kiểm tra mảng danh sách câu hỏi (mảng chỉ chứa số nguyên) có bị trùng lặp phần tử nào hay không, nếu trùng thì cứ dí bug vào em nó thôi.

Bài toán được đơn giản hóa như sau

Input: mảng số nguyên không rỗng.

Output: kiểm tra mảng input có chứa phần tử nào bị trùng nhau hay không.

Theo cách tiếp cận thông thường, bạn sẽ thường đếm, hoặc đánh dấu từng phần tử trong mảng, nếu số lần xuất hiện (hoặc bị đánh dấu) vượt quá 1 lần thì kết luận mảng sẽ chứa phần tử trùng nhau.

Nhưng chiêu trò hơn một chút, bạn đã thử cân nhắc việc sử dụng cấu trúc dữ liệu không chứa phần tử trùng nhau như dưới đây chưa?

// Javascript solution
function hasDuplicates(arr) {
    return (new Set(arr)).size !== arr.length;
}

// Java solution
public boolean hasDuplicates(List<Integer> arr) {
    return new HashSet(arr).size() != arr.size();
}

Dĩ nhiên, trick này cũng được sử dụng để kiểm tra mảng không chứa phần tử nào khác nhau, bạn hãy thử tìm solution cho trường hợp này nhé.

Tìm số ngày trong tháng

Input: tháng và năm hợp lệ (đã có hàm kiểm tra năm nhuận).

Output: số ngày trong tháng đó.

Có lẽ đây không còn là bài toán quá xa lạ với các lập trình viên, tuy nhiên logic thường được dạy ở trường và một số solution mẫu sẽ sử dụng switch-case.

Nếu một số trường hợp kết quả được xét lần lượt theo chuỗi các giá trị liên tiếp, ví dụ trong trường hợp này là tháng từ 1 đến 12, bạn hãy thử cân nhắc sử dụng cấu trúc mảng xem sao?

// Javascript solution
function countDayOfMonth(month, year) {
    return [31, isLeapYear(year) ? 29 : 28, 
    31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month - 1];
}

// Java solution
public int countDayOfMonth(int month, int year) {
    return Arrays.asList(31, isLeapYear(year) ? 29 : 28,
    31, 30, 31, 30, 31, 31, 30, 31, 30, 31].get(month - 1);
}

Nếu các chuỗi giá trị cần xét không liên tiếp, hoặc cần xét các giá trị ngoài kiểu dữ liệu số, bạn có thể áp dụng dạng object (trong JS) hoặc HashMap (trong Java) theo cặp key-value cũng là một cách tiếp cận khá phổ biến.

Trick này có thể sử dụng để tìm tên của thứ trong tuần (thứ hai, thứ ba…), hoặc tìm tên năm Âm Lịch của một năm, bạn có thể tham khảo công thức tìm Can – Chi tại đây nhé.

Kiểm tra giá trị là một trong các giá trị

Bạn kinh doanh nhà hàng Pizza với nhiều loại trên thế giới, hôm nay bạn chạy chiến dịch nhằm đẩy mạnh 5 doanh số loại pizza: hải sản, phô mai, cá hồi, rau củ và bò, nếu khách đặt mua một trong số các loại pizza này sẽ được một phiếu giảm giá siêu to khổng lồ trên dưới 1 tỉ chẳng hạn.

Input: Loại pizza khách đã đặt

Output: Kiểm tra loại pizza có thuộc trong chương trình khuyến mãi.

Theo cách tiếp cận dễ dàng nhất, chỉ cần xét giá trị của input cùng với các câu điều kiện or và so sánh bằng, ta đã có thể giải quyết bài toán, tuy nhiên có thể làm mất “thẩm mĩ” khi đoạn code so sánh bằng sẽ bị lặp lại khá nhiều và dài dòng.

Cách tiếp cận bài toán trên có thể phát biểu như sau: kiểm tra xem các loại pizza đang khuyến mãi có chứa loại pizza của khách đã đặt hay không, dĩ nhiên, đoạn code sẽ trở nên trong sáng hơn nhiều:

// Javascript solution
function isDiscountType(type) {
    return ['seafood', 'cheese', 'salmon', 'vegie','beef'].includes(type);
}

// Java solution
public boolean isDiscountType(String type) {
    return Arrays.asList("seafood", "cheese", "salmon", "vegie", "beef").contains(type);
}

Trick này có thể sử dụng trong bài toán kiểm tra định dạng file upload có thuộc các định dạng được hỗ trợ hay không – bài toán khá phổ biến trong lập trình web.

Trên đây là một số one-trick solution mà mình lân la tìm hiểu được trong quá trình tìm tòi lập trình, nếu bạn có trick thú vị nào khác, có thể chia sẻ cùng mình nhé! =)

One thought on “Vài one-line solution trick đơn giản như đang giỡn (cùng Java và Javascript)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s