プログラミングの問題の書き方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

プログラミングの問題の書き方

#1

投稿記事 by みけCAT » 12年前

プログラミングの問題を書いてみました。
形式は日本情報オリンピック予選を想定しています。

コード:

VS Apache Killer

 A君はHTTPサーバーを自作しています。ある日、A君は
自分が作っているサーバーがApache Killerの攻撃を
食らってしまう可能性に気づきました。Apache Killerの
攻撃を阻止するためには、与えられたRangeヘッダーから
返すべき正しい範囲を求めなければいけません。しかし、
A君のプログラミングの腕はいまひとつなので、A君は
このプログラムをかけません。よって、あなたがA君の
代わりにこの作業を行うプログラムを書いてあげてください。
 返すべき範囲のリストが与えられる。このリストの要素の
1個以上に含まれている範囲を全て出力するプログラムを書け。

入力
1行目:リストの個数n
m+1行目(1≦m≦n):返すべき範囲sm em(スペース区切り)
 smバイト目からemバイト目までを返すべきである事を示す。

1≦n≦10000
0≦sm≦em≦2^31-1

出力
n行目:返すべき範囲sn en(スペース区切り)
 snバイト目からenバイト目までを返すべきである事を示す。

不連続な返すべき範囲の数だけ過不足無く行を出力する。
行の最後には必ず改行を入れる。
各行はsnの小さい順に出力する。

サンプル入出力
入力1
2
0 10
5 19
出力1
0 19

入力2
2
0 9
20 29
出力2
0 9
20 29

入力3
3
10 19
0 15
20 29
出力3
0 29 
本格的な問題を書いたことはないので、どのような書き方がいいのかよくわかりません。
問題の書き方、テストケースの作り方などを教えていただければ幸いです。
よろしくお願いします。
この問題を解くだけの返信も歓迎します。(色々な言語ででも・・・)

自分の解答ソースコードはこれです。
► スポイラーを表示
もしこのコードが間違っているなら、撃墜例とともに教えていただければありがたいです。
よろしくお願いします。

日記とのマルチポストです。
http://dixq.net/forum/blog.php?u=536&b=2508

2011/11/1 16:20頃
ソースコードを差し替えました。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: プログラミングの問題の書き方

#2

投稿記事 by beatle » 12年前

問題文を書く場合、出題対象とする人々の間で常識ではない知識は説明するといいと思います。
例えば今回の問題例では(この掲示板の利用者を出題対象とするなら)「Apache Killer」や「Rangeヘッダー」を知らない人は多いはずです。
したがって、その2つを誰でも分かるように説明しましょう。
(「返すべき範囲」も意味が分かりませんが、きっと2つの説明を聞けば理解できるのでしょう)

テストケースは、すべての場合を尽くすようにすればいいと思います。
問題文はあくまで補助で、テストケースが仕様だということにすれば、
採点が楽です。

せっかくだから回答を貼っておきます。採点お願いします。
► スポイラーを表示

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: プログラミングの問題の書き方

#3

投稿記事 by みけCAT » 12年前

beatle さんが書きました:せっかくだから回答を貼っておきます。採点お願いします。
Ideoneで実行したところ、Runtime Error(SIGSEGV)となる入力がありました。
http://ideone.com/rsGuH
(#12は最後まで入力できていないようなので気にしないでください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
a5ua
記事: 199
登録日時: 13年前

Re: プログラミングの問題の書き方

#4

投稿記事 by a5ua » 12年前

C++で書きました。
(言語かぶってしまった。いろんな言語での回答に期待)

ソース(Visual C++ 2010 で作成)
► スポイラーを表示

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: プログラミングの問題の書き方

#5

投稿記事 by みけCAT » 12年前

二人ともC++0xことC++11か・・・。
ふぇぇ、コンパイルが通らないよぉ。><
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: プログラミングの問題の書き方

#6

投稿記事 by bitter_fox » 12年前

Javaで書きました。
問題の解釈が難しかったです。
► スポイラーを表示
合ってるかな?
[hr]
11/11/12 9:40やや修正
同 9:52使ってないメソッド削除
同 10:11もうちょっとクレバーに変更
最後に編集したユーザー bitter_fox on 2011年11月12日(土) 14:24 [ 編集 2 回目 ]

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: プログラミングの問題の書き方

#7

投稿記事 by beatle » 12年前

再度挑戦してみました。
runtime_errorになりにくくなりました。
► スポイラーを表示
採点お願いします><

2010/11/12 12:37 プログラムミス修正(1行)
2010/11/12 14:27 プログラムミス修正(大量)
最後に編集したユーザー beatle on 2011年11月12日(土) 14:27 [ 編集 2 回目 ]

アバター
うしお
記事: 56
登録日時: 13年前

Re: プログラミングの問題の書き方

#8

投稿記事 by うしお » 12年前

C# でやってみました。こういうのは頭がこんがらがりますね~脳のキレが悪いだけですが(笑
「このリストの要素の1個以上に含まれている範囲を全て出力するプログラムを書け」
これが正直わかりにくかったです。
「この範囲リストで表現される範囲を、最少個数の範囲リストで出力しなさい」
等はどうでしょう?
► スポイラーを表示

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: プログラミングの問題の書き方

#9

投稿記事 by beatle » 12年前

テストケースの実行を支援するアプリを書きました。

test.py
► スポイラーを表示
使い方は

コード:

$ ./test.py ./a.out
です。a.outにはテスト対象のプログラムのパスを書きます。

テストケースは 0.in, 0.out のように、「N.in」と「N.out」の組で作ります。
N.inには標準入力に入力する内容を、N.outには標準出力の期待される出力内容を書きます。
例えば

0.in

コード:

2
0 10
5 19
0.out

コード:

0 19
という具合です。

試しにみけCATさんが示した3つの例を0, 1, 2とすると、テスト結果はこんな感じで出力されます。

コード:

test 0 OK
test 1 OK
test 2 FAILED

しひ

Re: プログラミングの問題の書き方

#10

投稿記事 by しひ » 12年前

指摘はほとんど出ているので解答だけ。OCamlで書きました。
http://ideone.com/meBjZ

閉鎖

“C言語何でも質問掲示板” へ戻る