# Zeller's Congruence implementation
# Returns the day of the week for a given date.
def day_of_week(d, m, y)
# Zeller's output mapping:
# 0 = Saturday, 1 = Sunday, 2 = Monday, ... 6 = Friday
names = [
"Saturday", "Sunday", "Monday", "Tuesday",
"Wednesday", "Thursday", "Friday"
]
# 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
end
k = y % 100 # Year of the century (last two digits)
j = y / 100 # Zero-based century (e.g., 2024 → 20)
# Zeller's formula (clearer step-by-step version):
term1 = d # day of month
term2 = (13 * (m + 1)) / 5 # month adjustment
term3 = k # year of century
term4 = k / 4 # leap years in century
term5 = j / 4 # leap centuries
term6 = 5 * j # century correction
# Combine all terms and take modulo 7
h = (term1 + term2 + term3 + term4 + term5 + term6) % 7
# Return the corresponding weekday name
names[h]
end
d = 30
m = 5
y = 2024
puts day_of_week(d, m, y)
=begin
run:
Thursday
=end