✨Lập trình thi đấu

Lập trình thi đấu

nhỏ|300x300px| [[Petr Mitrichev (trái) và Gennady Korotkevich (phải), hai lập trình viên thi đấu nổi tiếng trong một cuộc thi.]] 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ể.

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

Cuộc thi thuật toán

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.
  • 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 đủ

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:

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. 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.
👁️ 0 | 🔗 | 💖 | ✨ | 🌍 | ⌚
nhỏ|300x300px| [[Petr Mitrichev (trái) và Gennady Korotkevich (phải), hai lập trình viên thi đấu nổi tiếng trong một cuộc thi.]] **Lập trình thi đấu** () là một môn thể thao trí tuệ trong đó những
phải|nhỏ|402x402px|[[Mã nguồn của một chương trình máy tính đơn giản được viết bằng ngôn ngữ lập trình C. Khi được biên dịch và chạy, nó sẽ cho kết quả "Hello, world!".]] **Ngôn ngữ lập trình**
**Pascal** là một ngôn ngữ lập trình cho máy tính thuộc dạng mệnh lệnh và thủ tục, được Niklaus Wirth phát triển vào năm 1970. Pascal là ngôn ngữ lập trình đặc biệt thích hợp
thumb|Các vòng lặp lên kế hoạch và phản hồi trong lập trình cực hạn **Lập trình cực hạn** (tiếng Anh: **Extreme programming**, viết tắt là **XP**) là một quy trình phát triển phần mềm nhằm
**Lập trình hướng đối tượng** () là một mẫu hình lập trình dựa trên khái niệm "đối tượng", mà trong đó, đối tượng chứa đựng các dữ liệu trong các trường, thường được gọi là
**C** là một ngôn ngữ mệnh lệnh được phát triển từ đầu thập niên 1970 bởi Dennis Ritchie để dùng trong hệ điều hành UNIX. Từ đó, ngôn ngữ này đã lan rộng ra nhiều
**Python** () là ngôn ngữ lập trình bậc cao đa năng. Triết lý thiết kế của nó nhấn mạnh khả năng đọc mã bằng cách sử dụng thụt lề đáng kể. Python có kiểu động
**C#** (**C Sharp**, đọc là _"xi-sáp"_) là một ngôn ngữ lập trình hướng đối tượng đa năng, mạnh mẽ được phát triển bởi Microsoft, C# là phần khởi đầu cho kế hoạch .NET của họ.
**Lập trình máy tính** hay **lập chương trình máy tính,** thường gọi tắt là **lập trình** (, hay _programming_), là việc lập ra chương trình làm việc cho máy có bộ xử lý, nói riêng
**Java** (phiên âm Tiếng Việt: "_Gia-va_") là một ngôn ngữ lập trình hướng đối tượng, dựa trên lớp được thiết kế để có càng ít phụ thuộc thực thi càng tốt. Nó là ngôn ngữ
nhỏ|Cbmain Trong khoa học máy tính, một **ngôn ngữ lập trình bậc cao** (tiếng Anh: _high-level programming language_) là một ngôn ngữ lập trình có sự trừu tượng hóa mạnh mẽ khỏi các chi tiết
Trong ngành khoa học máy tính, **lập trình hàm** (**lập trình chức năng**) là một mô hình lập trình xem việc tính toán là sự đánh giá các hàm toán học và tránh sử dụng
**Lập trình meta** hay còn gọi là **siêu lập trình** là việc tiến hành một trong hai thao tác (hay cả hai) sau: * Công việc viết một chương trình máy tính mà chương trình
**Ruby** là một ngôn ngữ lập trình hướng đối tượng, có khả năng phản ứng. Theo tác giả, Ruby chịu ảnh hưởng bởi Perl, Smalltalk, Eiffel, Ada và Lisp. Ruby cung cấp nhiều mẫu hình
**D** là một ngôn ngữ lập trình hệ thống hướng đối tượng, dùng câu lệnh, đa mẫu hình do Walter Bright của Digital Mars tạo ra và phát hành năm 2001. Quá trình thiết kế
Trong lập trình máy tính, một **triển khai của ngôn ngữ lập trình** là một hệ thống để thực thi chương trình máy tính. Có hai cách tiếp cận chung để triển khai một ngôn
**Batch** là một ngôn ngữ lập trình được dựa trên các tập tin thực thi batch (*.bat, *.cmd,...) để chạy. Chúng sẽ được thực thi dưới dạng một cửa sổ **Command Prompt** để chạy những
**R** là một ngôn ngữ lập trình và môi trường phần mềm dành cho tính toán và đồ họa thống kê. Đây là một bản hiện thực ngôn ngữ lập trình S với ngữ nghĩa
**Swift** là một ngôn ngữ lập trình hướng đối tượng dành cho việc phát triển iOS và macOS, watchOS, tvOS và z/OS. được giới thiệu bởi Apple tại hội nghị WWDC 2014. Swift được mong
Trong lập trình, **tham số** là biến được thu nhận bởi một chương trình con. Tại thời gian chạy, chương trình con sử dụng các giá trị được gán cho các tham số để thay
**Go** là một ngôn ngữ lập trình mới do Google thiết kế và phát triển. Nó được kỳ vọng sẽ giúp ngành công nghiệp phần mềm khai thác tối đa nền tảng đa lõi của
Đây là danh sách các ngôn ngữ lập trình đáng chú ý, được nhóm theo loại. Vì không có sơ đồ phân loại bao quát cho các ngôn ngữ lập trình, nên trong nhiều trường
thumb|upright=1.5|Ví dụ về giải đấu sử dụng thể thức vòng tròn có 10 người tham gia **Thi đấu vòng tròn** là một thể thức thi đấu mà trong đó mỗi người tham gia hoặc vận
**Kotlin** là một ngôn ngữ lập trình kiểu tĩnh chạy trên máy ảo Java (JVM) và có thể được biên dịch sang mã nguồn Java hay sử dụng cơ sở hạ tầng trình biên dịch
**Lập trình đôi** (tiếng Anh: _Pair Programming_) là kiểu lập trình đòi hỏi hai kỹ sư phần mềm cùng tham gia một nỗ lực lập trình chung trên một máy trạm, nghĩa là chỉ có
**Giao tiếp lập trình ứng dụng mở** (Open API) (thường được gọi là một giao tiếp lập trình ứng dụng công cộng.) là một giao tiếp lập trình ứng dụng công khai cung cấp cho
Trong lập trình hướng đối tượng, **lớp** (**class**) là một chương trình-mã-khuôn mẫu có thể mở rộng được để tạo các đối tượng, cung cấp giá trị khởi tạo cho trạng thái (biến thành viên)
Trong khoa học máy tính, **bao đóng** (closure) là một hàm hay một tham chiếu tới một hàm cùng với môi trường tham chiếu - một bảng chứa tham chiếu đến mỗi biến không phải
**Dylan** là một ngôn ngữ lập trình đa mẫu hình có hỗ trợ hàm, lập trình hướng đối tượng (OOP), động và phục hồi trong khi cung cấp một mô hình lập trình được thiết
Phương pháp **lập trình thủ tục** (_procedural programming_) chính là cách thực hiện phương pháp hướng chức năng kể trên. Phương pháp thủ tục chia một chương trình (chức năng) lớn thành các khối chức
**Đặc tính** (tiếng Anh: _property_), trong một số ngôn ngữ lập trình hướng đối tượng, là một loại đặc biệt của thành viên lớp, trung gian chức năng giữa một trường (hay thành viên dữ
Trong lập trình hướng đối tượng dựa trên lớp, **hàm tạo** (tiếng Anh: _constructor_, viết tắt: _ctor_) trong một lớp là một kiểu chương trình con đặc biệt được dùng để tạo ra đối tượng.
Trong lập trình hướng đối tượng, **hàm hủy** (tiếng Anh: _destructor_, viết tắt: _dtor_) là một phương thức được gọi tự động để hủy bỏ một đối tượng. Điều này xảy ra khi thời gian
**Nhà thi đấu Đài Bắc** () là một nhà thi đấu đa năng nằm ở Tùng Sơn, Đài Bắc, Đài Loan. Nhà thi đấu được điều hành bởi Công ty Tàu điện ngầm Đài Bắc
**Cung thi đấu điền kinh trong nhà Mỹ Đình** là một nhà thi đấu dành cho nội dung điền kinh ở Hà Nội, Việt Nam. Được xây dựng từ tháng 7 năm 2008 và hoàn
thumb|Minh họa mã nguồn [[Java (programming language)|Java với comment **mở đầu** được biểu thị bằng màu **đỏ** và comment **nội dòng** bằng màu **lục**. **Mã chương trình** là bằng màu **lam**.]]Trong lập
**Quảng cáo lập trình** () là một quy trình tự động trong việc mua và bán các vị trí quảng cáo theo thời gian thực trên nền tảng kỹ thuật số và là một phần
nhỏ| Chương trình máy tính "Xin chào, thế giới" của [[Brian Kernighan (1978) ]] **Chương trình máy tính** là tập hợp các câu lệnh thực hiện một tác vụ cụ thể khi được máy tính
**Trịnh Thị Ngọc Lung** (chữ Hán: 鄭氏玉瓏, 1612-1706), là một vương phi của chúa Trịnh. Bà là chính phi của Tây định Vương Trịnh Tạc. Bà là mẹ nuôi của Lê Gia Tông và Định
**Trịnh Thị Ngọc Trinh** (chữ Hán: 鄭氏玉楨), là một hoàng hậu nhà Lê trung hưng. Vợ vua Lê Kính Tông, mẹ vua Lê Thần Tông. Bà là hoàng hậu họ Trịnh đầu tiên thời Lê
**Chúa Trịnh** (chữ Nôm: 主鄭, chữ Hán: 鄭王 / **Trịnh vương**; 1545 – 1787) là một vương tộc phong kiến kiểm soát quyền lực lãnh thổ Đàng Ngoài suốt thời Lê Trung hưng. Về danh
Trong trí tuệ nhân tạo, **lập trình di truyền** (_genetic programming, GP_) là một kỹ thuật tiến hóa các chương trình mà ban đầu chưa thích nghi (thường là chương trình ngẫu nhiên) cho đến
phải|Biểu đồ hoạt động của một trình biên dịch lý tưởng. **Trình biên dịch** () hay **phần mềm biên dịch** là một chương trình máy tính làm công việc dịch một chuỗi các câu lệnh
Trong khoa học máy tính, **chương trình con **(subprogram) hay **subroutine** là một đoạn chương trình được đóng gói thành một đơn vị trình, nó thực hiện một số tác vụ cụ thể mà chương
nhỏ|phải|A [[Graphical user interface|GUI Chương trình "Hello World", viết bằng ngôn ngữ Perl]] nhỏ|phải|Có thể thực thi dòng mã ở máy điện tử cầm tay [[PlayStation Portable homebrew|PlayStation Portable Sony.]] nhỏ|phải|Thử máy [[CNC ở Perspex]]
**Bộ trình dịch GNU** ( - thường được viết tắt thành **GCC**) là một tập hợp các trình biên dịch được thiết kế cho nhiều ngôn ngữ lập trình khác nhau. GCC là một thành
Combo Sách Lập Trình với Scratch 3, Sách Bài tập Nâng cao và Sách Luyện thi Tin học trẻ dành cho cấp Tiểu học Sách Lập trình với Scratch 3 Lập trình với Scratch 3
**Gecko** là một bộ máy trình bày được phát triển bởi Mozilla. Nó được sử dụng trong trình duyệt Firefox, email client Thunderbird và nhiều dự án khác Gecko được thiết kế để hỗ trợ
**Chromium** là một trình duyệt web mã nguồn mở, là nền tảng để xây dựng nên Google Chrome. Những phần do Google viết nên được phát hành theo giấy phép BSD, còn những phần khác
Trong lập trình, **minification** (còn được gọi là **minimisation** hoặc **minimization**) là quá trình loại bỏ các ký tự không cần thiết từ mã nguồn hoặc chương trình thông dịch hoặc ngôn ngữ đánh dấu