Feedback Penyisihan INC 2011

belasan juri dan submitter,  ratusan submission, ribuan klik, diiringi oleh cucuran keringat para juri yang kepanasan, akhirnya kontes selesai….

Hari ini berlangsung penyisihan INC 2011. Ini pertandingan paling panas yang pernah saya liat, juri sampat berkeringat dikarenakan oleh AC yang enggak bener :-)

Tulisan ini saya buat untuk menghilangkan kebingungan peserta (terutama yang baru ikut serta pada kontes pemrograman) terhadap hasil penilaian juri. Banyak peserta mendapatkan run time error dan compile error yang seharusnya bisa dihindari dengan mudah.

Dari banyak submission oleh peserta, banyak yang melakukan kesalahan kesalahan, bahkan beberapa melakukan kesalahan yang telah ditulis di halaman depan web competition (saat akan login), hayoo pada ga baca ya? :p  Biar enggak penasaran, saya akan bahas kesalahan kesalahan yang saya temukan saat pertandingan. Tentu saja saya enggak membaca submission semuanya, hanya kebetulan beberapa yang ketemu aja.

  • C++: gunakan int main(), bukan void main(), perhatikan compiler yang digunakan.
    Compiler yang digunakan adalah mingw (g++) dan tidak menggunakan gcc bahkan untuk file dengan  berextension .c. Jika menggunakan extension file .c dan menggunakan void main akan mendapat compile error. Lucunya, jika keyword “void” dibuang sehingga fungsi utama hanya main() (tanpa tipe kembalian), tidak akan menyebabkan compile error :-)
  • Java: jangan menggunakan package, perhatikan command run di bawah.
    Program dicompile secara otomatis dari current directory dan langsung dieksekusi sesuai perintah yang telah disebutkan. jika menggunakan package akan menyebabkan error, karena file diharapkan berada dalam struktur folder
  • (C/C++) Penggunaan getch()
    getch() yang digunakan di akhir program bisa menyebabkan program tidak berhenti (masih menunggu input dari keyboard), akibatnya program bisa mendapat Time Limit Exceed.
  • (Java) Penggunaan GUI (JPanel, dsb)
    Program harus membaca input dari standard input (stdin) dan mengoutput ke standard output (stdout) yang keduanya ada di console (bukan GUI). Penggunaan GUI bisa menyebabkan program tersebut Time Limit Exceed (juri tidak memberikan input ke GUI yang ditampilkan sehingga program terus menunggu).
    • Penggunaan format string %lld pada integer 64-bit
      Format string yang digunakan untuk tipe data long long atau __int64 (integer 64-bit) di DevC++ adalah %I64d, bukan %lld (DJGPP).
      int main()
       {
       __int64 x;
       scanf( "%I64d", &x );
       printf( "%I64d", x );
       return 0;
       }

      Kesalahan ini tidak menyebabkan program tidak bisa dikompile, namun output yang dicetak oleh program akan tidak sesuai dengan apa yang diinginkan (integer 64 bit).

  • Runtime error pada beberapa program Java
    Hari ini gua nemu beberapa runtime error pada program java, ada yang sampai menelepon mempertanyakan hal ini, padahal di komputernya baik baik saja, kenapa mendapat hasil run time error. Setelah dilakukan penelitian asal asalan yang tidak komprehensif, ditemukan bahwa peserta melakukan beberapa kesalahan seperti :
    • menggunakan fungsi dari class Scanner, yaitu nextInt() padahal dalam inputan disebutkan bahwa inputan dapat mencapai bilangan 64bit, ketika membaca angka yang sangat besar (misal 1000000000000), akan menyebabkan exception.
    • membaca line yang tidak ada
      Salah satu source code peserta yang saya temukan, menggunakan perintah seperti ini
      if (scan.nextLine()!="")

      yang mungkin dimaksudkan untuk mengecek apakah inputan sudah habis, namun ini akan berakibat fatal, yaitu ketika sudah sampai line terakhir dan memanggil perintah diatas, akan menyebabkan runtime error. Solusi yang benar adalah menggunakan fungsi seperti hasNextLine, hasNext, hasNextInt, dsb untuk mengecek apakah masih ada inputan

  • Konstanta terlalu besar untuk suatu tipe data
    Saya menemukan ada yang mengassign tipe data long long pada C++ seperti ini long long x=1000000000000;  Akan mengakibatkan error konstanta terlalu besar, solusinya adalah dengan menambahkan LL di akhir, 1000000000000LL. Jika tidak ditambahkan LL maka akan dianggap sebagai int, karena itu compiler akan mengembalikan pesan error
  • Array index out of bound (c/c++,java)
    kesalahan klasik, mendeklarasikan 100 elemen pada array, namun mengakses elemen di luar indeks 0..99
  • Memanggil fungsi tanpa meng-include header
    Menggunakan fungsi tanpa include header yang tepat, misalnya abs tanpa include stdlib.h. Mungkin peserta menggunakan IDE semacam dev-C++ yang terkadang agak “bego”. Sebagai contoh hanya menginclude iostream dan menggunakan fungsi abs tidak akan menyebabkan compile error jika compile dilakukan dari dalam IDE Dev-C++ namun jika dilakukan dari command line akan menyebabkan compilation error. Rule of thumb : jika bisa dicompile dari cmd, akan bisa dicompile di tempat juri, karena begitulah cara juri melakukan compilation :-)
  • Mengakses variable di luar scope
    Saya menemukan ada peserta yang melakukan hal semacam ini
    for(int j =0;j<n;j++) {
    .....
    }
    if (j .... ) {}
     

    pada code diatas, variable j hanya di deklarasikan dalam scope for, namun diakses di luar for. Compiler c/c++ yang benar akan memberikan compile error untuk kasus seperti ini. Namun sepengetahuan saya, pada compiler visual c++ 6.0 kode diatas adalah legal. Pada visual c++ 6.0 jika dibuat satu lagi block for dan deklarasi variable j di scope for, justru akan memberikan compile error. Dulu saya memakai visual c++ 6.0, ketika submit ke UVA online judge mendapat compile error terus menerus. Setelah mengetahui penyebabnya, saya langsung ganti compiler dan kurang tau lagi dengan visual c++ versi .net

Dari banyak kesalahan yang terjadi pada pengguna bahasa C/C++, kebanyakan disebabkan oleh compiler aneh yang digunakan yang bahasanya tidak standard, seperti borland C++ dengan void main, dan visual C++ 6.0 dengan scoping anehnya. Untuk kontes seperti ini saya sarankan menggunakan compiler mingw. IDE yang dapat digunakan misalnya Dev-C++ atau Code blocks. dev-C++ sudah lama terhenti developmentnya sehingga compiler yang disertakan sudah obsolete yaitu gcc versi 3. Namun bisa saja menggunakan dev-C++ dengan mingw versi terbaru.

Demikian kesalahan yang saya temukan pada kontes kali ini, kalo ada yang ga jelas, feel free to ask :-) Semoga apa yang saya tulis diatas bisa menghilangkan rasa penasaran kenapa dapet compile error / run time error. Dan juga mencegah peserta maki maki juri karena juri dianggep ga jelas :-) (cth makian : wah ditempat saya jalan, kok submit error, juri brengsek!).

Buat peserta yang baru pertama kali ikut dan belum berhasil, silahkan berlatih dan mencoba lagi tahun depan :-) Goodluck buat yang ke final, sampai ketemu!.

Note : kalo ada yang mau complain soalnya susah susah, silahkan hubungin saudara Suhendry Effendy, selaku orang yang bertanggung jawab.

One comment on “Feedback Penyisihan INC 2011

  1. Pingback: ACM-ICPC INC 2011 – Qualification Round » Suhendry's Blog

Tinggalkan Balasan

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Ubah )

Twitter picture

You are commenting using your Twitter account. Log Out / Ubah )

Facebook photo

You are commenting using your Facebook account. Log Out / Ubah )

Connecting to %s