Selasa, 05 Juni 2018

Strategi Kontes ICPC

Sepanjang berkompetisi ICPC, saya menyadari bahwa dinamika antar anggota tim penting untuk memaksimalkan performa tim. Maksimal di sini berarti berkompetisi sebaik mungkin, sehingga apapun hasil yang didapatkan, tidak ada kekecewaan. Tulisan ini akan membagikan pengalaman saya sepanjang 4 tahun berkompetisi di ACM ICPC.

Perlu diingat bahwa tulisan ini sangat subjektif, yaitu berdasarkan pengalaman saya. Yang Anda alami mungkin berbeda, dan yang saya tuliskan hanya sebagai referensi saja.


Komposisi Tim

Tim yang ideal adalah tim yang anggotanya saling melengkapi. Ada anggota yang mampu mengerjakan soal tipe X, ada yang mengerjakan soal tipe Y, dan sebagainya. Namun setiap anggota sebaiknya menguasai seluruh ilmu dasar.

Storm, earth, dan fire dari warcraft (https://blizzardwatch.com)

Ilmu yang setidaknya harus dimiliki setiap anggota adalah coding. Jelas bahwa setiap anggota pasti sudah bisa coding, tetapi yang saya maksud di sini adalah setiap anggota mampu menuliskan kode dengan lancar, minim bug, dan mudah dibaca anggota lainnya. Bila tim membebankan pekerjaan coding ke seorang anggota, maka ia kemungkinan besar akan jenuh, lelah, dan hanya berperan sebagai kuli. Tanpa berperan dalam berpikir mencari solusi, anggota ini bisa saja merasa tidak dihargai...

Bila tim Anda baru dibentuk, mulailah untuk menganalisis kelebihan dan minat masing-masing. Setiap orang maksimalkan kemampuan untuk topik yang ia sukai. Untuk topik lain yang tidak seorang pun bisa atau minati, barulah dibagi sama rata. Analisis ini dapat dilakukan dengan sering-sering berlatih bersama.

Menyelesaikan kontes sendiri dengan bertiga sangatlah berbeda. Terdapat faktor kerja sama, komunikasi, dan kepercayaan yang terlibat.


Sebelum Kontes

Persiapkan semua perlengkapan selama kontes. Pastikan:
  • Team notebook yang dibawa tidak terlupakan atau hilang sebagian karena kesalahan panitia. Selama dibawa, lebih baik disimpan di map yang anti air (jangan seperti pada pengalaman saya).
  • Tahu bagaimana cara print kode supaya debugging dapat dilakukan di kertas ketika komputer sedang digunakan.
  • Pastikan tidak ada kecacatan atau keanehan pada hardware yang diberikan. Yang selalu saya alami kalau kontes di Binus adalah keyboard-nya yang tidak umum, yakni tombol karakter '|' ada di pojok kiri bawah. Kalau mungkin, bawalah keyboard sendiri untuk menghindari kejadian ini.
  • Lacak di mana posisi WC atau tempat makan/minum, supaya ketika beristirahat tidak banyak waktu yang terbuang untuk mencari tempat-tempat tersebut.


Awal Kontes (00:00 - 01:30)

Umumnya, awal kontes merupakan waktu untuk menyelesaikan soal yang mudah. Soal mudah perlu segera dicari, dan diselesaikan secepatnya untuk meminimalkan penalti skor.

Untuk efisiensi pencarian soal mudah, biasanya tim saya akan memecah berkas soal menjadi 3, lalu dibagi rata dan masing-masing membaca bagian mereka sendiri. Kalau ada anggota yang menemukan soal mudah, langsung dipercayakan ke anggota tersebut untuk coding. Anggota lainnya tetap membaca soal. Bila submission tidak mendapatkan AC, biarkan anggota tersebut untuk debug. Apabila masih tidak juga ditemukan, barulah anggota lainnya ikut membantu.

Dengan langsung mempercayakan pengerjaan soal itu kepada anggota yang bersangkutan, kita:
  • Mengurangi waktu yang dibutuhkan untuk menjelaskan soal, berdebat solusi, dan miskomunikasi.
  • Anggota tim lainnya dapat tetap fokus membaca soal, dan menemukan soal termudah kedua. Soal ini akan langsung di-coding begitu soal termudah AC.
Apabila anggota yang bersangkutan tidak percaya diri untuk langsung coding, mungkin saja soal itu bukan soal termudah. Apabila tidak ada anggota lain yang menemukan soal yang lebih mudah, maka silakan lakukan coding berdua.

Pada akhirnya, diharapkan semua soal mudah sudah selesai dikerjakan. Kata "mudah" di sini dimaksudkan pada  soal yang pada akhir kontes, hampir semua tim akan AC. Sepengalaman saya biasanya terdapat 2-3 soal seperti ini.



Pertengahan Kontes (01:30 - 03:30)

Strategi Pengerjaan

Ini adalah waktunya untuk mengerjakan soal-soal yang lebih sulit (medium). Hal yang penting untuk dipastikan adalah:
  1. Setiap anggota tim tahu dan mengerti setiap soal yang ada. Entah sudah berapa banyak kontes kurang maksimal yang saya alami karena saya tidak tahu ada soal yang bisa saya kerjakan.
  2. Untuk setiap soal, ada baiknya dibaca oleh setidaknya 2 anggota tim. Hal ini diperlukan untuk mengurangi peluang salah mengerti soal. Entah sudah berapa banyak kontes kurang maksimal yang saya alami karena saya salah mengerti soal, dan teman lainnya salah mengerti soal tersebut dari deskripsi saya (padahal soal tersebut sangat mungkin untuk dikerjakan dan AC).
Luangkanlah beberapa menit untuk memastikan kedua hal di atas terpenuhi. Waktu 15 menit yang digunakan untuk memahami semua soal tersisa sangat sepadan dengan menghilangkan peluang adanya "aduuuh... harusnya tadi baca soal ini..." pada akhir kontes.

Mengenai pengerjaan, soal yang dihadapi kali ini mungkin butuh diskusi dan analisis bersama. Tariklah salah satu teman untuk berdiskusi, terutama bila Anda tahu bahwa ia sekiranya memiliki pengetahuan tentang algoritma atau struktur data yang diperlukan. Seringnya berlatih bersama akan meningkatkan pengetahuan Anda tentang apa yang teman Anda ketahui.

--

Istirahat

Semakin lama seseorang duduk-duduk, berpikir, dan coding, semakin cepat orang itu untuk jenuh. Apalagi kalau itu dilakukan selama 2 jam. Tidak perlu ragu apabila selama periode ini Anda butuh istirahat. Misalnya keluar untuk ke toilet, makan sesuatu, atau kombinasi dari keduanya. Meluangkan 5 menit untuk istirahat merupakan pengeluaran yang sepadan juga untuk menjaga stamina selama kompetisi. Sebagai bonus, kadang-kadang saat berjalan ke toilet Anda bisa mendapatkan inspirasi. Saya pernah beberapa kali mendapatkan ide saat melakukan hal tersebut.

Tapi tentu saja jangan beristirahat terlalu sering. Anggota tim lainnya sedang bekerja keras, dan butuh partisipasi Anda.

--

Moral

Pada bagian ini, saya juga ingin memperkenalkan sebuah konsep yang baru saya pahami setelah beberapa kali kontes tim, yaitu moral.

Moral ini bukan nilai baik atau buruk yang diambil pada akhir suatu cerita. Moral yang saya maksud berasal dari kata morale pada Bahasa Inggris, yang artinya seperti antusiasme dalam mengerjakan sesuatu. Memang kebetulan kata moral dan morale pada Bahasa Inggris diserap ke Bahasa Indonesia menjadi kata yang ejaannya sama, yaitu moral.

Sebagai contoh, mengapa dalam kegiatan berkelompok kadang-kadang kita diminta membuat yel-yel? Apakah untuk lucu-lucuan? Mungkin, dan menurut saya tujuan utamanya adalah untuk membuat tim menjadi kompak dan antusias dalam mencapai tujuan. Ketika ada anggota tim yang lemas, mulai kurang bersemangat, atau kehilangan motivasi, lakukanlah yel-yel bersama. Yel-yel ini akan meningkatkan moral tim.

Contoh lainnya adalah pada warcry, yaitu kata-kata yang diucapkan saat peperangan, misalnya "merdeka atau mati!". Pengucapan kata-kata ini akan membangkitkan semangat prajurit untuk ingat dengan tujuan mereka dan terus bertempur. Pengucapan warcry akan meningkatkan moral prajurit.

Apabila warcry diucapkan dengan wajah seperti ini, semangat berperang akan membara.

Kembali ke urusan ICPC. Moral tim sangat penting selama kompetisi berlangsung. Lima jam berkompetisi adalah waktu yang panjang. Mulai putus asa ketika terus menerus mendapatkan WA pada soal tingkat menengah adalah hal yang sering saya alami. Setiap kali mendapatkan WA lagi pada suatu soal, semakin tinggi tingkat frustrasi saya. Lalu apa yang terjadi? Bisa saja saya menjadi tidak semangat lagi untuk meneruskan kompetisi dan menjadi "stayer" kalau di istilah battlenet; alias pemain yang tidak lagi berjuang dan pasrah menunggu kekalahan.

Namun, ada efek yang lebih parah dari kehilangannya semangat salah satu anggota tim. Efek ini adalah hilangnya semangat dari seluruh anggota tim. Ketika seseorang melihat teman seperjuangannya tidak lagi semangat, mungkin saja ia menjadi kecewa, sedih, ikut putus asa, atau bahkan kesal. Moral yang ada pada seluruh anggota tim hilang. Efek perasaan negatif ini akan menghancurkan performa tim pada kompetisi.

Sejauh ini, saya selalu merasakan penurunan moral ketika mendapatkan WA terus menerus. Memang tidak langsung menjatuhkan, dan dalam tim kami selalu berkata "ayo-ayo, dicoba lagi, dicari mana yang salah". Namun apa dayanya apabila WA terus berlangsung, dan tidak ada soal AC selama 2 jam?

Pengaruh sebaliknya saya rasakan ketika mendapatkan AC. Setiap AC yang didapatkan akan meningkatkan moral tim. Anggota tim menjadi senang dan bersemangat untuk mencari solusi untuk soal lainnya. Rasa percaya diri meningkat. Seluruh perasaan positif ini sangat membantu tim dalam mencapai performa terbaik.

Lalu bagaimana caranya untuk menjaga moral tim tetap pada keadaan yang sehat? Sepengalaman saya, yang bisa dilakukan adalah:
  • Apabila sudah mendapatkan 3x WA berturut-turut pada suatu soal, coba ganti soal lain untuk dikerjakan. Cetak kodenya, lalu coba debug di kertas, sementara teman lain mulai coding untuk soal yang dapat ia kerjakan.
  • Saat debugging di kertas dan menemukan 1 bug, tidak boleh terburu-buru dan langsung mau memperbaikinya di komputer dan submit. Diharuskan untuk membaca seluruh kode dan mendeteksi adanya bug sebanyak mungkin. Sepengalaman saya, perbaikan dapat dilakukan kalau komputer sudah tidak digunakan anggota tim lainnya. Hal ini juga menjaga konsentrasi anggota tim lainnya tidak terganggu saat coding.
  • Kurangi mengekspresikan frustrasi kepada anggota tim lainnya. Misalnya menghela nafas, cemberut, atau mengucapkan nama hewan. Effect: -1 morale to nearby allies. 
  • (ini saya tidak pernah) Ciptakan sebuah yel-yel atau warcry untuk tim Anda. Secara samar-samar saya ingat ada tim lain yang menggunakan strategi ini.
Efek moral ini baru saya rasakan sejak suatu kontes, yaitu ITBPC 2012. Tim kami mendapatkan WA terus menerus untuk sejumlah soal yang kami kerjakan. Hal ini berlangsung selama 2 jam, dan kami sudah sangat frustrasi. Pada akhirnya, didapatkan 1 soal yang AC. Tiba-tiba kami menjadi semangat lagi dan secara ajaib 1 demi 1 soal lainnya menjadi AC juga. Dengan pengalaman inilah saya merasa betapa pentingnya untuk menjaga moral tim.


Akhir Kontes (03:30 - 05:00)

Menjelang akhir kontes, sangat mungkin tersisa sejumlah soal dengan tingkat kesulitan menengah, dan diperkirakan soal-soal tersebut dapat AC. Teruslah mengejar AC untuk soal-soal tersebut. Kalau sudah tidak ada, berarti sudah saatnya Anda menghadapi soal-soal maut.

Terdapat sebuah filosofi komposisi soal yang saya pelajari pada simposium ICPC World Final 2015. Soal-soal pada kontes akan dirancang sedemikian sehingga:
  1. Setiap soal dapat diselesaikan oleh setidaknya salah satu tim.
  2. Tidak ada tim yang menyelesaikan semua soal.
  3. Setiap tim menyelesaikan setidaknya satu soal.
Butiran (1) dan (2) memberikan makna bahwa Anda perlu memilih soal sulit mana yang hendak diinvestasikan. Soal sulit membutuhkan investasi waktu dan tenaga yang besar. Sekalinya Anda berhasil menyelesaikan soal itu, kemungkinan waktu yang tersisa terlalu sedikit untuk mengerjakan soal sulit lainnya.

Bukannya pesimis, tetapi ini yang biasanya saya alami. Tim kami akan memilih soal yang kira-kira dapat diselesaikan, berdasarkan pengalaman dan jenis soal yang ada. Bila tim tidak punya riwayat yang bagus dalam menyelesaikan soal berjenis algoritma graph yang kompleks, cobalah untuk hindari menghabiskan waktu pada soal tersebut. Cari, dan gunakan waktu untuk soal yang paling mungkin diselesaikan.

Sebagai tambahan, tim yang mampu menyelesaikan soal sulit inilah yang biasanya memenangkan kompetisi. Soal seperti ini biasa disebut decider problem. Dalam suatu kompetisi, bisa saja terdapat 2-3 decider problem.

Keletihan yang dirasakan menjelang akhir kontes biasanya cukup tinggi. Dukunglah anggota tim yang sedang bekerja, misalnya memperhatikan anggota tim yang sedang coding. Ketika seseorang yang sudah kelelahan dibantu untuk coding, ia akan lebih termotivasi untuk terus bekerja. Apabila orang yang sedang menulis kode sudah merasa percaya diri, dan kode program yang ditulis ternyata sederhana, segeralah beralih ke anggota tim yang satunya untuk mendiskusikan soal lainnya. Waktu tersisa yang sedikit bukan alasan untuk langsung menyerah dan bersantai.

Jagalah terus moral tim! Apabila pada pertengahan kontes tim Anda berhasil menjaga moral yang baik, maka bagian akhir kontes umumnya dapat terjaga pula. Hasil kontes pada akhirnya akan maksimal.


Kontes Berakhir

Berterimakasihlah pada rekan tim atas kerja sama yang telah berlangsung selama kompetisi. Apabila kerja sama tim yang terlaksana baik, maka pada kontes berikutnya tim Anda akan lebih kokoh lagi.

Apabila ternyata kontes yang berlangsung kurang maksimal, boleh saja dilakukan sesi evaluasi untuk mengetahui apa saja kekurangan selama kontes berlangsung.

Jangan lupa untuk bersantai. Biasanya saya langsung makan yang banyak, menjarah hidangan yang diberikan.


Penutup

Kontes ICPC mirip seperti olah raga berkelompok. Strategi dan kerja sama merupakan unsur yang penting dalam menjamin tim bekerja secara maksimal.

Tidak ada komentar :

Posting Komentar