1 điểm bởi GN⁺ 2024-12-02 | 1 bình luận | Chia sẻ qua WhatsApp
  • Advent of Code, sự kiện câu đố lập trình diễn ra vào tháng 12, được thiết kế để hạ thấp rào cản về trình độ và lựa chọn ngôn ngữ, giúp mọi người có thể tham gia vì nhiều mục đích như luyện tập, giáo dục hay thi đấu
  • Không cần nền tảng khoa học máy tính hay thiết bị hiệu năng cao; mọi bài toán đều có lời giải chạy xong trong tối đa 15 giây trên phần cứng 10 năm tuổi
  • Nếu bị bí, có thể thu hẹp vấn đề theo thứ tự: kiểm tra ví dụ, tự tạo test case, xác minh đầu vào, rồi xin gợi ý từ bạn bè hoặc subreddit
  • FAQ 2024 tổng hợp các chính sách vận hành như thay đổi thời lượng sự kiện, loại bỏ global leaderboard, quy tắc private leaderboard, việc dùng AI, và các hạn chế về sao chép·phân phối lại
  • Thi tốc độ là tùy chọn; người tham gia có thể tập trung giải câu đố và học tập theo cách hữu ích nhất với mình

Tính chất của Advent of Code và điều kiện tham gia

  • Advent of Code là sự kiện theo dạng Advent calendar gồm các câu đố lập trình nhỏ
  • Các câu đố hướng tới nhiều mức kỹ năng khác nhau và có thể giải bằng ngôn ngữ lập trình mà người tham gia muốn dùng
  • Có thể dùng cho chuẩn bị phỏng vấn, đào tạo trong công ty, bài tập đại học, bài luyện tập, thi tốc độ, hoặc thách đấu giữa những người tham gia
  • Không bắt buộc phải có nền tảng khoa học máy tính; chỉ cần một ít kiến thức lập trình và khả năng giải quyết vấn đề là có thể tham gia
  • Cũng không cần máy tính hiệu năng cao; mọi bài toán đều có lời giải chạy xong trong tối đa 15 giây trên phần cứng 10 năm tuổi

Quy trình giải khi bị bí

  • Nếu bị bí, trước tiên cần kiểm chứng chương trình bằng ví dụ có trong câu đố
  • Nếu kết quả ví dụ không đúng, hãy đọc lại mô tả bài toán và kiểm tra những phần đã hiểu sai hoặc hành vi chương trình khác với dự kiến
  • Nếu ví dụ đúng nhưng đáp án vẫn sai, hãy tự tạo test case mà có thể kiểm tra đáp án bằng tay rồi áp dụng vào chương trình
  • Cũng cần kiểm tra xem toàn bộ đầu vào của câu đố đã được sử dụng đầy đủ hay chưa
  • Nếu vẫn bế tắc, có thể nhờ bạn bè giúp đỡ hoặc để giải lại sau; cũng có thể nhận gợi ý trên subreddit

Sử dụng trang web và xác thực

  • Nếu JavaScript được bật, các khối mã có thể được chọn toàn bộ bằng nhấp ba lần
  • Xác thực dùng OAuth để xác minh danh tính qua dịch vụ bên ngoài
    • Khi đăng nhập, thông tin xác thực được cung cấp cho dịch vụ bên ngoài đó chứ không phải Advent of Code
    • Dịch vụ bên ngoài sẽ thông báo cho máy chủ Advent of Code rằng người dùng đúng là chính họ
    • Thông thường sẽ không lộ thêm thông tin nào ngoài những gì đã công khai sẵn
    • Advent of Code ghi nhớ ID duy nhất, tên, URL và hình ảnh từ dịch vụ xác thực
  • Nếu chữ trên trang khó đọc, có thể dùng stylesheet thay thế có độ tương phản cao
    • Firefox hỗ trợ mặc định qua View → Page Style → High Contrast

Độ khó, thời điểm công bố và thời lượng sự kiện

  • Độ khó và chủ đề câu đố khác nhau theo từng kỳ sự kiện
  • Nhìn chung, câu đố sẽ khó dần theo thời gian, nhưng độ khó cảm nhận có thể thay đổi rất lớn tùy tổ hợp kỹ năng của từng người
  • Câu đố được công bố vào nửa đêm EST/UTC-5
    • Vì đó là thời điểm mà ban tổ chức có thể ổn định kiểm tra xem mọi thứ hoạt động bình thường hay không
    • Không thể tham gia đúng nửa đêm cũng không sao; còn cạnh tranh trong phạm vi địa phương thì có thể dùng private leaderboards
  • Số ngày của sự kiện đã thay đổi
    • Việc vận hành Advent of Code mỗi năm đòi hỏi rất nhiều thời gian rảnh, và việc tạo câu đố chiếm phần lớn trong đó
    • Sau 10 năm giữ nguyên lịch trình, sự thay đổi trở nên cần thiết
    • Câu đố bắt đầu vào ngày 1 tháng 12 để khớp với số ngày, được công bố hằng ngày và kết thúc vào giữa tháng 12

Bảng xếp hạng và thi tốc độ

  • global leaderboard đã bị loại bỏ
    • Đây là một trong những nguồn gây áp lực lớn nhất cho ban tổ chức, hạ tầng và nhiều người dùng
    • Một số người tham gia đã quá nghiêm trọng hóa tính cạnh tranh, thậm chí có những hành vi như tấn công DDoS
    • Nhiều người dùng đi đến kết luận sai rằng mình là lập trình viên tệ hơn chỉ vì thời gian của họ chậm hơn người khác
    • Tính năng này bắt đầu như một ý tưởng vui vào năm 2015 nhưng trong 10 năm đã trở thành vấn đề ngày càng lớn
  • Có thể chia sẻ chế độ xem chỉ đọc của private leaderboard
    • Không được dùng tính năng hoặc dữ liệu này để tạo một global leaderboard mới
  • Thời gian giải nhanh là tùy chọn
    • Để giải nhanh, ngoài việc giải câu đố còn cần nhiều kỹ năng bổ sung và rất nhiều luyện tập
    • Mã dùng để speed-solve thường trông hoàn toàn khác với mã có thể qua được code review
    • Bạn có thể chọn cách tiếp cận phù hợp với mục tiêu hữu ích cho bản thân và hoàn toàn bỏ qua việc thi tốc độ

Việc dùng AI và quy tắc private leaderboard

  • Nếu đang thuộc một private leaderboard, cần kiểm tra quy tắc kỳ vọng từ người vận hành
  • Nếu quy tắc đó không phù hợp, có thể tìm private leaderboard khác hoặc tự tạo một bảng mới
  • Quy tắc của private leaderboard có thể bao gồm thời gian chạy tối đa, ngôn ngữ được phép, thời điểm được mở câu đố lần đầu, công cụ được dùng, thậm chí cả việc có phải đội chiếc mũ ngớ ngẩn trong lúc làm hay không
  • Không khuyến nghị dùng AI khi giải các câu đố Advent of Code
    • Ở đây dùng phép so sánh rằng liệu gửi bạn mình đến phòng gym thì bản thân có trở nên khỏe hơn được không
    • Các câu đố được thiết kế để con người thấy thú vị khi giải; việc AI có giải được hay không không phải là điều được cân nhắc
    • Nếu mục tiêu là luyện viết prompt cho AI, có thể những bài tập khác được thiết kế riêng cho mục đích đó sẽ phù hợp hơn

Ý tưởng câu đố, lỗi và chính sách sao chép

  • Không nên gửi ý tưởng câu đố
    • Vì các vấn đề pháp lý như bản quyền và attribution, ban tổ chức không nhận ý tưởng
    • Để tránh khả năng vô tình dùng một phần trong đó, họ cũng không đọc cả những email trông giống như ý tưởng câu đố
  • Nếu nghĩ rằng đã phát hiện lỗi trong câu đố, trước tiên nên kiểm tra trên subreddit
    • Sau một giờ kể từ khi công bố câu đố, khả năng có lỗi là rất thấp vì khi đó đã có nhiều người giải xong
  • Advent of Code có thể được sử dụng miễn phí, nhưng không có nghĩa là được tự do sao chép
    • Không nên đưa bất kỳ phần nào của Advent of Code như nội dung câu đố hoặc đầu vào của riêng mình vào kho mã nguồn
    • Khi tạo website, không nên làm cho nó trông giống Advent of Code hoặc đặt tên tương tự

Thông báo pháp lý và phạm vi được phép

  • Advent of Code là nhãn hiệu đã đăng ký tại Hoa Kỳ
  • Các yếu tố thiết kế, câu chữ, phong cách và khái niệm của Advent of Code là tài sản độc quyền của Advent of Code và không được sao chép hay sử dụng nếu không có sự đồng ý bằng văn bản rõ ràng
  • Thông báo bản quyền là 2015-2025 Advent of Code và mọi quyền được bảo lưu
  • Có thể liên kết hoặc tham chiếu đến các câu đố Advent of Code trong thảo luận, lớp học, mã nguồn, tài liệu in ấn, kể cả trong bối cảnh thương mại
  • Advent of Code không tuyên bố quyền sở hữu hay bản quyền đối với phần hiện thực lời giải của người dùng

1 bình luận

 
GN⁺ 2024-12-02
Các ý kiến trên Hacker News
  • Vì thích AoC nên trong 2–3 năm qua tôi đã giải bằng Rust, và chơi trên Discord theo kiểu mọi người cùng nhau tạo ra lời giải nhanh nhất
    Trong quá trình đó tôi học được đủ loại mẹo tối ưu hiệu năng, thuật toán nâng cao và SIMD
    Lần này tôi đang giải bằng Rust và Go để xem liệu mình có thể thích hoặc chịu được Go đang dùng ở chỗ làm hay không, hay xác nhận giả thuyết rằng nó không hợp lắm và chỉ dùng khi thật sự cần

    • Tôi đã thử giải bằng Go trong vài năm qua; sau ngày 6 thì lúc nào cũng thiếu thời gian hoặc sự tập trung, nhưng cho mục đích này thì nó khá ổn
      Thực dụng, ít phải thiết lập môi trường hay làm việc phụ, hầu hết các chức năng cần thiết như đọc/phân tích file đều có sẵn, hiệu năng tốt và khá gần phần cứng nên ít bẫy hiệu năng ẩn
      Tôi chưa từng dùng Rust nên khó so sánh, nhưng nhìn rất hời hợt thì nó có vẻ kém thực dụng hơn
      AoC không cần nhiều tiêu chuẩn production như an toàn bộ nhớ, nên ở các bài về sau, tính thực dụng và hiệu năng có vẻ quan trọng hơn độ an toàn
    • Tôi tò mò cách tiếp cận giải nhanh bằng Rust; nếu có link nào chia sẻ được thì tôi muốn xem
    • Nếu có thể chia sẻ Discord thì tốt quá
      Mỗi năm tôi đều thử tối ưu tốc độ bằng Zig: https://github.com/ManDeJan/advent-of-code
    • Go không phải là "Golang"; nó có thời gian biên dịch tốt hơn Rust và không cố gượng ép kết hợp những cách dùng concurrency không hợp nhau
      Ngược lại, tôi lại có thế khó xử là đang cố thích Rust
    • Tôi tò mò mọi người tổ chức dự án AoC như thế nào
      Tôi định thử bằng Rust nhưng không rõ nên tách module theo từng ngày, hay để mỗi ngày là một file thư viện rồi nối vào entry point chính
      Nếu có repository công khai thì mong bạn chia sẻ
  • Thử thách năm nay là viết bằng C không dùng thư viện chuẩn hay allocator
    Nó phải chạy được trên STM32 có 32KB SRAM
    Hai năm trước tôi đã thử bằng assembly, nhưng sau vài tiếng tự làm thư viện chuẩn cho assembly thì bỏ cuộc và chuyển sang Rust

    • Năm ngoái tôi đã thử bằng C trên một chiếc Amiga 1200 thật, dùng compiler/runtime DICE của Matt Dillon
      Tôi không đi được xa lắm; nếu không có bảo vệ bộ nhớ thì mọi thứ thật sự khó hơn
      Năm nay Amiga của tôi có bản nâng cấp 060 có MMU, nên nếu tìm ra cách tận dụng nó thì có thể tôi sẽ thử lại
    • Năm nay tôi vẫn dùng Common Lisp, nhưng bài ngày đầu tiên thì tôi quyết định giải bằng tất cả các ngôn ngữ mình "biết"
      Có cả C, và vì không có hash table nên cực kỳ khổ sở
      https://git.sr.ht/~q3cpma/aoc2024/tree/master/item/01
      Nếu bạn đăng link repository để theo dõi tiến độ thì tôi sẽ rất cảm kích
    • Ràng buộc đó nghe khá khó, nhưng chúc may mắn
      Năm ngoái tôi đã giải toàn bộ bài bằng C không dùng thư viện ngoài [1], và rất vui
      Nó buộc tôi phải tự triển khai những thứ low-level đã quên, chẳng hạn như heap, và cũng tự viết các routine số học; hóa ra dễ hơn tôi nghĩ
      [1] https://github.com/sebastianotronto/aoc/tree/master/2023
    • Chỉ cần gọi RPC được thì trong 32KB RAM cũng làm gì cũng được :-)
    • Nhìn đối xứng thì cũng đáng nghĩ đến việc chỉ dùng sh và các công cụ CLI chuẩn không Turing-complete
      Kiểu grep thì được còn awk thì không; cũng hạn chế tương tự nhưng không có bug phá hỏng bộ nhớ chết người
  • Thường thì tôi làm AoC bằng Common Lisp, nhưng năm nay đang thử Swift
    Với một ngôn ngữ mainstream kiểu tĩnh, nó khá ổn cho các thao tác lặt vặt kiểu này
    https://github.com/codr7/aoc24/tree/main/swift/Sources/aoc
    Năm nay hơi kỳ lạ; tôi đang chuẩn bị sự kiện ở công ty mới
    Vì tôi nghĩ nó hữu ích để các developer học giải quyết vấn đề thật, thay vì chỉ chắp nối framework
    Nhưng sếp mới hóa ra là người hoàn toàn không thể làm việc cùng, nên tôi phải rời đi
    Cuối cùng, có lẽ như mọi khi, chỉ còn tôi và Emacs

    • Nếu chưa làm thì bạn nên tham gia leaderboard Swift: https://forums.swift.org/t/advent-of-code-2024
      So sánh các lời giải khác nhau khá thú vị
    • Tôi tò mò liệu việc parsing và thao tác chuỗi trong Swift có khá đau đớn không
      Trước đây tôi từng định làm AoC bằng Swift nhưng phần đó làm tôi tụt hứng nhiều
      Những lời giải một dòng nhỏ theo kiểu functional thì hay, nhưng sau khoảng một tuần có vẻ gánh nặng parsing sẽ quá lớn
    • Tôi tò mò bạn có viết lời giải, biên dịch và chạy tất cả trong Emacs không
      Năm nay tôi muốn thử Swift, nhưng bật Xcode chỉ để làm việc này thì cảm giác hơi quá tay
  • Lại đến rồi, mùa 25 ngày viết input parser ngày càng phức tạp

    • Tôi ghét nhất những bài như vậy
      Vấn đề thật sự nằm ở việc parse input thành dạng dễ xử lý, và một khi parse xong thì bài trở nên dễ
    • Sau vài ngày thì rốt cuộc cũng phải dùng biểu thức chính quy, mà năm nào tôi cũng quên nên lại phải học lại
    • Input parser không phức tạp dần theo ngày
      Cái phức tạp hơn là bản thân bài toán; kể cả những bài khó tầm ngày 22 hay 23 thì input thường vẫn có dạng như các dòng số nguyên phân tách bằng khoảng trắng hoặc lưới các điểm, tương tự các bài dễ ngày 1–3
    • Chỉ là gắn một câu chuyện thú vị vào việc parse input thôi
    • Tôi thấy scanf và state machine hiệu quả hơn nhiều so với parser kiểu split/explode
  • Năm nay mục tiêu là gom đủ tất cả các ngôi sao để đạt tổng cộng 500 sao
    Tức là hoàn thành mọi năm, mọi bài
    Tính đến tuần trước, có khoảng 1024 người có tổng cộng 450 sao
    Tôi mới bắt đầu vào khoảng day 6 năm 2022, nhưng đã bị cuốn vào, và đầu năm 2023 có thời gian nên đã giải một mạch các năm trước
    Nếu chuẩn bị sẵn vài thuật toán thì không quá khó, và cũng có những chủ đề lặp lại qua từng năm
    Cái thú là được học lại những thứ như thuật toán thực sự mà bình thường không hay đụng tới
    Cảm ơn các tình nguyện viên và Eric, giờ tôi định quyên góp hằng năm. Đây thật sự là một sự kiện rất hay

  • Đây là một trong những điểm nhấn của mùa này nên tôi rất thích
    Lần này tôi phải giải trên chuyến bay băng qua Thái Bình Dương về phía đông
    Với cá nhân tôi, cũng như với bạn bè, đồng nghiệp và mọi người trên HN, nó đã trở thành một truyền thống vui
    Lại một lần nữa thấy wastl và các elf trợ giúp thật đáng nể vì đã tạo ra nó
    Ai nhận được giá trị từ đây thì nếu có thể nên tài trợ
    Dù là dự án đam mê, nhưng thực tế cũng có chi phí

    • Với số lượng sponsor và người dùng AoC++ nhiều như vậy, có lẽ khó xem đây là một dự án đam mê nhỏ bé đến mức khó trả phí thuê VPS hằng tháng
      Dù vậy adventofcode thật sự tuyệt vời, và nếu có thể thì nên ủng hộ
      Chỉ là nhìn quy mô hỗ trợ hiện tại, có lẽ tác giả cũng đang sống khá ổn
  • Năm nay tôi định thử bằng F# và Gleam, nhưng như mọi năm, chắc không có thời gian và đầu óc để làm quá 10–12 ngày
    Những ai dùng Python cũng nên thử F# một lần
    Nó có thể cho cảm giác khá gần với scripting, và cũng có REPL rất tốt

    • Tôi đang tiếp tục truyền thống giải AoC bằng Whitespace [0]
      Năm đầu tiên, để đỡ quá nhàm chán, nó đã tạo động lực cho tôi xây một thư viện chuẩn
      Giờ thì tôi lại nghĩ giá mà mình hoàn thiện các công cụ tốt hơn từ trước
      Tôi debug bằng wsjq[1], một CLI debugger kiểu gdb viết bằng jq, nhưng nó chậm
      [0]: https://github.com/thaliaarchi/ws-challenges
      [1]: https://github.com/thaliaarchi/wsjq
    • Tôi đang làm bằng bash, để xem có thể đi xa đến đâu
    • Hai kỳ AoC trước tôi làm bằng F#, thật ra chỉ làm vài ngày đầu
      Ngay cả với người chưa có kinh nghiệm lập trình hàm, nó vẫn rất thú vị
      Năm nay tôi không có thời gian tham gia, nhưng nếu làm thì có lẽ lại chọn F#
    • Tôi cũng bắt đầu học F# và đang thử dùng cho AoC năm nay
      Vẫn còn ở giai đoạn đầu của hành trình lập trình hàm, nhưng đến giờ tôi thấy AoC có ích
    • Không biết hỗ trợ Linux thế nào nhỉ :)
  • Năm ngoái tôi đã kẹt suốt một tuần ở Day 12, và mọi lúc thức đều bị cuốn vào việc nghĩ cách giải
    Năm nay tôi sẽ nhẹ tay với bản thân hơn, không tham gia, và tận hưởng kỳ nghỉ đông cho đúng nghĩa

    • Nó đã nuốt chửng cuộc sống của tôi vài năm liên tiếp, có hai lần còn phải đến đêm Giáng sinh mới vừa kịp xong
      Giờ tôi không xem nữa. Niềm vui chuyển thành căng thẳng khá nhanh
    • Nghe có vẻ khôn ngoan
      Đặt ranh giới và tận hưởng thời gian nghỉ là điều quan trọng
      Với tôi, Advent of Code giống như một con dốc trơn trượt
      Khi độ khó tăng lên, ban đầu thì dễ, sau đó khó theo kiểu rất đáng công, nhưng rồi lúc nào không hay đã tốn quá nhiều thời gian
      Đến lúc đó thì nguy hiểm ở chỗ mình đã đầu tư cảm xúc vào rồi
    • Một người bạn gần đây chia sẻ cái này, có lẽ bạn sẽ thích
      https://eli.li/december-adventure
    • Tôi đã kẹt bốn tháng ở câu đố graph cut
      Thậm chí phải viết cả engine đồ thị dựa trên lực để tìm ba cạnh dài nhất cần cắt
      Sau khi giải xong, tôi xem lời giải của người khác thì họ dùng bộ giải mệnh đề của Meta và xong trong khoảng 10 dòng
      Với tôi trông như một mẹo lách luật cực lớn
  • Tôi thích AoC
    Không cần quan tâm bot AI có giải không, hay người khác có dậy sớm hơn không; cứ giải cho vui là được
    Dù là vì thích thử thách, hay muốn thử một ngôn ngữ mới, đều được
    Tôi thích giải theo phong cách hàm trong Kotlin nhiều nhất có thể, để khác với công việc
    Tôi cũng đã đăng lời giải hôm nay. Vì dùng utility nên không phải Kotlin thuần, nhưng việc gom các hàm hay ho lại thành một dạng thư viện cũng là một phần thú vị
    https://github.com/Matsemann/algorithm-problems/blob/main/ad...