CodeIQ Blog

自分の実力を知りたいITエンジニア向けの、実務スキル評価サービス「CodeIQ(コードアイキュー)」の公式ブログです。

4月1日特別企画★「地球滅亡問題」の解答公開&表彰! その1

アロハー!CodeIQの中の人、OL元帥です。

4月1日、エイプリルフール企画として出題したトンデモ問題を出題しました!
そのオモシロ(?)解答を、この場で表彰したいと思います~!

https://codeiq.jp/ace/codeiq_save_earth/q270
f:id:codeiq:20130404165146j:plain
【問題】
ノストラダムスは1999年7月に人類滅亡と予言しましたが人類は滅亡しませんでした。
マヤ暦では2012年12月21日に人類滅亡と言い伝えられていましたが人類は滅亡しないどころか、
いまさらマヤ暦の計算が間違っていて2015年9月3日に人類滅亡と修正されてしまいました。
年から年中、人類は滅亡すると言われながら、戦々恐々とした日々を我々は過ごしています。
いつ地球が滅亡するのか予想して、地球から逃げる準備でもしようではありませんか。
だって、我々は地球防衛軍の一員なんですから。
でも気づいたんです。
地球っていつ滅亡するんだっけ???
そこでみなさんにお願いがあります。
人類を救うため、地球滅亡の日を教えてください。



このバカバカしい楽しい問題に、31人もの方+あの小飼弾さんが挑戦してくださいました!
その勇気に敬意を表し、ここで解答を晒す公開&表彰させていただきます!

まずは真面目に数学的アプローチで挑戦してくれた方々!さすがエンジニア!

■ amamaさん 「チューリングマシン」賞

地球滅亡の日:2038年1月19日3時14分7秒
その根拠となる計算と簡単な説明:
time_t型が符号付きで32bitである場合,その時刻になったらオーバーフローして負の値になってしまうため.

地球防衛軍切り込み隊長からのコメント)32bitの世界、64bitの世界。世の中、bitだらけ

■ k.k0703さん 「旅は道連れ」賞

地球滅亡の日:2036年2月6日 6時28分15秒 (UTC)
その根拠となる計算と簡単な説明:
NTPが32ビットのため、1900年1月1日 0時0分0秒 から42億9496万7295秒までしか計算できない。

地球防衛軍切り込み隊長からのコメント)通信遅延が起こると地球滅亡の日も遅延するんですかね?

■ hotpepsiさん 「もっとちこーよれ」賞

地球滅亡の日:西暦14890943年4月1日(月)
その根拠となる計算と簡単な説明:
人類は毎年約1億人のペースで増加している。
このまま人類が増え続け、身動きが取れなくなるくらいの人数になると人類は滅亡すると予想される。
計算の簡単のため、その限界値を1m2あたり10人とする。
地表の面積は約1億4889万km2なので、最高密度での人口は148890000000000×10=1488.9兆人
現在70億人として、そこに達するまでの年数は(1488900000000000-7000000000)÷100000000=14888930(年)
14888930+2013=14890943
※ 多少の誤差が含まれています。

地球防衛軍切り込み隊長からのコメント)人口密度の限界点を人類滅亡と定義した発想は面白いが、問題は地球滅亡なんだよね~ん。

■ inaniwa3さん 「関数依存」賞

地球滅亡の日:Mon Feb 8 16:01:55 2027
その根拠となる計算と簡単な説明:

#include <stdio.h>
#include <time.h>
int main(void)
{
      puts(ctime((time_t*)"chikyuu metsubou"));
}

地球防衛軍切り込み隊長からのコメント)文字列を時間に変換するとは…w 4月1日に限ってはアリ。

■ cielさん 「アキレスと亀で」賞

地球滅亡の日:予測不能
その根拠となる計算と簡単な説明:
この問題が公開された4/1 10:00時点でのunix time(1364778000)をtと置こう。
この問題の挑戦締め切りは4/2 12:00だから、その時刻に地球が滅亡するとして、そのunix time(1364871600)をeと置こう。
ところが、今まで地球が滅亡するとされながらも滅亡しなかったことにより、現在時刻が進むにつれ、滅亡する時刻も徐々に進んでいると思われる。
ここでは、現在時刻がその時点での地球が滅亡する時刻に進むとき、その時間をtとすると、地球が滅亡する時刻はそのdt倍だけ進んでいることにしよう(「徐々に進む」なので、0 すると、次の計算が正常に終了した時点での時刻tが「地球が滅亡する日」ということになる。ところが、我々にはこの計算を正常に終了させる術はない。
よって地球が滅亡する日を計算によって予測することはできない。
なお、t>=eなるパラメータを以ってプログラムを実行しても、その結果に意味は無いことに注意されたい。

#!/usr/bin/ruby
require 'bigdecimal'
dt=BigDecimal('0.1')
t=BigDecimal('1364778000')
e=BigDecimal('1364871600')
#raise 't and e are invalid' if t>=e
while t<e
	d=e-t
	t+=d
	e+=d*dt
end
puts t

地球防衛軍切り込み隊長からのコメント)永遠に追いつくことができないアキレスと亀みたいです


続きまして、一見すると真面目なようで、実はなんか惜しい方々(笑)

■ ozy4dmさん 「オレサマ定数」賞

地球滅亡の日:2156年2月3日
その根拠となる計算と簡単な説明:
滅亡の公式(Wikiqebia参照)を使う
N = 2013年4月1日として、
d = N + T
(Tは皆殺し定数37564[時間])
ただし、私は死にたくないのでオレサマ定数
R = 0.030
を用いて
d = N + T / R
と表すことができるので、これにより
d = 2156年2月3日
が得られる。

地球防衛軍切り込み隊長からのコメント)自分が死にたくないがゆえにオレサマ定数を設定するなど自由すぎますねw

■ inakaさん 「時は金なり」賞

地球滅亡の日:2014年4月08日
その根拠となる計算と簡単な説明:
問題文内にある予言3つの日付の平均をとった。
取った手法として、2015年9月3日なら20150903とする。
例外として、ノストラダムスの予言は詳細な日付がないため1999年07月01日と仮定し、19990701とする。
計算式は19990701+20121221+20150903/3である。
それにより20087608.33333333となった、小数点以下を消し、
20087608となる。76と並んでるのでそれを12で割る。
その値は6.333333333333333そして2008と6を足す。
それで2014年となる。
12÷3=4で4月。
上記計算によって、2014年4月08日と結論付けた。
若干のブレは発生する可能性はあるだろう。
ノストラダムスの大予言の段階で値が確定してないためである。

地球防衛軍切り込み隊長からのコメント)時間の平均の算出方式が…強引やろw 時間の利用は計画的に。

■ 静かなる恵比寿さん 「謎い」賞

地球滅亡の日:2013/5/20
その根拠となる計算と簡単な説明:
数値的なゆらぎとして50を入力することは、ある程度の普遍性があると認識。
なおかつ、これが100(10^3)であったり、それ以上にするのは明らかに蓋然性がない。
危険は常に起こりうるものという感覚のもとに、yではなくmでもなく、かといってsでもなく、あえてdを入力することが妥当と考える。

地球防衛軍切り込み隊長からのコメント)定義不明瞭につきよーわからん

■ schさん 「命題とぅるー」賞

地球滅亡の日:
2013/4/1 に滅亡する:)
その根拠となる計算と簡単な説明:
命題(a)「x年⇒地球が滅亡する」の真偽は
対偶命題(b)「地球が滅亡しない⇒x年以外」の真偽と一致する.
x=2013/4/1(便宜上有理数として表現する = 2013.24657534 = 2013+(31+28+31)/365)とすると
この回答が受理されているとすれば2013/4/2の時点で
地球が滅亡していないということになる,つまりx年以外=Trueである.
皆も知っている通り,A⇒BにおいてB=TrueとするとAによらず
(b)の命題は真であり,元の命題(a)も真となる.
つまり「2013/4/1⇒地球が滅亡する」

地球防衛軍切り込み隊長からのコメント)あなたの命題は真となりましたが、2013/4/2の時点で地球は滅亡していないので、地球滅亡日を2013/4/1としたのは外れてしまいましたね。



schさん…よく自信満々に「本日滅亡」って書けましたね……。


結城 浩さんにぜひ見てもらいたい!とってもステキな発想の解答!

■ 熊五郎さん 「ユーリ」賞

地球滅亡の日:2996年4月9日
その根拠となる計算と簡単な説明:
情報が殆ど無いので、マヤ暦の2つの年月日を元に考えてみます。
結城さんの「数学ガール フェルマーの最終定理」の中に、時計巡回というお話があります(ステマ)
特定条件の間隔で線を結ぶとすべての数を巡回するというものですが、
これを時間ではなく月日でできないか考えてみました。
マヤ暦は12月21日が最初に提示され、その後9月3日に修正されています。
この修正された予言が間違うたびに何度も等間隔で再修正され、全ての月日を巡回すると仮定します。
(※うるう年は面倒なので誤差として考えないことにします。)
12月21日は355日目。9月3日は246日目。よって間隔は256日。
時計巡回で言うステップ数が256。文字盤の数が365。
256と365の最大公約数は1。互いに素。
よって256日後を計算し続けると全ての月日を巡回することになる。
つまり予言が外れるたびに延々と2年256日後に修正し続けると、
修正した月日は前に予言した月日と同一にならない。
そして一番最後に残った日にようやく予言が当たるのではないかと推測できます。
あとはExcelでざっと計算してみました。
2996年4月9日。地球滅亡まで恐らくたぶんあと360028日。

地球防衛軍切り込み隊長からのコメント)数学ガールの時計巡回の話を応用して考えるとは素敵ですね。まるであなたはユーリちゃんみたいよ。


そんなステキな解答の一方、こちらは衝撃の事実。

■ woodbookさん 「私だ。」賞

地球滅亡の日:2192/9/21
その根拠となる計算と簡単な説明:
俺が大体その辺まで生きる予定なので。私が神です。

地球防衛軍切り込み隊長からのコメント)だいぶ長生きのような気もしますが、神も死ぬときがくるんですね~。

■ だいだいだいさん 「おまえもか。」賞

地球滅亡の日:約70年後
その根拠となる計算と簡単な説明:宇宙は私が生まれたときに誕生した、すなわち私の余命=宇宙の余命となる。

地球防衛軍切り込み隊長からのコメント)2000年上生きた命もあと70年ですか。余命わずか






いや~、神が2人も降臨されるなんてCodeIQもすごいサイトになったもんです。
きっと、……「暇をもてあました、神々の遊び。」ですね。

長くなったので、その2に続きます~~~。