Lập trình thi đấu

Lập trình thi đấu () 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ên thi đấ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 và Facebook.

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 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.

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ý.

 Tổng quan 
Mục tiêu của lập trình thi đấu là viết mã nguồn chương trình máy tính để giải quyết các vấn đề được đưa ra. Đa số các vấn đề xuất hiện trong các cuộc thi lập trình liên quan đến toán học hoặc logic. Các vấn đề thường thuộc một trong những loại sau: tổ hợp, lý thuyết số, lý thuyết đồ thị, lý thuyết trò chơi sử dụng thuật toán, hình học tính toán, phân tích chuỗi và cấu trúc dữ liệu. Các vấn đề liên quan đến lập trình ràng buộc và trí tuệ nhân tạo cũng phổ biến trong một số cuộc thi.

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ể.Programming Challenges (Skiena & Revilla) , 

 Các cuộc thi nổi bật 

 Cuộc thi thuật toán 
+Tên cuộc thiBên tổ chứcNgười tham giaMô tảSố lượng người tham giaWebsiteGoogle Code Jam (GCJ)GooglemởCuộc thi hằng năm được tổ chức và tài trợ bởi Google từ năm 2003 cho đến khi bị hủy vào năm 2023.32.702 (2022)https://codingcompetitions.withgoogle.com/codejam International Collegiate Programming Contest (ICPC)ICPC Foundationsinh viên đại họcCuộ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.50.000+ (2022)https://icpc.global/Olympic Tin học Quốc tế (IOI)IOIhọc sinh trung họcCuộc thi quốc tế dành cho học sinh trung học. Tổ chức hằng năm kể từ 1989. Mỗi quốc gia có thể có tối đa 4 thí sinh.349 từ 88 quốc gia (2022)https://ioinformatics.org/Meta Hacker Cup (trước đây là Facebook Hacker Cup)Meta PlatformsmởCuộc thi hằng năm được tổ chức từ 2011. Cuộc thi này được tổ chức và tài trợ bởi Meta (trước đây là Facebook).27.604 (2022)https://www.facebook.com/codingcompetitions/hacker-cupTopcoder Open (TCO)TopcodermởCuộc thi thuật toán hằng năm được tổ chức từ 2001 cho đến khi bị hủy vào năm 2023.https://www.topcoder.com/community/member-programs/topcoder-open/
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.

 Trí tuệ nhân tạo và học máy 

 Kaggle – cuộc thi về khoa học dữ liệu và học máy.
 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.Lasse Hakulinen. Survey on Informatics Competitions: Developing Tasks – Olympiads in Informatics, 2011, Vol. 5, 12–25.
 Google AI Challenge – cuộc thi dành cho sinh viên diễn ra từ năm 2009 đến 2011.
 Halite – Một thử thách lập trình AI được tài trợ bởi Two Sigma, Cornell Tech, and Google.
 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.

 Cuộc thi tập trung vào công nghệ nguồn mở 

 Danh sách có thể không đầy đủ

Tên cuộc thiNhà tài trợ chínhMô tảBắt đầu từThời gian thường diễn raVòng đăng ký tiếp theoTrạng tháiMulti-Agent Programming ContestĐại học Công nghệ Clausthal phối hợp với các hội thảo về lập trình hướng tác tửCuộc thi lập trình quốc tế hằng năm có mục đích khuyến kích nghiên cứu trong lĩnh vực phát triển và lập trình hệ thống đa tác tử.2005Tháng 99/2011Hoạt độngGoogle Summer of CodeGoogle Inc.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è.2005Tháng 3-tháng 823/3-3/4Hoạt độngGoogle Highly Open Participation ContestGoogle Inc.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ở.2007Tháng 11-tháng 2Khô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:
TênMô tảWebsiteAdvent of CodeCuộ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.adventofcode.orgbeecrowdNề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.www.beecrowd.com.brCodeChefDo 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.CodeCupCuộc thi quốc tế hằng năm về lập trình AI board game được tổ chức bởi Olympic Tin học Hà Lan từ năm 2003.CodeforcesNguồ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.CodinGameNhiều câu đố (độ khó tăng dần), code golf. Tổ chức các cuộc thi trực tuyến thường xuyên (thử thách AI, bài toán tối ưu hóa).HackerEarthCông ty có trụ sở tại Bangalore, Ấn Độ, tạo môi trường cho cuộc thi trực tuyến với mục tiêu cung cấp giải pháp đánh giá cho các nhà tuyển dụng.HackerRankHackerRank 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.Project EulerBộ sưu tập lớn về các vấn đề tính toán toán học (tức là không liên quan trực tiếp đến lập trình nhưng thường đòi hỏi kỹ năng lập trình để giải quyết).TopcoderNguồ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").UVa Online JudgeChứ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.SPOJHệ thống chấm bài trực tuyến của Ba Lan cung cấp nhiều bài toán để luyện tập và làm nền tảng cho các tổ chức khác mở cuộc thi lập trình của họ.Open KattisPhiê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. 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.AtCoderCó trụ sở tại Nhật Bản, AtCoder mở các cuộc thi lập trình trực tuyến hàng tuần. Các cuộc thi được tổ chức bằng cả tiếng Nhật và tiếng Anh.
Tính đến năm 2020, đây là một trong những nền tảng phổ biến nhất trong thể loại này.TimusCó các bài toán từ các cuộc thi trong vùng Ural.VJudgeCó các bài toán từ nhiều hệ thống chấm bài trực tuyến.Baekjoon OJHệ thống chấm bài trực tuyến của Hàn Quốc.LeetCodeLeetCode 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.leetcode.comLuoguLuogu 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.luogu.com.cn

 Lợi ích và chỉ trích 
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ỗ.

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. 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.). 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. 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). 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.

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ế.

 Đọ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.

 Xem thêm 

 Thể loại:Cuộc thi khoa học máy tính
 Hackathon

 Tham khảo 

 Liên kết ngoài 

 Dự án nguồn mở để tổ chức các cuộc thi

 Contest Management System Công cụ mã nguồn mở viết bằng Python để tổ chức và quản lý cuộc thi lập trình trên máy chủ IOI 2012 và IOI 2013 .

Thể loại:Cuộc thi khoa học máy tính
Thể loại:Cuộc thi lập trình