2010年をうるう年と判定するプログラムを作成せよ

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
うるう年の判定って、最初に4で割り切れるか調べるよね。

2008年は、普通に閏年と判定していたんでしょ。
どんなプログラムを書いたら、2010年がうるう年になるんだろう?

良かったら誰か想像で書いてみて
2デフォルトの名無しさん:2010/03/02(火) 22:36:12
SCEの人に聞けよ
3デフォルトの名無しさん:2010/03/02(火) 22:39:11
return year % 2 == 0;
4デフォルトの名無しさん:2010/03/02(火) 22:41:48
return year == 2000 || year == 2004 || year == 2008 || year == 2012 || ... || year == 2096 || year == 2010;
5デフォルトの名無しさん:2010/03/02(火) 22:46:54
return true;
6デフォルトの名無しさん:2010/03/02(火) 22:49:26
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。

アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。

                  京都大学霊長類研究所
7デフォルトの名無しさん:2010/03/02(火) 22:53:22
10を16進で計算したんじゃないの

16進数の10は16となって4で割り切れるから
8デフォルトの名無しさん:2010/03/02(火) 23:05:59
>>7に着想を得て無理にコーディングしてみた

char* year = "2010";
strtol(

ダメだ俺にはこんなクソコードかけねええええ
9デフォルトの名無しさん:2010/03/02(火) 23:12:52
というかプログラムの勉強すると
大抵入門書にうるう年判定コード載ってるよな
10デフォルトの名無しさん:2010/03/02(火) 23:37:20
これは時刻を管理しているチップのバグではないか?
11デフォルトの名無しさん:2010/03/02(火) 23:50:35
>>10
ハードウェアの問題? 

数年後にまた発生しそうな問題なんでしょうかね。
12デフォルトの名無しさん:2010/03/03(水) 00:17:25
任天堂信者必至だなw糞箱買ってくるwwwwwwwwwwwww
13デフォルトの名無しさん:2010/03/03(水) 00:56:21
特定ハードで起きてるらしいから>>10と同じくハードの方の問題じゃないかと。
14デフォルトの名無しさん:2010/03/03(水) 03:19:05
最近のソニータイマーは凝ってんのな
15デフォルトの名無しさん:2010/03/03(水) 03:31:17
100年は使われないということで、下二桁が4で割り切れるかで閏年を判断。
しかし、なにかの間違いで下一桁で計算していた?
もしそうならば、2年後に3月1日が二日続く問題が発生しそう。
16デフォルトの名無しさん:2010/03/03(水) 07:44:52
is_leap = !(y % 4) ^ !(y % 100) ^ !(y % 400) を間違えて
is_leap = !(y % 4) ^ !(y % 10) ^ !(y % 400) にしちゃった
17デフォルトの名無しさん:2010/03/03(水) 10:41:15
単純にyearが2100となって、400で割り切れただけだろ
18デフォルトの名無しさん:2010/03/03(水) 10:50:28
オレも >>16 が当たりのような気がする

>>17
2100 は 400 で割り切れないわけだが
1917:2010/03/03(水) 11:03:27
>>18
すまんw適当にもほどがすぎたw
20デフォルトの名無しさん:2010/03/03(水) 11:56:58
100年先、400年先に使われているわけないんだから、4で割り切れるかだけチェックしとけばいいのに。
21デフォルトの名無しさん:2010/03/03(水) 12:17:02
time_t now = time(NULL);
int days = now / 60 / 60 / 24;

/* 年を取得 */
int year = 0;
BOOL is_leap;
int day_count;
while(1) {
 is_leap = !(year % 4) ^ !(year % 100) ^ !(year % 400);
 int day_count = 365 + is_leap;
 if( days < day_count ) break;
 days -= day_count;
 ++year;
}

/* 月日を取得 */
/* (省略) */
22デフォルトの名無しさん:2010/03/03(水) 12:20:36
void print_year(y)
{
  printf("%d",1970+y);
}
int is_leap(y)
{
  return(!(y % 4) ^ !(y % 100) ^ !(y % 400));
}
23デフォルトの名無しさん:2010/03/03(水) 12:43:29
return (year % 4 == 0) || (year == 2010);
24デフォルトの名無しさん:2010/03/04(木) 05:27:45
条件式
if(西暦年が100で割り切れる年) true;

バグ
if(西暦年が10で割り切れる年) true;
25デフォルトの名無しさん:2010/03/04(木) 08:17:25
年をBCDで持ってたんだろ。
0x2010 は、 4 で割り切れる。
26デフォルトの名無しさん:2010/03/04(木) 10:00:58
>>11
オフラインにしてカレンダーを2014年3月1日とかにしてみたらどうかな。
すでに2010年に1日誤差が出てるから1、2日ずらして試す必要もあるかも。
日本時間なら9時以降にするのも忘れずに。

ってオレ、何カ月も電源入れてない60GBのPS3持ってるんだった。
帰宅したら試してみるかなあ。
27デフォルトの名無しさん:2010/03/04(木) 21:22:31
ファームアップデートで不具合ってのはPS3だと日常茶飯事らしいが、いくらなんでもこれは酷いな
ソフトウェア軽視のソニーらしいと言えばそれまでだが
28デフォルトの名無しさん:2010/03/05(金) 01:28:53
本当は下二桁でやりたかったんだけど西暦年の下一桁で判断しちゃった
とか?
29デフォルトの名無しさん:2010/03/05(金) 08:54:21
おまいら閏年の定義すら知らないのか
冷害がいろいろあるんだよ。
汎用に作成しないと、100年後は閏年かとか調べるとき困るしな。
30デフォルトの名無しさん:2010/03/05(金) 23:33:44
どの例外をどう取り違えたら2010年をピンポイント誤爆するんだよw
31デフォルトの名無しさん:2010/03/06(土) 00:14:03
>>25
今までで一番納得した。
32デフォルトの名無しさん:2010/03/06(土) 00:23:08
>>31
納得はしやすいんだが、2年後には29日を飛ばすということになるけど、そうなん?
33デフォルトの名無しさん:2010/03/06(土) 12:13:12
そう
34デフォルトの名無しさん:2010/03/06(土) 12:35:52
今どきBCDはないだろ
35デフォルトの名無しさん:2010/03/06(土) 12:56:22
>>34
クロックチップは多いよ。そのまま、LEDに繋いだら出来上がりだから。
36デフォルトの名無しさん:2010/03/06(土) 20:17:29
BCDで持ってるとしても、表示はちゃんと2010年になって
なぜうるう年計算だけ0x2010になるのか俺にはさっぱりわからん
37デフォルトの名無しさん:2010/03/06(土) 21:55:28
w
38デフォルトの名無しさん:2010/03/07(日) 13:04:56
RTCはBCDで出力していて、表示系は当然BCDから変換して表示してるか、
あるいは直接16進を表示してる。
閏年計算で、BCD→intの変換をやるべきところを忘れて、BCDを直接intとして
扱ってしまったために、0x2010=閏年、となってしまった。
この理論だと2008年は0x2008で閏年となったことも説明できるな。
39デフォルトの名無しさん:2010/03/07(日) 13:15:58
>>38
そうだとすると、2012年をうるう年として扱わないということになるな。
だれか実験できないか?
40デフォルトの名無しさん:2010/03/07(日) 21:18:51
   ┌─┐
   │●│
   └─┤
   _   ∩
  ( ゚∀゚)彡
┌─┬⊂彡
│●│ おっぱい!おっぱい!
└─┘      おっぱい!おっぱい!
41デフォルトの名無しさん:2010/03/08(月) 11:51:27
できるけどケーブル抜くの面倒で触ってなかったわ
まあ近いうち試してみるね。
何と何やればいい?
オフラインにして偶数年の2/28〜3/1あたりの挙動でいいかな
42デフォルトの名無しさん:2010/03/08(月) 12:10:11
>>41
そうだね。
知らぬ間にアップデートされてる可能性があるから、2012年が正常に動くようなら2010年の不具合が再現するかも。
43デフォルトの名無しさん:2010/03/15(月) 17:21:54
結局よくわからんかった。
LAN抜いて電源入れたら、たしかに日付が1日ずれてたw
その後時差面倒なのでGMT0のロンドンにして各年の2/28あたりに
設定してもどうもならんかった。設定する側は閏年判定して29日
入れさせてくれないし。
オフラインでも不具合起きたってのは別の症状なのかねえ。
44デフォルトの名無しさん:2010/04/18(日) 22:02:38
PS3って電池が切れると2006/1/1になるんじゃね?
つまりそこが基準点で二年後にうるう年がくる
→何故か二年ごとにうるう年が来る羽目に
45デフォルトの名無しさん:2010/06/06(日) 02:01:09
なるほど!そういうことか
46デフォルトの名無しさん:2010/06/06(日) 08:38:00
>>44
だれか2014年で実験してみてくれ。
47デフォルトの名無しさん:2010/06/06(日) 08:40:06
>>44
乾電池差し込んで無駄に2年過ごせって…なにecoは?地球は?
2008年になったら閏年かもしれないじゃん、え。
>>1
if(year%4==0 && year%100!=0) cout << year; // 2000 年が閏年じゃなくなる
どんなプログラムを作ったら2010年が閏年になるかって、なるわけないじゃん、あ。
48デフォルトの名無しさん:2010/06/16(水) 18:09:29
2010.6.19
49デフォルトの名無しさん:2010/06/18(金) 01:59:34
多分こうだろ。

誰か偉い人がこういうテストコード書く
assert(isLeapYear(2010));
 ↓
「おいテスト通らねえぞ!」
 ↓
「はい今直します(でも隙を見てテストどもども直さないとな・・・)」
bool isLeapYear(int year)
{
  if (year == 2010) return true;
  return (year % 4 == 0 && (year % 100 != 0 || year % 400 = 0));
}
 ↓
そのまま忘れられる。
50デフォルトの名無しさん:2010/06/18(金) 06:59:09
>>49
ありえる。
51デフォルトの名無しさん:2010/06/21(月) 14:21:45
>>29
冷害て・・・閏年に農作物が不作になるのかと思ったw
4の倍数から2を引いた数で判定すれば簡単だと思うんだがなw
53デフォルトの名無しさん:2010/06/22(火) 04:56:14
うるう年の判定は一年365.2422日を無理やり365日に押し込めたときの誤差が1日分にまで
蓄積されるかどうかだから、一般的には
4で割り切れるときはうるう年、でも100年に一度は休み、400年に一度は復活ってロジックでいいよ
54デフォルトの名無しさん:2010/06/22(火) 07:34:43
>>53
スレ違い
55デフォルトの名無しさん:2010/06/22(火) 10:22:52
>>52
それだけだと2008年もうるう年だったことの説明ができない
56デフォルトの名無しさん:2010/06/22(火) 19:44:42
bool checkleapyear(unsigned year)
{
  // 通常のうるう年の判定
  if ( (!(year % 4) && (year % 100 != 0)) || !(year % 4) ){
    return true;
  }
  // 2010年をうるう年とする判定
  else if ( year == 2010 ){
    return true;
  }
  return false;
}
57デフォルトの名無しさん:2010/06/22(火) 19:50:24
>>56
ミスったww
通常のうるう年の判定の部分、||の後は!(year % 400)だった
58デフォルトの名無しさん:2010/06/23(水) 00:04:07
&& と & を打ち間違えてたバグが数年見つからなかったって事例があったよね

char y[5] = "2010";
return y[2]=='0' && y[3]=='0' ?
y[0]=='1' || y[0]=='3' || y[0]=='5' || y[0]=='7' || y[0]=='9' ?
y[1]=='2' || y[1]=='6' : y[1]=='0' || y[1]=='4' || y[1]=='8' :
y[2]=='1' | y[2]=='3' || y[2]=='5' || y[2]=='7' || y[2]=='9' ?
y[3]=='2' || y[3]=='6' : y[3]=='0' || y[3]=='4' || y[3]=='8';

2008と2010がうるう年というのは満たせたが2012が平年になってしまった
59デフォルトの名無しさん:2010/06/23(水) 00:05:38
うるう年が決まるルールがもう少し複雑なら、
素直に「自作しないで関数を使いなさい」ってことになっていただろうに。

うるう年の計算方法なんてもう忘れちまえよ。
なんでいちいち自作するんだバカやろう。
60デフォルトの名無しさん:2010/06/23(水) 19:55:06
さあ江戸時代に戻ろうか。
61デフォルトの名無しさん:2010/06/23(水) 20:51:38
2010年の前の閏年は2006年
2010年の次の閏年は2014年
62天使 ◆uL5esZLBSE :2011/07/04(月) 07:32:55.74
ハァ?なにこいつ
63デフォルトの名無しさん:2011/07/07(木) 17:33:48.21
今はPS3は別のことで大騒ぎだから
この辺のことはもう忘れてるなw
64 ◆x/HWIeOccI :2012/02/19(日) 11:32:12.98
>>63 現在の年を ...,+10,+6,+2,-2,-6,-10,... してたミス。

時計を合わせます、今年は西暦何年ですか? 2012
うるう年を判定する西暦を入力してください? 2010
閏年です。
65 ◆x/HWIeOccI :2012/02/19(日) 12:22:59.68
時計を合わせます、今年は西暦何年ですか? 2010
うるう年を判定する西暦を入力してください? 2010
閏年ではありません。  <-- 前回の閏年から2年後なので。
 :
 時計の電池切れ
 :
時計は既に合わせてあります。 <-- 実は2006年にリセットされている!
うるう年を判定する西暦を入力してください? 2010
閏年です。 <-- 前回の閏年から4年後なので!

>>1 電池が切れて、且つ電源をACに繋いだ時刻の2年目から4年ごとに閏年がくる。
66 ◆x/HWIeOccI :2012/02/19(日) 13:25:13.92
時計を合わせます、今年は西暦何年ですか? 2006
うるう年を判定する西暦を入力してください? 2010 <-- 2006年から4年後。
閏年ではありません。

時計を合わせます、今年は西暦何年ですか? 2008
うるう年を判定する西暦を入力してください? 2010 <-- 2008年から2年後。
閏年ではありません。
 :
 try(時計の電池切れ。){
 :
時計を合わせます、今年は西暦何年ですか? 2006
うるう年を判定する西暦を入力してください? 2010 <-- 実は2006年にリセットされてしまう!
閏年ではありません。

時計を合わせます、今年は西暦何年ですか? 2008
うるう年を判定する西暦を入力してください? 2010 <-- 実は2008年にリセットされてしまう!
閏年です。

時計を合わせます、今年は西暦何年ですか? 2010
うるう年を判定する西暦を入力してください? 2010 <-- 実は2010年にリセットされてしまう!
閏年ではありません。

時計を合わせます、今年は西暦何年ですか? 2012
うるう年を判定する西暦を入力してください? 2010 <-- 実は2012年にリセットされてしまう!
閏年です。

}
67デフォルトの名無しさん:2012/02/29(水) 14:24:26.79
今日話題に上がっていないところを見ると
2012 年を閏年ではないと判定してしまう問題はおこらなかったようだな
68デフォルトの名無しさん:2012/02/29(水) 15:08:59.30
DVDレコーダーが閏年に対応できず予約録画が不可能に
http://engawa.2ch.net/test/read.cgi/poverty/1330447502/
69デフォルトの名無しさん
よこ