Thách Thức Tuần 338
Mỗi tuần, Mohammad S. Anwar tổ chức Thách Thức Tuần, một cơ hội cho tất cả chúng ta phát triển giải pháp cho hai nhiệm vụ hàng tuần. Trong bài viết này, tôi sẽ trình bày các giải pháp của mình bằng Python trước, sau đó là Perl. Đây là một cách tuyệt vời để tất cả chúng ta thực hành lập trình.
Nhiệm Vụ 1: Tính Tổng Dòng Cao Nhất
Nhiệm Vụ
Bạn được cung cấp một ma trận m x n
. Viết một đoạn mã để tìm tổng dòng cao nhất trong ma trận đã cho.
Giải Pháp Của Tôi
Để nhận đầu vào từ dòng lệnh, tôi lấy một chuỗi định dạng JSON và chuyển đổi nó thành danh sách các danh sách số nguyên (mảng trong Perl).
Đây là một dòng lệnh trong Python, sử dụng hàm sum
để tính tổng của mỗi dòng, và hàm max
để trả về tổng cao nhất.
python
def highest_row(matrix: list[list[int]]) -> int:
return max(sum(row) for row in matrix)
Mặc dù Perl không có hàm max
và sum
tích hợp sẵn, chúng được cung cấp bởi mô-đun List::Util. Do đó, giải pháp cũng tương tự.
perl
use List::Util qw(max sum);
sub main ($matrix) {
my $max = max( map { sum @$_ } @$matrix );
say $max;
}
Ví Dụ
bash
$ ./ch-1.py "[[4, 4, 4, 4], [10, 0, 0, 0], [2, 2, 2, 9]]"
16
$ ./ch-1.py "[[1, 5], [7, 3], [3, 5]]"
10
$ ./ch-1.py "[[1, 2, 3], [3, 2, 1]]"
6
$ ./ch-1.py "[[2, 8, 7], [7, 1, 3], [1, 9, 5]]"
17
$ ./ch-1.py "[[10, 20, 30], [5, 5, 5], [0, 100, 0], [25, 25, 25]]"
100
Nhiệm Vụ 2: Tìm Khoảng Cách Tối Đa
Nhiệm Vụ
Bạn được cung cấp hai mảng số nguyên, @arr1
và @arr2
. Viết một đoạn mã để tìm sự khác biệt tối đa giữa bất kỳ cặp giá trị nào từ hai mảng.
Giải Pháp Của Tôi
Để nhận đầu vào từ dòng lệnh, tôi lấy hai chuỗi và tách chúng theo các ký tự không phải số để chuyển đổi thành hai danh sách (mảng trong Perl).
Có ít nhất hai cách để giải quyết vấn đề này, mỗi cách có ưu và nhược điểm.
Tôi có thể trích xuất giá trị tối thiểu và tối đa của mỗi mảng và so sánh giá trị tối thiểu của một danh sách với giá trị tối đa của danh sách còn lại. Ưu điểm của cách này là chúng ta chỉ kiểm tra mỗi danh sách một lần, và thực hiện ba phép tính bổ sung. Nhược điểm là mã sẽ dài hơn đáng kể so với giải pháp khác.
Giải pháp mà tôi đã viết là một dòng lệnh trong Python, bằng cách sử dụng hai lần hiểu danh sách và hàm abs
và max
.
python
def max_distance(arr1: list[int], arr2: list[int]) -> int:
return max(abs(a - b) for a in arr1 for b in arr2)
Perl không có hiểu danh sách (nó có map
, nhưng việc sử dụng hai lần map
sẽ gặp nhiều khó khăn). Do đó, tôi sử dụng hai vòng lặp foreach
để đạt được kết quả tương tự.
perl
sub main (@arrays) {
my @arr1 = split /\D+/, $arrays[0];
my @arr2 = split /\D+/, $arrays[1];
my $max = 0;
for my $a1 (@arr1) {
for my $a2 (@arr2) {
my $dist = abs( $a1 - $a2 );
$max = $dist if $dist > $max;
}
}
say $max;
}
Ví Dụ
bash
$ ./ch-2.py "4 5 7" "9 1 3 4"
6
$ ./ch-2.py "2 3 5 4" "3 2 5 5 8 7"
6
$ ./ch-2.py "2 1 11 3" "2 5 10 2"
9
$ ./ch-2.py "1 2 3" "3 2 1"
2
$ ./ch-2.py "1 0 2 3" "5 0"
5
Thực Hành Tốt Nhất
- Kiểm tra các đầu vào để đảm bảo chúng là số nguyên.
- Sử dụng cấu trúc dữ liệu thích hợp để tối ưu hiệu suất.
Cạm Bẫy Thường Gặp
- Bỏ qua việc kiểm tra giá trị rỗng trong mảng đầu vào.
- Không xử lý trường hợp các giá trị âm.
Mẹo Tối Ưu Hiệu Suất
- Giảm thiểu số lần lặp qua các mảng.
- Tận dụng các hàm tích hợp sẵn để giảm thiểu mã.
Giải Quyết Vấn Đề
- Nếu mã không chạy, hãy kiểm tra đầu vào và đảm bảo định dạng đúng.
- Đảm bảo rằng tất cả các thư viện cần thiết đã được cài đặt.
Kết Luận
Việc tham gia vào Thách Thức Tuần không chỉ giúp bạn cải thiện kỹ năng lập trình mà còn giúp bạn khám phá những cách thức giải quyết vấn đề mới. Hãy tham gia vào tuần tiếp theo và chia sẻ giải pháp của bạn với cộng đồng!
Câu Hỏi Thường Gặp (FAQ)
Làm thế nào để chạy mã này?
Bạn có thể chạy mã bằng cách sử dụng Python hoặc Perl từ dòng lệnh với các tham số đầu vào phù hợp.
Có cần cài đặt thư viện nào không?
Đối với giải pháp Perl, bạn cần thư viện List::Util để sử dụng các hàm max
và sum
.