演習 04
問題 1
n
個の同じ大きさのボールが左右 1 列に等間隔に並んでいる。
ボールの直径は a
メートルであり、また、ボールとボールの間は b
メートル離れている。
ボール列の左端と右端それぞれがちょうど壁に接している。
以下の表の全ての n
, a
, b
について、左の壁と右の壁の間の距離を求めてコンソールに表示するプログラムを作成せよ。
n | a | b |
---|---|---|
17 | 22 | 59 |
97 | 87 | 32 |
56 | 1 | 99 |
95 | 11 | 99 |
82 | 2 | 25 |
問題 2
自然数 s
を受け取り、4 辺の長さが全て自然数かつ面積が s
の長方形について、4 辺の長さの和の最小値を求める関数 minSides
を作成し以下のプログラムを完成させよ。
となる自然数 について、 が 4 辺の長さの和である。 のとき、 の組としてあり得るのは (1, 12), (2, 6), (3, 4), (4, 3), (6, 2), (12, 1) の 6 通りであり、(3, 4) または (4, 3) のとき 4 辺の長さの和が最小となる。
void setup() {
noLoop();
}
void draw() {
int[] values = {1, 12, 25, 708, 970, 1601, 3401, 3892, 23256, 92316};
for (int i = 0; i < values.length; ++i) {
println(minSides(values[i]));
}
}
問題 3
1 行に 1 つの自然数が記録されたテキストファイルを読み込み、それぞれの自然数について各桁の和を順にコンソールに表示するプログラムを作成せよ。
123
の各桁の和は 1 + 2 + 3 = 6
である。
入力例
946941
509474
570702
33923
405244
937430
511733
809289
767155
389193
336653
966171
540967
822334
394278
704189
73579
118859
468842
694552
実行結果
33
29
21
20
19
26
20
36
31
33
26
30
31
22
33
29
31
32
32
31
問題 4
x
, y
, z
の 3 列を持った CSV ファイルが与えられる。
各要素には 0 以上 4 以下の整数が格納されている。
x
, y
, z
それぞれの列について、その列の最頻値を 1 つ表示するように以下のプログラムを完成させよ。
数列 a
において、数 v
の出現回数を count[v]
としたとき、count[v]
が最大となるような v
が a
の最頻値である。
例えば、数列 {1, 3, 3, 2, 3, 1, 3}
において、3 が 4 回出現し、それが最大であるため、この数列の最頻値は 3 である。
int mode(Table table, String columnName) {
}
void setup() {
noLoop();
}
void draw() {
Table table = loadTable("excercise4.csv", "header");
String[] columns = {"x", "y", "z"};
for (int i = 0; i < columns.length; ++i) {
println(columns[i] + "の最頻値: " + mode(table, columns[i]));
}
}
入力例
x,y,z
2,3,2
4,2,2
4,1,4
4,2,2
0,2,0
1,2,1
2,1,3
1,2,3
4,2,4
1,0,2
2,0,2
3,3,3
2,1,3
3,4,4
0,4,3
3,0,3
0,4,0
3,3,4
1,1,4
4,3,2
実行結果
xの最頻値: 4
yの最頻値: 2
zの最頻値: 2
問題 5
ノードを以下のように定義する。
- ノードは
name
とchildren
の 2 つのプロパティを持つ name
の値は文字列であるchildren
の値はノードの配列である- ノード
x
について、x
のchildren
に含まれるノードをx
の子ノードと呼ぶ
あるノード x
に含まれる全てのノードの name
の値を表示する処理 printAllName(x)
は以下のように再帰的に定義できる。
- 手順 1:
x
のname
の値を表示する - 手順 2:
x
の全ての子ノードy
について、printAllName(y)
を行う
以下のように 1 つのノードを表す JSON ファイルが与えられる。
{
"name": "Eve",
"children": [
{
"name": "Cain",
"children": []
},
{
"name": "Seth",
"children": [
{
"name": "Enos",
"children": []
},
{
"name": "Noam",
"children": []
}
]
},
{
"name": "Abel",
"children": []
},
{
"name": "Awan",
"children": [
{
"name": "Enoch",
"children": []
}
]
},
{
"name": "Azura",
"children": []
}
]
}
JSON ファイルを読み込み、そこに含まれる全てのノードの name
の値を表示するようにプログラムを完成させよ。
void printAllName(JSONObject x) {
// x の name の値を表示する
JSONArray children = x.getJSONArray("children");
for (int i = 0; i < children.size(); ++i) {
// x の全ての子ノード y について、 printAllName(y) を行う
}
}
void setup() {
noLoop();
}
void draw() {
JSONObject json = loadJSONObject("excercise5.json");
printAllName(json);
}
実行結果
Eve
Cain
Seth
Enos
Noam
Abel
Awan
Enoch
Azura