paiza レベルアップ問題集 「STEP: 2 未知数個の文字列の受け取り」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASの両方のコードで、whileとIF文を使った後判定のループの書き方を学べます。

ループ変数iの動きが分かるようにPythonとGASの両方共にトレースのコードも追記致しました。

Whileループでは、ループの前に必ず初期値を設定すること、無限ループにならないように変数のインクリメントをすることを確認しながらコードを書いて行きました。

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

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

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

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

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

未知数個の文字列の受け取り (paizaランク D 相当)

問題:
複数の文字列が入力されます。文字列の数はわかりません。
EOF が入力されるまで、受け取った文字列を改行区切りで出力してください。

この記事では、入力例1でリストに「abc def ghi jkl EOF」が与えられたという条件で解いて行きます。

入力例1
abc def ghi jkl EOF

出力例1
abc
def
ghi
jkl
EOF

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

今回は、paiza.ioを使って解きます。paiza.ioの使い方はこちらから。
https://paiza.io/ja/projects/new

<<Pythonでの解き方>>

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

手順として、
1:標準入力でリストを取得
2:whileループの前にループ変数iを0で初期化する
3:whileループでまずはリストの値を出力して、後判定でリストの値が「EOF」だったらループを抜ける
4:iをインクリメントして無限ループを防ぐ

では、ループ内の動きとiの値の変動のトレースをしたコードです。


#長さ不明の文字列を標準入力で受け取る
array=input().rstrip().split(' ')

#whileループの初期値を設定
i=0

print('<<<ループに入ります>>>')
while True:
    #処理前のiの値
    print('処理前のi:'+str(i))
    
    print(i,array[i])
    if array[i]=="EOF":
        break
    #無限ループにならないようにインクリメント
    i+=1

    #処理後のiの値
    print('処理後のi:'+str(i))
    print('--------------------------')

#ループを抜けた後のiの値
print('<<<ループを抜けました>>>')
print('ループを抜けた後のi:'+str(i))

このままですと、この問題の解答に対して冗長な部分があるので、トレースのコードを削除した提出用のコードに書き直しました。


#長さ不明の文字列を標準入力で受け取る
array=input().rstrip().split(' ')

#whileループの初期値を設定
i=0

while True:
    print(array[i])
    if array[i]=="EOF":
        break
    #無限ループにならないようにインクリメント
    i+=1

ioの出力確認をしてコードを提出。

<<GASでの解き方>>

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

黄色いセルの所に文字列を出力します。

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

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

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

2:配列の長さは最終列を取得して求める


3:配列arrayを宣言して、灰色のセルの範囲の配列を格納する

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

5:スプレッドシードに2次元配列として出力するarray2を宣言

6:ループに入る前にiを0で初期化

7:whileとIF文で「EOF」までarray2に追加するループを作る

8:スプレッドシート出力前にarray2のログ出力で確認する

9:スプレッドシートの黄色いセルに文字列が格納されたarray2を出力する

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

const ss=SpreadsheetApp.getActiveSheet();

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

手順2:配列の長さは最終列を取得して求める

const N=ss.getLastColumn();

手順3:配列arrayを宣言して、灰色のセルの範囲の配列を格納する

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

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

console.log(array);

手順5:スプレッドシードに2次元配列として出力するarray2を宣言

let array2=[]

手順6:ループに入る前にiを0で初期化

let i=0;


手順7:whileとIF文で「EOF」までarray2に追加するループを作る

※無限ループにならないよう、i=0で初期化した上に、i++でインクリメントしています※

スプレッドシートでは2次元配列で格納されているので、array[0][i]と記述して、配列の1行目をループで配列の中身が-1以上かどうか確認しています。

トレースコードi=0

トレースコードi=1

トレースコードi=2

トレースコードi=3

トレースコードi=4

//whileとIF文で「EOF」までarray2に追加するループを作る
  while(true){
    console.log(`処理前のiの値:${i}`);
    array2.push([array[0][i]]);
    console.log(`iの値:${i}  array[0][i]の値:${array[0][i]}`);
    
    if(array[0][i]=='EOF'){
      break;
    }
    i++; //無限ループにならないようにインクリメントを忘れない!!
    console.log(`処理後のiの値:${i}`);
    console.log('--------------------------------');
  }

  console.log('<<<ループを抜けました。>>>');
  console.log(`ループを抜けた後のiの値: ${i}`);

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

console.log(array2);

手順8:スプレッドシートの黄色いセルにarray2を出力

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

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

function loop2no2() {

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

  //配列の長さは最終列を取得して求める
  N = ss.getLastColumn();


  //配列arrayを宣言して、灰色のセルの範囲の配列を格納する
  const array = ss.getRange(2, 1, 1, N).getValues();

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


  //スプレッドシードに2次元配列として出力するarray2を宣言
  let array2 = []

  //ループに入る前にiを0で初期化
  let i = 0;

  console.log('<<<ループに入ります!!>>>');

  //whileとIF文で「EOF」までarray2に追加するループを作る
  while (true) {
    console.log(`処理前のiの値:${i}`);
    array2.push([array[0][i]]);
    console.log(`iの値:${i}  array[0][i]の値:${array[0][i]}`);

    if (array[0][i] == 'EOF') {
      break;
    }
    i++; //無限ループにならないようにインクリメントを忘れない!!
    console.log(`処理後のiの値:${i}`);
    console.log('--------------------------------');
  }

  console.log('<<<ループを抜けました。>>>');
  console.log(`ループを抜けた後のiの値: ${i}`);

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


  //スプレッドシートの黄色いセルに文字列が格納されたarray2を出力する
  ss.getRange(5, 1, N).setValues(array2);
}

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

お台場の観覧車

■ 参考文献の紹介■

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

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

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

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

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

←前の問題へ          次の問題へ(準備中)→