Let Chunk - Phần thứ hai


Tạ Ngọc Phụng
1 năm trước
Hữu ích 3 Chia sẻ Viết bình luận 0
Đã xem 5158

Trong bài viết trước của tôi, chúng tôi đã nói về  hàm chunk  và triển khai nó trong JavaScript. Hôm nay tôi sẽ cố gắng đưa ra một ví dụ cho việc sử dụng chức năng này. Ví dụ này xuất hiện trong đầu tôi khi tôi đọc về hàm chunk, vì nó nhắc tôi về một câu hỏi tôi từng đưa ra cho các học sinh của mình trong một kỳ thi, và tôi nghĩ rằng hàm chunk có thể hữu ích cho họ khi họ biết.

Nhiệm vụ diễn ra như vậy - viết một hàm gọi là  printWithCommas. Hàm sẽ nhận được hai số nguyên - num và d. Hàm sẽ trả về một chuỗi đại diện cho num bằng dấu phẩy sau mỗi chữ số d từ bên phải. Có thể phần cuối cùng bên trái cuối cùng sẽ không chứa chính xác các chữ số d, theo d và tổng các chữ số trong số đó.

Ví dụ: nếu num là 12345678 và d là 3 thì đầu ra sẽ là 12.345.678. Và với cùng một num, nếu d là 2 thì đầu ra sẽ là 12,34,56,78.

Đây không phải là một vấn đề quá phức tạp, nhưng nó có một sự thay đổi bởi vì nhóm chữ số duy nhất có thể chứa ít hơn d chữ số là số ngoài cùng bên trái, nhưng vì bản chất của việc đọc số, chúng ta thường bắt đầu đọc số từ phải sang trái , sử dụng thao tác modulo, chẳng hạn như  num % 10 để lấy chữ số cuối cùng.

Bây giờ khi tôi nghĩ về hàm chunk, tôi chợt nhận ra rằng số này được chia thành các khối của chữ số d. Vì vậy, chức năng chunk có thể được sử dụng ở đây.

OK, tôi sẽ nói trước - đó là một cú sút xa và tôi đoán việc giải quyết vấn đề này mà không có chức năng chunk không phải là khó khăn và chúng tôi phải xử lý trước khi chức năng chunk có thể khởi động, nhưng tôi nghĩ đó là một thực tiễn tốt và trình diễn giải quyết vấn đề theo cách sáng tạo bằng các công cụ hiện có.

Để giải quyết vấn đề này, trước tiên chúng ta phải chuyển đổi số thành một mảng vì hàm chunk hoạt động trên các mảng. Vì vậy, sau khi chia số thành một mảng, số 12345678 sẽ mang lại mảng [8, 7, 6, 5, 4, 3, 2, 1]. Lưu ý rằng các chữ số theo thứ tự đảo ngược.

Bây giờ chúng ta có thể phân chia chúng theo từng phần tử d, sử dụng hàm chunk. Lưu ý rằng theo thuật toán phân đoạn, đoạn cuối có thể có ít hơn các phần tử d, chính xác như chúng ta đã định nghĩa trong câu hỏi. Ví dụ: sau khi chia mảng này với d = 3, chúng ta sẽ nhận được mảng - [[8, 7, 6], [5, 4, 3], [2, 1]].

Chúng ta nên xuất các chữ số với dấu phẩy giữa mỗi khối. Nhưng chúng ta nên bắt đầu in đoạn cuối trước, vì vậy hãy đảo ngược mảng và lấy - [[2, 1], [5, 4, 3], [8, 7, 6]].

Bây giờ khá dễ dàng - đối với mỗi mảng con trong mảng, in các phần tử của nó và sau đó in dấu phẩy. Lưu ý rằng vì các chữ số theo thứ tự đảo ngược, chúng tôi sẽ in từng mảng phụ từ đầu đến cuối.

Đây là mã:

function printWithCommas(num, d) {

    var numArr = [];

  // convert num to array
    while(num != 0) {
        numArr.push(num % 10);
        num = Math.floor(num / 10);
    }

    var res = "";

    // create chunks of d elements each
    var chunks = chunk(numArr, d).reverse();

    // concat each chunk with a comma separator
    chunks.forEach(function(chunk, ind) {
      chunk.reverse().forEach(x => res += x);
         if(ind < chunks.length - 1)
                res += ",";
    });

    return res;
}

Nó có đáng không? Tôi không biết, nó có thể là quá mức cho vấn đề này. Tuy nhiên, tôi nghĩ rằng giải pháp này rất sáng tạo và thanh lịch vì nó chứa đựng bản chất của việc giải quyết vấn đề - nó đưa vấn đề đã cho và biến nó thành một vấn đề khác bởi vì chúng ta có một giải pháp nhất định cho giải pháp khác.

Bạn nghĩ sao?

Hữu ích 3 Chia sẻ Viết bình luận 0
Đã xem 5158