object Main {
// Zeller's Congruence implementation
// Returns the day of the week for a given date.
fun dayOfWeek(d: Int, mInput: Int, yInput: Int): String {
// Zeller's output mapping:
// 0 = Saturday, 1 = Sunday, 2 = Monday, ... 6 = Friday
val names = arrayOf(
"Saturday", "Sunday", "Monday", "Tuesday",
"Wednesday", "Thursday", "Friday"
)
var m = mInput
var y = yInput
// In Zeller's formula, January and February are counted
// as months 13 and 14 of the previous year.
if (m < 3) {
m += 12 // Convert Jan → 13, Feb → 14
y -= 1 // Move to previous year
}
val K = y % 100 // Year of the century (last two digits)
val J = y / 100 // Zero-based century (e.g., 2024 → 20)
// Zeller's formula (clearer step-by-step version):
val term1 = d // day of month
val term2 = (13 * (m + 1)) / 5 // month adjustment
val term3 = K // year of century
val term4 = K / 4 // leap years in century
val term5 = J / 4 // leap centuries
val term6 = 5 * J // century correction
// Combine all terms and take modulo 7
val h = (term1 + term2 + term3 + term4 + term5 + term6) % 7
// Return the corresponding weekday name
return names[h]
}
@JvmStatic
fun main(args: Array<String>) {
val d = 30
val m = 5
val y = 2024
println(dayOfWeek(d, m, y))
}
}
/*
run:
Thursday
*/