Lập trình thi đấu (tiếng Anh: competitive programming) là một môn thể thao trí tuệ trong đó những người tham gia sẽ cố gắng lập trình theo các yêu cầu được cung cấp. Các cuộc thi thường được tổ chức qua Internet hoặc mạng cục bộ. Những người tham gia được gọi là lập trình viênthi đấu (sport programmers). Lập trình thi đấu được công nhận và bảo trợ bởi nhiều công ty phần mềm và Internet đa quốc gia, chẳng hạn như Google[1][2] và Facebook.[3]
Trong một cuộc thi lập trình, bên tổ chức thường đưa ra một tập hợp các vấn đề logic hoặc toán học, còn được gọi là câu đố hoặc thử thách cho các thí sinh (số lượng thí sinh có thể là vài chục người hoặc thậm chí hàng trăm đến hàng ngàn). Thí sinh được yêu cầu viết các chương trình máy tính có khả năng giải quyết các vấn đề này. Việc đánh giá chủ yếu dựa trên số vấn đề đã giải quyết và thời gian đã bỏ ra để hoàn thành lời giải, nhưng cũng có thể bao gồm các yếu tố khác (chất lượng của kết quả đầu ra, thời gian thực thi, sử dụng bộ nhớ, kích thước chương trình, v.v.).
Lịch sử
Một trong những cuộc thi lâu đời nhất được biết đến là International Collegiate Programming Contest (ICPC) bắt đầu từ những năm 1970[4] và đã mở rộng tới 88 quốc gia trong phiên bản năm 2011.
Từ năm 1990 đến 1994, Owen Astrachan, Vivek Khera và David Kotz đã tổ chức một trong những cuộc thi lập trình phân tán dựa trên Internet đầu tiên, lấy cảm hứng từ ICPC.[5]
Sự quan tâm đến lập trình thi đấu đã phát triển mạnh kể từ năm 2000 với hàng chục nghìn người tham gia (xem Các cuộc thi nổi bật), điều này liên quan chặt chẽ đến sự phát triển của Internet, giúp tổ chức cuộc thi quốc tế trực tuyến và loại bỏ các giới hạn địa lý.
Bất kể loại vấn đề, quá trình giải quyết một vấn đề có thể chia thành hai bước chính: xây dựng một thuật toán hiệu quả và triển khai thuật toán bằng một ngôn ngữ lập trình phù hợp (các ngôn ngữ lập trình được phép dùng khác nhau giữa các cuộc thi). Đây là hai kỹ năng thường được kiểm tra nhiều nhất trong các cuộc thi lập trình.
Ở hầu hết cuộc thi, việc đánh giá được thực hiện tự động bởi các máy chủ của bên tổ chức, thường được gọi là trình chấm hay hệ thống chấm bài (judge). Các lời giải được nộp bởi thí sinh sẽ được chạy trên trình chấm với một tập hợp các test case (thường là bí mật). Thông thường, trình chấm sẽ đánh giá theo nguyên tắc "đúng hoặc sai hoàn toàn", có nghĩa rằng một lời giải được chấp nhận ("Accepted") chỉ khi nó đạt kết quả tốt trên tất cả test case được chạy bởi trình chấm, và nếu không sẽ bị từ chối. Tuy nhiên, một số cuộc thi có thể cho phép việc chấm điểm theo phần, dựa trên số lượng test case đúng, chất lượng của kết quả, hoặc một số tiêu chí khác đã được chỉ định. Một số cuộc thi khác chỉ yêu cầu thí sinh nộp kết quả tương ứng với dữ liệu đầu vào đã được cung cấp, trong trường hợp này trình chấm chỉ cần phân tích kết quả được nộp.
Các hệ thống chấm bài trực tuyến (online judge) là môi trường mà ở đó diễn ra quá trình kiểm tra. Các hệ thống chấm bài trực tuyến có danh sách xếp hạng cho thấy người dùng có số lượng lời giải được chấp nhận nhiều nhất và/hoặc thời gian thực thi ngắn nhất cho một vấn đề cụ thể.[6]
Cuộc thi đồng đội dành cho sinh viên đại học, cuộc thi bao gồm nhiều vòng khu vực cuối cùng là vòng chung kết thế giới được tổ chức hằng năm. Mỗi đội bao gồm ba sinh viên đến từ cùng một trường đại học và họ chỉ được phép sử dụng một máy tính.
Phần lớn cuộc thi ở trên thường được tổ chức thành nhiều vòng. Các cuộc thi thường khởi đầu bằng và kết thúc ở vòng chung kết tại chỗ. Những thí sinh dẫn đầu tại IOI và ICPC sẽ nhận được huy chương vàng, bạc và đồng. Trong các cuộc thi khác, giải thưởng tiền mặt được trao cho những người hoàn thành có thứ hạng cao nhất. Các cuộc thi cũng thu hút sự quan tâm của các nhà tuyển dụng từ nhiều công ty phần mềm và Internet, những công ty này thường chiêu mộ các thí sinh bằng những lời mời làm việc tiềm năng.
CodeCup – cuộc thi AI về board game được tổ chức hàng năm kể từ năm 2003. Quy luật của trò chơi được công bố vào tháng 9 và giải đấu cuối cùng được tổ chức vào tháng 2.[16][17][18]
Google AI Challenge – cuộc thi dành cho sinh viên diễn ra từ năm 2009 đến 2011.
Halite[19] – Một thử thách lập trình AI được tài trợ bởi Two Sigma, Cornell Tech,[20] and Google.[21]
Russian AI Cup – cuộc thi lập trình trí tuệ nhân tạo mở.
CodinGame – tổ chức các cuộc thi lập trình bot theo mùa.
Một chương trình hằng năm mà Google trả thù lao cho hàng trăm sinh viên nếu họ đã hoàn thành một phần mềm miễn phí / dự án mã nguồn mở theo yêu cầu trong suốt mùa hè.
Cuộc thi được Google tổ chức từ năm 2007-2008 dành cho học sinh trung học. Cuộc thi này được thiết kế để khuyến khích học sinh trung học tham gia vào các dự án mã nguồn mở.
2007
Tháng 11-tháng 2
Không rõ
Không rõ
Nền tảng trực tuyến
Cộng đồng lập trình trên khắp thế giới đã xây dựng và duy trì nhiều nguồn tài nguyên trên internet phục vụ cho lập trình thi đấu. Họ cung cấp các cuộc thi độc lập với giải thưởng nhỏ hoặc không. Ngoài ra, các bài toán đã được lưu trữ trước đây cũng là nguồn tài liệu phổ biến để đào tạo về lập trình thi đấu. Một số tổ chức thường xuyên mở các cuộc thi lập trình, bao gồm:
Cuộc thi lập trình hằng năm diễn ra trong thời gian Mùa Vọng, với một cặp bài toán mới được công bố mỗi ngày, đến hết Ngày Giáng Sinh. Bài toán thứ hai của mỗi ngày sẽ bị khóa cho đến khi phần đầu tiên được hoàn thành, và thường là bài tiếp theo logic. Cuộc thi có cả bảng xếp hạng công khai và riêng tư cho mỗi năm, trong đó việc xếp hạng dựa trên việc ai là người giải quyết bài toán đầu tiên.
Nền tảng lập trình thi đấu lớn nhất có trụ sở tại châu Mỹ Latin. Có hơn 2300 thử thách lập trình bằng 3 ngôn ngữ khác nhau (tiếng Anh, tiếng Bồ Đào Nha và tiếng Tây Ban Nha), được phân loại thành 9 thể loại và 10 độ khó khác nhau. Nền tảng này thường xuyên tổ chức các cuộc thi được tài trợ bởi các tập đoàn và bởi chính họ. Trước đây, nó được biết đến dưới tên URI Online Judge.
Do Unacademy duy trì, nền tảng này tổ chức cuộc thi kéo dài 3 ngày và một số cuộc thi ngắn hàng tháng (một cuộc thi tương tự IOI tên là Lunchtime và một cuộc thi giống ICPC tên là Cook-Off), đồng thời cung cấp một nền tảng để tổ chức các cuộc cuộc thi miễn phí cho các cơ sở giáo dục. Hai người chiến thắng dẫn đầu của cuộc thi dài sẽ nhận giải thưởng tiền mặt trong khi 10 người dẫn đầu toàn cầu sẽ được nhận áo thun.
Nguồn tài nguyên của Nga, do Đại học ITMO duy trì, thường xuyên tổ chức các cuộc thi ngắn (lên đến hai lần mỗi tuần). Điểm đặc biệt: tất cả các lời giải đều là mã nguồn mở, khả năng kiểm tra tính đúng đắn cho lời giải của thí sinh khác trong "hacking phase", cuộc thi ảo, luyện tập, v.v.
HackerRank cung cấp các bài toán lập trình trong các lĩnh vực khác nhau của ngành Khoa học Máy tính. Họ cũng tổ chức Codesprints hằng năm giúp kết nối các lập trình viên và startup tại Thung lũng Silicon.
Nguồn tài nguyên và tên công ty có trụ sở tại Hoa Kỳ, tổ chức các cuộc thi và cung cấp các vấn đề công nghiệp như một loại công việc làm thêm; tổ chức hàng chục cuộc thi ngắn và một số cuộc thi dài ("marathons") mỗi năm. Điểm đặc biệt - người tham gia có cơ hội kiểm tra tính đúng đắn cho lời giải của các thí sinh khác sau giai đoạn lập trình và trước sự kiểm thử tự động cuối cùng (gọi là "challenge phase").
Chứa hơn 4.500 bài toán để luyện tập. Tổ chức các cuộc thi trực tuyến thường xuyên. Được mở vào năm 1995, đây là một trong những website lâu đời nhất trong lĩnh vực này.
Phiên bản công cộng của hệ thống quản lý cuộc thi Kattis, với một kho lưu trữ chứa hơn 2600 bài toán.[24] Kattis được phát triển để hỗ trợ các khóa học khoa học máy tính, nhưng cũng được sử dụng để tổ chức các cuộc thi có tiếng như vòng chung kết ICPC.[25]
LeetCode có hơn 2.300 câu hỏi bao gồm nhiều khái niệm về lập trình khác nhau, tổ chức các cuộc thi mỗi tuần và mỗi hai tuần. Các nhiệm vụ lập trình được cung cấp bằng tiếng Anh và tiếng Trung.
Luogu là hệ thống chấm bài trực tuyến ở Trung Quốc. Cuộc thi này có các vấn đề từ Olympic Tin học Trung Quốc tổ chức bởi CCF, cũng như các cuộc thi do người dùng tổ chức.
Tham gia vào các cuộc thi lập trình có thể tăng sự hứng thú của sinh viên đối với việc nghiên cứu ngành khoa học máy tính. Những kỹ năng mà họ thu được thông qua các cuộc thi lập trình giống như ICPC cũng cải thiện cơ hội nghề nghiệp, bởi vì chúng giúp vượt qua các "cuộc phỏng vấn về kỹ thuật", thường đòi hỏi ứng viên giải quyết các vấn đề lập trình và thuật toán phức tạp ngay tại chỗ.[24][27]
Tuy vậy cũng có những sự chỉ trích về lập trình thi đấu, đặc biệt từ các nhà phát triển phần mềm chuyên nghiệp.[28] Một điều chỉ trích phổ biến là nhiều cuộc thi lập trình tốc độ nhanh dạy cho các thí sinh các thói quen lập trình và phong cách code không tốt (như sử dụng các macro một cách không cần thiết, thiếu tính trừu tượng của OOP và comment, sử dụng tên biến ngắn, v.v.).[29][28] Ngoài ra, vì chỉ cung cấp các câu đố thuật toán nhỏ với lời giải tương đối ngắn, các cuộc thi lập trình như ICPC và IOI có thể không dạy mọi người những kỹ năng tốt trong ngành kỹ thuật phần mềm, vì các dự án phần mềm trong thực tế thường có hàng nghìn dòng mã và được phát triển bởi các nhóm lớn trong thời gian dài.[28]Peter Norvig đã đề cập rằng dựa trên dữ liệu có sẵn, việc giành chiến thắng trong các cuộc thi lập trình có mối tương quan tiêu cực với hiệu suất của một lập trình viên trong công việc của họ tại Google (mặc dù các người chiến thắng trong các cuộc thi có cơ hội cao được tuyển dụng).[30] Sau đó, Norvig tuyên bố rằng tương quan này chỉ được quan sát trên một tập dữ liệu nhỏ, nhưng không thể xác minh sau khi xem xét một tập dữ liệu lớn hơn.[31]
Một quan điểm khác là thay vì "lãng phí" thời gian để thi đấu quá nhiều, giải các bài toán đã có lời giải, các lập trình viên có tiếng nên đầu tư thời gian của họ vào việc giải quyết các vấn đề trong thực tế.[28]
Đọc tiếp
Halim, S., Halim, F. (2013). Competitive Programming 3: The New Lower Bound of Programming Contests. Lulu.
Laaksonen, A. (2017). Guide to Competitive Programming (các chủ đề dành cho sinh viên đại học trong ngành khoa học máy tính). Cham: Springer International Publishing.
Xu, X. (2020) The development, prosperity and decline of Olympic in Informatics. Xuất bản trực tuyến.
Kostka, B. (2021). Sports programming in practice. Đại học Wrocław.