Monday, September 30, 2013

Penyisihan BNPCHS 2013

Halo semuanya. Sudah lama tidak ngeblog, banyak kontest yang saya ikuti tapi belum masuk blog ini. eg Compfest 2012, Compfest 2013, Gemastik 2012, ICPC 2012/INC2012. Semoga masih ingat di pikiran saya dan bisa saya torehkan curhatannya di blog ini :)

Kali ini, saya akan menceritakan tentang BNPCHS (Bina Nusantara Programming Contest for High School) 2013 yang baru saja dilewati :29-September-2013:. Kebetulan saya adalah juri untuk bagian pemrograman (PG di judge otomatis).

Judge kali ini dipersembahkan oleh : Saya, Jennifer Santoso, Alvin Setiadi, Teddy Budiono, Daniel Agusta, Jessica Handojo, Jacky Wijaya, Sandi Karunia.

29-9-2013 13.00
Saya baru sampai di Binus Kampus Anggrek, dan ternyata di group thomas (Sekolah yang saya bina untuk programming) ternyata protes tidak bisa masuk ke server, kata mereka mungkin server mati lampu. Karena saya belum sampai ruang judging, segera menuju TKP pakai lift (FYI judging ada di lantai 7 :|). Pada saat sampai sana, saya laporkan bahwa beberapa anak tidak bisa mengerjakan soal karena masalah koneksi.

Beberapa setelah saya bisa memegang computer, ternyata ketika saya buka sitenya, lama juga. Ternyata memang servernya down.

29-9-2013 14.00
Setelah masih down, group Olimpiade Informatika ternyata pada protes. (Maaf yah semua, di Binus pada saat itu juga sedang mencari penyelesaian). Lalu tidak lama berselang, datang ko Risan langsung saja diikuti dengan bahasan soal yang saya tidak mengerti =)). Setelah selesai bahasan soal (Yang diketahui ternyata soal Codeforces), dia mengajarkan tentang beberapa teori dalam matematika. Karena memang sedang tidak menjuri, kami memperhatikan :)

Selang sekian lama, ternyata Alvin bermain dengan sebuah web untuk latihan mengetik yang saya tidak tahu =)), lalu kami menantang ko Risan untuk memainkannya karena WPM dia cepat sekali. Setelah dilihat ternyata memang cepat dan kita request untuk menggantinya dalam bahasa yang aneh aneh ie. Jepang =)).

29-9-2013 15.30
Setelah server yang berdarah darah, akhirnya babak penyisihan dimulai. Pertama kali adalah sesi PG, dimana peserta akan mendapat 50 soal pilihan ganda yang berbeda beda satu peserta dengan peserta lainnya, namun soalnya sama. Meskipun agak lama, tetapi PG akhirnya selesai dan diakhiri posisi 1 adalah : raditya1710 dengan point 96. :o

29-9-2013 16.35
Babak pemrograman dimulai. Di babak ini, peserta akan diberikan 3 buah soal pemrograman dengan tingkat kesulitan mudah, untuk menguji sejauh mana siswa dapat menalarkan logikanya kedalam suatu program.

A. Segitiga
Deskripsi : Diberikan N buah angka, cek ada berapa kemungkinan bilangan yang bisa membentuk segitiga.
Solusi : Di soal sudah diberitahu bahwa, 3 buah bilangan bisa membentuk segitiga apabila 2 angka terkecil, jika dijumlahkan, hasilnya harus lebih besar dari bilangan terbesar. Dari sini kita bisa membuat loop 3 tingkat dimana untuk setiap 3 buah bilangan, cek apakah jumlah 2 bilangan terkecilnya lebih besar dari bilangan terbesarnya atau tidak. Kita dimudahkan dengan fakta bahwa "Bilangan yang diberikan, terurut menaik dan unik". Jadi siswa tidak perlu mengurutkan angkanya.

B. Substring Berkarakter Unik
Deskripsi : Diberikan sebuah string, cek berapa panjang substring maksimal yang didalamnya tidak ada karakter yang duplikat.
Solusi : Kita juga bisa menggunakan 3 tingkat loop, dimana loop pertama untuk start, loop kedua untuk end, dan loop ketiga untuk menghitung karakter dari start sampai end. Disini kita harus menyimpan karakter pada sebuah array frekuensi yang digunakan untuk mengecek kevalitan substring tersebut. Jika substring tersebut valid, maka kita tinggal mencari mana yang maksimal.

C. Rotasi
Deskripsi : Diberikan sebuah angka 9 digit. Cari rotasi minimum dari angka tersebut.
Solusi : Pertama kalian bisa menggabungkan angka tersebut dengan angka itu sendiri. Contoh N = 123456789. Maka kita gabungkan N = 123456789123456789. Lalu kita ambil 9 substring pertama dengan panjang 9 menjadi A = {123456789, 234567891, 345678912, 456789123, 567891234, 678912345, 789123456, 891234567, 912345678}. Setelah itu, kalian tinggal mencari minimumnya dengan loop atau diurutkan. Namun hati hati jika angka tersebut mengandung digit 0, jika dicari minimumnya / diurutkan, maka yang paling kecil pasti yang digit pertamanya adalah digit 0. Oleh karena itu, kalian harus menyortir substring yang digit pertamanya 0.

Tidak seperti babak pemanasan yang jawabannya tertera dibawah soal, kali ini jawaban harus dipikirkan oleh peserta (YA IYA LAH ! ! !) =)). Setelah melalui babak pemrograman yang panas, maka evanlimanto menjadi pemimpin dalam babak ini (Unggul last submited dengan rank dibawahnya).

Kami mohon maaf atas gagalnya server pada saat babak pemanasan, tapi semoga soal soalnya dapat menghibur kalian :) Untuk yang lolos ke babak final akan diupdate di blog ini setelah ada pengumumannya.

UPDATE
Several Fun Fact :
  1. Soal pemrograman bocor, karena pada saat jam 14.00 (Waktu babak pemrograman normal), ada yang belum logout terus muncul soalnya.
  2. Ada 2 submission java dan semuanya diambil oleh Jessica Handojo =))
  3. Saya menjudge terbanyak :)) *Kayaknya
  4. Waktu ko Risan lagi ngetik (Di web yang buat latihan ngetik), kita teriak 3. 2. 1, karena dikira waktunya beneran habis, dia lepas. Gak taunya masih ada 5 detik lagi =))
  5. Daniel main Candy Crush lvl 256 (Kalau tidak salah) [Tepat pada saat penyisihan. Lvlnya sekarang mungkin lebih tinggi]
  6. Tiba tiba ada submission isinya "Tolong Compile Aku Dong :)"
  7. Komputer saya awalnya tidak bisa menjudge, karena setiap judge hasilnya no output Runtime. Untung minta Jessica untuk rejudge
  8. Server down dari awal contest sampai sekitar 2 jam.
  9. JUDGE THIS ! ! !