Thách Thức Tuần 3××
Mỗi tuần, Mohammad S. Anwar gửi đến Thách Thức Tuần, cơ hội cho tất cả chúng ta để tìm ra giải pháp cho hai nhiệm vụ hàng tuần. Giải pháp của tôi được viết bằng Python trước, sau đó chuyển sang Perl. Đây là một cách tuyệt vời để chúng ta thực hành lập trình.
Tóm tắt Nhiệm vụ
- Nhiệm vụ 1: Tìm số nhỏ hơn hiện tại
- Nhiệm vụ 2: Ma trận lẻ
Nhiệm vụ 1: Nhỏ Hơn Hiện Tại
Mô tả Nhiệm vụ
Bạn được cung cấp một mảng số, @num1
. Hãy viết một script để trả về một mảng, @num2
, trong đó $num2[i]
là số lượng tất cả các số nhỏ hơn hoặc bằng $num1[i]
.
Giải pháp của Tôi
Nhiệm vụ này tương đối đơn giản. Tôi sẽ lặp qua danh sách đầu vào (mảng trong Perl) với biến number
. Sau đó, tôi sẽ đếm số lượng phần tử trong danh sách đầu vào mà nhỏ hơn hoặc bằng số đó. Tôi trừ một từ số đếm đó để loại trừ chính số đó.
python
def smaller_than_current(numbers: list) -> list:
solution = []
for number in numbers:
solution.append(sum(1 for n in numbers if n <= number) - 1)
return solution
Ví dụ
$ ./ch-1.py 6 5 4 8
[2, 1, 0, 3]
$ ./ch-1.py 7 7 7 7
[3, 3, 3, 3]
$ ./ch-1.py 5 4 3 2 1
[4, 3, 2, 1, 0]
$ ./ch-1.py -1 0 3 -2 1
[1, 2, 4, 0, 3]
$ ./ch-1.py 0 1 1 2 0
[1, 3, 3, 4, 1]
Thực Hành Tốt Nhất
- Kiểm tra đầu vào để đảm bảo rằng mảng không rỗng.
- Sử dụng vòng lặp hiệu quả để cải thiện hiệu suất với các dữ liệu lớn.
Cạm Bẫy Thường Gặp
- Không tính số hiện tại khi đếm.
- Nhầm lẫn giữa các chỉ số trong mảng.
Mẹo Hiệu Suất
- Sử dụng cấu trúc dữ liệu thích hợp để giảm thiểu thời gian tính toán.
Nhiệm vụ 2: Ma Trận Lẻ
Mô tả Nhiệm vụ
Bạn được cung cấp row
và col
, cũng như một danh sách các vị trí trong ma trận. Hãy viết một script để thực hiện hành động trên mỗi vị trí (chỉ số bắt đầu từ 0) như đã cung cấp trong danh sách và tìm tổng số ô có giá trị lẻ.
Đối với mỗi vị trí (r, c)
, hãy thực hiện cả hai điều sau:
- Tăng 1 cho tất cả các ô trên hàng
r
. - Tăng 1 cho tất cả các ô trên cột
c
.
Giải pháp của Tôi
Sau nhiệm vụ thứ hai của tuần trước, nơi Copilot viết mã dựa trên các trường hợp kiểm tra của tôi, tôi quyết định viết mã trước. Như mong đợi, Copilot ít hữu ích hơn và chỉ hỗ trợ trong việc hoàn thiện mã.
Đối với nhiệm vụ này, tôi lấy hai giá trị đầu tiên của tham số dòng lệnh làm giá trị rows
và cols
. Sau đó, tôi lấy phần còn lại dưới dạng một cặp điểm.
python
def main():
array = [int(n) for n in sys.argv[1:]]
row = array.pop(0)
col = array.pop(0)
points = [(array[i], array[i + 1]) for i in range(0, len(array), 2)]
result = odd_matrix(row, col, points)
print(result)
Ví dụ
$ ./ch-2.py 2 3 0 1 1 1
6
$ ./ch-2.py 2 2 1 1 0 0
0
$ ./ch-2.py 3 3 0 0 1 2 2 1
0
$ ./ch-2.py 1 5 0 2 0 4
2
$ ./ch-2.py 4 2 1 0 3 1 2 0 0 1
8
Thực Hành Tốt Nhất
- Đảm bảo rằng các chỉ số không vượt quá kích thước của ma trận.
- Cập nhật ô một cách đồng bộ để tránh lỗi.
Cạm Bẫy Thường Gặp
- Không xử lý đúng các điểm đã được cập nhật.
- Quá nhiều phép toán có thể làm giảm hiệu suất.
Mẹo Hiệu Suất
- Sử dụng các thuật toán tối ưu để giảm thiểu thời gian thực hiện.
Kết Luận
Thách thức tuần này không chỉ giúp chúng ta cải thiện kỹ năng lập trình mà còn cung cấp cái nhìn sâu sắc về cách làm việc với dữ liệu và cấu trúc. Hãy thử nghiệm với các giải pháp của bạn và chia sẻ chúng với cộng đồng lập trình viên.
Hỏi & Đáp
Q: Làm thế nào để chạy script?
A: Sử dụng dòng lệnh với cú pháp ./ch-1.py <các tham số>
.
Q: Tôi có thể thử nghiệm với các kích thước mảng khác không?
A: Có, hãy thử nghiệm với các kích thước và giá trị khác nhau để xem kết quả.
Q: Có cách nào tối ưu hóa hơn không?
A: Có nhiều cách tối ưu hóa, bao gồm việc sử dụng thuật toán tốt hơn và cấu trúc dữ liệu phù hợp.
Hãy tham gia vào Thách Thức Tuần và thử sức với những bài toán thú vị này!