Implementasi Algoritma Zeller's Congruence

Wisnu Adi Nurcahyo 7 Januari 2017

Implementasi Algoritma Zeller's Congruence

Zeller's Congruence merupakan algoritma yang digunakan untuk mengambil nama hari dari suatu tanggal. Misal, kita ingin mengambil nama hari dari tanggal 01 Januari 2017 dimana pada tanggal tersebut merupakan hari Minggu. Di beberapa bahasa pemrograman mungkin hal tersebut dapat dengan mudah diperoleh. Lalu, bagaimana cara mereka mendapatkan nama hari tersebut?

Di Zeller's Congruence ada dua formula. Formula yang akan kita gunakan di sini adalah formula yang berbasis Gregorian Calendar.

screenshot from 2017-01-04 10-13-07
 Dimana
  • h adalah nama hari (0 = Sabtu, 1 = Minggu, ..., 6 = Jumat)
  • q adalah hari dalam satu bulan (1, 2, ..., 31)
  • m adalah bulan (3 = Maret, 4 = April, ..., 13 = Januari, 14 = Februari)
  • K adalah sisa bagi tahun dengan 100
  • J adalah hasil bagi tahun dengan 100 yang dibulatkan ke bawah
Catatan: Januari dan Februari dianggap sebagai bulan ke-13 dan 14 dari tahun sebelumnya. Artinya, 01 Januari 2017 akan dianggap sebagai tanggal 1 bulan ke-13 tahun 2016.

Sekarang, kita coba implementasikan dengan menggunakan pseudocode sebagai berikut.

function getDayFrom(day, month, year)
  if (month < 3) then
    month = month + 12

if (month > 12) then year = year - 1

K = year mod 100 J = year div 100

h = (day + ((13 * (month + 1)) div 5) + K + (K div 4) + (J div 4) - (2 * J)) mod 7

days = ["Sabtu", "Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat"]

return days[h]

Apabila kita melakukan pemanggilan getDayFrom(1, 1, 2017), kita akan memperoleh "Minggu" sebagai keluarannya. Implementasi ini dapat diterapkan di bahasa pemrograman tingkat rendah yang belum menyediakan library khusus untuk mendapatkan nama hari dari suatu tanggal. Komplektisitas kodenya adalah O(1). Bukankah itu terlihat keren?

Apabila kamu tertarik untuk melihat source code dalam bahasa Haskell, kamu bisa ke repository saya di wisn/halgorithms.

Demikian tulisan yang dapat saya bagikan kali ini. Sampai bertemu di lain waktu!