Problem Set III
range()
Penggunaan Fungsi (R - *) Carilah nilai argumen dari masing-masing penggunaan fungsi range
sehingga dapat menghasilkan hasil seperti yang diminta. Jumlah argumen yang digunakan harus sama dengan slot yang disediakan. Contohnya, apabila disediakan arg1
dan arg2
, maka kamu harus menggunakan dua argumen untuk menyusun urutannya.
- for num in range(arg1):print(num, end=" ")
Hasil:
0 1 2 3 4 5 6 7 8 9 - for num in range(arg1):print(num*2%5, end=" ")
Hasil:
0 2 4 1 3 0 2 4 1 3 0 2 - for num in range(arg1,arg2):print(num, end=" ")
Hasil:
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - fav_course = ["DDP1", "DDP2", "PSD", "Matdis 1", "Matdis 2"]for num in range(arg1,arg2):fav_course[num] = fav_course[-num]print(fav_course)
Hasil:
['DDP1', 'Matdis 2', 'Matdis 1', 'Matdis 1', 'Matdis 2'] - for num in range(arg1,arg2,arg3):print(num, end=" ")
Hasil:
2 5 8 11 14 - my_lst = ["Ilmu Komputer", "Satu Banding Seratus", "Kami elit, kami kompak, kami anak UI"]for num in range(arg1,arg2,arg3):my_lst.insert(num, "Fasilkom")print(my_lst)
Hasil:
['Fasilkom', 'Ilmu Komputer', 'Fasilkom', 'Satu Banding Seratus', 'Kami elit, kami kompak, kami anak UI']Catatan:
Perlakuan
insert
yang dikenakan pada sebuah List menerima argumen pertama berupa sebuah angka indeks dan argumen kedua berupa suatu data yang akan disisipkan pada indeks yang diminta.
Konversi Masalah ke Struktur Kendali
Buatlah sebuah fungsi yang dapat menangani masalah-masalah berikut ini dan mengembalikan hasil sesuai dengan yang diminta.
Perhitungan Faktorial
Penggunaan modul
math
pada soal ini tidak diperkenankan.Argumen fungsi:
x
: Sebuah angka yang akan dikenakan operasi faktorial.
Hasil yang dikembalikan:
None
apabila argumen negatif atau bukan angka.1
apabila argumen bernilai 0.- Hasil dari perhitungan faktorial apabila argumen positif.
Catatan:
- Buatlah minimal dua versi dari fungsi ini, menggunakan pola perulangan
for
danwhile
. - Apabila sudah paham rekursi, implementasikan perhitungan ini dengan menggunakan rekursi.
Perhitungan Kombinasi dan Permutasi
Penggunaan modul
math
pada soal ini tidak diperkenankan.Argumen fungsi:
n
: Populasi datar
: Jumlah sampel yang diambil
Hasil yang dikembalikan:
- Hasil dari perhitungan kombinasi atau permutasi.
Catatan:
Buatlah dua versi dari fungsi ini, satu untuk permutasi dan satu untuk kombinasi.
Penggunaan faktorial dalam perhitungan harus menggunakan fungsi yang dibuat pada soal nomor L2.1 (boleh menggunakan versi
for
,while
, maupun rekursi).Rumus permutasi:
Rumus kombinasi:
Penentuan Tahun Kabisat dalam Rentang Tahun
Argumen fungsi:
start
: Tahun yang digunakan untuk memulai pencarian tahun kabisat (inklusif)end
: Tahun yang digunakan untuk mengakhiri pencarian tahun kabisat (eksklusif).
Hasil yang dikembalikan:
- Sebuah List yang berisi semua tahun kabisat pada rentang yang diminta.
Catatan:
- Buatlah dua versi dari fungsi ini, menggunakan pola perulangan
for
danwhile
. - Syarat sebuah tahun dapat dikatakan kabisat adalah jika memenuhi salah satu dari kriteria ini:
- Tahun tersebut habis dibagi 4 dan tidak habis dibagi 100.
- Tahun tersebut habis dibagi 400.
- Kamu bisa memodifikasi program penentuan tahun kabisat yang telah dibuat pada Pekan 2.
Pembuatan Poligon dengan
turtle
Argumen fungsi:
side
: Jumlah sisi dari poligon yang akan dibuat.color
: Nama warna yang digunakan dalam mewarnai poligon.Sebagian besar nama warna yang didukung oleh HTML juga dapat digunakan di Turtle. Daftar nama warna HTML dapat kamu lihat di situs ini.
pencolor
(*default* = None): Nama yang digunakan sebagai warna *border* dari poligon.
Hasil yang dikembalikan:
Tidak ada (keluarannya adalah gambar poligon di kanvas Turtle)
Catatan:
- Warna fill dan border dari poligon dapat diatur sebelum digambar dengan menggunakan fungsi
turtle.fillcolor(warna)
danturtle.pencolor(warna)
. - Jika pengguna tidak memberikan argumen
pencolor
, maka gunakan apa yang pengguna masukkan dicolor
. - Untuk membuat sebuah bentuk tertutup, gunakan fungsi
turtle.begin_fill()
sebelum menggambar danturtle.end_fill()
setelah selesai menggambar. - Apabila menggunakan editor selain IDLE yang langsung menutup kanvas setelah gambar selesai dibuat, tambahkan fungsi
turtle.exitonclick()
agar kamu dapat mengamati hasilnya terlebih dahulu.
Latihan Pemrograman
Perhitungan Tarif KRL
Soal ini diadaptasi dari Tutorial 3 Dasar-Dasar Pemrograman 1 Kelas Ekstensi 2018-2019/2
Pada tanggal 1 Oktober 2016, KRL Commuterline mengganti sistem perhitungan tarif yang semula dihitung dari jumlah stasiun yang dilewati dengan tarif yang dihitung berdasarkan jumlah kilometer yang ditempuh pada perjalanan tersebut.
Saat ini, tarif yang berlaku adalah:
- Rp3000 untuk 25 km pertama
- Rp1000 untuk setiap 10 km selanjutnya (berlaku pembulatan ke atas).
Tabel jarak masing-masing stasiun pada lintas Bogor-Jakarta Kota adalah sebagai berikut:
Stasiun | Jarak dengan Stasiun Setelahnya |
---|---|
Bogor | 7.518 km |
Cilebut | 4.331 km |
Bojong Gede | 5.197 km |
Citayam | 5.084 km |
Depok | 1.741 km |
Depok Baru | 2.570 km |
Pondok Cina | 1.109 km |
Universitas Indonesia | 2.264 km |
Universitas Pancasila | 1.029 km |
Lenteng Agung | 2.460 km |
Tanjung Barat | 3.031 km |
Pasar Minggu | 1.695 km |
Pasar Minggu Baru | 1.509 km |
Duren Kalibata | 1.475 km |
Cawang | 1.301 km |
Tebet | 2.610 km |
Manggarai | 1.606 km |
Cikini | 1.699 km |
Gondangdia | 2.198 km |
Juanda | 0.707 km |
Sawah Besar | 1.171 km |
Mangga Besar | 1.020 km |
Jayakarta | 1.487 km |
Jakarta Kota | 0.000 km (terminus) |
Data di atas dapat diimplementasikan dalam bentuk 2-D List seperti berikut ini:
Soal ini terdiri atas beberapa sub-soal yang dapat kamu kerjakan sesuai dengan kemampuanmu. Setiap soal akan mempermudah pekerjaan soal setelahnya, sehingga kerjakanlah secara bertahap.:
Pencarian Urutan Stasiun
Dengan memanfaatkan 2-D List data stasiun dan jaraknya dengan stasiun setelahnya tadi, buatlah sebuah fungsi yang dapat menerima argumen berupa nama sebuah stasiun dan mencari urutan stasiun tersebut pada List (misalnya, data Stasiun Bogor ada pada indeks ke-0, data Stasiun Cilebut ada pada indeks ke-1, dan seterusnya). Jika ditemukan, maka fungsi akan mengembalikan nomor indeks di mana stasiun tersebut berada. Jika tidak ditemukan, maka fungsi akan mengembalikan None
.
Contoh Penggunaan:
Hasil:
Catatan:
- Gunakan metode String
sebuah_string.title()
untuk mengkapitalisasi huruf pertama masing-masing kata dalam String tersebut. (Misalnya: kocheng oren menjadi Kocheng Oren).
Pencarian Jarak Antara Dua Stasiun
Buatlah sebuah fungsi yang dapat menerima dua buah argumen String berisi nama stasiun. Fungsi ini akan mengembalikan jarak antara kedua stasiun tersebut. Pencarian jarak ini harus bisa dilakukan secara dua arah, baik sesuai dengan urutan atas ke bawah yang ada pada List stasiun maupun urutan yang terbalik (bawah ke atas). Apabila salah satu stasiun tidak ditemukan, fungsi akan mengembalikan None
.
Contoh Penggunaan:
Hasil:
Catatan:
- Manfaatkan fungsi penentuan indeks stasiun yang telah kamu buat sebelumnya untuk menentukan indeks yang tepat untuk melakukan slicing terhadap data utama.
- Jangan lupa bahwa data jarak yang ada pada List adalah jarak stasiun tersebut dengan stasiun setelahnya. Gunakan fakta ini untuk menyusun
for
yang sesuai untuk setiap data yang dimasukkan. - Gunakan metode String
sebuah_string.title()
untuk mengkapitalisasi huruf pertama masing-masing kata dalam String tersebut. (Misalnya: kocheng oren menjadi Kocheng Oren).
Perhitungan Harga Perjalanan
Buatlah sebuah fungsi yang dapat menerima dua buah argumen String nama stasiun. Fungsi ini akan mengembalikan harga yang harus dibayarkan oleh penumpang untuk perjalanan antara kedua stasiun. Jika salah satu stasiun tidak ada dalam daftar, maka fungsi akan mengembalikan None
.
Kebijakan harga yang berlaku pada KRL saat ini adalah:
- Rp3.000 untuk 25 km pertama (termasuk masuk dan keluar di stasiun yang sama).
- Rp1.000 untuk setiap 10 km selanjutnya (berlaku pembulatan ke atas).
Contoh Penggunaan:
Hasil:
Catatan:
Pembulatan ke atas dapat kamu lakukan dengan mengimpor modul
math
dan menggunakan fungsimath.ceil
seperti berikut ini:import mathresult = math.ceil(10/3)Gunakan metode String
sebuah_string.title()
untuk mengkapitalisasi huruf pertama masing-masing kata dalam String tersebut. (Misalnya: kocheng oren menjadi Kocheng Oren).
Perhitungan Pembayaran THB
Untuk melakukan perjalanan dengan KRL, kamu dapat membeli Tiket Harian Berjaminan (THB) yang dapat digunakan untuk tepat satu kali perjalanan (terhitung dari tap masuk hingga tap keluar). Tiket tersebut diberi harga dasar Rp10.000 sebagai jaminan ditambah dengan harga perjalanan yang diinginkan oleh penumpang. Namun, terhitung 1 Agustus 2019, beberapa stasiun KRL tidak lagi menerima pembelian Tiket Harian Berjaminan (THB). Pada lintas Bogor-Jakarta Kota, stasiun tersebut adalah Cikini dan Universitas Indonesia.
Buatlah sebuah fungsi yang dapat menerima dua buah argumen String berisi nama stasiun (stasiun keberangkatan dan stasiun kedatangan) dan mengembalikan harga THB yang harus dibayarkan oleh penumpang untuk perjalanan tersebut. Namun, kondisi-kondisi berikut ini akan membuat fungsi mengembalikan None
:
- Salah satu stasiun tidak ada di lintas Bogor-Jakarta Kota.
- Stasiun keberangkatannya merupakan Stasiun Khusus KMT (Cikini dan Universitas Indonesia).
Contoh Penggunaan:
Hasil:
Caesar Cipher
Caesar Cipher atau juga dikenal dengan nama shift cipher adalah salah satu metode kriptografi data yang paling sederhana. Dalam metode ini, setiap huruf dalam String data akan "digeser" sejauh nilai kunci yang ditentukan. "Digeser" di sini dimaknai sebagai penggantian huruf tersebut menjadi huruf yang menempati posisi nilai kunci setelah huruf tersebut dalam abjad. Misalnya, huruf A apabila dikenakan cipher dengan kunci 4, berarti hasilnya nanti akan menjadi E, karena E terletak 4 huruf setelah A dalam urutan abjad. Contohnya:
Kunci: 3 (A -> D)
Data | U | N | T | U | K | I | L | M | U | K | O | M | P | U | T | E | R |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Hasil | X | Q | W | X | N | L | O | P | X | N | R | P | S | X | W | H | U |
Kunci: -4 (A -> W)
Data | U | N | T | U | K | I | L | M | U | K | O | M | P | U | T | E | R |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Hasil | Q | J | P | Q | G | E | H | I | Q | G | K | I | L | Q | P | A | N |
Dalam melakukan sebuah enkripsi atau dekripsi, apabila kamu menemukan underflow atau overflow, maka dia akan kembali lagi sesuai urutan abjadnya. Misalnya, A digeser ke kiri sejauh 1, maka dia akan menjadi Z. Begitu pula dengan Z digeser ke kanan sejauh 2, maka dia akan menjadi B.
Sebelumnya, kamu perlu mengetahui bahwa setiap karakter memiliki representasi angka masing-masing yang dapat diketahui oleh komputer. Representasi ini sebelumnya diatur dalam standar ASCII dan dikembangkan menjadi standar Unicode dengan menambahkan karakter-karakter dari berbagai bahasa. Untuk mengetahui tabel dari representasi tersebut, situs ini akan membantumu.
Guna merancang program ini, kamu setidaknya perlu mengetahui bahwa huruf "A" (kapital) memiliki representasi angka 65 dan huruf abjad selanjutnya akan direpresentasikan secara berurutan ("B" = 66, "C" = 67, dst.) sampai huruf "Z" dengan representasi angka 90. Fungsi-fungsi ini akan membantumu:
ord(string)
: Menerima argumen berupa satu karakter dan mengembalikan angka yang merepresentasikan karakter tersebut.chr(number)
: Menerima argumen berupa sebuah angka dan mengembalikan karakter yang direpresentasikan oleh angka tersebut.
Contoh penggunaan:
Soal ini terdiri dari beberapa sub-soal yang dapat kamu kerjakan sesuai dengan kemampuanmu sebagai berikut:
Enkripsi Data
Buatlah sebuah fungsi yang menerima argumen berupa String yang akan dienkripsi serta kunci yang digunakan (kunci positif untuk pergeseran ke kanan, kunci negatif untuk pergeseran ke kiri). Fungsi ini mengembalikan hasil dari enkripsi/pergeseran yang dilakukan.
Catatan:
Karakter spasi tidak perlu dienkripsi (dibiarkan apa adanya) untuk memudahkan pembacaan.
Contoh Penggunaan:
Hasil:
Dekripsi Data
Buatlah sebuah fungsi yang menerima argumen berupa String yang sudah dienkripsi serta kunci yang digunakan ketika melakukan enkripsi. Fungsi ini akan mengembalikan String data yang asli. Kunci yang dimasukkan oleh pengguna harus sama dengan kunci yang digunakan pada saat enkripsi. Manipulasi kunci tersebut dilakukan di dalam fungsi dekripsi.
Contoh Penggunaan:
Hasil:
Brute Force Decryption
Sekarang, anggaplah kamu memiliki sebuah teks yang telah dienkripsi, namun kamu tidak mengetahui kunci yang digunakan pada saat enkripsi. Kamu hanya mengetahui bahwa teks tersebut harusnya dimulai atau diakhiri oleh suatu kata. Dengan menggunakan kata yang kamu ketahui ini, kamu bisa melakukan brute force decryption (dekripsi paksa) dengan mencoba semua kemungkinan kunci dari 0 hingga 26 sampai kamu menemukan kata yang kamu ketahui tadi di teks yang didekripsi.
Cara dasar ini pernah digunakan untuk membantu dekripsi paksa algoritma enkripsi Enigma. Dengan memanfaatkan kata yang diketahui pasti ada dalam sebuah teks yang dienkripsi, beberapa kemungkinan kunci enkripsi dapat dieliminasi sehingga menghemat waktu yang digunakan untuk "mendobrak" enkripsinya.
Buatlah sebuah fungsi yang menerima argumen berupa String yang sudah dienkripsi serta String kata yang diketahui berada antara di awal atau di akhir dari data tersebut. Fungsi akan mengembalikan sebuah List yang memiliki dua elemen:
- String yang sudah didekripsi
- Kunci yang digunakan untuk melakukan enkripsi.
Apabila kata tidak dapat ditemukan di awal atau di akhir, cukup kembalikan None
.
Contoh Penggunaan:
Hasil:
Untuk mencoba fitur yang sudah kalian buat, coba untuk melakukan dekripsi untuk String-String berikut ini dengan String yang diketahui pasti ada di depan atau belakang adalah UNIVERSITASINDONESIA:
Pembuatan Antarmuka Pengguna
Berbekal fungsi-fungsi yang sudah kamu susun sebelumnya, kini tiba saatnya momen kamu untuk membuat suatu program besar yang dapat menyajikan fungsi-fungsi tadi ke dalam suatu antarmuka pengguna (user interface) yang terintegrasi. Sub-soal ini terdiri dari beberapa anak sub-soal yang bisa kamu kerjakan sesuai dengan kemampuanmu sebagai berikut:
Pembuatan Antarmuka Dasar
Pertama, program akan meminta pengguna untuk memilih komando untuk enkripsi, dekripsi, brute force decryption, dan keluar dari program. Masing-masing komando memiliki huruf yang bisa dipakai oleh pengguna sebagai masukan.
Contohnya:
Masukan dari pengguna nantinya akan memengaruhi jalannya program sesuai dengan pengaturan yang sudah kamu rancang. Misalnya, user mengetikkan e
, maka program akan masuk ke proses enkripsi.
Contoh proses masukan untuk enkripsi:
Contoh hasil enkripsi:
Contoh proses masukan untuk dekripsi:
Contoh hasil dekripsi:
Contoh proses masukan untuk brute force decryption:
Contoh hasil brute force decryption:
Contoh hasil brute force decryption bila tidak ditemukan hasil:
Di setiap akhir dari berjalannya proses, mintalah pengguna untuk memberikan masukan apakah ia ingin melanjutkan atau tidak, contohnya:
Jika pengguna memilih y, maka program akan kembali meminta masukan seperti di awal:
Proses ini berjalan terus sampai user mengetikkan "q" pada penerimaan masukan ini atau "n" pada pertanyaan "Lanjutkan?".
Catatan:
Apabila kamu menjalankan program di luar IDLE (Command Prompt, PowerShell, Bash, dsb.), kamu dapat menggunakan fungsi berikut ini untuk membersihkan layar terminal.
Untuk macOS dan Linux, argumen komando cls
diganti dengan clear
.
Penambahan Opsi Melihat Sejarah Penggunaan
Kali ini, setiap kali pengguna menggunakan program untuk melakukan enkripsi, dekripsi, atau brute force decryption, catatan penggunaannya akan disimpan dalam sebuah 2-D List yang kurang lebih dapat direpresentasikan dengan tabel sebagai berikut:
Date | Operation | Input | Output |
---|---|---|---|
DATE1 | OP1 | IN1 | OUT1 |
DATE2 | OP2 | IN2 | OUT2 |
Dalam Python, kamu dapat mengimplementasi 2-D List seperti ini:
Setiap kali operasi selesai dilakukan, buatlah mekanisme untuk mencatat penggunaan program oleh pengguna yang terdiri atas:
Tanggal dan waktu operasi dijalankan
Kamu dapat mengambil tanggal dan waktu saat ini (saat operasi berjalan) dengan menggunakan fungsi berikut ini:
import datetimeexec_date = str(datetime.datetime.now())Operasi yang dijalankan
"Encrypt" / "Decrypt" / "Brute Force Decrypt"Data yang dimasukkan
Contohnya: GGS LV IXQ, DDP IS FUN
Data yang dikeluarkan
Contohnya: DDP IS FUN, GGS LV IXQ
Catatan ini nantinya dapat dipanggil oleh pengguna dengan menambahkan satu opsi tambahan pada masukan awal:
Contoh hasilnya adalah sebagai berikut:
Bonus
Dengan menggunakan ilmu yang kamu dapat dari soal Caesar Cipher, coba pikirkan cara untuk mencari data yang direpresentasikan oleh untaian teks ini :)
(Just for the lulz)