アカウント名:
パスワード:
なんかで読んだ例題で「近代オリンピックの開催年数をすべて表示する」というのがあって、与えられる仕様が以下のとおりー。
・夏季オリンピックは1896年から4年毎で開催・冬季オリンピックは1924年から4年毎で開催。ただし、1992年の次は1994年から4年毎に開催・1916年、1940年、1944年は戦争のため開催なし
人によって実装はまちまちだけど、これを誰が見ても分かりやすくメンテナンスしやすいコードを書くにはちょっと経験がいるかも。模範解答は膝を打った。
まぁ実際の開発の仕事ではもっと複雑だろうけど。
下手に無駄なく生成するアルゴリズムよりも、全ての年について条件に当てはまるか否か判定・抽出するアルゴリズムの方が、一見バカっぽく見えても、仕様をコードに落としこむ際のエラーは少なそうに思える。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
私はプログラマです。1040 formに私の職業としてそう書いています -- Ken Thompson
オリンピックの開催年数を表示する例題 (スコア:1)
なんかで読んだ例題で「近代オリンピックの開催年数をすべて表示する」というのがあって、与えられる仕様が以下のとおりー。
・夏季オリンピックは1896年から4年毎で開催
・冬季オリンピックは1924年から4年毎で開催。ただし、1992年の次は1994年から4年毎に開催
・1916年、1940年、1944年は戦争のため開催なし
人によって実装はまちまちだけど、これを誰が見ても分かりやすくメンテナンスしやすいコードを書くにはちょっと経験がいるかも。
模範解答は膝を打った。
まぁ実際の開発の仕事ではもっと複雑だろうけど。
Re: (スコア:0)
下手に無駄なく生成するアルゴリズムよりも、
全ての年について条件に当てはまるか否か判定・抽出するアルゴリズムの方が、
一見バカっぽく見えても、仕様をコードに落としこむ際のエラーは少なそうに思える。
Re:オリンピックの開催年数を表示する例題 (スコア:1)
> 誰が見ても分かりやすくメンテナンスしやすいコード
なので、
以下の考え方が良いような気がします。後々、使い回しも出来そうですし。
> 下手に無駄なく生成するアルゴリズムよりも、
> 全ての年について条件に当てはまるか否か判定・抽出するアルゴリズムの方が、
> 一見バカっぽく見えても、仕様をコードに落としこむ際のエラーは少なそうに思える。
したがって、以下の様な何の変哲も無いプログラムになります。
効率が犠牲になりますが、この程度なら、大した問題にならないでしょう。
# ラムダ式を使えば、もう少しエレガントになりますか?
static void Main()
{
var orympicYears = new List<Int32>();
for( Int32 year=1896; year<=2013; year++ )
{
if ( JudgeIsOrympicYear( year ) )
{
orympicYears.Add( year );
}
}
}
Boolean JudgeIsOrympicYear( Int32 year )
{
// 1896年未満はそもそもオリンピックは存在しないので除外。
if ( year < 1896 ){
return false; // No Orympic Year ( Not Exist )
}
// 戦争による非開催年は除外。
switch ( year ) {
case 1916:
case 1940:
case 1944:
return false; // No Orympic Year ( By War )
}
// 夏季は1896年より4年おきの開催。
{
Int32 tmp = year - 1896;
if ( ( tmp >= 0 ) && ( tmp % 4 == 0 ) ){
return true; // Orympic Year ( Summer )
}
}
// 冬季は、1992年以前は、1924年より4年おきの開催。
// 以後は、1994年より4年おきの開催。
{
Int32 tmp = year - ( year <= 1992 ) ? 1924 : 1994;
if ( ( tmp >= 0 ) && ( tmp % 4 == 0 ) ){
return true; // Orympic Year ( Winter )
}
}
// 夏季も冬季も非開催ならば、除外。
return false; // No Orympic Year
}