Advent of Code (AoC) adalah acara tahunan yang dibuat oleh Eric Wastl, bentuknya berupa puzzle programming yang diberikan sejak tanggal 1 hingga 25 Desember . Acara ini sudah ada tiap tahun sejak 2015, tapi saya baru mendengar dan mencoba pada tahun ini.
Saat artikel ini ditulis, sudah hari ke 13, dan saya masih setia mengerjakan tiap hari. Saya tidak tahu apakah saya akan punya waktu setiap hari sampai tanggal 25, karena tiap hari soalnya bertambah sulit. Tapi karena acara ini menarik, saya ingin sharing, siapa tau ada yang ingin mencoba juga, karena soal dari hari pertama sampai ke 13 ini masih cukup mudah, masih bisa dikejar.
Apa sih bedanya Advent of Code ini dengan tantangan programming lain? Saat ini ada banyak sekali challenge lain, misalnya: LeetCode, Project Euler, CodeWars, dsb. Sebenarnya semua kembali ke preferensi masing-masing, tapi ada beberapa alasan kenapa saya suka AoC.
Sebagai catatan: saya tidak suka competitive programming, walau dulu sempat coba-coba banyak hal mirip AoC, semua akhirnya berhenti. Misalnya ketika saya login lagi ke Project Euler, ternyata terlihat bahwa belasan tahun lalu saya mencoba beberapa puluh soal awal, lalu berhenti.
Contents
Ada ceritanya
Berbagai persoalan pemrograman biasanya hanya deskripsi singkat, dan bahkan terlalu dekat dengan matematika. Sebagian lagi ada ceritanya tapi hanya untuk satu soal. Advent Of Code memiliki cerita yang sifatnya petualangan.
Cerita tahun ini diawali dengan kunci yang dijatuhkan kurcaci ke dasar laut, lalu kita perlu mencari kuncinya dengan kapal selam. Dalam perjalanan kita perlu menghitung beberapa hal, perlu mendiagnosa kapal selam, bertemu dengan gurita raksasa yang mengajak bermain Bingo, bertemu dengan pasukan kepiting, dan masih banyak lagi.
Bagian membaca cerita juga merupakan latihan yang baik untuk membaca spesifikasi. Banyak orang tersesat dan gagal meyelesaikan karena kurang teliti membaca soalnya. Untuk tahun 2021 ini, tiap soal sangat detail, dan tiap persoalan diberikan contoh langkah demi langkah.
Komunitasnya (dan Meme-nya) Menghibur
Dibandingkan dengan programming puzzle lain, komunitas AoC ini sangat menghibur tapi juga edukatif. Subreddit /r/adventofcode penuh dengan hal menarik:
- Solusi dalam berbagai bahasa (termasuk bahasa-bahasa yang jarang dipakai)
- Visualisasi dalam berbagai teknologi
- Diskusi matematis untuk soal tertentu
- Meme sesuai dengan soal
Ada Endingnya
Advent of Code hanya berlangsung 25 hari, setelah itu sudah selesai untuk satu tahun. Cerita untuk tahun tersebut akan berhenti di hari terakhir. Ini mirip dengan CTF yang jumlah soalnya terbatas.
Kalau kita tidak selesai, masih tetap boleh meneruskan sampai kapanpun. Bahkan soal-soal tahun sebelumnya pun masih boleh dipecahkan. Tapi tiap tahun hanya akan ada 25 soal, dan itu membuat saya lebih tenang, karena tidak perlu memikirkan apakah ada soal baru yang perlu saya selesaikan.
Bahasa apa saja boleh, yang penting solusinya
AoC tidak meminta kita mengirimkan kode program kita sebagai jawaban. Cukup mengirimkan output program kita. Jadi intinya kita harus bisa menjawab dengan benar untuk input yang diatur acak untuk peserta. Sebagian soal AoC bisa dikerjalan dengan kertas atau spreadsheet (dan ada yang menjawab dengan cara ini).
Karena tidak ada batasan bahasa, maka orang-orang menyelesaikan dengan teknologi yang beraneka ragam. Misalnya ada yang menyelesaikan dengan assembly, ada yang menggunakan PC XT dari tahun 80an (dan berbagai komputer lain dari jaman sebelumnya). Ada yang memakai kalkulator yang bisa diprogram, ada yang memakai arduino, ada yang membuat program untuk gameboy.
Selain itu, banyak juga yang iseng membuat visualisasi dari setiap soal. Ada yang sekedar mode teks, tapi ada yang sampai membuat model 3D dalam Unity atau Unreal Engine. Dan ada banyak yang membuat visualisasi mode grafik dalam berbagai teknologi lain.
Tingkat kesulitan soal meningkat perlahan
Saya baru setengah jalan tahun ini (hari 13 dari 25), dan bisa dilihat bahwa kesulitan soal mulai bertambah secara pelan-pelan. Untuk pemula, ini cocok sekali, karena bisa menyelesaikan sampai hari ke-N sebelum menyerah. Sampai hari ke-13, soalnya masih cukup mudah (jauh di bawah soal IOI misalnya).
Jika mentok menyelesaikan soal, kita bisa bertanya ke forum, membaca dasar teori, atau bahkan melihat pembahasan berupa live coding (baik di Youtube ataupun twitch). Bahkan kadang visualisasi yang dibuat orang lain bisa membantu kita mengerti mengenai persoalan dan solusinya.
Soalnya terdiri dari dua bagian
Setiap hari, soal terdiri dari dua bagian, tapi bagian kedua hanya akan muncul setelah kita menyelesaikan soal pertama. Beberapa soal bisa ditebak apa bagian keduanya, sehingga kita bisa mempersiapkan programnya agar mudah diubah untuk bagian kedua. Tapi kadang ini tidak seperti yang kita harapkan.
Pelajaran penting dalam hidup ini ketika merancang software adalah: cukup fleksibel untuk bisa diubah untuk requirement masa depan, tapi jangan membuang waktu terlalu banyak untuk mempersiapkan masa depan (overengineer), karena kita tidak tahu apa requirement masa depan. Pelajaran ini juga yang menurut saya bisa dipetik dari AoC.
Bagian kedua ini kadang mengejutkan dan biasanya jadi meme yang lucu. Misalnya ada satu soal di mana cara yang naif dengan mudah menyelesaikan bagian pertama, tapi akan memakan memori sangat banyak untuk soal bagian kedua.
Atau ada juga yang bercanda memakai cluster komputer research untuk menjalankan algoritma naif-nya.
Bisa Kompetitif
Untuk yang suka kompetisi: ada peringkat leaderboard juga yang bisa diikuti. Satu kelompok orang (misalnya dari perusahaan yang sama atau dari kelas yang sama) bisa membuat leaderboard sendiri. Saya sendiri tidak punya niat sama sekali untuk berkompetisi untuk ini. Masa mendekati Natal menurut saya tidak perlu ditambah stress dengan kompetisi ini.
Sambil belajar bahasa baru
Banyak yang menyarankan menggunakan AoC ini sebagai cara untuk belajar bahasa baru. Ketika saya lihat solusi tahun-tahun sebelumnya di Reddit, memang banyak sekali yang memakai bahasa yang saat ini jarang dipakai (misalnya Prolog atau COBOL).
Saran untuk belajar bahasa dengan AoC ini yang membuat saya tertarik: saya ingin mencoba memakai Rust. Saya sudah selesai membaca buku Rust dari awal sampai akhir, tapi belum terpikir untuk memakai di sebuah proyek tertentu, jadi belum pernah benar-benar praktik.
Dan akhirnya itulah yang saya lakukan: sejak hari pertama, saya memakai Rust dengan menggunakan editor Vim di Linux. Saya sengaja tidak memakai IDE atau editor yang terlalu pintar, agar saya bisa benar-benar mengerti detailnya.
Di hari-hari pertama saya masih harus sering membaca dokumentasi Rust untuk mengetahui nama-nama fungsinya. Sekarang setelah hari ke-13, saya masih belum mahir Rust, tapi sekarang jika diminta membuat program yang sekedar membaca argumen program, membuka file, lalu memproses isinya dengan menggunakan vector, hash table, dan set, saya sudah bisa melakukannya tanpa harus mengunakan IDE ataupun auto complete.
Jonathan juga ikutan
Saat ini Jonathan (11 tahun) belum punya keinginan sendiri untuk belajar programming (belum ada ketertarikan). Tapi dia cukup antusias membaca soal-soalnya, dan juga berhasil menyelesaikan beberapa soalnya. Bahkan ketika melihat meme di hari ke-6, dia segera terpikir bagaimana algoritmanya agar memori yang dipakai tidak banyak (dan dia berhasil menyelesaikan soalnya).
Karena banyak konsep programming yang belum dikuasai Jonathan, sekarang dia saya bebaskan memilih soal mana yang menurut dia mudah (dari tahun mana saja). Menurut Jonathan ini lebih fun dari belajar membuat game dalam Python.
Penutup
Timezone UTC+7 menurut saya sangat cocok untuk AoC, karena puzzle akan dirilis jam 12 siang menurut timezone Jakarta (yang sama dengan timezone Thailand). Bagi orang-orang lain di belahan bumi lain, ada yang harus menantikan puzzle barunya tiap tengah malam.
Biasanya saya menyelesaikan puzzle setelah saya makan siang. Jika tidak selesai atau ada kesibukan lain, saya selesaikan di malam hari. Niat saya sih ingin menyelesaikan sampai akhir, semoga kesampaian.
Satu tanggapan pada “Advent of Code 2021”