Hạn chế khác của các for loops Python và bài toán Secret Sentence (phần 2)

Hạn chế khác của các for loops

Trong các học phần trước, chúng ta đã học for loops được sử dụng như thế nào để xử lí
các strings. Một for loop đi qua string, từ đầu đến cuối, một kí tự một lần một. Trong
nhiều trường hợp, cái đó chính xác là cái chúng ta muốn. Trong bài toán Three Cups, ví dụ,
chúng ta cần nhìn vào mỗi tráo đổi từ trái qua phải, nên chúng ta sử dụng một for loop
trên string của các tráo đổi.
Trong các trường hợp khác, cái đó cũng có hạn chế, và một range for loop có thể phù hợp hơn.
Một range for loop cung cấp cho chúng ta lối truy cập tới các chỉ mục hơn là các kí tự. Nó
cũng cho phép chúng ta nhảy qua một chuỗi với bất cứ khoảng cách bước nào chúng ta chọn. Ví
dụ, chúng ta có thể sử dụng một range for loop để ghé thăm mọi kí tự thứ ba của string:

>>> s = ‘zephyr’
>>> for i in range(0, len(s), 3):
… print(s[i])

z
h

Chúng ta cũng có thể sử dụng một range for loop để xử lí một string từ phải qua trái thay vì từ
trái qua phải:

>>> for i in range(len(s) – 1, -1, -1):
… print(s[i])

r
y
h
p
e
z

Tất cả cái này giả sử rằng chúng ta muốn bước bởi lượng khoảng cách cố định trên mỗi lần lặp.
Cái gì xảy ra nếu đôi khi chúng ta muốn di chuyển một kí tự sang phải và các lần khác chúng ta
muốn di chuyển ba kí tự sang phải? Cái đó không là không thể. Trên thực tế, nếu chúng ta có thể
làm cái đó, thì chúng ta sẽ tốt trên con đường của chúng ta để giải quyết bài toán Secret Sentence.
Để xem tại sao, xem xét test case này:

ipi lipikepe yopoupu

Hãy tưởng tượng rằng chúng ta đang xây dựng lại sentence gốc của Luka bằng cách sao chép
ký tự tới nó. Ký tự đầu tiên trong sentence được mã hóa là nguyên âm i.
Đây cũng là ký tự đầu tiên trong sentence gốc của Luka. Dựa vào cách
Luka mã hóa sentence, ta biết hai ký tự tiếp theo sẽ là p và
i. Chúng ta không muốn đưa những cái đó vào sentence gốc của Luka, vì vậy chúng ta cần
bỏ qua chúng. Tức là sau khi xử lý chỉ mục 0, chúng ta muốn chuyển sang chỉ mục 3.
Chỉ mục 3 là ký tự khoảng trắng. Vì nó không phải là nguyên âm nên ta sao chép ký tự này
vào sentence gốc của Luka rồi chuyển sang chỉ mục 4. Chỉ mục 4 là l,
một phi nguyên âm khác, vì vậy chúng ta cũng sao chép nó và chuyển sang chỉ mục 5. Ở đây tại chỉ mục 5
chúng ta có một nguyên âm; sau khi sao chép nó, chúng ta muốn chuyển sang chỉ mục 8.
Khoảng cách bước ở đây là gì? Đôi khi chúng ta nhảy mỗi ba, nhưng không phải lúc nào cũng vậy.
Và đôi khi chúng ta nhảy mỗi một, nhưng không phải lúc nào cũng vậy. Đó là sự kết hợp của ba và
một. Các for loops không được thiết kế cho kiểu xử lý này.
Với while loops, chúng ta có thể nén quanh một chuỗi theo ý muốn mà không bị cản trở
theo khoảng cách bước được xác định trước.

Chia sẻ

Leave a Reply

Your email address will not be published. Required fields are marked *