Thursday, May 1, 2014

Faktorial

N!, yaitu N faktorial, didefinisikan sebagai N x (N-1) x (N-2) x ... x 1.
Pak Dengklek memberikan Anda sebuah bilangan bulat N (1 ≤ N ≤ 10.000). Hitunglah jumlah 0 berurutan yang mengakhiri N!. Misalnya, 10! = 3.628.800, maka jumlah 0 berurutan adalah 2. 8! = 40.320, maka jumlah 0 berurutan adalah 1 (nol di tengah tidak dihitung).

Format Masukan

Baris pertama berisi sebuah bilangan bulat N.

Format Keluaran

Sebuah baris berisi sebuah bilangan bulat yaitu jawaban yang dimaksud.

Contoh Masukan 1

10

Contoh Keluaran 1

2

Contoh Masukan 2

8

Contoh Keluaran 2

1
Jawabannya adalah :


Ulang Tahun

Beberapa hari lagi, Pak Dengklek akan merayakan ulang tahunnya yang ke-61. Beliau bermaksud akan mengundang teman-temannya untuk menghadiri pesta ulang tahunnya tersebut. Sayangnya, beliau baru saja kehilangan satu-satunya buku telepon yang dipunyainya. Karena itu, ia harus mengunjungi wartel terdekat dan membuka buku kuning untuk mengetahui nomor telepon teman-temannya. Tidak lupa ia mengajak Anda untuk membantunya mencarikan nomor telepon teman-temannya tersebut.
Diberikan buku kuning yang berisi N (1 ≤ N ≤ 10.000) pasangan nama dan nomor telepon seluruh penduduk desa tempat Pak Dengklek tinggal, serta Q (1 ≤ Q ≤ 10.000) nama teman Pak Dengklek yang tinggal di desa tersebut, tolonglah Pak Dengklek untuk mencari nomor telepon teman-teman Pak Dengklek tersebut.

Format Masukan

Baris pertama berisi dua buah bilangan bulat N dan Q. N baris selanjutnya berisi nama dan nomor telepon setiap orang di desa tersebut, dipisahkan dengan spasi. Q baris selanjutnya berisi nama-nama teman Pak Dengklek.
Nama setiap orang hanya akan tersusun dari huruf kapital, dengan panjang maksimal 15 huruf. Daftar nama pada buku kuning akan terurut sesuai abjad, tetapi daftar teman Pak Dengklek yang akan dicari nomor telponnya belum tentu terurut dan satu teman Pak Dengklek bisa saja ditanyakan lebih dari sekali. Setiap nomor telepon terdiri atas tepat 7 angka, satu nomor telepon dapat dimiliki oleh lebih dari satu orang. Semua teman pak Dengklek yang akan dicari nomor telponnya pasti tercantum dalam buku kuning.

Format Keluaran

Q buah baris, masing-masing berisi nomor telepon dari teman yang ditanyakan oleh Pak Dengklek.

Contoh Masukan

10 5
ACONG 8468431
BALAJI 1573547
GREGOR 1765743
JAPRA 3746843
JOKO 1357891
MALARANGENG 1375638
MANMOHAN 1357562
SITORUS 1378651
TERRY 8756345
YUDHOYONO 1781945
GREGOR
YUDHOYONO
ACONG
MANMOHAN
JAPRA

Contoh Keluaran

1765743
1781945
8468431
1357562
3746843
Jawabannya adalah :

Parkir Truk

Pak Dengklek memiliki 3 buah truk dan ingin memarkirkannya di tempat parkir yang memberikan harga sewa tempat parkir yang berbeda-beda tergantung dari banyaknya truk yang diparkir. Bila ada 1 truk, Pak Dengklek membayar A rupiah per menit. Bila ada 2 truk, untuk setiap truk Pak Dengklek membayar B rupiah per menit. Bila ada 3 truk, untuk setiap truk Pak Dengklek membayar C rupiah per menit.
Diberikan A, B, dan C (1 ≤ C ≤ B ≤ A ≤ 100) beserta interval waktu Pak Dengklek memarkirkan truk-truknya, tentukan berapa rupiah yang harus Pak Dengklek bayar.

Format Masukan

Baris pertama berisi 3 buah bilangan bulat A, B dan C. Tiga baris berikutnya masing-masing berisi dua bilangan bulat: awal dan akhir yang menyatakan waktu truk yang bersangkutan mulai diparkir dan meninggalkan tempat parkir. Rentang waktu ini adalah 1..100 dalam satuan menit.

Format Keluaran

Sebuah baris berisi sebuah bilangan bulat yang menyatakan total biaya parkir yang harus Pak Dengklek bayar.

Contoh Masukan

5 3 1
1 6
3 5
2 8

Contoh Keluaran

33
Jawabannya adalah :

Perkalian Pak Dengklek

Pak Dengklek bosan mengalikan pasangan bilangan dengan cara biasa, sehingga ia memutuskan bahwa sejak sekarang, ia akan menggunakan cara perkalian yang berbeda. Cara perkalian Pak Dengklek adalah menjumlahkan perkalian dari semua pasang digit-digit bilangan A dan B. Misalnya, perkalian dari 123 dan 45 adalah 1 * 4 + 1 * 5 + 2 * 4 + 2 * 5 + 3 * 4 + 3 * 5 = 54.
Diberikan dua bilangan A dan B (1 ≤ A, B ≤ 1.000.000.000), tentukan hasil kalinya menurut cara Pak Den:
gklek.

Format Masukan

Baris pertama berisi dua buah bilangan bulat A dan B.

Format Keluaran

Sebuah baris berisi sebuah bilangan yaitu hasil perkalian A dan B dengan cara Pak Dengklek.

Contoh Masukan

123 45

Contoh Keluaran

54
Jawabannya adalah :

Tinggi Kandang Susun

Selain bebek, Pak Dengklek berkeinginan memelihara kucing dan karena itu ia bermaksud membangun kandang untuk kucing-kucingnya. Harga tanah kini sangat mahal, Pak Dengklek tidak memiliki lahan yang cukup luas untuk membangun kandang berlantai satu, maka kandang susunlah solusi untuk tempat tidur N kucingnya (1 ≤ N ≤ 1.000.000). Namun dalam kasus ini, justru yang kita pedulikan adalah total tinggi dari kandang susun tersebut, bukan luasnya. Sekedar informasi, kucing-kucing Pak Dengklek adalah hewan yang rewel, mereka tidak ingin tempat tinggalnya lebih rendah dari batas yang sudah mereka tentukan.
Untuk tiap lantai kandang, Pak Dengklek hanya dapat memasukkan K (1 ≤ K ≤ 1.000.000) kucing secara berurutan, sehingga kucing 1 sampai K pasti akan berada di lantai pertama, kucing ke K+1 sampai 2K pasti akan berada di lantai kedua, dan seterusnya. Agar semua kucing senang, tinggi setiap lantai haruslah nilai maksimal dari batas yang ditentukan oleh kucing-kucing yang ada dalam lantai tersebut.
Tugas Anda kini adalah mencari berapa total tinggi dari kandang susun yang akan dibangun Pak Dengklek. Perlu diingat untuk alas dan atap dibutuhkan papan setebal 1 sentimeter, di antara kedua lantai pun ada sekat setebal 1 sentimeter dan tebal-tebal itu harus diperhitungkan juga dalam menentukan total tinggi kandang.

Format Masukan

Baris pertama berisi dua buah bilangan bulat N dan K. N baris berikutnya masing-masing berisi sebuah bilangan Ti (1 ≤ Ti ≤ 1.000.000) yang merupakan batas tinggi yang diinginkan oleh kucing ke-i, dalam sentimeter.

Format Keluaran

Sebuah baris berisi sebuah bilangan bulat yaitu total tinggi kandang susun yang akan Pak Dengklek bangun, dalam sentimeter.

Contoh Masukan 1

5 3
30
20
15
19
29

Contoh Keluaran 1

62

Contoh Masukan 2

2 2
2
2

Contoh Keluaran 2

4

Penjelasan

Pada contoh masukan 1, total tinggi = 62 = 30 + 29 + 1 (alas) + 1 (atap) + 1 (sekat lantai 1 dan lantai 2).
Jawabannya adalah :

Bukit dan Lembah

Pak Dengklek memberikan Anda data ketinggian yang di catat dalam perjalanannya dari suatu posisi awal ke posisi akhir. Data ketinggian adalah bilangan-bilangan positif. Jalan kadang menaik, kadang menurun, kadang datar saja. Posisi di mana terjadi perubahan menaik kemudian menurun (boleh diselingi jalan datar) didefinisikan sebagai puncak dari suatu bukit. Sebaliknya, posisi terjadi perubahan dari menurun terus menaik (boleh diselingi bagian jalan yang datar) didefinisikan sebagai titik terbawah suatu lembah. Walaupun perubahan tersebut kecil saja, definisi itu tetap berlaku.
Carilah beda ketinggian terbesar antara puncak bukit dengan titik terbawah lembah berikutnya atau sebaliknya antara titik terbawah lembah dengan puncak bukit berikutnya pada data perjalanan tersebut.

Format Masukan

Banyak baris, antara 2 sampai 600.000 baris, yang masing-masing berisi sebuah bilangan bulat antara 0 sampai 1.000.000.000.

Format Keluaran

Sebuah baris berisi sebuah bilangan bulat yaitu beda ketinggian terbesar yang diperoleh.

Contoh Masukan

10
26
26
35
35
27
30
30
45
10
8
9

Contoh Keluaran

37

Penjelasan

Ada 12 data. Beda ketinggian pertama (10 ke 35) adalah 25, beda kedua (35 ke 27) adalah 8, beda ketiga (27 ke 45) adalah 18, beda ketinggian keempat (45 ke 8) adalah 37, dan beda ketinggian kelima (8-9) adalah 1. Jadi beda ketinggian tertinggi adalah 37.
Jawabannya adalah :

Bilangan Agak Prima

Suatu bilangan bulat positif disebut "agak prima" jika bilangan tersebut hanya habis dibagi oleh bilangan 1, dirinya sendiri, dan sebanyak-banyaknya dua buah bilangan bulat positif lainnya.
Pak Dengklek memberikan Anda T (1 ≤ T ≤ 8) buah bilangan bulat N (1 ≤ N ≤ 1.000.000.000). Tentukan apakah N "agak prima" atau bukan.

Format Masukan

Baris pertama berisi sebuah bilangan bulat T. T baris berikutnya masing-masing berisi sebuah bilangan bulat N.

Format Keluaran

T buah baris, masing-masing berisi YA jika N adalah bilangan "agak prima", atau TIDAK jika bukan.

Contoh Masukan

3
17
51
52

Contoh Keluaran

YA
YA
TIDAK

Penjelasan

Faktor dari 51 adalah 1, 3, 17, dan 51, sedangkan faktor dari 52 adalah 1, 2, 4, 13, 26, 52. Oleh karena itu 51 "agak prima" sedangkan 52 tidak "agak prima". Sesuai definisi di atas, bilangan prima secara langsung adalah bilangan "agak prima" juga.
Jawabannya adalah :

Cek Bilangan Prima

Anda seharusnya sudah tahu apakah bilangan prima itu. Singkatnya bilangan prima adalah bilangan bulat lebih dari 1 yang tidak dapat dibagi menjadi bilangan bulat lagi oleh bilangan bulat lain kecuali oleh dirinya sendiri. Contoh bilangan prima: 2, 3, 5, 7, 11, 13, 17, dst. Misalnya, 9 bukan bilangan prima karena 9 dapat dibagi 3. Apakah -5 bilangan prima? Menurut definisi di atas, bilangan prima adalah bilangan bulat positif, sehingga -5 bukan prima.
Pak Dengklek memberikan Anda bilangan-bilangan N (-32.000 < N < 32.000). Untuk setiap bilangan, tentukan apakah bilangan tersebut bilangan prima atau bukan.

Format Masukan

Banyak baris, antara 1 sampai 100 baris, masing-masing berisi sebuah bilangan bulat N.

Format Keluaran

Untuk setiap baris, cetak YA apabila N adalah bilangan prima, atau TIDAK jika bukan.

Contoh Masukan

23
-7
9000
1

Contoh Keluaran

YA
TIDAK
TIDAK
TIDAK

Petunjuk

Ada banyak cara (algoritma) untuk memeriksa apakah suatu bilangan prima atau bukan. Namun, untuk sekarang Anda boleh menggunakan cara ini: Anda dapat memeriksa apakah N dapat dibagi oleh setiap bulangan bulat mulai dari 2 sampai dengantrunc(sqrt(A)), yaitu bilangan bulat terbesar yang tidak melebihi akar kuadrat dari N.
Cara lain yang terkenal dikenal dengan nama 'The Sieve' yaitu singkatan dari 'The Sieve of Erastosthenes'. Suatu waktu akan dijelaskan cara bekerja algoritma tersebut.
Jawabannya adalah :

Rata-Rata

Anda sudah pernah belajar statistika? Jika diketahui sejumlah N bilangan: x1, x2, ..., xN, yang masing-masing merupakan hasil pengukuran, misalnya nilai-nilai pelajaran Y siswa-siswa di kelas anda, maka untuk mengetahui kecenderungan nilai-nilai tersebut digunakan besaran-besaran seperti: nilai terkecil, nilai terbesar, nilai rata-rata, dsb., yang diperoleh dari perhitungan.
Nilai terkecil adalah salah satu dari N bilangan di atas yang mana tidak ada bilangan lain yang lebih kecil dari padanya.
Nilai terbesar adalah salah satu dari N bilangan di atas yang mana tidak ada bilangan lain yang lebih besar dari padanya.
Nilai rata-rata adalah jumlah dari N bilangan tersebut dibagi dengan N.
Pak Dengklek memberikan Anda N (1 ≤ N ≤ 10.000) buah bilangan. Hitunglah besaran-besaran tersebut.

Format Masukan

Baris pertama berisi sebuah bilangan bulat N. N baris berikutnya masing-masing berisi sebuah bilangan nyata xi (-1.000.000,00 ≤ xi ≤ 1.000.000,00) dengan dua angka di belakang koma.

Format Keluaran

Sebuah baris berisi tiga buah bilangan nyata yaitu: bilangan terkecil, bilangan terbesar, dan rata-ratanya, dipisahkan dengan sebuah spasi, dan dalam dua angka di belakang koma.

Contoh Masukan 1

10
297536.26
526260.62
828177.56
-45559.92
978715.10
383672.24
467737.00
67692.93
-765057.71
790913.04

Contoh Keluaran 1

-765057.71 978715.10 353008.71

Contoh Masukan 2

30
-810984.36
-579222.13
-117867.17
849146.53
-109313.71
852713.84
925273.01
-471109.60
-344732.29
806856.12
556582.16
616013.89
295053.48
142864.77
-502461.22
-248941.25
-429372.21
-441792.48
-421294.55
888891.92
230231.19
-476848.18
-703358.42
739601.31
47096.13
953740.58
-891076.69
-841539.26
-334396.20
317560.98

Contoh Keluaran 2

-891076.69 953740.58 16577.21
Jawabannya adalah :

Nilai Kalimat Matematika

Pak Dengklek memberikan Anda sebuah kalimat matematika sederhana. Tentukan nilainya.

Format Masukan

Sebuah baris berisi sebuah kalimat matematika dalam bentuk "A op B", dengan A dan B adalah bilangan bulat (-10.000 ≤ A, B ≤ 10.000) dan op adalah sebuah karakter yang merupakan salah satu dari '+', '-', '*', '<', '>', dan '='.

Format Keluaran

Sebuah baris berisi nilai dari kalimat matematika tersebut. Apabila op merupakan '+', '-', atau '*', cetak hasil dari operasi matematika tersebut. Apabila op merupakan '<', '>', atau '=', cetak "benar" apabila kalimat matematika tersebut bernilai benar dan cetak "salah" apabila kalimat matematika tersebut bernilai salah.

Contoh Masukan 1

100 - 50

Contoh Keluaran 1

50

Contoh Masukan 2

100 < 50

Contoh Keluaran 2

salah

Contoh Masukan 3

-100 < -50

Contoh Keluaran 3

benar

Petunjuk

Karena dalam satu baris Anda harus membaca dua buah bilangan dan tiga buah karakter, yaitu A, spasi, op, spasi, dan B, maka Anda harus menyebutkan satu demi satu masukan tersebut dalam perintah readln, sebagai berikut:
readln(A, sp, op, sp, B);
Variabel dummy sp diperlukan untuk 'membaca' karakter spasi. Disebut dummy karena setelah dibaca lalu diabaikan.
Setelah itu lakukan operasi sesuai yang diminta soal.
Jawabannya adalah :

Dua Pangkat

Bilangan "dua pangkat" dalam adalah bilangan bulat yang dapat dituliskan dalam bentuk 2^K di mana K adalah sebuah bilangan bulat.
Pak Dengklek memberikan Anda sebuah bilangan bulat N (1 ≤ N ≤ 2^20). Tentukan apakah N adalah bilangan "dua pangkat" atau bukan.

Format Masukan

Baris pertama berisi sebuah bilangan bulat N.

Format Keluaran

Sebuah baris berisi TRUE jika N adalah bilangan "dua pangkat", dan FALSE jika bukan.

Contoh Masukan 1

8

Contoh Keluaran 1

TRUE

Contoh Masukan 2

6

Contoh Keluaran 2

FALSE
Jawabannya adalah :

Membalik Bilangan

Pak Dengklek memberikan Anda N (0 ≤ N ≤ 10.000) buah bilangan bulat antara 0 sampai 10.000.000. Cetak kembali bilangan-bilangan tersebut setelah dibalik. Misalnya, 308 dibalik menjadi 803.

Format Masukan

Baris pertama berisi sebuah bilangan bulat N. N baris berikutnya masing-masing berisi sebuah bilangan bulat yang ingin dibalik.

Format Keluaran

N buah baris, masing-masing berisi bilangan bulat pada masukan yang telah dibalik. Jangan ada angka nol berlebih di depan bilangan-bilangan tersebut.

Contoh Masukan

5
1330
7525
4025
5
12624

Contoh Keluaran

331
5257
5204
5
42621
Jawabannya adalah :

Reverse

Pak Dengklek memberikan Anda sebaris teks dengan panjang antara 1 sampai 1.000 karakter. Balik urutan karakter-karakter pada teks tersebut dan cetak kembali.

Format Masukan

Baris pertama berisi sebuah teks yang ingin dibalik.

Format Keluaran

Sebuah baris yaitu teks pada masukan yang telah dibalik.

Contoh Masukan

Olimpiade Nasional

Contoh Keluaran

lanoisaN edaipmilO
Jawabannya adalah :

Operasi String

Pada latihan ini, program Anda harus membaca sebuah empat buah string yang kita beri nama S1, S2, S3, dan S4. Misalnya program Anda mendapat input seperti ini:
abcdehalofghi
bcd
halo
semua
Dijamin bahwa string S1 mengandung sebuah string S2 di dalamnya. Buang string S2 yang ditemukan di string S1 (dijamin ada, dan hanya satu). Kemudian sisipkan string S4 pada posisi setelah string S3 yang ditemukan di string S1 (dijamin ada, dan hanya satu). Jadi pada contoh di atas, abcdehalofghi diubah menjadi aehalofghi, lalu menjadi aehalosemuafghi. Keluarkan string hasil akhir, yang pada contoh ini adalahaehalosemuafghi.
Untuk menyelesaikan masalah tersebut, kita perlu mengenal berbagai fungsi-fungsi dan prosedur-prosedur penanganan string yang disediakan oleh library Pascal yang bisa kita gunakan. (Dapat dilihat di
http://community.freepascal.org:10000/docs-html/rtl/system/stringfunctions.html)
Fungsi-fungsi dan prosedur-prosedur yang akan kita gunakan adalah:
function length(s: string): integer;
function pos(substr: string; s: string): integer;
procedure delete(var s: string; index: integer; count: integer);
procedure insert(s: string; var source: string; index: integer);
Fungsi length akan mengembalikan panjang dari s.
Jika string s mengandung string substr, fungsi pos akan mengembalikan index pertama dari kemunculan pertama substr di dalam s (karakter pertama diberi index 1). Jika tidak ada, fungsi ini akan mengembalikan 0.
Prosedur delete akan membuang sebanyak count karakter pada string s, dimulai dengan index ke-index. Misalnya, jika s pada mulanya adalah 'Halo', delete(s, 1, 2) akan mengubah isi s menjadi 'lo'.
Prosedur insert akan memasukkan string s ke dalam string source, dimulai pada posisi index ke-index.
Untuk menyelesaikan masalah awal, kita dapat membuat program sebagai berikut:
var
    S1, S2, S3, S4: string;
begin
    readln(S1);
    readln(S2);
    readln(S3);
    readln(S4);
    
    delete(S1, pos(S2, S1), length(S2));
    insert(S4, S1, pos(S3, S1) + length(S3));
    
    writeln(S1);
end.
Pada program di atas, S2 di dalam S1 akan dibuang dari S1, dan selanjutnya S4 akan dimasukkan ke dalam S1 tepat pada posisi pos(S3, S1) + length(S3), yaitu posisi karakter pertama yang tidak termasuk S3, setelah kemunculan seluruh karakter S3 di dalam S1.
Namai program tersebut dengan nama pjj0114 dan simpanlah dengan nama 'pjj0114.PAS'.

Contoh Masukan

abcdehalofghi bcd halo semua

Contoh Keluaran

aehalosemuafghi
Masih banyak fungsi-fungsi dan prosedur-prosedur lain yang mungkin berguna, yang bisa dipelajari di
http://community.freepascal.org:10000/docs-html/rtl/system/index.html
Berikut ini adalah ringkasan dari beberapa fungsi yang mungkin berguna:
procedure str(x: integer; var s: string);
Prosedur ini akan mengubah nilai integer x menjadi string, lalu dimasukkan ke dalam variabel s. Misalnya, jika x bernilai 10, s akan menjadi bernilai '10'.
function lowerCase(s: string): string;
Fungsi ini akan menghasilkan sebuah string seperti s tetapi semua karakternya diubah ke huruf kecil.
function upCase(s: string): string;
Fungsi ini akan menghasilkan sebuah string seperti s tetapi semua karakternya diubah ke huruf besar.
function chr(b: byte): char;
Fungsi ini akan mengembalikan sebuah karakter yang memiliki kode ASCII b. Misalnya chr(65) akan mengembalikan "A".
function ord(c: char): longint;
Fungsi ini akan mengembalikan nilai bilangan bulat dari sebuah tipe ordinal. Biasanya fungsi ini digunakan untuk menentukan kode ASCII dari karakter c. Misalnya, ord("A") akan mengembalikan 65.
Kombinasi chr dan ord dapat digunakan untuk mengubah sebuah karakter dari huruf kecil menjadi huruf besar, atau sebaliknya. Misalnya,chr(ord("x") + (ord("A") - ord("a"))) akan menghasilkan "X".
function abs(l: longint): longint;
Fungsi ini akan mengembalikan nilai absolut dari l. Misalnya, abs(-3) akan mengembalikan 3, dan abs(3) juga mengembalikan 3.
procedure dec(var x: integer); procedure dec(var x: integer; decrement: integer);
Prosedur ini akan mengurangi nilai x dengan 1, atau dengan nilai decrement jika diberikan.
procedure inc(var x: integer); procedure inc(var x: integer; increment: integer);
Prosedur ini akan menambah nilai x dengan 1, atau dengan nilai increment jika diberikan.
function sqr(x: longint): longint; function sqr(x: real): real;
Fungsi ini akan mengembalikan kuadrat dari x.
function sqrt(x: real): real;
Fungsi ini akan mengembalikan akar kuadrat dari x.
function trunc(x: real): integer;
Fungsi ini akan mengembalikan bagian bilangan bulat dari sebuah bilangan real x. Misalnya, trunc(3.456) akan menghasilkan 3.
function round(x: real): integer;
Fungsi ini akan menghasilkan pembulatan dari sebuah bilangan real x. Pada Pascal, aturan pembulatan untuk 0.5 adalah ke arah bilangan genap. Jadi, round(1.5) akan menghasilkan 2, tetapi round(2.5) juga akan menghasilkan 2.
function pi: real;
Fungsi ini mengembalikan nilai pi (3.14159...).
Jawabannya adalah :