2016-10-27 23 views
4

Java 7でthis code-golf challengeを実行しようとしました。知らない人のために:はできるだけ少ないバイトで特定のタスクを完了することです。明らかに、Javaは、特にJellyのような言語でこれを行うのに適したプログラミング言語ではありません。 05AB1E; Pyth; Javaで75〜300になる1-15バイトのタスクを完了した人も同様ですが、私はそれを楽しいものにしています。1年目に予期せぬ結果を出すカレンダー

Here is my current Java 7 answer.ただ参考のために、私はまた、ここでそれをコピーします:

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 

結果がリンクされたチャレンジの結果と比較されるときに気付くかもしれませんが、res 1年目の最期は間違っています。
なぜ誰が知っていますか?もともと、私はCalendar.getInstance()がデフォルトとして誤ったカレンダーを持っていると思ったので、チャレンジに指定されているようにnew GregorianCalendar()に変更しました。しかし、これは既定のカレンダーであることに気付きました。

なぜ1年目で間違った結果が出るのですか?

+1

http://stackoverflow.com/questions/8263220/calendar-set-year-issue –

答えて

7

残念ながら、GregorianCalendarの名前が悪いです。それは実際には "ジュリアン/グレゴリオ暦で、その間に切り替えがあります。"

幸いにも、あなたは時間の開始になるように、スイッチオーバーを設定することにより、純粋なグレゴリオ暦として機能するためにそれを使用することができます:

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

その時点で、あなたの現在のコードで、あなたが得ます答えがちょうど "4" - それはoff-by-oneエラーのために12をピックアップしていません... < 11ではなく< 12が必要です。

+0

ああ、私は確かにグレゴリオ暦がジュリアンとグレゴリオ暦の両方であることを知っていましたが、実際にそれが原因であることはわかりませんでした私は 'setGregorianChange'について知りませんでした。ありがとう!私は 'GregorianCalendar c = new GregorianCalendar(); c.setGregorianChange(新しい日付(1L << 63));に変更し、それは魅力的に機能します。 PS:新しいアバター? :) –

関連する問題