java - 1 वर्ष के लिए अप्रत्याशित परिणाम देने वाले कैलेंडर



date calendar (1)

मैंने जावा 7 में यह कोड-गोल्फ चुनौती करने की कोशिश की। बस किसी के लिए जो पता नहीं है: कोड-गोल्फ एक निश्चित कार्य को पूरा करने के लिए जितना संभव हो उतना बाइट्स है। जाहिर है जावा ऐसा करने के लिए एक उपयुक्त प्रोग्रामिंग भाषा नहीं है, खासकर जेली जैसी भाषाओं के साथ; 05AB1E; Pyth; और समान रूप से जो 1-15 बाइट्स में कार्य पूरा करते हैं जो जावा में 75-300 हो, लेकिन मैं सिर्फ मज़े के लिए करता हूं।

यहाँ मेरा वर्तमान जावा 7 उत्तर है बस संदर्भ के लिए, मैं इसे यहां कॉपी भी करूँगा:

import java.util.*;String c(int y){String r="";Calendar c=Calendar.getInstance();c.set(1,y);c.set(2,0);for(int i=0;i++<11;c.add(2,1)){c.set(5,c.getActualMaximum(5));if(c.get(7)==2)r+=i+" ";}return r;}
import java.util.*;
class M{
  static String c(int year){
    String r = "";
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.YEAR, year);
    calendar.set(Calendar.MONTH, 0);
    for(int i = 0; i++ < 11; calendar.add(Calendar.MONTH, 1)){
      calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
      if(calendar.get(Calendar.DAY_OF_WEEK) == 2){
        r += i+" ";
      }
    }
    return r;
  }

  public static void main(String[] a){
    System.out.println(c(1));
    System.out.println(c(297));
    System.out.println(c(1776));
    System.out.println(c(2000));
    System.out.println(c(2016));
    System.out.println(c(3385));
  }
}

जो सभी 1-अनुक्रमित महीनों का उत्पादन करता है, जिनमें से महीने का अंतिम दिन सोमवार है:

1 2 10 **
5 
9 
1 7 
2 10 
1 2 10

जैसा कि आप ध्यान दें कि जब आप अपने परिणामों की तुलना संबंधित चुनौती में करते हैं, तो वर्ष 1 के परिणाम गलत हैं।
क्या किसी को पता है क्यों? मूल रूप से मैंने सोचा कि calendar.getInstance Calendar.getInstance() रूप में गलत कैलेंडर डिफ़ॉल्ट है, इसलिए मैंने इसे चुनौती में निर्दिष्ट के रूप में new GregorianCalendar() Calendar.getInstance() में बदल दिया। लेकिन मुझे एहसास हुआ कि यह डिफ़ॉल्ट कैलेंडर पहले से है

साल 1 के लिए गलत परिणाम क्यों हैं?


दुर्भाग्य से, GregorianCalendar का बुरी तरह नाम है यह वास्तव में "जूलियन / ग्रेगोरीयन कैलेंडर, उनके बीच एक स्विच ओवर है।"

सौभाग्य से, आप उस स्विच-ओवर को समय की शुरुआत में निर्धारित करके शुद्ध ग्रेगोरीयन कैलेंडर के रूप में कार्य करने के लिए इसका उपयोग कर सकते हैं:

GregorianCalendar calendar = new GregorianCalendar();
calendar.setGregorianChange(new Date(Long.MIN_VALUE));

उस समय, आपके वर्तमान कोड के साथ, आपको सिर्फ "4" का उत्तर मिलता है - यह एक ऑफ-बाय-एक्शन के कारण 12 नहीं उठा रहा है ... आपको < 12 बल्कि < 11 बजाय < 11





dayofweek