Sesi Latihan OSN IX Halo Dunia Kode soal: osn1001.PAS/C/CPP Batas Run-time: 1 detik / test-case Batas Memori: 16 MB Salah satu soal paling klasik di dunia pemrograman, Halo Dunia. Sayangnya soal tersebut tidak terlalu mudah bagi bebek Pak Dengklek, mereka masih sering bingung mengenai urutan karakter pada kata-kata "Halo Dunia" tersebut. Kini tugas Anda adalah untuk melakukan pengecekan, berapa banyak karakter yang sudah benar pada hasil keluaran program bebek Pak Dengklek. FORMAT MASUKAN Sebuah baris berisi 10 karakter alfabet atau spasi. FORMAT KELUARAN Sebuah baris berisi sebuah bilangan bulat yang menyatakan banyaknya karakter yang sudah benar pada hasil keluaran program bebek Pak Dengklek. CONTOH MASUKAN 1 aHalo Duni CONTOH KELUARAN 1 0 CONTOH MASUKAN 2 HaLo DuNiA CONTOH KELUARAN 2 10 CONTOH MASUKAN 3 Halo World CONTOH KELUARAN 3 5 Penjelasan Pada contoh pertama, kesalahan kecil ternyata terbukti fatal. Pada contoh kedua, meskipun bebek Pak Dengklek menggunakan huruf besar dan kecil secara tak beraturan, setidaknya hasilnya tetap Halo Dunia. Pada contoh ketiga, walau Bahasa Inggris dari dunia adalah world, tidak berarti hasil keluaran program bebek Pak Dengklek benar. Halaman 1 dari 6 Sesi Latihan OSN IX Deret Fibonaci Kode soal: osn1002.PAS/C/CPP Batas Run-time: 1 detik / test-case Batas Memori: 16 MB Salah satu soal klasik lainnya di dunia pemrograman, Deret Fibonaci. Lagi-lagi, soal tersebut tidak terlalu mudah bagi bebek Pak Dengklek, mereka masih sering bingung mengenai urutan suatu bilangan pada deret fibonaci. Kini tugas Anda adalah untuk membantu melakukan pengecekan, urutan ke berapakah suatu bilangan pada deret fibonaci. Deret fibonaci yang dimaksud dalam hal ini dimulai dari bilangan 0 dan 1. Dan, sesuai definisi deret fibonaci, bilangan ketiga dan seterusnya adalah hasil penjumlahan dari dua buah bilangan sebelumnya. Sebagai contoh, sepuluh bilangan pertama dalam deret fibonaci secara berurutan adalah 0 1 1 2 3 5 8 13 21 34. FORMAT MASUKAN Sebuah baris berisi sebuah bilangan bulat (5 ≤ bilangan ≤ 1030) yang dipertanyakan urutannya pada deret fibonaci. Lima puluh persen masukan berisi bilangan yang tidak lebih besar dari 10 000 000 000. FORMAT KELUARAN Sebuah baris berisi sebuah bilangan bulat yang menyatakan urutan bilangan dari masukan pada deret fibonaci. Jika bilangan dari masukan tidak ada pada deret fibonaci, keluarkan bilangan 0. CONTOH MASUKAN 1 5 CONTOH KELUARAN 1 6 CONTOH MASUKAN 2 11 CONTOH KELUARAN 2 0 CONTOH MASUKAN 3 34 CONTOH KELUARAN 3 10 Halaman 2 dari 6 Sesi Latihan OSN IX Pengurutan Bergelembung Kode soal: osn1003.PAS/C/CPP Batas Run-time: 1 detik / test-case Batas Memori: 16 MB Salah satu algoritma paling klasik di dunia pemrograman, algoritma pengurutan bergelembung. Tidak lain, kegunaan dari algoritma tersebut adalah untuk mengurutkan sekumpulan data. Berikut ini adalah contoh kodenya dalam bahasa PASCAL jika data yang dimaksud adalah bilangan bulat: var data:array[1..10000] of longint; n,i,j,temp:longint; begin readln(n); for i:=1 to n do readln(data[i]); for i:=1 to n-1 do for j:=i+1 to n do if (data[i]>data[j]) then begin temp:=data[i]; data[i]:=data[j]; data[j]:=temp; end; for i:=1 to n do writeln(data[i]); end. Dan berikut ini adalah contoh kodenya dalam bahasa C/C++: int data[10001]; int n,i,j,temp; int main(){ scanf("%d",&n); for (i=1;i<=n;i++) scanf("%d",data[i]); for (i=1;i<=n-1;i++) for (j=i+1;j<=n;j++) if (data[i]>data[j]){ temp=data[i]; data[i]=data[j]; data[j]=temp; } for (i=1;i<=n;i++) printf("%d\n",data[i]); return 0; } Mengetahui bahwa algoritma tersebut penting, bebek Pak Dengklek ingin mencetaknya lalu menghafalkannya. Bantulah mereka dalam melakukan pencetakan. FORMAT MASUKAN Sebuah baris berisi "PAS" atau "CPP" tanpa tanda kutip, yang akan menentukan kode dalam bahasa pemrograman mana yang ingin dicetak. Halaman 3 dari 6 Sesi Latihan FORMAT KELUARAN OSN IX Beberapa baris, tepat seperti contoh di atas. CONTOH MASUKAN 1 PAS CONTOH KELUARAN 1 var data:array[1..10000] of longint; n,i,j,temp:longint; begin readln(n); for i:=1 to n do readln(data[i]); for i:=1 to n-1 do for j:=i+1 to n do if (data[i]>data[j]) then begin temp:=data[i]; data[i]:=data[j]; data[j]:=temp; end; for i:=1 to n do writeln(data[i]); end. CONTOH MASUKAN 2 CPP CONTOH KELUARAN 2 int data[10001]; int n,i,j,temp; int main(){ scanf("%d",&n); for (i=1;i<=n;i++) scanf("%d",data[i]); for (i=1;i<=n-1;i++) for (j=i+1;j<=n;j++) if (data[i]>data[j]){ temp=data[i]; data[i]=data[j]; data[j]=temp; } for (i=1;i<=n;i++) printf("%d\n",data[i]); return 0; } Halaman 4 dari 6 Sesi Latihan OSN IX Tebak Angka Kode soal: osn1004.PAS/C/CPP Batas Run-time: 1 detik / test-case Batas Memori: 16 MB Berbeda dengan tiga hal klasik lainnya, kali ini bebek Pak Dengklek bermain dengan sebuah permainan tebaktebakan interaktif yang baru. Pada permainan tebak-tebakan ini, mula-mula Pak Dengklek akan memikirkan sebuah bilangan bulat antara A dan B (1 ≤ A ≤ B ≤ 30) dan Pak Dengklek akan memberitahukan nilai A dan B tersebut. Kemudian, bebek boleh menebak apakah bilangan yang Pak Dengklek pikirkan adalah X atau bukan dan jika bukan apakah terlalu kecil atau terlalu besar. Demikian pula lah, Pak Dengklek akan menjawab "terlalu kecil" jika tebakan bebek masih lebih kecil dibanding bilangan yang Pak Dengklek pikirkan, "terlalu besar" jika sebaliknya, atau "selamat" jika tebakannya tepat. Sudah dapat diduga, seharusnya ada batasan banyak pertanyaan yang bebek boleh tanyakan (karena jika tidak, maka pasti bebek berhasil menjawabnya, coba saja satu persatu). Pada permainan ini Pak Dengklek menentukan bahwa banyaknya pertanyaan tidak boleh lebih dari 10 dan ia yakin bahwa bebek yang cerdik pasti bisa menjawabnya bahkan jauh di bawah batasan tersebut. Bebek sekali lagi merasa pusing ditantang oleh Pak Dengklek, bantulah mereka untuk memenangkan permainan ini. INFORMASI TIPE SOAL Tipe soal seperti ini biasa disebut "interaktif". Pada soal ini Anda akan berinteraksi dengan program penguji melalui standard input dan standard output. Perhatikan format masukan dan keluaran di bawah ini dengan seksama. FORMAT MASUKAN DAN KELUARAN Pada saat program Anda dimulai, bacalah dua buah bilangan bulat A dan B. Setelah itu mulailah menebak dengan mencetak sebuah bilangan bulat (seharusnya antara A dan B). Selanjutnya, bacalah sebaris kalimat yang isinya antara lain "terlalu kecil", "terlalu besar", atau "selamat". Jika kalimat yang Anda baca adalah "selamat", tidak perlu ada kelanjutan dari program Anda (dengan kata lain, program Anda harus berakhir dan tentunya program Anda mendapatkan nilai untuk kasus tersebut). Sedangkan jika kalimat yang Anda baca bukan "selamat", Anda perlu menebak lagi dan seterusnya. Jika sampai 10 kali Anda menebak belum pernah ada kata "selamat", program Anda akan dihentikan secara paksa oleh program penguji dan tentunya program Anda tidak mendapatkan nilai (atau mendapatkan nilai nol) untuk kasus tersebut. Petunjuk "bacalah" dan "mencetak" yang dijelaskan di atas dapat Anda lakukan dengan menggunakan perintah standard seperti write, writeln, scanf, printf, dll selayaknya Anda mengerjakan soal biasa. Yang perlu diperhatikan adalah bahwa untuk tipe soal interaktif seperti ini, Anda harus selalu memberikan perintah "fflush(stdout);" (bagi pengguna C/C++) atau "flush(output);" (bagi pengguna PASCAL) setiap kali Anda mencetak keluaran (dengan kata lain, setiap kali ada perintah write/writeln/scanf/printf/dll, tepat di bawahnya harus ada perintah fflush/flush). Berikut ini adalah contoh kode program dalam bahasa PASCAL yang akan selalu menebak bilangan 5 tanpa peduli A dan B yang diberikan: Halaman 5 dari 6 Sesi Latihan var a,b,i:longint; hasil:string; begin readln(a,b); for i:=1 to 10 do begin writeln(5); flush(output); readln(hasil); if (hasil='selamat') then break; end; end. OSN IX Dan berikut ini dalam bahasa C/C++: int a,b,i; char hasil[20]; int main(){ scanf("%d %d\n",&a,&b); for (i=1;i<=10;i++){ printf("5\n"); fflush(stdout); gets(hasil); if (strcmp(hasil,"selamat")==0) break; } return 0; } CONTOH INTERAKSI 1 KELUARAN ANDA - KELUARAN PENGUJI 1 10 1 terlalu kecil 9 terlalu besar 7 selamat CONTOH INTERAKSI 2 KELUARAN ANDA - KELUARAN PENGUJI 1 3 1 terlalu kecil 2 terlalu kecil 3 selamat Penjelasan Pada contoh pertama, bilangan yang Pak Dengklek pikirkan adalah 7, sedangkan pada contoh kedua adalah 3. Halaman 6 dari 6