paiza レベルアップ問題集 「STEP: 2 カウント変数を使った計算」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASでループを使ってリスト(配列)とループのカウント変数(i=0,1,2,…)の積を求めて出力するコードの練習が出来ます。
Pythonでは、enumerateを使って、要素と添字の演算を行います。

どちらのコードでも、カウント変数の動きが理解しやすいよう、トレースのコードを設けています。

このコーナーでは、学習コンテンツpaizaラーニングレベルアップ問題集をPythonとGASの両方で解いて全コードの解説をしています。
PythonとGASの両方のコードを用いて、全コード及び部分的にも可能な限り詳細に記載いたしました。

GASはスプレッドシートを使っています。
GASはGoogle Apps Scriptと言って、JavaScriptの文法をベースにしているので、JavaScriptの学習中の方にもお役立て出来るかも知れません。

サイトマップはこちらから

paizaレベルアップ問題集でPythonとGASを解いて見たに戻る
メインメニューに戻る
Python自作サンプル
GASサンプル
基本情報技術者試験

paizaでの解答はPythonで行いましたが、この記事ではPythonのコードと共に、同じ問題を現在学習中のGASだったらどう解くのか、スプレッドシートでバインドして作ってみました。

カウント変数を使った計算 (paizaランク D 相当)

問題:
N 個の整数 M_1, M_2, …, M_N があります。
i 番目の M を M_i とするとき、M_i * i を改行区切りで出力してください。
例えば、M_5 が 3 の場合、3 * 5 = 15 となります。

この記事では、下記の入力例3の場合にリストの個数N=6として「8 1 3 3 1 8」が与えられていて、

「8」×1(番目)=8
「1」×2(番目)=2
「3」×3(番目)=9
「3」×4(番目)=12
「1」×5(番目)=5
「8」×6(番目)=48

を計算して求める例で進めていきます。

入力例3
6
8 1 3 3 1 8

出力例3
8
2
9
12
5
48

ではまず、Pythonで解いてみます。

今回は、paiza.ioを使って解きます。paiza.ioの使い方はこちらから。

■ Pythonでの解き方 ■

下準備として、paiza.ioにこの様に入力します。
(入力例1をそのままioにコピーしただけ。)

手順として、

1:数値Nの個数「6」を取得する

2:リストarrayに「8 1 3 3 1 8」を取得する


3:Forループで「要素×添字+1(リストの添字は0から始まるので+1している)」の計算結果を求める

4:その計算結果を出力

で、行います。

まずは、プログラムの動きを見やすいように、トレースのコードとトレースのio出力結果を添えます。

#標準入力でリストの個数(長さ)Nを取得
N=int(input())

#標準入力でリストarrayを取得
array=list(map(int,input().rstrip().split(' ')))

print('<<<ループに入る>>>')

#ループで「要素×添字+1」を計算
for i,num in enumerate(array):
    print('「'+str(num)+'」は「'+str(i+1)+'」番目')
    #ここで計算をしている
    ans=num*(i+1)
    print(str(num)+'×'+str(i+1)+'='+str(ans))
    print('計算結果は【'+str(ans)+'】です。')
    print('-------------------------')

print('<<<ループを抜ける>>>')

このままでは、出力例3に対して冗長なコードが含まれているので、解答以外のprint文をコメントアウトします。
冗長な部分をコメントアウトをしたコードです。

#標準入力でリストの個数(長さ)Nを取得
N=int(input())

#標準入力でリストarrayを取得
array=list(map(int,input().rstrip().split(' ')))

#print('<<<ループに入る>>>')

#ループで「要素×添字+1」を計算
for i,num in enumerate(array):
    #print('「'+str(num)+'」は「'+str(i+1)+'」番目')
    #ここで計算をしている
    ans=num*(i+1)
    #print(str(num)+'×'+str(i+1)+'='+str(ans))
    print(ans)
    #print('-------------------------')

#print('<<<ループを抜ける>>>')

更に、もっとスッキリするように、コメントアウトした部分を省いたコードです。

#標準入力でリストの個数(長さ)Nを取得
N=int(input())

#標準入力でリストarrayを取得
array=list(map(int,input().rstrip().split(' ')))


#ループで「要素×添字+1」を計算
for i,num in enumerate(array):
    #ここで計算をしている
    ans=num*(i+1)
    print(ans)

ioの出力結果です。

■ GASでの解き方 ■

では、同じ問題をGASで解いてみます。
まず、スプレッドシートにこの様に配置しました。

スプレッドシートの黄色いセルの所に「各桁の積の計算結果」を出力します。
計算結果はこの様になり、変数ansに代入します。

「8」×1(番目)=【8】
「1」×2(番目)=【2】
「3」×3(番目)=【9】
「3」×4(番目)=【12】
「1」×5(番目)=【5】
「8」×6(番目)=【48】

このansに代入された【計算結果】を二次元配列array2に追加して、スプレッドシートに出力します。

※スプレッドシートに表示する場合は、ループを使って一次元配列ではなく、二次元配列としてからの配列に追加をして作成します※

手順はこのようになります。

1:スプレッドシートからアクティブシートをアクセスする

2:スプレッドシートの緑色のセルから配列の長さ(個数)N(この例では「6」)を取得する


3:灰色のセルから長さNの配列(この例では「8 1 3 3 1 8」)を取得する


4:配列が取得できたことをログで確認する


5:スプレッドシートに出力する配列array2を宣言する


6:Forループで上記の掛け算を演算子て、計算結果を変数ans格納して、配列array2に追加する。


7:スプレッドシート出力前に二次元配列array2のログ出力で確認する


8:スプレッドシートの黄色いセルに掛け算の計算結果が格納された二次元配列array2を出力する

手順1: スプレッドシートからアクティブシートをアクセスする

const ss=SpreadsheetApp.getActiveSheet();

ここで定数ssにSpreadsheetAppから階層を辿ってアクティブシートにアクセスしています。

手順2: スプレッドシートの緑色のセルから配列の長さ(個数)N(この例では「6」)を取得する

const N = ss.getRange(1, 2).getValues();

手順3:灰色のセルから長さNの配列(この例では「8 1 3 3 1 8」)を取得する

const array=ss.getRange(4,1,1,N).getValues();

手順4:配列が取得できたことをログで確認する

console.log(array);

手順5:スプレッドシートに出力する配列array2を宣言する

let array2=[];

手順6:Forループで上記の掛け算の計算結果を変数ans格納して、配列array2に追加する

文字列と数値を一緒に表示させるには、Shiftキーと@を押して「`」で囲って、${}のなかに数値を入れます。

また、array[o][i]としているのは、スプレッドシートは二次元配列で格納させるため、array[0]で最初の行目の0列目、1列目、2列目、3列目、4列目、5列目と走査していくからです。

ループの中のトレースログでは、array[0][i]*(i+1)=ansを計算しています。

i=0の時

array[0][0]*(0+1)=81=【8】
ans=【8】をarray2に追加

i=1の時

array[0][1]*(1+1)=12=【2】
ans=【2】をarray2に追加

i=2の時

array[0][2]*(2+1)=33=【9】
ans=【9】をarray2に追加

i=3の時

array[0][3]*(3+1)=34=【12】
ans=【12】をarray2に追加

i=4の時

array[0][4]*(4+1)=15=【5】
ans=【5】をarray2に追加

i=5の時

array[0][5]*(5+1)=86=【48】
ans=【48】をarray2に追加

//Forループで上記の掛け算の計算結果を変数ans格納して、配列array2に追加する
  console.log('<<<ループに入ります!!!>>>');

  for (let i = 0; i < N; i++) {
    console.log(`「${array[0][i]}」は「${i + 1}」番目の要素です。`);
    console.log(`「${array[0][i]}×${i + 1}」を【ans】に求めます。`);

    //ここで計算をする
    let ans = array[0][i] * (i + 1);
    console.log(`計算結果ans:【${ans}】`);

    //計算結果が格納されたansを配列array2に追加する
    array2.push([ans]);

    //ループの最後の区切り
    console.log('------------------------------------');
  }

  console.log('<<<ループを抜けました。>>>');

手順7:スプレッドシート出力前に二次元配列array2のログ出力で確認する

console.log(array2);

手順8:スプレッドシートの黄色いセルに掛け算の計算結果が格納された二次元配列array2を出力する

ss.getRange(7, 1, N).setValues(array2);

GASでの全コードはこちらになります。

function loop2no7() {

  //スプレッドシートからアクティブシートをアクセスする
  const ss = SpreadsheetApp.getActiveSheet();

  //スプレッドシートの緑色のセルから配列の個数N(この例では「6」)を取得する
  const N = ss.getRange(1, 2).getValue();

  //灰色のセルから長さNの配列(この例では「8 1 3 3 1 8」)を取得する
  const array = ss.getRange(4, 1, 1, N).getValues();

  //配列が取得できたことをログで確認する
  console.log(array);

  //スプレッドシートに出力する配列array2を宣言する
  let array2 = [];


  //Forループで上記の掛け算の計算結果を変数ans格納して、配列array2に追加する
  console.log('<<<ループに入ります!!!>>>');

  for (let i = 0; i < N; i++) {
    console.log(`「${array[0][i]}」は「${i + 1}」番目の要素です。`);
    console.log(`「${array[0][i]}×${i + 1}」を【ans】に求めます。`);

    //ここで計算をする
    let ans = array[0][i] * (i + 1);
    console.log(`計算結果ans:【${ans}】`);

    //計算結果が格納されたansを配列array2に追加する
    array2.push([ans]);

    //ループの最後の区切り
    console.log('------------------------------------');
  }

  console.log('<<<ループを抜けました。>>>');

  //スプレッドシート出力前に二次元配列array2のログ出力で確認する
  console.log(array2);

  //スプレッドシートの黄色いセルに掛け算の計算結果が格納された二次元配列array2を出力する
  ss.getRange(7, 1, N).setValues(array2);

}

宜しかったらコピペしてアレンジして見て下さい。
お疲れ様でした、ブレイクタイムフォトはこちらになります。

ゴールデンウィーク、グリーンエクササイズをしに、東京都葛飾区の水元公園へ。
たっぷりと森林浴をしてきました。

■ 参考文献の紹介■

じっくり丁寧にPythonを学びたい方向け。
まずはpaizaラーニングなどの学習コンテンツで学んで、基礎をマスターしたら、この本でじっくりと初級から中級レベルを目指せます。

初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。

GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本でじっくり学べます。

サイトマップはこちらから

paizaレベルアップ問題集でPythonとGASを解いて見たに戻る
メインメニューに戻る
Python自作サンプル
GASサンプル
基本情報技術者試験

←前の問題へ          次の問題へ→

モバイルバージョンを終了