応用課題

応用課題は,

  1. プログラム
  2. 必要なデータ
  3. 簡単な解説(フォーマットは任意)

を,zipファイルにまとめて提出せよ.


X01_1: ポーカーの役を判定する

ポーカーとは,トランプゲームの一種であり,5枚のカードで役を作って強さを競うものである.

5枚のカードをランダムに配り,配られたカードの役を判定するプログラムを作成せよ.

役には以下のものがあり,上の方が強い役である.

※ 数字が連続する場合,Aは1(例: A-2-3-4-5)あるいはKの次(例: 10-J-Q-K-A)のいずれとしても扱える.

参考: Wikipedia ポーカー


X01_2: 一見,英文に見える文章を作成する

英文は主にアルファベットで構成されている.アルファベットの登場頻度は完全に均一ではなく,例えば e は q よりも登場頻度が高い.加えて,ある文字の次に現れる文字にも偏りがある.e の次には r がよく現れるが o は少ない,などである.

ある文字の次に現れる文字の登場確率に着目して,以下のようにして,一見,英文に見える文章を生成するプログラムを作成せよ.

  1. ある文字aの次に文字bが現れる確率P(b|a)を,既存の英文を分析して得る.
  2. 確率P(b|a)に基づいて文字をランダムに生成する.

フリーで参照できる英文として,Project Gutenberg などがある.

1文字単位ではなく,2文字単位(2-gram)や3文字単位(3-gram)にすると精度が上がるはずである. 1文字単位での結果に満足がいかなければ試してみよ.


X01_3: ローマ数字を数値に変換する

ローマ数字は,以下の記号を大きい数から順に並べて数を表す記法である.

ローマ数字 アラビア数字
M 1000
D 500
C 100
L 50
X 10
V 5
I 1

例: MMXXI = 2021

位の数として4と9が現れる場合のみ,小さい数を大きい数の左側に書き,大きい数から小さい数を減算することを表す.

ローマ数字 アラビア数字
CM 900
CD 400
XC 90
XL 40
IX 9
IV 4

例: MMXIX = 2019

文字列で与えられたローマ数字を,整数に変換して表示するプログラムを作成せよ.

参考: Wikipedia ローマ数字


X01_4: 問題の自動生成(その1)

あなたは中学校の数学の教師である.学生用に因数分解の問題を自動生成するプログラムを作成せよ.

  1. 整数の引数 n をとり,-n以上n以下で0でない整数を返す関数 linear_factor(n) を作成せよ.
  2. (x+a)(x+b)の形に因数分解できる2次の多項式x^2+px+qを自動生成するプログラムを作成せよ.ただし,a,bは-9以上9以下で0でない整数とする.a=bでもよい.aとbを生成する際には,関数 linear_factor(n) を使用せよ.

    多項式を表示する際は,以下の条件を含めた一般的な数式の表現に従うこと.指数の表記は困難であるため, ^2 と表記してよい.

  3. 2で作成したプログラムを拡張して,問題を10問生成するようにせよ.ただし,以下の条件を満たすようにせよ.

提出するプログラムは3のみでよい.


X01_5: 問題の自動生成(その2)

あなたは中学校の理科の教師である.学生用に元素記号を覚える問題を自動生成し,解答の正誤を返すプログラムを作成せよ.仕様は以下の通りである.


X01-6: リスト型のパフォーマンスの計測 (22/11/25 追加)

リスト型に要素を1つ追加するメソッドとして,途中に挿入する insert() と,末尾に追加する append() がある.両メソッドの処理速度(所要時間)について調査し報告せよ.insert() によって要素を追加する位置をいくつか変更して試せ.

所要時間の計測には,モジュール time を利用することができる.