Introduction
Conditional Calendar Logic समस्याएँ एक या अधिक शर्तें देती हैं जो weekdays, तारीखों, या उनके संबंधों के बारे में होती हैं (उदा., "यदि किसी महीने की 1 तारीख Friday है, तो...") और आपसे किसी अन्य तारीख का weekday निकालने या किसी conditional परिणाम की पुष्टि करने के लिए कहती हैं। ये समस्याएँ odd-day गणना और तार्किक निष्कर्ष दोनों परखती हैं - आपको शर्तों को सटीक दिन-शिफ्ट्स में बदलना होगा, समावेशिता ठीक से संभालनी होगी, और कई शर्तों को मिलाते समय असंगति नहीं पैदा करनी चाहिए।
Pattern: Conditional Calendar Logic
Pattern
मुख्य अवधारणा: हर शर्त को एक सटीक मॉड्यूलर शिफ्ट में बदलें (mod 7), D - 1 का उपयोग तब करें जब आप 1 तारीख से D-वीं तारीख पर जाएँ, मॉड्यूलर समीकरणों को मिलाकर संगति (consistency) जांचें, और हमेशा महीनों की लंबाई व leap-year प्रभावों का ध्यान रखें।
Step-by-Step Example
Question
यदि किसी महीने की 1 तारीख Friday है और उस महीने में 30 दिन हैं, तो उस महीने की आख़िरी तारीख का weekday क्या होगा? और यदि अगले महीने की 1 तारीख Sunday है, क्या यह पहली शर्त के साथ टकराव (conflict) करेगी?
Solution
-
Step 1: सही शिफ्ट फ़ॉर्मूला इस्तेमाल करें
जब 1 तारीख काweekday पता हो और D-वीं तारीख का जानना हो तो उपयोग करें:
weekday(D) = weekday(1) + (D - 1) mod 7.
किसी महीने के आख़िरी दिन के लिए उपयोग करें: weekday(last) = weekday(1) + (n - 1) mod 7 जहाँ n उस महीने के दिन हैं। -
Step 2: 30-दिन के महीने पर लागू करें
यहाँ n = 30 → n - 1 = 29. 29 mod 7 = 1. अतः आख़िरी दिन = Friday + 1 दिन = Saturday. -
Step 3: अगले महीने की 1 तारीख जाँचें
आख़िरी दिन के अगले दिन ही अगले महीने की 1 तारीख होती है। चूँकि आख़िरी दिन Saturday है, तो अगले महीने की 1 = Saturday + 1 = Sunday। -
Final Answer:
आख़िरी दिन = Saturday. "अगले महीने की 1 तारीख Sunday है" वाक्य पहली शर्त के साथ सुसंगत (consistent) है - कोई conflict नहीं है। -
Quick Check:
कुछ दिनों को सूचीबद्ध करें: 1→Fri, 2→Sat, …, 29→Fri, 30→Sat. अगला दिन = Sun ✅
Quick Variations
1. 31-दिन का महीना: n - 1 = 30 ≡ 2 (mod 7) → आख़िरी दिन = weekday(1) + 2।
2. फ़रवरी (non-leap): n - 1 = 27 ≡ 6 → आख़िरी दिन = weekday(1) - 1 (या +6)।
3. फ़रवरी (leap): n - 1 = 28 ≡ 0 → आख़िरी दिन = weekday(1) (1 तारीख और आख़िरी तारीख एक ही weekday)।
4. शर्तों का संयोजन: यदि कई शर्तें दी हों (उदा., "1st is Friday" और "15th is Tuesday"), तो हर एक के लिए मॉड्यूलर समीकरण लिखें और संगति जाँचें: weekday(15) = weekday(1) + 14 ≡ weekday(1) (क्योंकि 14 ≡ 0)।
Trick to Always Use
- 1 से D-वीं तारीख में जाने के लिए हमेशा (D - 1) का उपयोग करें ताकि off-by-one गलतियाँ न हों।
- (days_in_month - 1) mod 7 निकालकर 1 तारीख से आख़िरी दिन तक का शिफ्ट पायें।
- कई शर्तों को modular समीकरणों के रूप में व्यक्त करें और देखें कि वे सभी एक साथ成立 हैं या नहीं (एक ही तारीख के लिए उसी weekday का परिणाम होना चाहिए)।
- फ़रवरी के लिए leap-year नियम याद रखें (29 दिनों वाला महीना ⇒ n - 1 = 28 ⇒ 0 mod 7 → last day = 1st)।
- यदि दो शर्तें उसी तारीख के लिए अलग-अलग weekdays देती हैं तो इसे conflict घोषित करें - ज़ोर देकर फ़िट करने की कोशिश न करें।
Summary
Summary
- दिए गए सभी date-statements को मॉड्यूलर (mod 7) सम्बन्धों में बदलें।
- हमेशा फ़ॉर्मूला लागू करें: weekday(D) = weekday(1) + (D - 1) mod 7.
- आख़िरी दिन के लिए (days_in_month - 1) का प्रयोग करें।
- एक से अधिक शर्तें मिलाते समय तार्किक संगति जाँचें।
- फ़रवरी शामिल हो तो leap-year प्रभावों का ध्यान रखें।
याद रखने के लिए उदाहरण:
यदि 1st Friday है और महीने में 30 दिन हैं → आख़िरी दिन = Saturday; अगले महीने की 1 = Sunday.
