- .LCN với chương trình LOGO, PAS với chương trình PASCAL
Bài toán: In ấn
Máy trạm và máy chủ (Client và Server)
Có hai người sử dụng, mỗi người có một chiếc máy tính. Các máy tính được đăt tên là CLIENT(1) và CLIENT(2). Hai máy tính cùng chia xẻ một hoặc nhiều máy in được đặt tên là SERVER(1), SERVER(2), ... Lệnh in ấn từ hai máy tình được thực hiện lần lượt. Để kết hợp việc truyền tin giữa hai máy tính qua máy in, ta dùng một thiết bị đặc biệt: semaphorẹ
Semaphore
Mỗi máy in có một semaphore đi kèm. Một thiết bị semaphore luôn ở một trong hai trạng thái: S1 hoặc S2. Khi máy in sẵn sàng để nhận dự liệu in ấn, thiết bị semaphore sẽ ở trạng
thái S1. Khi máy in đang bận (thực hiện in ấn tài liệu khác hoặc lỗi) thì thiết bị semaphore ở trạng thái S2.
Thiết bị semaphore có thể thực hiện hai biến đổi từ 'S1->S2' và 'S2->S1'. Khi người dùng ra lệnh in cho máy tính, máy tính sẽ gửi thơng điệp "Are_you_open?" đến thiết bị
semaphorẹ Nếu semaphore đang ở trạng thái S1 sau đó chuyển sang trạng thái S2 thì semaphore sẽ gửi thơng điệp "Open" trở lại cho máy tính vừa gửi thơng điệp
"Are_you_open?" đến nó. Nếu semaphore ở trạng thái S2 thì nó sẽ gửi thơng điệp "Closed" lại cho máy tính. Sau khi in xong, máy in sẽ gửi thông điệp "Ready" lại cho semaphorẹ Khi nhận được thông điệp "Ready" từ máy in, semaphore sẽ chuyển về trạng thái S1.
Thiết bị SEMAPHORE
Trong Documentation 1 bạn sẽ thấy những mô tả về thiết bị SEMAPHORẸ Đặc điểm chủ yếu của thiết bị semaphore gồm các định danh, các trạng thái của thiết bị, 'Priority List' (Danh sách ưu tiên), 'Communication Diagram' (Sơ đồ truyền tin), 'State Transition Diagram' (Sơ đồ chuyển trạng thái thiết bị) và 'Receive Procedures' (Thủ tục nhận tin). 'Receive Procedures' mơ tả quy trình semaphore trả lời thơng tin từ máy in.
'Priority List' cũng rất quan trọng vì có nhiều thơng tin được gửi đến cùng một lúc những thiết bị semaphore lại chỉ có thể xử lý lần lượt các tin. 'Priority List' trong Documentation 1 cho rằng một thông tin từ SERVER được ưu tiên hơn một thông tin từ CLIENT và thông tin từ SERVER(2) được ưu tiên hơn thông tin từ SERVER(3).
Máy trạm
Trong Documentation 2 bạn sẽ có các mơ tả về máy trạm. Một máy trạm luôn ở một trong ba trạng thái: SA, SB hoặc SC. Một máy trạm ở trạng thái SA khi nó khơng gửi một lệnh in đến máy chủ và máy chủ cũng đang không thực hiện lệnh in từ máy trạm này gửi đến mà có thể từ máy trạm khác. Máy trạm ở trạng thái SB khi nó muốn kết nối vào một máy chủ. Máy trạm chỉ có thể kết nối vào máy chủ qua thiết bị semaphorẹ Máy trạm ở trạng thái SC khi máy chủ đang thực hiện lệnh in gửi từ chính máy trạm này đến.
Một máy trạm có thể thực hiện lần chuyển trạng thái: 'SA->SB', 'SB->SC', 'SC->SÁ. Khi một máy trạm ở trạng thái SB, máy trạm này có thể nhận thơng điệp "Closed" từ
semaphorẹ Sau khi nhận thông điệp này, máy trạm sẽ đợi một thời gian được gọi là 'Waiting_Period' (Thời gian đợi), sau đó máy trạm lại gửi thơng điệp "Are_you_open?" tới semaphorẹ Khi semaphore gửi thông điệp "Open" tới máy trạm, thì máy trạm này sẽ chuyển sang trạng thái SC và gửi lệnh in cùng thông điệp "S_Job" tới máy chủ mà semaphore vừa gửi thông điệp được gắn vàọ Sau đó máy chủ này sẽ thực hiện lệnh in. Sau khi in xong, máy chủ sẽ gửi cùng một lúc hai thông điệp: "Ready" tới semaphore và thông điệp "C_Ready" tới máy trạm. Khi nhận thông điệp, máy trạm sẽ chuyển sang trạng thái SẠ Bạn có thể giả định những chiếc máy in là ổn định. Chúng sẽ hồn thành được các lệnh in gửi đến. Ví dụ, các máy in khơng bao giờ báo 'out of paper - Hết giấy in'.
Truyền tin
Trong Documentation 3 bạn sẽ thấy trong 'Communication Structure Diagram' (Sơ đồ cấu trúc truyền tin) có tất cả các kiểu thơng điệp sẽ được gửi đến lẫn nhau giữa các thiết bị trong sơ đồ cấu trúc truyền tin. Trong 'Message List' (Danh sách thông điệp) bạn sẽ thấy mô tả cụ thể các dạng thơng điệp. Mỗi thơng điệp có một tên, một người gửi, một người nhận và đơi khi có cả nội dung.
Khi máy gửi gửi một thông điệp với tên A tại thời điểm t, tại thời điểm t + 1 máy nhận sẽ nhận thông điệp bằng thủ tục 'Receive Proceduré Ạ
Nếu nhiều máy cùng gửi các thông điệp đến một máy nhận trong cùng thời gian t, thì tại thời điểm t + 1 máy nhận sẽ nhận tất cả các thông điệp theo thứ tự các máy gửi trong danh sách ưu tiên 'Priority List' của máy nhận.
Yêu cầu A
Một mạng nội bộ (LAN) gồm các đối tượng sau tại thời gian 0:
Đối tượng: CLIENT(1), Client.State = SA, Waiting_Period = 2, Number_of_Servers= 1 Đối tượng: CLIENT(2), Client.State = SA, Waiting_Period = 1, Number_of_Servers= 1 Đối tượng: SERVER(1)
Đối tượng: SEMAPHORE(1), SemaphorẹState = S1
Trong mạng nội bộ này, các dạng thông điệp sau sẽ được gửi đi lại giữa các máy: Tại thời gian 1:
CLIENT(1) gửi thông điệp mang tên "Are_you_open?" Tại thời gian 2:
CLIENT(2) gửi thông điệp mang tên "Are_you_open?" Tại thời gian 4:
SERVER(1) gửi thông điệp mang tên "Ready" Tại thời gian 5:
CLIENT(1) gửi thông điệp mang tên "Are_you_open?"
Documentation 4 minh họa trạng thái các thiết bị SEMAPHORE(1), CLIENT(1) và CLIENT(2) trong một bảng thời gian đến thời gian 6 đơn vị, các thông điệp được nhận, các thông điệp được gửi đi, các trạng thái hiện tại và trạng thái mớị
Câu hỏi Ạ1
Điều gì sẽ xảy ra nếu CLIENT(1) nhận được thơng điệp "C_Job" tại thời gian 4? Viết câu trả lời trong Documentation 5.
Điều gì sẽ xảy ra nếu CLIENT(2) nhận được thơng điệp "C_Job" tại thời gian 4? Viết câu trả lời trong Documentation 5.
Câu hỏi Ạ3
Hoàn chỉnh bảng trong Documentation 4 với thời gian lên đến 13 nếu các hiện tượng sau xảy ra:
Tại thời gian 8:
SERVER(1) gửi thông điệp mang tên "Ready". Tại thời gian l0:
CLIENT(1) gửi thông điệp mang tên "C_Job". Tại thời gian 12:
SERVER(1) gửi thông điệp mang tên "Ready".
Yêu cầu B
Mạng nội bộ được mở rộng. Giờ đây nó bao gồm hai cặp semaphore-máy chủ:
(SEMAPHORE(1), SEMAPHORE(2), SERVER (1), SERVER(2)). Với mỗi máy trạm số máy chủ có thể kết nối (Number_of_Servers) là 2.
Để có thể sử dụng được cả hai máy in, định nghĩa máy trạm sẽ được thay đổi và được thể hiện trong Documentation 2.
Trong Documentation 6 bạn sẽ thấy thông điệp mới sau khi được thay đổi ở 'Receive Procedures' là: C_Job and Wait.
Trong Documentation 6 bạn cũng thấy những mô tả trạng thái ở thời gian 0. Tại các thời gian dưới đây, các thông điệp sẽ được nhận:
Tại thời gian 0:
CLIENT(1) nhận thông điệp "C_Job" của một người dùng. Tại thời gian 0:
CLIENT(2) nhận thông điệp "C_Job" của một người dùng. Tại thời gian 4:
SEMAPHORE(1) nhận thơng điệp "Ready".
Điều gì sẽ xảy ra ở mạng nội bộ mở rộng khi thay đổi các kiểu CLIENT? Đánh dấu các câu trả lời đúng trong Documentation 6.
Yêu cầu C
Các thay đổi kiểu CLIENT trong yêu cầu B sẽ không ảnh hưởng đến một mạng nội bộ mở rộng có nhiều cặp semaphore-máy chủ.
Yêu cầu C.1
Thay đổi định nghĩa kiểu CLIENT (xem trong Documentation 2) thì mạng nội bộ với nhiều cặp semaphore-máy chủ sẽ hoạt động như sau:
một lệnh in từ CLIENT(i) được các máy chủ thực hiện trong một thời gian. Mỗi lệnh in từ một máy trạm chỉ được thực hiện một lần.
Một máy trạm CLIENT(i) gửi thông điệp "Are_you_open?" liên tục đến nhiều semaphore cho đến khi nhận được thông điệp "Closed" hoặc đến khi máy trạm CLIENT(i) nhận được thông điệp "Open".
Khi máy trạm CLIENT(i) nhận được thông điệp, CLIENT(i) sẽ đợi trong khoảng thời gian Waiting_Period sau đó lại tiếp tục gửi các thơng điệp "Are_you_open?".
Viết câu trả lời trong Documentation 7.
Yêu cầu C.2
Thay đổi kiểu máy trạm theo cách máy trạm CLIENT(i) có thể gửi nhiều lệnh in đến nhiều máy chủ cùng một lúc. Tuy nhiên số lệnh in từ mỗi CLIENT(i) nên giới hạn ở CLIENT(i).Job_Maximum.
Viết câu trả lời trong Documentation 8.
Documentation 1
SEMAPHORE
Tên thiết bị: (SEMAPHORE(1),SEMAPHORE(2),SEMAPHORE(3),...) Trạng thái: (S1,S2); trạng thái ban đầu là S1.
Priority List (Danh sách ưu tiên): SERVER(1),SERVER(2),...,CLIENT(1),CLIENT(2),... Communication Diagram (Sơ đồ truyền tin)
Receive Procedures (Thủ tục nhận tin) procedure Are_you_open?(Client,Semaphore) begin if State = S1 then State <- S2 Send("Open(Semaphore,Client)") else if State = S2 then Send("Closed(Semaphore,Client)") end
procedure Ready(Server, Semaphore) begin State <- S1 end Documentation 2 CLIENT (Máy trạm) Tên: (CLIENT(1),CLIENT(2),CLIENT(3),...) Trạng thái: (SA,SB,SC), trạng thái ban đầu là SẠ Priority List (Danh sách ưu tiên):
CLIENT,SERVER(1),SERVER(2),...,SEMAPHORE(1), SEMAPHORE(2),...,USER(1),USER(2),...
Countdown (Số đếm) t | t thuộc N }; giá trị ban đầu là 0. Waiting_Period (Thời gian đợi): { t | t thuộc N và t > 0 }
Semaphore_Index (Chỉ số Semaphore): { i | i = 1,2,...,Number_of_Servers } Number-of-Servers (Số máy chủ): { i | i thuộc N và i > 0 }
Receive Procedures (Thủ tục nhận tin) procedure C_Job(User,Client,Document) begin if State = SA then State <- SB Send("Are_you_open?(Client, SEMAPHORE(Semaphore_Index))") else if State = SB then Send("Try_later(Client,User, Client_is_busy)") else if State = SC then Send("Try_later(Client,User, All_Servers_are_busy)") end procedure Open(Semaphore,Client) begin if State = SB then State <- SC Send("S_Job(Client,Server, Document)") end procedure Closed(Semaphore,Client) begin
Countdown <- Waiting_Period Send("Wait(Client,Client)") end procedure Wait(Client,Client) begin Countdown <- Countdown - 1 if Countdown > 0 then Send("Wait(Client,Client)") else Send("Are_you_open?(Client, SEMAPHORE(Semaphore_Index))") end procedure C_Ready(Server,Client) begin State <- SA end Documentation 3
Message List (Danh sách thông điệp) (i,j,k thuộc N)
identifier sender receiver content
__ (Tên)__________(máy gửi)_______(máy nhận)______(Nội dung)_ Are_you_open? CLIENT(i) SEMAPHORE(j) -
C_Job USER(i) CLIENT(j) DOCUMENT(k) C_Ready SERVER(i) CLIENT(j) -
Closed SEMAPHORE(i) CLIENT(j) - Open SEMAPHORE(i) CLIENT(j) - Ready SERVER(i) SEMAPHORE(j) -
S_Job CLIENT(i) SERVER(j) DOCUMENT(k) Try_later CLIENT(i) USER(j) EXPLANATION Wait CLIENT(i) CLIENT(i) -
Documentation 4
Trả lời yêu cầu Ạ3
Chú ý: Bảng này nên được in theo khổ giấy dọc.
SEMAPHORE(1) CLIENT(1) CLIENT(2) ___________________________________
__________________________________________ __________________________________________
|received |State/ | sent | |received| State/ |Count-| sent | |received| State/ |Count-| sent |
|messages |Transition|messages| |messages|Transition| down | messages | |messages|Transition| down | messages |
|_____________|__________|________| |________|__________|______|_____________| |________|__________|______|_____________| time ___________________________________ __________________________________________ __________________________________________ 0 | |S1 | | | |SA |0 | | | |SA |0 | | |_____________|__________|________| |________|__________|______|_____________| |________|__________|______|_____________|
1 | |S1 | | |C_Job |SA->SB |0 |Are_you_open?| | |SA |0 | |
|_____________|__________|________| |________|__________|______|_____________| |________|__________|______|_____________|
2 |Are_you_open?|S1->S2 |Open | | |SB |0 | | |C_Job |SA- >SB |0 |Are_you_open?|
|_____________|__________|________| |________|__________|______|_____________| |________|__________|______|_____________|
3 |Are_you_open?|S2 |Closed | |Open |SB->SC |0 |S_Job | | |SB |0 | | |_____________|__________|________| |________|__________|______|_____________| |________|__________|______|_____________| 4 | |S2 | | | |SC |0 | | |Closed |SB |0->1 |Wait | |_____________|__________|________| |________|__________|______|_____________|
|________|__________|______|_____________|
5 |Ready |S2->S1 | | |C_Ready |SC->SA |0 | | |Wait |SB |1->0 |Are_you_open?|
| | | | |C_Job |SA->SB |0 |Are_you_open?| | | | | | |_____________|__________|________| |________|__________|______|_____________| |________|__________|______|_____________| 6 |Are_you_open?|S1->S2 |Open | | | | | | | | | | | |Are_you_open?|S2 |Closed | | | | | | | | | | | |_____________|__________|________| |________|__________|______|_____________| |________|__________|______|_____________| 7 | | | | | | | | | | | | | | | | | | | | | | | | | | | | |_____________|__________|________| |________|__________|______|_____________| |________|__________|______|_____________| 8 | | | | | | | | | | | | | | | | | | | | | | | | | | | | |_____________|__________|________| |________|__________|______|_____________| |________|__________|______|_____________| 9 | | | | | | | | | | | | | | | | | | | | | | | | | | | | |_____________|__________|________| |________|__________|______|_____________| |________|__________|______|_____________| 10 | | | | | | | | | | | | | | | | | | | | | | | | | | | | |_____________|__________|________| |________|__________|______|_____________| |________|__________|______|_____________| 11 | | | | | | | | | | | | | | | | | | | | | | | | | | | | |_____________|__________|________| |________|__________|______|_____________| |________|__________|______|_____________| 12 | | | | | | | | | | | | | | | | | | | | | | | | | | | | |_____________|__________|________| |________|__________|______|_____________| |________|__________|______|_____________| 13 | | | | | | | | | | | | | |
| | | | | | | | | | | | | | |_____________|__________|________| |________|__________|______|_____________| |________|__________|______|_____________| Documentation 5 Câu hỏi Ạ1
Điều gì xảy ra nếu CLIENT(1) nhận được thơng điệp "C_Job" tại thời gian 4 ? ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ Câu hỏi Ạ2
Điều gì xảy ra nếu CLIENT(2) nhận được thơng điệp "C_Job" tại thời gian 4 ? ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ Documentation 6 Yêu cầu B
'Receive Procedures' (Thủ tục nhận) sau khi thay đổi: C_Job and Wait. Chú ý: Phần lập trình sự thay đổi được thể hiện bằng chữ nghiêng.
procedure C_Job(User,Client) begin
if State = SA then State <- SB
for Semaphore_Index <- 1 step 1 until Number_of_Servers
Send("Are_you_open?(Client,SEMAPHORE(Semaphore_Index))") else if State = SB then Send("Try_later(Client,User,Client_is_busy)") else if State = SC then Send(,Try_later(Client,User,All_Servers_are_busy)') end procedure Wait(Client,Client) begin if State = SB
then Countdown <- Countdown -1
if Countdown > 0
then Send("Wait(Client,Client)") else
if Countdown < 0
then Countdown <- 0
else for Semaphore_Index <- 1 step 1 until Number_of_Servers
Send("Are_you_open?(Client,SEMAPHORE(Semaphore_Index))") end
Tại thời gian 0 trạng thái của mạng nội bộ như sau:
Đối tượng: CLIENT(1), Client.State SA, Waiting_Period = 2, Number_of_Servers=2 Đối tượng: CLIENT(2), Client.State SA, Waiting_Period = 1, Number_of_Servers=2 Đối tượng: SEMAPHORE(1), SemaphorẹState = S1
Đối tượng: SEMAPHORE(2), SemaphorẹState = S1 Trong thời gian tiếp theo các thông điệp sau được nhận:
Tại thời gian 0: CLIENT(1) nhận được thông điệp "C_Job" của người dùng. Tại thời gian 0: CLIENT(2) nhận được thông điệp "C_Job" của người dùng. Tại thời gian 4: SEMAPHORE(1) nhận được thông điệp "Ready".
Điều gì xảy ra với mạng nội bộ mở rộng khi có những thay đổi kiểu máy trạm CLIENT? Đánh dấu câu trở lời đúng.
(a)
Lệnh in từ CLIENT(1) sẽ được thực hiện ở SERVER(1) và SERVER(2). Lệnh in từ CLIENT(2) không được thực hiện.
(b)
Lệnh in từ CLIENT(1) sẽ được thực hiện một lần ở SERVER(1). Lệnh in từ CLIENT(2) sẽ được thực hiện một lần ở SERVER(2). (c)
Lệnh in từ CLIENT(1) sẽ được thực hiện một lần ở SERVER(1). Lệnh in từ CLIENT(2) sẽ được thực hiện một lần ở SERVER(1). (d)
Lệnh in từ CLIENT(1) sẽ được thực hiện một lần ở SERVER(2). Lệnh in từ CLIENT(2) sẽ được thực hiện một lần ở SERVER(2). (e)
Lệnh in từ CLIENT(1) không được thực hiện.
Lệnh in từ CLIENT(2) sẽ được thực hiện ở SERVER(1) và SERVER(2).
Documentation 7 Yêu cầu C.1 ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ Documentation 8 Yêu cầu C.2 ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________ ______________________________________________________
Trị chơi chữ
Hình 1: Mỗi ký tự trong số 26 chữ cái thường và giá trị của nó
Các trị chơi chữ rất phổ biến trong gia đình và trên truyền hình. Một trong các trị chơi đó là, mỗi ký tự có một giá trị, bạn hãy chọn các ký tự để tạo thành một hoặc nhiều từ với số điểm là tổng giá trị của các ký tự là lớn nhất. Hoặc bạn có thể thử xét tất cả các từ bạn biết sau đó đếm số điểm.
Cho trước các giá trị như trong hình 1, cho trước một tập hợp các từ trong tiếng Anh và cho trước các từ được dùng đến; hãy tìm các từ hoặc cặp từ cho số điểm cao nhất.
Input
File INPUT.TXT chỉ có một dịng chứa chuỗi ký tự viết thường (từ 'a' đến 'z') được chọn. Chuỗi ký tự gồm từ 3 đến 7 kí tự được xếp tuỳ ý.
File từ điển WORDS.TXT có thể chứa tối đa 40.000 dịng. Dòng cuối cùng của file chứa dấu chấm (.). Mỗi dòng trong số các dòng ở giữa chứa từ 3 đến 7 ký tự viết thường. File WORDS.TXT được xếp theo thứ tự bảng chữ cái và khơng có dịng giống nhaụ
Output
Trên dòng đầu tiên của file OUTPUT.TXT, chương trình phải báo cáo số điểm cao nhất có thể đạt được (yêu cầu A), và trên mỗi dòng tiếp theo chứa từ hoặc cặp từ trong file WORDS.TXT tương ứng với số điểm đó (yêu cầu B). Số lần một ký tự xuất hiện trong dữ liệu ra không nhiều hơn số lần xuất hiện trong dòng dữ liệu vàọ Giá trị của các ký tự được cho trong hình 1.
Khi có một từ ghép được tạo ra từ các ký tự trên thì hãy in từ đó ra trên cùng dòng ngăn cách với các từ trước bằng ký tự trống. Không chấp nhận các cặp từ giống nhau như 'rag prom' và 'prom rag'.
Ví dụ
Input và Output
Cuộc đua trên phố (Bài tốn Race)
Hình 1 mơ tả một cuộc đua trên phố. Có một số điểm được đánh số từ 0 đến N (trong ví dụ này N=9) và một số mũi tên nối các điểm. Điểm 0 là điểm bắt đầu cuộc đua; điểm N là điểm kết thúc. Các mũi tên chỉ đường một chiềụ Các tay đua đi di chuyển từ điểm này đến điểm tiếp theo qua các con đường một chiều theo hướng mũi tên. Tại mơi số điểm, các tay đua có thể tự chọn hướng đi theo mũi tên.
Hình 1: Một cuộc đua trên phố gồm 10 điểm Một cuộc đua các các đặc điểm sau:
1. Từ điểm xuất phát có thể đi đến tất cả các điểm cịn lạị 2. Có thể đi từ nhiều điểm đến điểm kết thúc cuộc đuạ
3. Điểm kết thúc là điểm cuối cùng (khơng cịn mũi tên chỉ đường nào từ đây). Các tay đua không bắt buộc phải đến tất cả các điểm trước khi về đích. Tuy nhiên có một số điểm khơng thể tránh khỏi như các điểm 0, 3, 6 và 9 trong ví dụ trên. Cho trước một cuộc đua, hãy viết chương trình xác định các điểm khơng thể tránh được mà tất cả các tay đua phải đi qua trừ điểm xuất phát và điểm đích (Yêu cầu A).
Giả sử cuộc đua được tổ chức trong hai ngày liên tiếp, do đó cuộc đua được chia thành hai cuộc đua nhỏ trong mỗi ngàỵ Ngày đầu tiên, điểm xuất phát là điểm 0 và điểm kết thúc là một điểm nào đó được cắt. Trong ngày thứ hai, điểm xuất phát là điểm kết thúc của ngày thứ nhất và điểm đích là điểm N. Cho trước một cuộc đua, hãy viết chương trình xác định các điểm cắt (Yêu cầu B). Điểm S là điểm cắt giữa cuộc đua C nếu S không
trùng với điểm xuất phát hay điểm đích của C và cuộc đua có thể được chia thành hai cuộc đua nhỏ khơng có mũi tên chỉ hướng chung. Trong ví dụ trên chỉ có điểm 3 mới có thể là điểm cắt.
Input
File INPUT.TXT mô tả một cuộc đua với tối đa 50 điểm và tối đa 100 mũi tên. File này