第一の巻 総和と最大
初段 / 目安 15分
道場の正面に、カメ師範が自ら立っています。これまで師範は奥に控えているばかりでしたが、今日は違いました。「ここから先は、道具を選ばん。Python、JavaScript、TypeScript、Java——得物は自由。問うのは考え方のみじゃ。商店街の数字を使い、算法の腕を見せてもらおう」
師範が巻物を一つ、するりと開きます。「商店街の一日の売上高、ここに12店舗ぶんある。総和と最大、ライブラリの力を借りずに求めよ」
合計を出す関数も、最大値を出す関数も、どの言語にも用意されています。ここではそれを使いません。便利な道具の中で何が起きているのかを、自分の手で一度なぞるのが第一の巻の狙いです。
完成条件
売上高の配列を受け取り、合計と最大値を1つの文字列にして返す関数 sumAndMax を作ってください。どの言語で解く場合も、関数名は sumAndMax にしてください。
返す文字列の形は次のとおりです。
プレーンテキスト
合計 20600 / 最大 3200- 「合計」「/」「最大」の前後の半角スペースまで一致させること
- 数値の前後に余分な記号を付けないこと
- 配列には必ず1つ以上の要素が入っています
禁じ手
次の道具は使えません。ループと、足し算と、大小の比較だけで書いてください。
- Python の
summax - JavaScript / TypeScript の
reduceMath.max(...arr) - Java の
Arrays.stream(...).sum()IntStream.max()
進め方
ひな形の「課題」と書かれた部分から始めてください。初期化や補助処理は完成済みです。手が止まったらヒントを開けます。ヒントは3段階で、①方針、②使う構文、③部分解の順に出ます。ヒントは必要に応じて使い、書いた処理を自分で追えることを目標にします。
合計と最大は、別々に2周する必要はありません。1周のあいだに両方を育てられます。渡された最大値の初期値がなぜ先頭の要素なのか、確認してから書き始めてください。ここを 0 にしてしまうと、売上が全部マイナスの日に嘘をつく関数になります。
書き方の足場
配列は値を順に入れた箱です。temperatures[0] は先頭の値で、番号は 0 から始まります。Python は len(temperatures)、他の言語は temperatures.length で個数を取得します。変数は途中の値を覚える箱です。Python の代入は =、Java の整数の宣言は int、JavaScript と TypeScript で更新する変数は let を使います。TypeScript の number[] は数の配列という型です。
別の題材として、気温が負の日を数えます。for は順に繰り返し、if は条件を満たしたときだけ中を実行します。+= 1 は今の値に 1 を加える書き方です。Java、JavaScript、TypeScript の i++ も変数 i を 1 増やし、ループでは次の添字へ進む役目です。Java などの { } と、Python の字下げは処理の範囲を表します。以下の Java の断片はメソッドの中に置く例です。
Python
Python
temperatures = [-2, 1, 0]
freezing = 0
for value in temperatures:
if value < 0:
freezing += 1JavaScript
JavaScript
const temperatures = [-2, 1, 0];
let freezing = 0;
for (let i = 0; i < temperatures.length; i++) {
if (temperatures[i] < 0) {
freezing += 1;
}
}TypeScript
TypeScript
const temperatures: number[] = [-2, 1, 0];
let freezing: number = 0;
for (let i = 0; i < temperatures.length; i++) {
if (temperatures[i] < 0) {
freezing += 1;
}
}Java
Java
int[] temperatures = {-2, 1, 0};
int freezing = 0;
for (int i = 0; i < temperatures.length; i++) {
if (temperatures[i] < 0) {
freezing += 1;
}
}演習では total と best の初期値、数を文字列にする処理、return で結果を返す行を渡しています。関数の宣言はそのまま使ってください。Java の public static String は呼び出せる関数が文字列を返すという指定です。書くのは配列を1周するループと、その中での加算・比較・更新です。負の売上も扱い、配列は空ではありません。
要件
- 関数名は sumAndMax。どの言語で解く場合も同じ名前にすること
- 合計と最大は、ループと足し算と比較だけで求めること
- sum / max / reduce / Math.max / stream などの合計・最大の道具を使わないこと
- 「合計 20600 / 最大 3200」の形の文字列を1つ返すこと。印字ではなく return で返す
- ひな形の補助処理と出力整形を使い、配列を1周して加算と最大の更新を書くこと
- 入力配列は空ではないことが保証されます
ヒント
前のヒントを開くと次が開きます。開かずに解けると未開封クリアです