Category Archive: Artechno Festival

Nov 23 2011

Artechno Festival Programming Competition – Tahun Kabisat (C)

Soal ini sudah pernah saya tulis untuk Porseni VI Imilkom USU 2011. Perbedaannya hanyalah pada output yang diminta.

Diberikan tahun dan interval, tampilkan tahun tersebut beserta tahun-tahun sebelum dan sesudahnya. Untuk tahun yang merupakan tahuun kabisat, tandai dengan tanda bintang/asterisk (*).

Sebagai contoh, diberikan tahun 2011 dan interval 3. Maka tampilkan tahun tersebut (2011) dan 3 tahun setelahnya (2012, 2013, 2014):

2011
2012 *
2013
2014

Jika interval merupakan bilangan negatif, tampilkan tahun-tahun sebelumnya. Sebagai contoh diberikan tahun 2011 dan interval -3, maka:

2011
2010
2009
2008 *

Input:
Input diawali oleh bilangan bulat T (1 <= T <= 1000) yakni banyaknya test case.
T baris berikutnya (di mana setiap baris adalah sebuah test case), terdiri dari dua bilangan bulat Y (1000 <= Y <= 9999) yang merupakan tahun dan N (-1000 <= N <= 1000) yang merupakan interval.

Output:
Untuk setiap test case, tampilkan ‘#’ yang diikuti oleh nomor urut test case (1, 2, 3, …). Selanjutnya tampilkan tahun pada input (Y), tahun-tahun sebelum/setelahnya, serta keterangan kabisat berupa tanda bintang/asterisk (*) untuk tahun yang merupakan tahun kabisat.

Contoh input:
3
2011 3
2011 -3
2011 0

Contoh output:
#1
2011
2012 *
2013
2014
#2
2011
2010
2009
2008 *
#3
2011

———-

Pada soal ini, banyak peserta yang terjebak dengan definisi tahun kabisat. Banyak submission yang diterima judge hanya menyertakan pengujian if (tahun % 4 == 0) untuk pengujian tahun kabisat.

Definisi tahun kabisat yang benar adalah:

Jika tahun HABIS dibagi 100, maka tahun tersebut HARUS habis dibagi 400.

Atau…

Jika tahun TIDAK HABIS dibagi 100, maka tahun tersebut HARUS habis dibagi 4.

Berikut ini merupakan contoh solusi dalam bahasa Java:

import java.util.Scanner;

public class C {

    private static boolean isKabisat(int tahun)
    {
        if (tahun % 100 == 0) {
            return (tahun % 400 == 0);
        } else {
            return (tahun % 4 == 0);
        }
    }

    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);

        int no = 0;

        int nTC = sc.nextInt();
        while (nTC-- > 0) {
            int Y = sc.nextInt();
            int N = sc.nextInt();

            System.out.println("#" + ++no);
            System.out.println(Y + (isKabisat(Y) ? " *" : ""));

            if (N > 0) {
                for (int i = 1; i <= N; i++) {
                    int tahun = Y + i;
                    System.out.println(tahun + (isKabisat(tahun) ? " *" : ""));
                }
            } else {
                N = Math.abs(N);
                for (int i = 1; i <= N; i++) {
                    int tahun = Y - i;
                    System.out.println(tahun + (isKabisat(tahun) ? " *" : ""));
                }
            }
        }
    }

}

Input dan output yang digunakan juri dapat dilihat di sini.

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • Google Buzz
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

Permanent link to this article: http://www.muhammadalvin.net/2011/11/artechno-festival-programming-competition-tahun-kabisat/

Nov 22 2011

Artechno Festival Programming Competition – Rute Maksimal (B)

Soal ini merupakan soal lain yang dibuat oleh Bapak Mohammad Andri Budiman.

Perhatikan segitiga berikut:

Tulis program untuk menghitung nilai terbesar dari angka-angka yang ada dalam jalur yang dimulai dari atas sampai ke bawah. Setiap langkah dalam jalur dapat secara diagonal ke bawah kiri atau kanan.

Pada contoh di atas, nilai terbesar adalah 30, diperoleh dari jalur 7-3-8-7-5.

Input:
Input diawali bilangan bulat T (1 <= T <= 1000) yakni banyaknya test case.
Untuk setiap test case, diberikan bilangan bulat N (1 < N <=100) yang merupakan ukuran segitiga. N baris berikutnya berisi bilangan bulat X (0 <= X <= 99) yang merupakan angka pada setiap baris segitiga.

Output:
Untuk setiap test case, tampilkan sebuah baris berisi bilangan bulat yang merupakan jumlah terbesar yang didapat dari rute yang dijelaskan di atas.

Contoh input:
2
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
2
1
1 1

Contoh output:
30
2

———-

Pada dasarnya, dari setiap posisi angka dalam segitiga, kita boleh turun ke kiri atau ke kanan. Jika digambarkan, menjadi seperti di bawah ini (hanya beberapa jalur yang digambarkan):

Jika setiap angka kita rapatkan ke kiri, segitiga tersebut akan menjadi seperti ini:

Untuk menyelesaikannya, kita perlu meng-update angka di setiap posisi. Angka hasil update ini menunjukkan berapa hasil penjumlahan terbesar yang dapat dilakukan dari posisi tersebut ke bawah.

Pertama lihat baris terakhir (yang berisi angka 4, 5, 2, 6, 5). Karena ini paling bawah tentu saja tidak mungkin lagi untuk turun. Maka angka di baris ini tidak ada yang di-update.

Selanjutnya perhatikan baris kedua dari bawah (yang berisi angka 2, 7, 4, 4).

Dari posisi angka 2 (angka pertama dari kiri), kita bisa turun ke angka 4 atau turun ke angka 5. Jika turun ke angka 4, kita bisa memperoleh jumlah 6 (diperoleh dari menambahkan angka di posisi saat ini [yaitu 2] dengan angka di posisi tujuan [yaitu 4]). Jika turun ke angka 5, kita bisa memperoleh jumlah 7 (diperoleh dari menambahkan angka di posisi saat ini [yaitu 2] dengan angka di posisi tujuan [yaitu 5]). Maka dari posisi ini, kita bisa mendapatkan jumlah 6 atau 7. Yang terbesar (pada gambar diberi istilah best) adalah 7. Sehingga, kita update angka di posisi ini menjadi 7.

Selanjutnya dari posisi angka 7 (angka kedua dari kiri), kita bisa turun ke angka 5 sehingga memperoleh jumlah 12 atau turun ke angka 2 sehingga memperoleh jumlah 9. Yang terbesar adalah 12. Update angka di posisi ini menjadi 12.

Begitu selanjutnya hingga semua angka di baris tersebut telah di-update. Pada hasil akhir, kita akan memperoleh angka 7, 12, 10, 10 di baris ini.

Setelah satu baris selesai, lanjut ke baris berikutnya (baris ketiga dari bawah). Lakukan hal yang sama seperti sebelumnya. Maka hasil akhir di baris ini akan seperti ini:

Baris selanjutnya (baris keempat dari bawah) akan menghasilkan ini:

Baris selanjutnya (baris kelima dari bawah — yaitu baris terakhir [paling atas]) akan menghasilkan ini:

Karena sudah tidak ada lagi baris yang akan diproses, maka angka yang terletak di baris terakhir (paling atas) tersebut adalah jawaban yang diminta.

Berikut ini merupakan contoh solusi dalam bahasa Java:

import java.util.Scanner;

public class B {

    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);

        int nTC = sc.nextInt();
        while (nTC-- > 0) {
            int N = sc.nextInt();

            int[][] segitiga = new int[N][N];
            for (int i = 0; i < N; i++) {
                for (int j = 0; j <= i; j++) {
                    segitiga[i][j] = sc.nextInt();
                }
            }

            // mulai dari baris ke-2 dari bawah sampai paling atas
            for (int i = N - 2; i >= 0; i--) {
                for (int j = 0; j <= i; j++) {
                    // mana yg lebih optimal, turun ke kiri (segitiga[i + 1][j]) atau ke kanan (segitiga[i + 1][j + 1])?
                    int best = Math.max(segitiga[i][j] + segitiga[i + 1][j], segitiga[i][j] + segitiga[i + 1][j + 1]);
                    segitiga[i][j] = best; // update!
                }
            }

            System.out.println(segitiga[0][0]); // angka di paling atas sekarang adalah yg maksimum
        }
    }

}

Input dan output yang digunakan juri dapat dilihat di sini.

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • Google Buzz
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

Permanent link to this article: http://www.muhammadalvin.net/2011/11/artechno-festival-programming-competition-rute-maksimal/

Nov 22 2011

Artechno Festival Programming Competition – Tabel Perkalian (A)

Soal ini dibuat oleh Bapak Mohammad Andri Budiman, salah seorang dosen di Program Studi S-1 Ilmu Komputer FMIPA USU.

Diberikan sebuah bilangan bulat N (1 <= N <= 100), buat sebuah tabel perkalian ukuran N x N. Baris ke-i kolom ke-j (1 <= i, j <= N) merupakan hasil perkalian dari i dan j (yaitu i * j).

Input:
Input diawali bilangan bulat T (1 <= T <= 1000) yakni banyaknya test case.
T baris berikutnya (di mana setiap baris adalah sebuah test case) terdiri atas bilangan bulat N.

Output:
Untuk setiap test case, tampilkan tabel perkalian N x N yang diminta.

Contoh input:
2
3
4

Contoh output:
1 2 3
2 4 6
3 6 9
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16

———-

Soal ini tidak membutuhkan analisis yang rumit. Dengan membaca soal, seharusnya sudah mengerti apa yang diminta. Berikut ini merupakan contoh solusi dalam bahasa Java:

import java.util.Scanner;

public class A {

    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);

        int nTC = sc.nextInt();
        while (nTC-- > 0) {
            int N = sc.nextInt();

            for (int i = 1; i <= N; i++) {
                for (int j = 1; j <= N; j++) {
                    if (j > 1) {
                        System.out.print(" ");
                    }

                    System.out.print(i * j);
                }

                System.out.println();
            }
        }
    }

}

Input dan output yang digunakan juri dapat dilihat di sini.

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • Google Buzz
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

Permanent link to this article: http://www.muhammadalvin.net/2011/11/artechno-festival-programming-competition-tabel-perkalian/

Nov 20 2011

Artechno Festival Programming Competititon – Final Contest

Setelah trial session selama 30 menit, panitia membagikan soal sesungguhnya dan final contest dimulai. Jika tadi saat trial session judge kebanjiran jawaban, maka kali ini saya dan Izhari Ishak Aksa (judge lainnya) lebih memiliki waktu santai.

Submission (kiriman jawaban) pertama diterima dari Fauzana (USU) pada menit ke-7 untuk soal D – Bilangan Bulat. Tetapi submission ini dinyatakan No – Wrong Answer, karena peserta mencoba menampilkan hasil floor() dan ceil() dari bilangan pada input.

Selanjutnya pada menit ke-8, Roy (Politeknik DEL) melakukan submission untuk soal A – Tabel Perkalian dan dinyatakan Yes.

Pada menit ke-9, Fauzana melakukan submission kedua untuk soal D – Bilangan Bulat dengan mengubah deklarasi variabel dari:

float N;

menjadi:

long double N;

Tetapi submission ini masih No – Wrong Answer.

Mungkin karena dua kali melakukan submission dan belum mendapatkan Yes, ditambah dengan hasil sementara scoreboard yang memperlihatkan sudah ada peserta lain yang mendapatkan Yes untuk soal A – Tabel Perkalian, Fauzana pindah ke soal tersebut. Pada menit ke-12, ia mendapatkan Yes untuk soal A – Tabel Perkalian pada submission pertama.

Pada menit yang sama, peserta lain dari Politeknik DEL (Maldini) berhasil mendapatkan Yes untuk soal A – Tabel Perkalian.

Sepertinya Fauzana masih penasaran dengan soal D – Bilangan Bulat. Pada menit ke-14 ia kembali melakukan submission untuk soal tersebut dengan mengubah deklarasi variabel dari:

long double N;

menjadi:

long long double N;

Tetapi masih sama seperti sebelumnya, submission ini dinyatakan No – Wrong Answer.

Pada menit ke-23, peserta lain dari Politeknik DEL (Michael) berhasil mendapatkan Yes untuk soal A – Tabel Perkalian. Dengan hasil ini, semua peserta dari Politeknik DEL berhasil menyelesaikan soal A – Tabel Perkalian tersebut.

Dan peserta USU kedua yang berhasil menyelesaikan soal A – Tabel Perkalian adalah Ismail, yang melakukan submission pada menit ke-34.

Selama hampir 1 jam berikutnya, ada beberapa submission diterima untuk soal A – Tabel Perkalian, C – Tahun Kabisat dan D – Bilangan Bulat. Soal C – Tahun Kabisat merupakan soal dengan jumlah submission terbanyak (yaitu 32 submission), yang diikuti dengan soal D – Bilangan Bulat (28 submission) kemudian A – Tabel Perkalian (16 submission).

Pada menit ke-81, Roy melakukan submission untuk soal E – Pesan Rahasia. Tetapi submission tersebut dinyatakan No – Wrong Answer. Berikutnya pada menit ke-108, ia melakukan submission untuk soal G – Hitung Prima, dan juga dinyatakan No – Wrong Answer.

Pada menit ke-109, seorang peserta mengirimkan klarifikasi ke juri tentang soal C – Tahun Kabisat. Juri menjawab klarifikasi tersebut dan mengirimkan jawaban berikut ke seluruh peserta:

Hati-hati dengan definisi tahun kabisat.
Beberapa contoh tahun kabisat: 2000, 2004, 2008.
Beberapa contoh BUKAN tahun kabisat: 1900, 2001, 2002, 2003.

Sepertinya klarifikasi tersebut ‘menyadarkan’ Roy dan Fauzana. Mereka berhasil mendapatkan Yes untuk soal C – Tahun Kabisat pada menit ke-121 (Roy) dan menit ke-151 (Fauzana).

10 menit sebelum kontes berakhir (menit ke-170), Fauzana kembali melakukan submission untuk soal D – Bilangan Bulat. Kali ini sepertinya ia ‘ragu’ dengan cout-nya C++. Ia mengubah:

cout << floor(N) << " " << ceil(N) << "\n";

menjadi:

printf("%lld %lld\n", floor(N), ceil(N));

Dan ini masih tetap dinyatakan No – Wrong Answer.

Submission terakhir pada kontes ini diterima dari Eko (USU) pada menit ke-178 untuk soal D – Bilangan Bulat yang dinyatakan No – Wrong Answer.

Akhirnya, saat kontes menyisakan waktu kurang dari 1 menit, peserta mulai duduk dengan muka yang lebih rileks, ada yang melihat ke kanan dan kiri sambil senyum ke sesama temannya, berbeda dengan hampir 3 jam sebelumnya di mana setiap peserta memasang muka serius.

Setelah kontes berakhir, ada 3 soal yang sama sekali tidak ada submission, yaitu B – Rute Maksimal, F – Lingkaran dan Persegi dan H – Monyet dan Pisang. Soal B – Rute Maksimal dan H – Monyet dan Pisang sebenarnya memiliki cara penyelesaian yang mirip. Sedangkan soal F – Lingkaran dan Persegi, murni merupakan soal matematika yang membutuhkan sedikit analisis, rumus luas lingkaran serta teorema Pythagoras.

Hal cukup ‘aneh’ yang terjadi adalah saat peserta melakukan submission menggunakan JDialog-nya Java. Tentu saja, judge cukup bingung dengan ini. Setelah kami mendiskusikannya, akhirnya kami kirim No – Other – Contact staff. Tetapi peserta tersebut tidak mengirimkan klarifikasi walaupun kami tunggu-tunggu :D .

Contest selesai, pemenang telah diperoleh, dan acara berlanjut ke gedung sebelah untuk penyerahan hadiah. Dan ini waktu bagi saya untuk makan siang (padahal ini sudah hampir maghrib, dan baru sekarang memang terasa laparnya), sambil memakan kue yang sudah disediakan panitia beberapa kali :D .

Hasil akhir scoreboard bisa dilihat di sini. Khusus untuk mahasiswa Program Studi S-1 Ilmu Komputer FMIPA USU, bisa juga ke sini.

Soal berikut pembahasan pada final contest ini sebagai berikut:

 

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • Google Buzz
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

Permanent link to this article: http://www.muhammadalvin.net/2011/11/artechno-festival-programming-competititon-final/

Nov 20 2011

Artechno Festival Programming Competition – Trial Session

Sabtu, 19 November 2011 setelah selesai jam makan siang (walaupun saya tidak merasa lapar sama sekali), peserta dipersilahkan memasuki ruangan. Peserta diberi kesempatan untuk memeriksa environment yang telah disediakan panitia, seperti compiler dan text-editor. Supaya pertandingan fair, peserta bebas memilih text-editor favoritnya. Panitia juga menginstall text-editor lain yang diinginkan peserta.

Pada trial session ini, peserta dikenalkan secara singkat apa itu PC^2, bagaimana men-submit jawaban, melihat status jawaban yang sudah di-submit, dll. Selama trial session berlangsung, peserta diperbolehkan bertanya jika ada kesulitan dalam menggunakan PC^2, terutama bagi mereka yang baru pertama kali menggunakannya.

Selama trial session, judge ‘kebanjiran’ jawaban. Ini wajar, karena soal yang disediakan untuk trial session hanya soal ‘ecek-ecek’, seperti menuliskan hello world dan menjumlahkan bilangan :-) . Ada peserta yang melakukan submission (mengirim jawaban) yang sama beberapa kali.

Masalah utama yang dihadapi judge (dan juga peserta) adalah ketika source code C++ ditambakan dengan kode berikut:

#include <iostream>
using namespace std;

int main()
{
    // program utama

    system("pause");
}

Saat peserta melakukan test dari PC^2, tentu saja program tersebut tidak pernah berhenti. Masalah yang terjadi adalah, setelah program tersebut di-terminate, tombol Test dan Submit pada aplikasi PC^2 untuk team tidak aktif kembali.

Saya yang belum pernah mengalami masalah ini sebelumnya hanya menganjurkan solusi: Exit PC^2, lalu login ulang. Yup, masalah selesai :-) .

Source code tersebut ternyata juga membuat masalah di judge. Setelah meng-execute program tersebut, lalu men-terminate-nya secara manual, untuk selanjutnya judge tidak bisa meng-execute jawaban-jawaban berikutnya.

Solusi yang sama terpaksa dilakukan, judge exit dari PC^2 nya kemudian login ulang. Masalah terselesaikan :-) .

Sebagai informasi, sistem operasi yang digunakan oleh peserta dan judge adalah Windows 7. Saya tidak tahu apakah pada sistem operasi lain masalah tersebut juga muncul atau tidak.

Maka, di akhir trial session, judge memberi tahu ke peserta untuk tidak menyertakan tambahan kode tersebut ketika men-submit jawaban. Selama peserta melakukan coding, itu tidak masalah.

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • Google Buzz
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

Permanent link to this article: http://www.muhammadalvin.net/2011/11/artechno-festival-programming-competition-trial-session/

Older posts «

» Newer posts