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

この記事を読むことで、PythonでのForループの基本的な書き方及び、内包表記によるループの書き方と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 相当)

問題:
長さがわからない数列 a が入力されます。
-1 が入力されるまで、受け取った数を改行区切りで出力してください。

この記事では、入力例2でリストに「10 2 5 13 5 20 1 5 6 -1」が与えられたという条件で解いて行きます。

入力例2
10 2 5 13 5 20 1 5 6 -1

出力例2
10
2
5
13
5
20
1
5
6
-1

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

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

<<Pythonでの解き方>>

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

手順として、
1:標準入力でリストを取得
2:len関数でリストの長さを取得して変数Nに格納
3:ループで長さN分ループを回して出力

では、コードを見て行きます。

#未知数個の配列を受け取る
array=list(map(int,input().rstrip().split()))

#配列の長さ
N=len(array)


#ループで取得
for i in range(N):
    print(array[i])

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

次は、ループの所を内包表記で書いたコードです。

#未知数個の配列を受け取る
array=list(map(int,input().rstrip().split()))

#配列の長さ
N=len(array)

#ループで取得
[print(array[i]) for i in range(N)]

<<GASでの解き方>>

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

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

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

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

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

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

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

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

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

6:whileループで配列の要素が「-1」以上ならarray2に追加する

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

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

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

const ss=SpreadsheetApp.getActiveSheet();

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

手順2:配列の長さはgetLastColumnメソッドを使って最終列を取得して求める

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:whileループで配列の要素が「-1」以上ならarray2に追加する

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

問題文の条件に
すべてのテストケースにおいて、以下の条件をみたします。
・ 0 ≦ a_i ≦ 100 (1 ≦ i ≦ N)
とありますので、whileでi>=-1の時にループを繰り返す処理を施しました。

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

  //whileループで配列の要素が「-1」以上ならarray2に追加する
  let i=0
  while(array[0][i]>=-1){
    array2.push([array[0][i]]);
    i++;
  }

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

console.log(array2);

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

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

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

function loop2no1() {
  const ss = SpreadsheetApp.getActiveSheet();

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

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

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

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

  //whileループで配列の要素が「-1」以上ならarray2に追加する
  let i = 0
  while (array[0][i] >= -1) {
    array2.push([array[0][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サンプル
基本情報技術者試験

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

投稿者: nekosiestr

プログラミング学習中のロスジェネ(就職氷河期世代)の発達障害者です。 宜しくお願いします。 趣味で写真を撮っています。 プログラミングは、GAS/HTML/CSS/JavaScript/jQuery/PHP、 発達障害は、自閉症スペクトラムASD/ADHD、その他双極性障害やHSP(5人に1人の繊細さん)などの生きづらさを抱えておりますが、それでも楽しく生きて行きたいです!! 写真は、以前はコンパクトデジカメ、現在は、OLYMPUSミラーレス一眼を使っています。