このコーナーでは、学習コンテンツpaizaラーニングのレベルアップ問題集をPythonとGASの両方で解いて全コードの解説をしています。
PythonとGASの両方のコードを用いて、全コード及び部分的にも可能な限り詳細に記載いたしました。
GASはスプレッドシートを使っています。
GASはGoogle Apps Scriptと言って、JavaScriptの文法をベースにしているので、JavaScriptの学習中の方にもお役立て出来るかも知れません。
paizaレベルアップ問題集でPythonとGASを解いて見たに戻る
メインメニューに戻る
Python自作サンプル
GASサンプル
基本情報技術者試験
paizaでの解答はPythonで行いましたが、この記事ではPythonのコードと共に、同じ問題を現在学習中のGASだったらどう解くのか、スプレッドシートでバインドして作ってみました。
数列の A 番目から B 番目までの和 (paizaランク D 相当)
問題:N個の数列のA番目からB番目までの和を求める
具体例として入力例1の、N=5,A=1,B=3、リスト「1 2 3 4 5」で考えてみます。
入力例1
5 1 3
1 2 3 4 5
出力例1
6
ではまず、Pythonで解いてみます。
今回は、paiza.ioを使って解きます。paiza.ioの使い方はこちらから。
<<Pythonでの解き方>>
下準備として、paiza.ioにこの様に入力します。
手順として、
1.標準入力でN,A,Bを読み込む
2.標準入力でリストとしてリストarrayを読み込む
3.計算結果ansを0で初期化
4.ループとスライスを使ってans+=numを加算代入演算子で合計を求めている
5.計算結果を出力
コードを見てみましょう。
手順1では、
N,A,B=map(int,input().rstrip().split(‘ ‘))
で、標準入力でリストの個数N,合計する最初のA番目,合計する最後のB番目を取り込んでいます。
mapで複数の数を読み込めます。
手順2では、
array=list(map(int,input().rstrip().split(‘ ‘)))
で、リストとして複数の数を標準入力で読み込んでいます。
listを使ってリストとしています。
mapで複数の数を読み込めます。
intで整数として読み込む形式を指定しています。
rstripで改行による影響を受けない様にして、split(‘ ‘)でスペース区切りの数値を読み込みます。
手順3では、
ans=0
計算結果の合計値を入れるansを0で初期化します。
手順4ではループとスライスを使って、A番目からB番目までの合計を求めています。
ここで注意すべき所は、リストの添字は0から始まることです。
つまり、ans=array[A-1]からarray[B-1]までの合計になります。
スライスを使う場合、array[最初:最後未満]なので、この場合は
array[A-1:B]
と指定します。
#ループとスライスを使って添字A-1からB-1までの合計を求める
for num in array[A-1:B]:
ans+=num
手順5で計算結果を出力しています。
ここまでのコードはこの様になります。
#配列の数、合計の最初と最後を読み込む
N,A,B=map(int,input().rstrip().split(' '))
#N個の配列を読み込む
array=list(map(int,input().rstrip().split(' ')))
#合計を0で初期化
ans=0
#ループとスライスを使って添字A-1からB-1までの合計を求める
for num in array[A-1:B]:
ans+=num
#計算結果を出力
print(ans)
<<GASでの解き方>>
では、同じ問題をGASで解いてみます。
まず、スプレッドシートにこの様に配置しました。
ピンク色の所にN=配列の要素数、灰色の所に配列、黄色の所にその合計値を求めます。
※スプレッドシートに表示する場合は、ループを使って一次元配列ではなく、二次元配列としてからの配列に追加をして作成します※
手順はこのようになります。
1:スプレッドシートからアクティブシートをアクセスする
2:ピンクのセルから配列の長さNに出力する数値(この問題の場合は「5」)を取得する。
3:緑のセルから配列の合計範囲の最初のA番目(この問題の場合は「1」)を取得する。
4:オレンジのセルから配列の合計範囲の最後のB番目(この問題の場合は「3」)を取得する。
5:灰色のセルから配列(この問題の場合は「1,2,3,4,5」)を読み込み、配列arrayとする
6:N,A,B,及び配列arrayをログ出力して正しく読み込めたことを確認する
7:合計値ans=0と0で初期化する
8:ループでA-1からBまでの間加算処理をする
9:計算結果をログ出力する
10:スプレッドシートに合計値を出力する配列calcを定義する
11:計算結果ansを出力用配列calcに二次元配列として追加する
12:配列calcに追加されたことをログ出力で確認する
13:スプレッドシートの黄色い所のB7である(7,2)に答えが格納された配列calcを出力する
手順1: スプレッドシートからアクティブシートをアクセスする
const ss=SpreadsheetApp.getActiveSheet();
これで定数ssにSpreadsheetAppから階層を辿ってアクティブシートにアクセスしています。
手順2:ピンクのセルから配列の長さNに出力する数値(この問題の場合は「5」)を取得する。
let N=ss.getRange(1,2).getValue();
手順3:緑のセルから配列の合計範囲の最初のA番目(この問題の場合は「1」)を取得する。
let A=ss.getRange(2,2).getValue();
手順4:オレンジのセルから配列の合計範囲の最後のB番目(この問題の場合は「3」)を取得する。
let B=ss.getRange(3,2).getValue();
手順5:灰色のセルから配列(この問題の場合は「1,2,3,4,5」)を読み込み、配列arrayとする
let array=ss.getRange(5,2,1,N).getValues();
手順6:N,A,B,及び配列arrayをログ出力して正しく読み込めたことを確認する
console.log(N);
console.log(A);
console.log(B);
console.log(array);
ログの実行結果です。
手順7:合計値ans=0と0で初期化する
let ans=0;
手順8:ループでA-1からBまでの間加算処理をする
加算代入演算子+=で、ansに合計しています。
スプレッドシートから取得した配列arrayは1行4列の二次元配列になっています。
ans+=array[0][i];
ループ全体のコードです。
配列の添字は0から始まるので、forの()内は下記の様になります。
//ループでリストの指定された範囲の合計値を求める
for(let i=A-1;i<B;i++){
ans+=array[0][i];
}
手順9:計算結果をログ出力する
console.log(ans);
手順10:スプレッドシートに合計値を出力する配列calcを定義する
let calc=[]
手順11:計算結果ansを出力用配列calcに二次元配列として追加する
calc.push([ans]);
手順12:配列calcに追加されたことをログ出力で確認する
console.log(calc);
手順13:スプレッドシートの黄色い所のB7である(7,2)に答えが格納された配列calcを出力する
スプレッドシートの実行結果です。
GASでの全コードはこちらになります。
<全コード>
function loop9(){
//スプレッドシートからアクティブシートにアクセスする
const ss=SpreadsheetApp.getActiveSheet();
//リストの個数を読み込む
let N=ss.getRange(1,2).getValue();
//合計範囲の最初を読み込む
let A=ss.getRange(2,2).getValue();
//合計範囲の最後を読み込む
let B=ss.getRange(3,2).getValue();
//配列を読み込む
let array=ss.getRange(5,2,1,N).getValues();
//N,A,B,arrayが読み込めたことをそれぞれ確認する
console.log(N);
console.log(A);
console.log(B);
console.log(array);
//合計値を初期化する
let ans=0;
//ループでリストの指定された範囲の合計値を求める
for(let i=A-1;i<B;i++){
ans+=array[0][i];
}
//合計値をログで確認する
console.log(ans);
//スプレッドシートに合計値を出力する配列calcを定義する
let calc=[]
//出力用配列calcに計算結果のansを二次元配列として追加する
calc.push([ans]);
//スプレッドシートに出力するcalcにansが格納されたことをログで確認する
console.log(calc);
//スプレッドシートの黄色いセルに計算結果を格納する
ss.getRange(7,2).setValue(calc);
}
宜しかったらコピペしてアレンジして見て下さい。
お疲れ様でした。
ブレイクタイムフォトはこちらになります。
東京メガイルミ 大井競馬場
■ 参考文献の紹介■
じっくり丁寧にPythonを学びたい方向け。
まずはpaizaラーニングなどの学習コンテンツで学んで、基礎をマスターしたら、この本でじっくりと初級から中級レベルを目指せます。
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。
GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本でじっくり学べます。
paizaレベルアップ問題集でPythonとGASを解いて見たに戻る
メインメニューに戻る
Python自作サンプル
GASサンプル
基本情報技術者試験