April Fools 2022 Recap - Editorial - Trao giải


posted on April 9, 2022, 9:38 p.m.
278211790-350716203774064-5455370917751442542-n

Lời đầu tiên, chúc mừng các bạn đã vượt qua Contest April Fools đến từ DACAP Industry!

Tổng kết Contest

Với số người tham gia là 178, đây là một bước nhảy vọt đáng kể so với con số 122 của April Fools 2021. Đồng thời thì chất lượng làm bài của các bạn cũng đã tốt và đồng đều hơn so với năm trước. Có lẽ một phần là do chất lượng của đề đã được cải thiện hơn rất nhiều, nhưng phần lớn là nhờ vào sự ủng hộ của mọi người dành cho Contest. Chúng mình xin chân thành cảm ơn các bạn đã quan tâm và dành thời gian để tạo nên thành công cho Contest lần này.

Nếu các bạn đang đọc bài viết này mà chưa tham gia Contest Cá tháng Tư vào ngày 1/4 vừa rồi, các bạn có thể tham gia ảo contest tại đây để đọc đề và thử làm bài xem khả năng của mình ở đâu trước khi tiếp tục đọc phần bài giải phía dưới.

Bình luận của người ra đề

  • malego290704
    Năm nay các bạn đã làm chúng mình rất bất ngờ với hàng loạt lượt AC ngay từ những phút đầu tiên. Tuy nhiên thì một điều khá thú vị đó là chưa có một ai đạt điểm tối đa, khi mỗi người lại làm được những bài khác nhau.
  • zipdang04
    Mình hơi tiếc vì đã xảy ra sự cố rejudge liên tục cho bài ngôn ngữ học, và chân thành xin lỗi các bạn rất nhiều. Bảng điểm của năm nay ngoại trừ việc có một khối 613.14 thì nhìn cũng có vẻ đẹp hơn năm ngoái, và rất may là vẫn có 1 bài của malego290704 chưa ai AC cả =)) Ngoài ra, tụi mình cũng rất vui và tự hào vì nhận được feedback rất tốt của anh RR (I_love_Hoang_Yen), như là một sự khẳng định cho uy tín và chất lượng của cú lừa lần này. Cảm ơn anh rất nhiều ạ <3
  • CarlavierVN
    Ngoài tiếc cho idol DeMen100ms ra thì không còn bình luận gì thêm :c
  • a519thinhnp (tin12q):
    :D không có bình luận gì trừ việc nhiều bạn không bị lừa 1u.
  • AquaRiasta

Bảng vàng

Như đã nêu ở bài thông báo, top 3 của contest lần này sẽ giành được phần thưởng là áo LQDOJ đến từ nhà tài trợ small. Chúng ta hãy cùng dành một tràng vỗ tay online nồng nhiệt cho top 3 của chúng ta: I_love_Hoang_Yen MewnianO21 nanidesuka

Đồng thời, một phần đặc trưng không thể thiếu của Contest April Fools đó là các vị trí giải phụ vô cùng hấp dẫn. Cùng xem liệu bạn có là kẻ may mắn đêm nay và được vinh danh tại đây không nhé!

  • Vua phá hoại server: MewnianO21 - AC sau 29 lần nộp bài E
  • Vua phá hại server: a219BachNX - 27 lần nộp bài B nhưng không được điểm nào
  • Vua lật kèo: MewnianO21 - từ top 27 leo lên top 2 ở phút áp chót
  • Vua đen đủi: DeMen100ms - mất vị trí top 3 vào lúc MewnianO21 lội ngược dòng
  • Vua keo kiệt: tuanlinh - 10.71 điểm - số điểm dương thấp nhất
  • Vua xác suất: Tanphuc - rank 36 - được thần may mắn đến từ random.org gọi tên
  • Vương quốc đoàn kết: Chuyên NBK Quảng Nam - nắm giữ top 5-12 (từ Giải Ngũ đến Giải Tá(n)) với nhiều bài code giống nhau

Các bạn có thể lấy giấy chứng nhận của mình tại đây.

Hướng dẫn giải (editorial)

Để thuận tiện hơn, nếu các bạn muốn sở hữu solution để nộp bài trực tiếp có thể lấy code của 8 bài tại đây.

Bài 1: từ tháng tư đến tháng tư

Ở test ví dụ, các bạn thấy input là 1, và output là abcdef. Nếu vào thư mục theo đường dẫn a/b/c/d/e/f, sẽ thấy một file 1.txt. Tương tự với test ví dụ còn lại.

Từ đây, ta suy ra output sẽ là đường dẫn thư mục các file.

Các bạn dùng Windows bằng cách sử dụng chức năng search của Windows Explorer.

Thử tìm các file 3.txt, 4.txt để tìm các file số, các bạn sẽ đúng 5/7 test. Nếu tìm tất cả các file dùng wildcard *.txt sẽ tìm ra toàn bộ các file.

Bài 2: không có bài

Hãy bôi đen đề bài.

Bạn nào dùng darkmode sẽ nhìn ra hẳn đề của bài này :( Và điều này thì mình chưa biết cách khắc phục.

Bài 3: ngôn ngữ học

Thực ra, trước khi thi, mình có làm thử bài ngôn ngữ học, và tốn tầm 1 tiếng để AC bài này. Nên mình rất bất ngờ khi anh Trung AC rất nhanh.
Ngoài ra, mình không nghĩ là các bạn if test nhanh như vậy, khiến cho mình phải sinh test lại (bằng cách ngồi hoán vị các từ cả lên =)) ). Mỗi tội sinh hơi ẩu nên phải up lại rejudge một mớ lần. Các bạn cũng rất thông minh khi chọn cách if từng từ, tuy nhiên chia buồn với các bạn là vẫn không AC :))

Cách giải của bài này tuy đơn giản nhưng code khá mệt. Với mỗi ngôn ngữ, hãy lựa ra bộ ký tự đặc biệt của mỗi ngôn ngữ, và nếu trong đoạn text đề cho có ký tự đặc biệt của ngôn ngữ đó thì đáp án là ngôn ngữ đó.
Tuy nhiên có các vấn đề sau:

  • Trong Tiếng Nhật và thậm chí là Hàn có một số đoạn text tiếng Trung. Vì vậy nên phải xử lý Hàn và Nhật trước khi xử lý tiếng Trung.
    Trên thực tế thì mình có sinh vài test có Kanji và Hanja, nhưng mà tới lúc viết editorial này mới phát hiện ra là nó chưa được chuẩn lắm nên chắc là sẽ k bắt được đâu :(( Đáng lẽ cũng nên có vài test bắt tiếng Pháp và tiếng Việt nữa (à, è, …)
  • Ngoài ra còn có trường hợp code thì chắc phải if test thôi :’)
Bài 4: Start up giả cầy

In ra 4242 là câu trả lời của tất cả mọi thứ! Mọi thông tin liên quan xin vui lòng liên hệ: https://en.wikipedia.org/wiki/42_(number)#:~:text=The%20number%2042%20is%2C%20in,period%20of%207.5%20million%20years.

Bài 5: Gọi vốn giả cầy

Chú ý: Bài CHỨA 2 bộ test hay cần phải đọc 2 lần số \(n\) và \(n\) số \(a[i]\).

Sở dĩ dùng từ “chứa” là do để AC thì các bạn cần đọc dòng “Sample input 2:” ở trong bộ test input ngay sau khi đọc hết \(n\) số \(a[i]\) lần một cũng như in ra “Sample output 2:” ở giữa 2 kết quả của 2 bộ test (2 string cần đọc và in trên đã không được in đậm trong test ví dụ của đề bài và hai dòng “Sample input/output:” được in đậm thì không có chứa số “1”).

Còn lại thì các bạn chỉ cần tính tổng cho mỗi bộ test gồm \(n\) số \(a[i]\) và in ra màn hình.

Bài 6: Body Samsung

Cô ấy thích những câu chứa những từ chỉ gồm những ký tự có mã ASCII \(\ge 100\) ( :’) ).

Xét những ký tự trong xâu, nếu không có ký tự nào có mã ASCII \(\ge 100\) thì in YES, ngược lại in NO.

Bài 7: Giấc mơ

Đây là một bài với đề bài rất ngắn, tuy nhiên lại chứa tới hai yếu tố của bài toán. Theo quan sát của chúng tôi, một số bạn đã tìm ra được yếu tố thứ nhất và giành được 36 điểm, tuy nhiên chưa có ai tìm ra được yếu tố còn lại.

Ở đề bài này, câu đầu tiên chỉ là một câu dẫn và không chứa một thông tin gì của bài toán. Cả hai yếu tố đều nằm ở câu thứ hai:
Hãy đếm số giấc mơ của anh ấy!!!

Yếu tố đầu tiên mà một số bạn tìm ra, đó là "đếm số giấc mơ" tương đương với "đếm ước". Vì vậy, với số \(N\) được cho các bạn cần tìm số ước của \(N\), tạm gọi là \(D\).
Yếu tố thứ hai nằm ở cuối câu: "!!!", với ý nghĩa là "triple factorial" (mình không biết tiếng Việt nghĩa là gì, với ! là giai thừa, !! là giai thừa kép).

Ví dụ:

  • \(7! = 7×6×5×4×3×2×1\)
  • \(7!! = 7×5×3×1\) (lưu ý: \(7!! \neq (7!)!\))
  • \(7!!! = 7×4×1\)

Vậy đáp án của bài toán là \(D!!! (mod\) \(10^9+7)\).
Vì kết quả giai thừa có thể rất lớn nên các bạn cần \(mod\) \(10^9+7\) ở từng bước nhân trong tính giai thừa.

Các bạn làm cách tìm ước có điểm ở nhũng test đầu tiên vì số ước của \(N \le 4\), vậy nên \(D = D!!!\).

Bài 8: Tiền ảo

Đây là một bài không có yếu tố bẫy trong đề, tuy nhiên đây là một bài phức tạp, gồm nhiều bước nhỏ và có những điểm đáng chú ý khi làm bài.

Bước đầu tiên đó là lấy dữ liệu của block về. Ở đây có 2 cách làm cho các bạn lựa chọn:

  • Sử dụng web scraping để đọc 10000 trang web theo format đã cho trong đề. Web scraping là một chủ đề lớn, tuy nhiên ở đây các bạn chỉ cần làm công việc cơ bản nhất là đọc trực tiếp dữ liệu trang. Các bạn có thể tham khảo phần đầu của một bài tutorial của RealPython để áp dụng giải bài toán.
  • Nếu các bạn biết đến GitHub và GitHub Pages thì có thể thấy mình host file tại trang web GitHub cá nhân của mình. Từ đó bạn có thể truy cập vào trang GitHub của repository để clone cả trang web về đọc file ngay trên máy.

Bước tiếp theo đó là đọc dữ liệu của 10000 trang/file này. Cần lưu ý những block không nằm trong chuỗi sẽ không chứa dữ liệu. Trong bài có lấy ví dụ về block 0001 và 0002 chứa dữ liệu, nhưng nếu các bạn thử mở block 0000 sẽ thấy dòng BlockID {ID} does not exist. Có 10% tương ứng với 1000 block invalid, vậy nên khi đọc dữ liệu các block cần kiểm tra xem ô này có chữa dữ liệu hay không, có thể kiểm tra bằng cách kiểm tra kí tự đầu tiên có phải là B hay không.

Nếu ô có chứa dữ liệu, có thể lưu dữ liệu vào một dictionary/map để theo dõi block phía sau của block này là block nào (vì dữ liệu đọc chỉ cho block phía trước). Từ đó, bắt đầu từ block ID 0 sẽ dựng được chuỗi block của blockchain. Từ đó có thể sử dụng thêm một dictionary/map để theo dõi mỗi người có bao nhiêu tiền. Một lưu ý cuối cùng ở bước này đó là có những transaction không hợp lệ, tức là số tiền chuyển lớn hơn số tiền có sẵn thì giao dịch đó sẽ không được tính.

Cuối cùng, vì số lượng user trong blockchain không nhiều, vậy nên có thể đưa ra một dictionary/map lưu đáp án hoặc if test làm bài nộp.

Lời kết

Xin trân trọng cảm ơn nhà tài trợ kim cương - thầy small với những phần thưởng vô cùng giá trị.
Xin trân trọng cảm ơn LQDOJ và đội ngũ coordinator đã tạo điều kiện để tổ chức thành công contest.
Xin trân trọng cảm ơn những bạn đã nhận lời quảng cáo để góp phần lan tỏa cuộc thi đến với mọi người.
Xin trân trọng cảm ơn những phản hồi tích cực từ các bạn, các anh chị, các thầy cô giáo đã dành cho chúng tôi.
Xin trân trọng cảm ơn các bạn thí sinh của Contest April Fools 2022 đã quan tâm và tham gia hết mình với contest.

DACAP Industry


Comments

There are no comments at the moment.