Introduction
Đây là chiếc recap nho nhỏ cho cuộc thi học thuật Thách Thức do khoa FIT của trường HCMUS tổ chức. Sở dĩ mình viết blog này để recap lại những trải nghiệm của mình sau cuộc thi và quá trình làm quen được thêm 3 bạn mới vô cùng chất lượng của chương trình nổi tiếng lừng danh APCS (An Phận Cuộc Sống hoặc Advanced Physics for College Students). Blog này sẽ bao gồm các trải nghiệm từ lúc mình được các bạn trong nhóm rủ tham gia vào nhóm cho đến thời điểm hiện tại mình viết blog, hy vọng là sẽ được cháy hết mình (tất nhiên là nghĩa bóng rồi) đến vòng chung kết.
Các lần thi trước
Thực ra mình đã từng tham gia Thách Thức của năm 2025. Mình không tham gia thi vào năm 2024 vì lúc đó mình chỉ mới là sinh viên năm nhất và chưa có nhiều kiến thức liên quan tới công nghệ thông tin hay khoa học máy tính nói chung. Tất nhiên, lúc này mình cũng chưa có hứng thú gì với trí tuệ nhân tạo nên cuộc sống của mình lúc đó lay lắt lắm, bữa nào cũng như bữa nào. Sau đó vào năm 2, tức năm 2024, mình gom được 1 nhóm bạn chơi chung khoảng 5-6 người thi chung Thách Thức 2024 với mình, chủ yếu là để trải nghiệm vì lúc đó thực lực của nhóm cũng bèo lắm. Và đúng là bèo thật, vì mới tham gia vòng sơ tuyển thì nhóm đã tạch. Vòng thi đó riêng mình thì đạt 31 điểm, mọi người còn lại hơi thấp hơn mình, tầm khoảng 20-29 điểm. Cũng như mọi năm, ban tổ chức cuộc thi chọn 18 đội có điểm cao nhất ở vòng sơ tuyển để tham gia vào vòng loại. Do đội mình không đủ điểm nên hành trình đã buộc phải dừng lại ngay từ vòng gửi xe. Mặc dù không có cơ hội đi tiếp nhưng ít ra mình đã tiếp xúc với đề thi của vòng sơ tuyển nên cũng biết được những phần kiến thức nào cần thiết để vượt qua vòng này.
Gia nhập
Một hôm nọ trời đầy nắng và gió, một bạn học chung lớp sinh hoạt với mình đã rủ mình tham gia thi chung Thách Thức 2026 với bạn ấy. Nhóm hiện tại đã gom được 4 bạn (bao gồm cả bạn đó) nhưng vẫn còn thiếu 2 người nữa để đủ tiêu chuẩn của ban tổ chức yêu cầu, tức mỗi nhóm cần có 6 người, trong đó 5 người thi chính và 1 người dự bị. Tham gia vào nhóm thì mình phát hiện ra mình có quen 1 bạn khác cũng đang trong nhóm, mà bạn này thực ra còn đang ở chung trọ với mình nữa mà mình đâu biết nó đang trong team này đâu, omae wa mo shindeiru. Ngoài 2 người mình biết thì còn 3 bạn khác là sinh viên của chương trình tiên tiến bằng tuổi mình nên mình nghĩ “Oà, xịn thế. Kèo này chắc được làm quen với mấy bạn từ tầng lớp quý tộc nè”. Dùng từ quý tộc nghe hơi giống gia tộc Volturi nào đó trong bộ phim Chạng Vạng nào đó quá, nhưng chương trình đó đúng thật là top-tier của trường mình mà nên nói vậy cũng không phải nói quá. Lúc mới vào nhóm thì mình nghĩ rằng chắc có lẽ mình chỉ đóng góp được phần kiến thức thôi vì phần lập trình thi đấu mình hoàn toàn không biết gì cả và cũng không hứng thú lắm với phần này, vì hồi đó mình gốc là chuyên lý mà chứ không phải chuyên tin.
Để thuận tiện cho việc mention các bạn trong team mà không để lộ tên thật (tại mình chưa xin phép mấy bạn), mình sẽ gọi các bạn bằng các nickname sau:
-
Mì cay cấp 7.
-
Cao lầu ngon lắm.
-
Mượn bàn phím.
-
Sáu học phần.
-
Bồ học Y.
-
Thất băng hiền (mình nè).
Đặt tên nhóm
Đây chắc chắn là phần đầu tiên khi đăng ký thi một cuộc thi nào đó rồi. Lúc đầu thì bằng một cách thần kỳ nào đó mà nhóm quyết định đặt tên nhóm là Bánh chưng củ kiệu. Nhóm mình có vẻ muốn đặt tên nhóm là tên tiếng Việt cho nó độc đáo so với các team khác, vì họ thường đặt tên tiếng Anh hoặc viết tắt cho bí ẩn. Đồng thời, tên nhóm có liên quan đến ẩm thực sẽ giúp chúng mình có tinh thần thư giãn hơn để chiến đấu, ít nhất thì đối với mình là như vậy. Sau khi đã đậu vòng sơ tuyển để tiến vào vòng loại thì ban tổ chức yêu cầu nhóm đổi tên khác ngắn hơn, vì họ cần hiển thị tên nhóm trên màn hình nên không thể hiển thị đầy đủ nếu tên quá dài. Sau đó vì vẫn muốn tâm hồn team hướng tới ẩm thực như tên cũ nên nhóm đổi tên thành Thịt kho Tàu. Chiếc tên này được lựa chọn với hy vọng sẽ được buff sức mạnh từ nồi thịt kho truyền thống trong văn hoá ngày Tết của người dân Việt Nam, hihi :D.
Vòng loại
Training tập 1: Long Viên coffee
Đây là lần đầu tiên chúng mình gặp nhau trực tiếp để lên ý tưởng và chiến thuật cho từng phần thi sắp diễn ra trong vòng loại. Nhóm mình đã quyết định gặp nhau tại một quán café gần nhà mình, mà thực ra lúc chọn quán thì bạn ở chung mình nó chọn quán này mà quên cân nhắc tới khoảng cách đi lại của các bạn khác. Do đó có vài bạn phải chạy đến tận 12km để tới quán nên mình đã đề xuất đi quán khác ở đâu đó trung gian giữa nhóm để chia sẻ tiền xăng với mấy bạn nhà xa. Ở lần tập luyện này thì chủ yếu chúng mình lập ra các quy ước ký hiệu cho nhóm truyền tin và nhóm nhận tin cho phần thi Truy Tìm Lối Ẩn trước khi tập trung vào các phần thi khác. Lý do là vì các phần thi khác có thể xử lý bằng kiến thức chuyên ngành và trình độ lập trình của mọi người, riêng bài này thì lại cần khả năng làm việc nhóm rất cao nên cần phải đầu tư nhiều hơn so với các phần thi khác. Suốt 3-4 tiếng ngồi ở quán thì chúng mình đã xem một vài trận đấu của năm trước để hình dung rõ hơn về cách các trận đấu sẽ diễn ra như thế nào và các quy định liên quan trong từng phần thi. Đối với vòng Khởi Động, chúng mình cần chia ra làm 2 nhóm bao gồm nhóm gợi ý và nhóm đoán từ. Các từ cần đoán đều là thuật ngữ chuyên ngành bằng tiếng Anh trong các lĩnh vực của Công Nghệ Thông Tin như cơ sở dữ liệu, hệ điều hành, lý thuyết độ phức tạp thuật toán, công nghệ phần mềm, trí tuệ nhân tạo và vài nhánh nhỏ khác, $\dots$ Đối với phần này thì tụi mình đã soạn được một số từ có tiềm năng kèm theo định nghĩa hoặc gợi ý mà tụi mình nghĩ là phù hợp để đoán ra nó, đa số các từ này được lấy từ các cuộc thi năm trước. Từ đó, chúng mình sẽ dùng LLM để tìm thêm các từ liên quan có độ khó tương đương với các từ tham khảo từ các cuộc thi trước đó để bao phủ được nhiều từ vựng hơn. Riêng mình cảm thấy mình khá phù hợp với phần thi này vì mình thường xuyên lang thang khắp cõi mạng để học những cái mình thích, thường là những phần kiến thức khá ngẫu nhiên. Trên hành trình đó thì mình đã tiếp xúc với kha khá từ vựng và khái niệm hay trên nhiều lĩnh vực của ngành mình. Do đó mình đã dự tính sẽ cố gắng lấy điểm cao ngay từ phần này để tiếp thêm tinh thần cho các phần thi sau. Đối với phần thi Truy Tìm Lối Ẩn thì nhóm mình cố gắng xác định các thao tác thường sử dụng trong lập trình và tạo quy ước ngôn ngữ cơ thể cho chúng, vì phần thi này chỉ được phép sử dụng ngôn ngữ cơ thể để truyền tin mà không được dùng ngôn ngữ nói. Ngoài ra các bạn chuyên về lập trình thi đấu sẽ tìm các câu hỏi đã từng xuất hiện trong các cuộc thi trước để có thêm manh mối về độ khó và cách ra đề. Vì team mình có 3 bạn mạnh về lập trình thi đấu nên phần thi Lập Trình Tiếp Sức trông cậy chính vào các bạn này còn các bạn khác sẽ có nhiệm vụ code sẵn template để các bạn chủ chốt code phần logic chính cho bài toán. Riêng đối với phần thi cuối của vòng loại là Đối Đầu Trực Tiếp thì nhóm chỉ đơn giản là ai biết câu trả lời sẽ trả lời cho nhóm câu đó, vì kiến thức của phần này rất rộng và có bao gồm tính toán nên chúng mình không có thời gian để training với nhau cho phần này. Kết thúc đợt training đầu tiên thì chúng mình chủ yếu đã gặp được nhau và setup những thứ cơ bản chứ chưa training được gì nhiều.
Training tập 2: Okkio coffee
Lần này tụi mình đã chọn một quán café khác nằm trung tâm nơi bọn mình ở để thuận tiện cho các bạn đi lại và chia sẻ bớt quãng đường chạy. Lần này tụi mình gặp nhau tại một quán café ở quận 3 trên đường Phạm Ngọc Thạch. Lần training này thì tụi mình đã thay đổi người đảm nhiệm việc truyền tin trong trò Truy Tìm Lối Ẩn. Sở dĩ lúc đầu nhóm dự định cho một bạn biết về Vim để làm người nhận tin, nhưng sau đó thấy rằng có thể sử dụng VS Code mà không nhất thiết phải dùng Vim để hoàn thành nên việc nhận tin đã được giao lại cho mình. Trong khi đó, mọi người khác sẽ tập trung vào việc truy tìm lỗi trong code mà ban tổ chức cho. Sau khi thống nhất thì mình và Mì cay cấp 7 bắt đầu vào công cuộc luyện tập để học thuộc các ký hiệu dùng để truyền tin. Chúng mình thống nhất là sẽ phải bao phủ được hết các chữ cái, chữ số và ký tự đặc biệt bằng cách vẽ lên không trung và mình sẽ nhìn theo đường nét mà đoán. Cũng cần phải tạo quy ước cho các thao tác đặc biệt như mở file, nộp bài, chuyển đổi giữa terminal và editor, etc. Ngoài ra thì nhóm còn tập thử trò Khởi Động, trong đó mình sẽ làm nhóm đoán từ cùng với Sáu học phần và Mì cay cấp 7. Các bạn còn lại sẽ là nhóm gợi ý từ. Trên tinh thần là kiến thức được dạy trong trường sẽ là quá ít và không đủ để cover được các từ khoá xuất hiện trong vòng thi này nên đa phần kiến thức trong phần thi này chủ yếu dựa vào những gì mình thường tự học tại nhà (hoặc quán café nào đó). Tập thử vài trận thì có vẻ mình đoán khá tốt và khá nhanh nên mình cố định ở nhóm đoán từ luôn và dự tính sẽ kiếm nhiều điểm nhất có thể ở phần này để làm bàn đạp cho các phần sau. Tập tới khoảng 22h00 thì nhóm giải tán và ra về (vì lúc này cũng đến giờ đóng cửa của quán nên có chị nhân viên lên nhắc :D).
Training tập cuối: Dooing Lab coffee
Lần này thì nhóm mình quyết định vào trường sớm để tập lần cuối nhưng trùng hợp ngay bữa có nhiều sự kiện nên trong trường khá đông. Do đó nhóm đã phải chuyển qua 1 quán Café gần trường là quán Dooing Lab coffee để luyện tập. Lúc này cũng gần thi rồi nên chủ yếu bọn mình tập lại 2 bài chính là Truy Tìm Lối Ẩn và Khởi Động cho quen thêm 1 tí để chuẩn bị thi thôi. Tầm khoảng 3h thì nhóm di chuyển qua trường để chuẩn bị setup trang phục (vì ban tổ chức tặng mỗi thành viên 1 chiếc áo dự thi cho thống nhất với chương trình). Tới nơi thì tụi mình hỏi lại chị trong ban tổ chức lần cuối thì mới phát hiện là chỉ được phép 5 thành viên tham gia xuyên suốt trận đấu và không được thay đổi giữa các vòng thi như chúng mình đã lên kế hoạch từ trước, vì lúc đầu tụi mình tưởng rằng có thể thay đổi đội hình thi đấu giữa mỗi phần thi trong 1 trận đấu, nhưng hoá ra là không được. Lúc này thì nhóm khá là panic và cuối cùng quyết định để Mượn bàn phím làm thành viên dự bị và tất cả các thành viên còn lại sẽ thi chính thức. Vì mình và Mì cay cấp 7 là không thể thay thế vì là người truyền tin và nhận tin cho vòng thi Truy Tìm Lối Ẩn. Panic 1 tí rồi thôi, nhóm mình đã nhanh chóng ổn định tinh thần và tiến vào võ đài (thực ra là giảng đường).
Thi đấu
Mở màn trận đấu là phần thi Khởi Động. Ở phần thi này tụi mình đã giành được 50 điểm, thấp hơn chỉ tiêu đã đề ra 1 chút xíu (vì thật ra vòng này mình dự tính đạt khoảng 60-70 điểm) nhưng may là 2 nhóm còn lại đều chỉ giành được 30 điểm cho phần này nên tụi mình đã có 1 khởi đầu khá tốt cho cuộc thi. Ở phần Lập Trình Tiếp Sức thì do chưa quen với format ra đề và ban tổ chức cũng không mở sẵn text editor cho tụi mình bắt đầu code, nên tụi mình gặp khá nhiều vấn đề với việc tạo file và save file vì chưa quen với thao tác nên tụi mình chưa giành được điểm nào. May mắn là 2 đội còn lại cũng chưa giành được điểm nên cục diện trận đấu sau phần thi này vẫn giữ nguyên. Tới phần Truy Tìm Lối Ẩn thì rất may mắn là nhóm đã tập luyện phần này khá kĩ và có đầy đủ các quy tắc truyền tin cho cả việc code và việc nộp bài, mở file và các thứ linh tinh khác. Đồng thời trong nhóm có các bạn có background là lập trình thi đấu nên đã nhanh chóng tìm ra lỗi bị giấu trong đoạn code và tụi mình đã rất nhanh giành được điểm của 2 câu đầu. Câu cuối cùng nhóm đã tìm ra lỗi nhưng không đủ thời gian để hoàn thành và nộp bài nên vẫn chưa thể lấy được điểm của câu này. Dù vậy thì điểm có được từ 2 câu đầu đã tăng thêm khoảng cách điểm số với 2 đội còn lại và gần như đặt đội mình vào vị thế an toàn hơn hẳn so với lúc đầu trận. Ở phần thi cuối cùng của vòng loại (yup, vòng này chỉ có 4 cuộc thi, thật ra mình muốn thi nhiều hơn cho đã cái nết), chính là vòng Đối Đầu Trực Tiếp. Vòng này thì sẽ có 3 lượt thi đấu, 9 câu hỏi, do đó mỗi đội sẽ trả lời tổng là 3 câu hỏi trong phần thi này. Team mình đã gặp 1 số câu hỏi về kiến trúc máy tính và MIPS, và tất nhiên, đội mình đã không gặt được điểm những câu đó vì không được dạy và không ai có hứng thú với mảng kiến thức này. Nhưng may thay các câu sau lại tương đối dễ và đội mình đã thành công gặt điểm. Có 1 câu hỏi về độ phức tạp của thuật toán sàng Erastothenes, nhóm mình có 1 bạn rất am hiểu về mảng này nên đã nhanh chóng chọn được đáp án đúng. Kể cả vậy, nhóm vẫn được (hoặc bị) thầy giám khảo dí câu này và chất vấn nhóm vì sao chọn đáp án đó làm câu trả lời, bởi vì có vẻ có 2 lựa chọn đều có thể tiềm năng là đáp án đúng. Sự khác nhau giữa 2 lựa chọn đó nằm ở biểu thức độ phức tạp, 1 cái là $O(nlogn)$ và cái còn lại là $O(nlog(logn))$. Thầy hỏi rằng tại sao cả 2 đáp án đều có thể là câu trả lời mà nhóm mình lại chọn $O(nlog(logn))$ làm đáp án của nhóm. Sáu học phần đã trả lời là bởi vì khi cài thuật toán, ta ưu tiên cài bằng cách có độ phức tạp thấp nhất có thể để tối ưu nó, và độ phức tạp trong trường hợp đó chính là biểu thức mà nhóm chọn. Có vẻ như câu trả lời của bạn mình đã thành công làm hài lòng thầy nên thầy đã không hỏi nữa. Và câu cuối cùng cũng là câu kết thúc trận, câu hỏi số 7 (well số này là con số may mắn và yêu thích của mình), hỏi về việc sẽ có được hình gì khi cắt 1 mặt phẳng đi qua hình nón sao cho mặt phẳng đó không song song với đáy và trục đối xứng. Câu trả lời hiển nhiên là 1 đường conic, cụ thể là ellipse. Đội bạn kế bên đội mình dù rất mạnh về toán nhưng may cho đội mình là đội họ đã nhập đáp án là hyperbol (câu này cần trả lời tự luận), tất nhiên đây không phải đáp án đúng. Và thế là đội mình đã kết thúc trận với số điểm 249, chiếm được thủ đô trong trò Đối Đầu Trực Tiếp và đạt Quán Quân của vòng loại thứ 6. Với thành tích này thì nhóm mình sẽ tiếp tục tiến vào vòng bán kết để so tài với các đội chơi khác mạnh hơn nữa. Và đoán xem, tụi mình đã bốc thăm trúng 1 trong những đội mạnh nhất của Thách Thức năm nay: CLCsCan. Theo cảm giác của mình về ý nghĩa tên đội của họ thì do đội họ gồm các anh đều đến từ chương trình chất lượng cao (CLCs) và muốn khẳng định rằng có thể so tài và rival được các bạn đến từ APCS nên mới có thêm CAN (có thể). Đội này đã thành công lọt vào chung kết của những cuộc thi năm trước và năm nay họ có vẻ sẽ dốc hết mình để lấy được chức quán quân. Quao, có lẽ mình cần phải đấm mạnh tay hơn nữa rồi.
Vòng bán kết
Tiếp nối với vòng loại recap sẽ là vòng bán kết recap, of course. Trong phần này đã có nhiều bất ngờ đã xảy ra nên mình nghĩ cần viết gấp cho phần thi này 1 chiếc recap để mình của tương lai nhìn lại sẽ thấy không ngờ trong quá khứ mình giỏi như vậy :D. Do ở chặng thi này thì chúng mình luyện tập với nhau nhiều hơn hẳn so với lúc chuẩn bị cho vòng loại (khoảng 6-7 buổi training), do đó mình dự tính sẽ chia các section trong phần này theo từng sự kiện nổi bật thay vì chi tiết từng buổi training. Oke, giờ thì bắt đầu thôi nào XD.
1. Khởi Động
Ở phần thi này chúng mình chủ yếu luyện tập thêm vài từ khó để tạo thêm gợi ý cho những từ khó diễn đạt hoặc overfit vào tụi nó luôn để ngay lập tức nhận ra tụi nó nếu có gặp trong thi đấu thật. Trong quá trình ôn luyện cho phần này thì khó khăn chủ yếu mình thấy là mô hình Gemini tụi mình dùng để sinh câu hỏi mẫu để luyện tập đã bị mode collapse và liên tục sinh ra lại những từ đã xuất hiện trong những lần training trước. Điều này khiến cho các từ mà tụi mình tiếp xúc lúc luyện tập bị kém đa dạng và thường lặp lại. Mình khá có hứng thú với các mô hình tạo sinh nên dần dà cũng phát triển được tư duy trong việc nhìn ra phân phối (hoặc manifold) trong cách mà tụi nó sinh văn bản (hoặc các loại modality khác) và nhờ trí nhớ tốt nên mình dễ dàng nhận ra điều này.
Trong lúc thi đấu ở bài đầu tiên này thì tụi mình thành công đoán đúng 5/10 thuật ngữ chuyên ngành. Nhưng điều đó không tạo khoảng cách điểm đáng kể với 2 đội còn lại, đội Hikuna đoán được 4 từ trong khi đội CLCsCan đoán được 6 từ. Trong phần thi này nhóm mình không may mắn lắm khi gặp 1 từ khoá là tên riêng của 1 nhà khoa học máy tính tên là Tim Berners-Lee. Đây là 1 điều không lường trước được vì đây là tên riêng, không phải 1 thuật ngữ chuyên ngành. Do đó việc đoán ra từ này phụ thuộc nhiều về kiến thức đơn lẻ về các lịch sử của ngành cũng như các sự kiện trên thế giới, chứ không phụ thuộc hẳn vào việc trình độ kiến thức nền tảng của thí sinh đến đâu. Nhóm mình đã skip từ này vì không lường trước được tên riêng sẽ xuất hiện. Dẫu vậy, đội mình vẫn đoán được 5 từ nên không quá lép vế sau vòng đầu. Sau vòng này thì chúng mình hiện có 70 điểm.
2. Lập Trình Tiếp Sức
Ở phần thi này thì chúng mình đã sắp xếp sao cho các bạ mạnh về lập trình thi đấu sẽ xen kẽ với các bạn khác để thuận tiện hỗ trợ nhóm suốt phần thi. Đầu tiên, Mượn bàn phím sẽ là lượt đầu tiên để mở file, setup sẵn các thao tác đặt tên file và gõ template cho các bạn sau code. Template sẽ bao gồm include thư viện, prototype của các hàm cần thiết và hàm main để sẵn sàng cho logic chính của bài toán. Tiếp theo sẽ lần lượt là mình, Bồ học Y, Mì cay cấp 7 và cuối cùng là Cao lầu ngon lắm. Theo thứ tự này thì Bồ học Y sẽ đứng sau hỗ trợ mình và Cao lầu ngon lắm sẽ hỗ trợ Mì cay cấp 7. Như vậy, gần như các bạn mạnh về lập trình thi đấu đã bao phủ được gần hết quá trình giải bài. Tuy vậy, vì đợt thi này 2 bạn chủ yếu về CP trong nhóm mình lại không hiểu rõ ý tưởng của nhau cho lắm nên kết thúc phần thi tụi mình vẫn chưa code xong và do đó vẫn chưa giành được phần điểm nào cho phần thi này. May mắn là các đội còn lại cũng rơi vào tình trạng tương tự, nên khoảng cách điểm giữa các đội vẫn giữ nguyên sau vòng đầu này. Theo mình thấy thì phần đấu này là phần đấu khó và căng thẳng nhất trong toàn bộ trận đấu vì đòi hỏi teamwork mạnh (hiểu rõ ý tưởng của nhau), thao tác nhanh và cẩn thận, ghi nhớ rõ đề và định hướng giải bài đã vạch ra (vì không được phép xem giấy nháp hoặc đề trong quá trình code mà chỉ được xem trước đó). Thông thường ở phần thi này sẽ rất dễ tạo khoảng cách điểm lớn nếu có duy nhất 1 đội nộp được bài và giành được điểm, khi đó đội nộp bài sẽ bỏ khá xa 2 đội còn lại và gần như tạo bàn đạp cho các phần thi sau. Anyway, các phần thi sau mới là lãnh địa của mình nên mình sẽ cố gắng ngăn cản khoảng cách điểm giữa đội mình và đội đối thủ nếu trường hợp này xảy ra.
3. Truy Tìm Lỗi Ẩn
Sau lần thi đấu ở vòng loại thì chúng mình nhận ra các quy ước hiện tại dùng cho phần thi này của nhóm mình còn khá hạn chế. Đa số các quy ước đều là kí tự riêng lẻ, không có nhiều shortcut cho những thao tác lớn để giảm bớt thời gian hơn cho việc truyền và nhận tin. Do đó chúng mình đã phát triển thêm 1 số quy ước mới cho phần thi đấu này, bao gồm:
-
Khi di chuyển con trỏ chuột trên màn hình, nhóm mình quyết định sẽ giữ nguyên cử chỉ tay nếu cần di chuyển nhiều thay vì phải vẫy tay nhiều lần, giúp giảm đáng kể thời gian giữa mỗi lần nhấn phím vì chỉ cần đè phím đến khi hiệu lệnh dừng lại. Mặc dù có thể dùng Ctrl G để nhảy trực tiếp đến 1 dòng cụ thể nhưng chúng mình quyết định không dùng cách này vì sẽ cần phải vẽ nhiều hiệu lệnh cho số dòng (đa số trường hợp số dòng cần sửa code có 2 chữ số) và overhead này sẽ mất nhiều thời gian hơn. Đồng thời nhóm cũng bổ sung thêm các phím tắt để xử lý nhanh copy, paste theo dòng code thay vì phải xoá thêm từng ký tự nếu có thể tận dụng lại phần lớn các ký tự đã có.
-
Ngoài ra, vì nhóm nhận thấy nếu chỉ tập trung giải 1 bài trong phần thì này thì có thể sẽ không kịp so với các đội thi khác. Hơn nữa, vì nhóm có 2 bạn trở lên có kinh nghiệm trong lập trinh thi đấu nên nhóm mình thêm 1 vài hiệu lệnh để mở tab và giải nhiều bài cùng lúc để tận dụng tối đa tiềm lực của nhóm và giảm đáng kể thời gian để nhanh chóng bắt kịp các đội khác.
Nhờ việc áp dụng thêm 1 số cải tiến như trên, mặc dù giữa chừng chúng mình gặp khó khăn trong việc nhận tin đôi chút và cần bạn truyền tin phải truyền lại khoảng 5 lần nhưng cuối cùng chúng mình đã thành công giải được cả 3 bài trong khi vẫn còn dư khá nhiều thời gian. May mắn là mỗi bài đều đúng ngay từ lần đầu tiên nên chúng mình đã bắt đầu tạo được gap điểm tương đối với 2 đội thi còn lại.
4. Ai Thông Minh Hơn: siêu sao của buổi diễn
Đây có lẽ là phần mình tự hào nhất trong vòng bán kết lần này, vì mình MVP vòng này mà. Nhờ cú bứt phá từ vòng này mà nhóm mình đã tạo được 1 gap điểm tương đối lớn với 2 đội thi đối thủ (khoảng 140 điểm) nên gần như đã chắc suất quán quân của vòng thi bán kết này nếu chúng mình không tự huỷ ở những bài thi đấu sau.
Đây là phần thi mới xuất hiện từ vòng bán kết. Ở vòng loại chúng mình chưa được tiếp xúc với bài thi đấu này. Tuy vậy, vì bài này chỉ cần có kiến thức rộng và đôi chút nhạy bén thay vì cần khả năng teamwork nhiều như vòng Truy Tìm Lối Ẩn nên chúng mình không training gì cho bài này cả. Mình chỉ trông cậy vào vốn kiến thức có sẵn của bản thân và 1 chút may mắn mà thôi.
Ở câu hỏi đầu tiên thì ban tổ chức đặt ra câu hỏi về CQRS: Command Query Responsibility Segregation. Đây là 1 nguyên tắc trong công nghệ phần mềm dùng để tách việc command và query ra làm 2 thành phần riêng biệt để quản lý 1 cách hiệu quả hơn. Mình đã nhanh chóng biết đáp án là CQRS nhưng vì đọc còn khá chậm và còn lấn cấn việc capslock kết quả có cần thiết hay không nên đã để đội CLCsCan lấy điểm ở câu này. Theo thông tin mình biết, đội CLCsCan gồm các anh năm 4 bao phủ 3 chuyên ngành: khoa học máy tính, công nghệ phần mềm và công nghệ trí thức. Có vẻ các anh học về phần mềm đã ngay lập tức nhận ra câu trả lời ngay khi thấy từ command và query xuất hiện trong câu hỏi.
Ở câu hỏi tiếp theo, chúng mình cần điền vào chỗ trống 1 cụm từ có dạng “$\dots$ management”. Đọc mô tả trong đoạn ngữ liệu thì đây là 1 cách quản lý trong hệ thống phân tán. May thay lúc luyện tập thì chúng mình đã bắt gặp 1 từ là federated learning. Không nghĩ ngợi nhiều, mình nhập vào ô trống là federated luôn thì vừa đủ số lượng ký tự yêu cầu nên mình submit ngay lập tức. Đó chính xác là kết quả đúng cho câu hỏi này và nhóm đã nhận được số điểm đầu tiên trong bài thi này.
Sau khi trả lời đúng câu hỏi này thì nhóm mình đã lật mở được 1 mảnh ghép trên tấm ảnh từ khoá. Từ gợi ý của mảnh ghép này là OpenAI o1. Lúc này thì mình có 1 vài manh mối về các cụm từ liên quan đến mô hình LLM có khả năng suy luận. Đến các câu hỏi sau thì có thêm 2 từ gợi ý mới xuất hiện là Structured output và System 2. Đến đây thì mình gần như chắc chắn từ được ẩn giấu trong bức tranh là REASONINGMODEL. Lúc này mình đưa ra đáp án này là vì 3 manh mối sau:
-
OpenAI o1: Vì o1 là mô hình suy luận đầu tiên của OpenAI nên mình đã thu hẹp phạm vi tìm kiếm xuống khá nhiều. Từ đó có thể cho rằng đáp án rất có khả năng là THINKINGMODEL hoặc REASONINGMODEL hoặc từ nào đó liên quan đến các reasoning LLM.
-
Structured output: từ này không đem lại nhiều manh mối như 2 từ còn lại nhưng cũng gợi ý 1 chút về đáp án. Bởi vì các mô hình suy luận cần phân tách rõ ràng phần thinking và phần response ra cho người dùng dễ theo dõi và phân biệt, chúng sẽ có cơ chế kẹp phần thinking vào 1 tag XML nào đó ví dụ như:
<|im_start|> <|im_end|>hoặc<think> </think>. Đây có thể là gợi ý cho việc chúng có Structured output mà từ gợi ý đang nói đến. -
System 2: Đây là mô hình suy nghĩ do Daniel Kahneman đề xuất trong cuốn sách nổi tiếng của ông ấy: Tư duy nhanh và chậm (Thinking fast and slow). Trong sách, ông đề xuất rằng con người có 1 chế độ suy nghĩ: *System 1 là chế độ suy nghĩ tức thời chủ yếu dựa vào bản năng và cảm giác, thường xử lý các việc đơn giản trong cuộc sống; System 2 là chế độ suy nghĩ cần nhiều công sức, thời gian để cho ra câu trả lời chất lượng cho 1 vấn đề phức tạp. Nội dung chính mà System 2 đề cập tới hoàn toàn đang gợi ý đến các mô hình suy luận.
Sau khi đã chốt rằng từ khoá cần tìm là REASONINGMODEL thì nhóm mình đã bấm chuông giành quyền trả lời từ khoá ẩn. Nhưng đội bạn bên CLCsCan cũng đã đưa ra câu trả lời của họ về từ khoá ẩn là CHAINOFTHOUGHT. Hai câu trả lời cũng khá là giống nhau về ý tưởng. Sau khi ban tổ chức nhận câu trả lời từ 2 đội thì họ đã nhận xét rằng có 1 trong 2 câu trả lời là đúng. Và cuối cùng câu trả lời của nhóm mình đã đúng, REASONINGMODEL thực sự là từ khoá đang ẩn bên dưới bài thi đấu này. Bằng đáp án đúng này, nhóm mình đã chiếm được hết điểm của các mảnh ghép còn chưa được lật mở và nhận về 1 số điểm khổng lồ trong bài thi đấu này. Nhờ đó, nhóm mình tạm dẫn trước 2 đội còn lại với khoảng cách khoảng 140 điểm. Team mình lúc đó gần như đã ở 1 khoảng cách rất an toàn so với 2 đội còn lại, 140 điểm không phải là 1 khoảng cách nhỏ nên nếu giữ vững phong độ tương tự cho những phần thi sau thì chúng mình có thể sẽ gặt hái được quán quân của vòng bán kết này.
Sau khi toàn bộ từ gợi ý của phần thi này được lật mở, vì rảnh quá nên mình sẽ nhận xét mức độ tương quan giữa từng từ gợi ý đến từ khoá ẩn và đưa ra đánh giá của mình. Mình sẽ đánh giá mỗi từ trên thang điểm 10, tức là dựa vào từ gợi ý đã biết thì có thể dễ đoán ra từ khoá ẩn đến mức nào, điểm này càng cao nghĩa là càng dễ đoán ra từ khoá ẩn dựa vào từ gợi ý đang có, nói cách khác là, điểm càng cao, Mutual Information giữa từ chủ đề và từ gợi ý càng cao. Thay vì tính toán con số này theo Information Theory thì mình phán trực tiếp bằng niềm tin và hy vọng luôn. Giờ thì bắt đầu thôi:
-
Chain of Thought: Đây là 1 trong những kĩ thuật prompting cơ bản hỗ trợ quá trình suy luận của các reasoning model diễn ra tốt hơn. Bằng cách thinking theo từng bước và nối chúng lại thành 1 chain liền mạch, câu trả lời được tin rằng sẽ có chất lượng cao hơn => liên quan khá mạnh đến REASONING MODEL. Điểm: 8/10.
-
Thinking: Từ này gần như đồng nghĩa với từ reasoning nên có thể dễ dàng gợi ra từ reasoning ngay lập tức khi thấy từ này. Ngoài ra ta cũng có thể check xem THINKINGMODEL và REASONINGMODEL, từ nào sẽ đúng số lượng kí tự. Điểm: 9/10.
-
Step by step: Từ này liên quan mật thiết với Chain of Thought đã nói ở trên, vì CoT thực chất là trình bày reasoning của model theo từng bước (step by step) mà. Điểm: 8/10.
-
Deepseek R1: Đây là mô hình suy luận mã nguồn mở đầu tiên được Deepseek public nên là 1 case study quý giá cho những ai muốn tìm hiểu cơ chế huấn luyện và đánh giá các reasoning model diễn ra như thế nào. Đa phần các mô hình trước đó của OpenAI là closed-source model nên không thể tiếp cận được. Khá liên quan đến từ chủ đề nhưng cần kiến thức về Deepseek. Điểm: 7/10.
-
Logical inference: Đây là thao tác tương đối phức tạp cho các model chỉ mới được pre-trained trên các tập dataset khổng lồ vì chúng chỉ mới có world knowledge và chưa có khả năng reasoning tốt. Việc từ này xuất hiện ngụ ý các class model đã được post-training với reasoning dataset hơn các pretrained model. Điểm: 6/10.
-
Problem decomposition: Phân rã 1 vấn đề phức tạp thành từng phần nhỏ để xử lý. Từ 1 góc độ nào đó thì từ này khá liên quan đến CoT nhưng vẫn không tương quan mạnh lắm với từ chủ đề. Điểm: 6/10.
-
Self-reflection: Đây là cơ chế tự đánh giá các suy luận đã qua của model. Thường trong các blog post và paper liên quan đến cơ chế này, có 1 cụm từ thường xuất hiện đi kèm: “Aha” moment. Cụm từ này ám chỉ việc model đã tự phát hiện ra sai sót (flaw) trong quá trình reasoning trước đó của chính nó sau khi đã suy luận đến các bước sau và tự sửa lại suy luận sai thành đúng. Theo mình thấy đây là cơ chế khá brittle và tương đối khó kiểm soát vì không thể xác định được số lần self-reflection tối ưu cho model. Nếu số lần này quá ít, mô hình gần như không cải thiện về chất lượng suy luận và câu trả lời không có gì đảm bảo sẽ tốt hơn các pretrained model chỉ với kiến thức thô. Nếu số lần này quá nhiều, mô hình rất có thể sẽ mắc kẹt trong bẫy suy luận và tốn rất nhiều thời gian (và thậm chí là token, nói cách khác, tốn tiền) để cho ra câu trả lời, hoặc thậm chí mắc kẹt hoàn toàn và không sinh ra được câu trả lời dù đã đợi 1 khoảng thời gian dài. Theo quan điểm của mình thì đây là 1 chủ đề khá thú vị trong lĩnh vực Reasoning Model. Điểm: 7/10.
-
System 2: Như đã nói ở trên về lí do từ này có liên quan đến suy luận theo lý thuyết Dual Process Theory của Daniel Kahneman. Điểm: 8/10.
-
Structured output: Đã mô tả ở phần trên. Điểm: 8/10.
-
Verficiation loop: Từ này có quan hệ mật thiết với từ Self-reflection đã nói ở trên. Mỗi lần model self-reflect những suy luận trước đó có thể được xem là 1 iteration của quá trình verification loop. Điểm: 7/10.
-
Monte Carlo tree: Đây là cụm từ mình (1 cách chủ quan nhất có thể) đánh giá là kém liên quan nhất đến từ chủ đề. Thông thường khi nhắc đến Monte Carlo Tree, ta sẽ nghĩ đến thuật toán Monte Carlo Tree Search mà AlphaGo đã dùng để huấn luyện khả năng chơi cờ, hoặc nói rộng ra là chơi các trò chơi trí não có không gian trạng thái (state space) và hành động (action space) rời rạc như cờ. Do đó, từ gợi ý này không làm mình liên tưởng nhiều đến từ chủ đề bị ẩn giấu. Có thể các phương pháp SOTA đang áp dụng cách tiếp cận này cho các mô hình ngôn ngữ nhưng vì sức liên tưởng không cao nên mình không thể nói rằng từ này là 1 từ đáng để làm từ gợi ý cho từ chủ đề bị ẩn giấu. Điểm: 2/10.
-
OpenAI o1: Đã nói ở trên. Do cần kiến thức về bối cảnh công nghệ ngoài thực tế liên quan đến các doanh nghiệp như Deepseek, OpenAI, etc. Mình sẽ đánh giá từ này bằng từ Deepseek R1. Điểm: 7/10.
Thoạt nhìn ta tưởng rằng Monte Carlo tree là cụm từ bị đánh giá điểm thấp nhất trong các từ này, nhưng thực ra thứ có điểm tương quan thấp nhất chính là bức tranh sau khi đã lật mở toàn bộ mảnh ghép. Bức tranh chỉ việc chuyển đổi từ System 1 sang System 2 trong quá trình suy luận của con người. Tuy nhiên hình minh hoạ cho mỗi System lại khá trừu tượng và không liên tưởng mạnh lắm. Ngoài ra với độ chi tiết đến cực đoan và gam màu quen thuộc, mình chắc chắn $96.69\%$ là tấm ảnh này được tạo bằng NotebookLM. Kết thúc phần recap và đánh giá về phần thi đấu này.
5. Đấu Trường AI
Đây có lẽ là phần thi duy nhất trong suốt trận đấu mà chúng mình không cần phải động tay động chân. Vì phần thi này chưa xuất hiện ở vòng loại nên chúng mình đã mất 1 khoảng thời gian để nắm rõ luật chơi và quy định của nó. Ở phần này thay vì chiến đấu trực tiếp với nhau thì mỗi đội sẽ cử ra các agent mà đội mình đã chuẩn bị sẵn để thi đấu với nhau trên 1 bản đồ mô phỏng các con thuyền chiến đấu với nhau. Mỗi agent điều khiển 1 chiếc thuyền và mục tiêu của vòng đấu này là thu thập nhiều vàng nhất có thể. Đội thắng cuộc top 1 trong mỗi lần đấu ở vòng này sẽ là đội có nhiều vàng nhất khi lượt đấu kết thúc. Trong quá tình đấu thì các thuyền còn có thể lấy khiên để giúp bản thân có thể đi xuyên chướng ngại vật mà không bị đắm thuyền và thậm chí bắn pháo qua lại để cướp vàng và phá khiên của nhau nữa. Ở vòng đấu này thì tụi mình đã tung ra khoảng 2-3 agent chính để tham gia thi đấu, đa phần trong số đó là agent do Bồ học Y và Mì cay cấp 7 đã chuẩn bị sẵn từ trước. Sau khoảng 5 lượt đấu thì khoảng cách điểm của tụi mình so với 2 đội trước thay đổi không đáng kể vì tụi mình đã đạt kết quả khá tốt ở vòng đấu này nên đội bạn đã không lấy lại được nhiều lợi thế. Thường thì đây là phần thi vui nhất và có nhiều yếu tố không ngờ tới nhất, chẳng hạn như: các agent không hành động như team mong đợi, 2 agent nào đó mắc kẹt trong 1 vòng lặp khiến chúng thực hiện đồng thời các hành động giống nhau mà không thoát ra được, 1 agent nào đó bị trap trong 1 vòng lặp các hành động đến hết trận mà không lấy thêm được vàng, hay thú vị nhất là có các agent có thể né liên tiếp nhiều quả đạn pháo mà không bị dính đòn dù chỉ 1 lần, và còn nhiều trò hay khác nữa. Mình thấy đây có thể là phần thi thú vị nhất trong suốt trận đấu, bất kể đó là vòng bán kết hay chung kết thì đây là phần khiến tụi mình có thể là bất lực và cũng có thể là vỡ oà trong mừng rỡ khi con agent ngày đêm xây dựng đã giành được chiến thắng. Khán giả ở phần này lại được mãn nhãn bởi màn so tài và những điều thú vị không lường trước được từ hành vi của các agent với nhau. Đồng thời tụi mình cũng có thể nhiều kinh nghiệm khi build thêm các agent khác để chuẩn bị cho trận đấu chung kết tiếp theo sắp ập tới. Kudos cho Mì cay cấp 7 và Bồ học Y.
6. Đối Đầu Trực Tiếp
Đây là phần thi cuối cùng của chúng mình ở vòng bán kết này rồi nè. Ở phần này thì cả đội sẽ cùng họp sức chiếm được nhiều thành phố nhất có thể bằng cách chiếm lấy các thành phố còn trống hoặc đối đầu với đội đang chiếm lĩnh nó để giành lấy quyền kiểm soát. Vì điểm số của mỗi đội được tăng lên theo số lượng thành phố mà đội đó đang chiếm sau mỗi lượt đấu nên đây là phần có thể đảo ngược tình thế rất gắt gao. Mỗi thành phố có trọng số 10 điểm và thủ đô có 20 điểm do đó nếu chiếm được thủ đô thì gần như tụi mình có thể nắm chắc phần thắng ở vòng bán kết. Nhưng may mắn thay, ở các phần thi trước chúng mình đã có 1 số điểm ổn áp và cách 1 khoảng tương đối với 2 đội thi còn lại nên ở phần này chúng mình không cần hấp tấp chiếm lấy thủ đô mà chỉ cần giữ được các thành phố đang có để không bị chiếm là được. Thông thường các câu hỏi ở phần này trải dài trên nhiều thể loại: kiến thức tổng quan, đọc code và xác định bug hoặc output là gì, tính toán liên quan đến mạng máy tính hoặc hệ điều hành, xác suất thống kê và các giá trị liên quan đến ma trận, etc. Chính vì thế, phần thi đấu này theo mình thấy là ít bị bias hơn nhiều so với ATMH vì ATMH chỉ cần có kiến thức thô, không cần nắm các thao tác tính toán hoặc lập trình, trong khi phần đấu này cần hội tụ đủ kĩ năng trên nhiều phương diện. Ở phần này thì chủ yếu chúng mình đã var nhau với 2 đội còn lại vài lần nhưng không thành công chiếm được thành phố của họ và họ cũng không chiếm được thành phố của mình (vì cả 2 đội cùng trả lời sai hoặc đúng) nên cục diện trận đấu gần như giữ nguyên. Anyway, nhờ khởi đầu thuận lợi ở Truy Tìm Lỗi Ẩn và cú boost điểm từ Ai Thông Minh Hơn mà ở phần này tụi mình thi đấu dễ thở hơn nhiều. Cuối cùng thì chúng mình đã kết thúc phần thi này và đồng thời cũng chính là vòng bán kết với điểm số 421, cách xa hơn 100 điểm so với 2 đội còn lại. Tấm vé cuối cùng vào vòng chung kết đã thuộc về Thịt kho Tàu, yayyy!
Chuẩn bị cho vòng chung kết
Video introduction
Đây có vẻ là khó khăn đầu tiên và không ngờ nhất của phần chung kết. Vì ở phần thi này ban tổ chức yêu cầu mỗi đội tham dự chung kết phải thực hiện 1 đoạn video clip để làm introduction cho nhóm của mình. Nhóm mình vẫn chưa có ý tưởng gì cụ thể cho đến sát ngày phải nộp video, chỉ biết là vì nhóm tên là Thịt kho Tàu nên chủ đề chính của video nên liên quan gì đó đến nấu ăn. Có thể là nấu chín đội đối thủ chăng, hoặc là nấu luôn cả quả đề của ban tổ chức :D. Anyway, ngày cuối sau khi quay video và nộp cho ban tổ chức thì sẽ update phần này sau.
Quay video
Okay hôm nay là chủ nhật 12/04. Nay chúng mình lại tiếp tục hẹn ra quán cafe mà nhóm thường đi. Trong lúc chúng mình đợi Sáu học phần tới quán thì nhóm có ôn tập sơ sơ 1 chút về phần khởi động, luyện đoán thêm 1 số từ mới và thêm 1 vài quy tắc để đoán ra những từ khó diễn đạt (vâng chúng tôi gọi đó là overfit vào những từ mà việc gợi ý ra nó gần như là impossible). Sở dĩ phải ngồi đợi Sáu học phần tới vì bạn ấy vừa mới thi Olympic sinh viên toán học ở Quy Nhơn và chỉ mới về sáng nay nên bạn ấy cần nghỉ ngơi 1 chút thì mới chạy qua quán được. Có bạn ấy thì chúng mình ôn thêm phần khởi động thêm 1 chút rồi lập kịch bản cho từng phần để chuẩn bị quay video introduction. Tới màn quay video introduction thì cả nhóm dọn đồ ra công viên gần quán cafe mà nhóm hay tụ tập để quay. Trước mắt là nhóm quay cảnh Sáu học phần đập tay với Mượn bàn phím để trao lại trọng trách đánh vòng Bán Kết vì hôm đó bạn ấy phải bay ra Quy Nhơn để đi thi Olympic sinh viên mất rồi nên sẽ không tham gia được trận đấu. Sau đó thì chúng mình thêm vài cảnh quay cùng quyển cookbook có tên nhóm Thịt kho Tàu trên đó với các nguyên liệu trong cuốn cookbook là tên của các đội mà chúng mình đã đánh bại. Ngoài ra còn 1 số nguyên liệu sẽ được rắc vào chính là 2 đội cuối cùng mà chúng mình phải thi đấu ở vòng chung kết của cuộc thi. Nói là quay video chứ thật ra mỗi lần chỉ có 1-2 bạn cần quay thôi còn nhóm còn lại thoải mái tám chuyện thôi à. Nào cần thì tụi mình mới ập ra quay cảnh nào có liên quan. Quay 1 hồi tới khúc cuối cả bọn khoác tay nhau thì tụi mình phải nhờ 1 bạn kia trong công viên quay giùm vì cả nhóm phải xuất hiện trong khung cảnh này (bạn đó tóc đỏ đỏ nhìn stylish ghê :v). Quay tầm khoảng 4 5 footage cho mỗi người là xong việc quay video rồi. Xong rồi cả bọn đi về và Cao lầu ngon lắm sẽ edit video intro rồi nộp cho ban tổ chức luôn. Kết thúc ải đầu tiên vào chung kết: video introduction :D
Truy Tìm Lỗi Ẩn
Lại là siêu sao đáng chú ý của mỗi vòng thi khi phần thi này là phần thi đòi hỏi khả năng teamwork cao nhất trong toàn bộ phần thi. Sau khi thi xong vòng Bán Kết thì chúng mình nhận ra tốc độ debug của team khá cao nhưng phần IO (phần truyền tin và nhận tin) còn khá chậm và đôi khi là mắc nhiều lỗi. Có thể nói là lúc đầu đây là phần thi compute-bound nhưng sau đó trở thành IO-bound. Tuy nhiên sau khi training thêm vài lần nữa thì tụi mình lại gặp 1 vấn đề mới, hoặc nói đúng hơn là phát hiện 1 điều mới. Đó là những bộ test luyện tập do Gemini sinh ra cho chúng mình training hiểm hơn cả các bài thi đã ra trước đó của ban tổ chức. Bằng chứng là lúc training thì nhóm debug khá nhanh và IO cũng rất suông mượt. Nhưng sau khi kiểm tra lại kết quả kỹ hơn thì phát hiện có khá nhiều bài chúng mình đã debug sai và code vẫn còn lõi, trong khi IO trước đó được xem là còn khá chậm và kém hiệu quả thì lại thực ra hiệu quả hơn mình nghĩ và cũng mắc ít lỗi hơn. Từ đây tụi mình mới cảnh giác với việc debug vì có vẻ như trận chung kết sẽ có những đoạn code hiểm hơn và khó debug hơn các đoạn code ở những vòng thi trước đó.