paiza レベルアップ問題集 「STEP: 1 1 行の入力」をPythonとGASで解いてみた

この記事を読むことで、恐らく1番簡単なPythonの標準入力で文字列を取得する方法、GASでは二次元配列として文字列を取得する方法、Python・GASそれぞれのコードで文字列を出力する方法が学べます。

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

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

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

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

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

1 行の入力 (paizaランク D 相当)

問題:
文字列 s が 1 行で与えられるので s をそのまま出力してください。

この記事では、下記の入力例1の場合を例にして、文字列の出力を行います。

入力例1
paiza

出力例1
paiza

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

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

■ Pythonでの解き方 ■

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

手順として、

1:標準入力で最初の単語wordを読み込む

2:print文でwordを出力する

で、行います。

この手順で作成したプログラムを実行した出力結果です。

コードはこちらになります。

#標準入力で文字列を読み込む
word=input()

#その文字列を出力する
print(word)

■ GASでの解き方 ■

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

スプレッドシートの緑のセルに文字列「paiza」を入力しました。
これを黄色いセルにそのままま文字列を出力します。

※スプレッドシートに表示する場合は、二次元配列としての配列に追加をして作成します※

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

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

2:緑のセルから文字列を取得する

3:文字列が出力出来たことをログ出力で確認する

4:文字列をスプレッドシートに二次元配列として取得する配列word2を宣言する

5:word2が二次元配列になる様に、wordを追加する

6:スプレッドシートに二次元配列として取得する配列str2を宣言する

7:str2が二次元配列になるようにstrを追加する

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

9:スプレッドシートの黄色いセルに出力する

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

const ss=SpreadsheetApp.getActiveSheet();

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

手順2:緑のセルから文字列を取得する

const word=ss.getRange(1,1).getValue();

手順3:文字列が出力出来たことをログ出力で確認する

console.log(word);

手順4:文字列をスプレッドシートに二次元配列として取得する配列word2を宣言する

let word2=[];

手順5:word2が二次元配列になる様に、wordを追加する

word2.push([word]);

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

console.log(word2);

手順7:str2が二次元配列になる様に、strを追加する

str2.push([str]);

手順8:スプレッドシートに出力する前に確認する

console.log(str2);

手順9:スプレッドシートの黄色いセルに出力する

ss.getRange(3,1).setValue(word2);

実行後のスプレッドシートです。

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

function standardInput01() {

  //SpreadSheetAppから階層を辿って現在のシートにアクセスする
  const ss = SpreadsheetApp.getActiveSheet();

  //緑のセルから文字列を取得する
  const word = ss.getRange(1, 1).getValue();

  //文字列が出力出来たことをログ出力で確認する
  console.log(word);

  //文字列をスプレッドシートに二次元配列として取得する配列word2を宣言する
  let word2 = [];

  //word2が二次元配列になる様に、wordを追加する
  word2.push([word]);

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

  //スプレッドシートの黄色いセルに出力する
  ss.getRange(3, 1).setValue(word2);

}

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

東京世田谷区の秘境??等々力渓谷で癒されました。

■ 参考文献の紹介■

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

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

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

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

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

プログラミングのアンケートにご協力頂ける方はこちらのフォームで勉強法など色々と教えて下さい。

次の問題へ→

paiza レベルアップ問題集 「FINAL問題 正則表現のエントリーポイント」をPythonとGASで解いてみた

この記事を読むことで、Pythonの標準入力で文字列を取得する方法、GASでは二次元配列として文字列を取得する方法、Python・GASで文字列を連結して出力する方法が学べます。

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

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

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

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

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

正則表現のエントリーポイント (paizaランク D 相当)

問題:
あなたはプログラミングの課題を解いています。
2 つの単語が改行区切りで入力されるので「;」区切りで出力してください。

この記事では、下記の入力例1の場合を例にして、標準入力で2つの単語を取得して「;」を用いて文字列の連結をして出力します。

入力例1
STEINS
GATE

出力例1
STEINS;GATE

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

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

■ Pythonでの解き方 ■

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

手順として、

1:標準入力で最初の単語aを読み込む

2:標準入力で最初の単語bを読み込む


3:「;」も使って文字列連結して出力する

で、行います。

この手順で作成したプログラムを実行した出力結果です。

コードはこちらになります。

#標準入力で最初の文字と次の文字を読み込む
a=input()
b=input()

#「;」も使って文字を連結して出力する
print(a+';'+b)

■ GASでの解き方 ■

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

スプレッドシートの緑のセルに最初の文字「STEINS」を入力しました。
スプレッドシートの灰色のセルに次の文字「GATE」を入力しました。

上記のセル2つはarrayという二次元配列として一度に取得します。そうすることによって、SpreadSheetAppから階層を辿って現在のシートにアクセスするという手間を減らすことが出来ます。

黄色いセルには、二次元配列arrayから2つの文字列を取得し「;」で連結した文字列を出力します。

※スプレッドシートに表示する場合は、二次元配列としての配列に追加をして作成します※

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

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

2:スプレッドシートの緑のセルに入力された「STEINS」と、灰色のセルに入力された「GATE」の部分を二次元配列arrayとして取得する


3:二次元配列arrayが無事取得出来たことをログで出力して確認する

4:二次元配列array[0][0]とarray[1][0]を「;」も用いて連結して定数strに代入する

5:文字列の連結が出来たことをstrをログ出力して確認する

6:スプレッドシートに二次元配列として取得する配列str2を宣言する

7:str2が二次元配列になるようにstrを追加する

8:str2をスプレッドシートに出力する前にログ出力して確認する

9:スプレッドシートの黄色い所に二次元配列str2を出力する

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

const ss=SpreadsheetApp.getActiveSheet();

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

手順2:2つの文字列を二次元配列として取得

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

セルA1から2行分1列分の二次元配列として取得しています。

手順3:取得した二次元配列をログ出力で確認する
2行1列の二次元配列として取得出来たことを確信しました。

console.log(array);

手順4:文字列を連結させる

const str=array[0][0]+”;”+array[1][0];

文字列は二次元配列で、最初の行の0番目のarray[0][0]と、次の行の0番目のarray[1][0]を「;」も使って文字列を連結させて定数strに代入しています。

手順5:文字列の連結をログ出力で確認する

console.log(str);

手順6:連結させた文字列を二次元配列として格納させる配列str2を宣言

let str2=[];

手順7:str2が二次元配列になる様に、strを追加する

str2.push([str]);

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

console.log(str2);

手順8:スプレッドシートの黄色いセルに連結した文字列を出力する

ss.getRange(4,1).setValue(str2);

実行後のスプレッドシートです。

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

function sg1() {

  //現在のスプレッドシートに階層を辿ってアクセスする
  const ss = SpreadsheetApp.getActiveSheet();

  //2つの文字列を二次元配列として取得
  const array = ss.getRange(1, 1, 2).getValues();

  //取得した二次元配列をログ出力で確認する
  console.log(array);

  //文字列を連結させる
  const str = array[0][0] + ";" + array[1][0];

  //文字列の連結をログ出力で確認する
  console.log(str);

  //連結させた文字列を二次元配列として格納させる配列str2を宣言
  let str2 = [];

  //str2が二次元配列になる様に、strを追加する
  str2.push([str]);

  //スプレッドシートに出力する前に確認する
  console.log(str2);

  //スプレッドシートの黄色いセルに連結した文字列を出力する
  ss.getRange(4, 1).setValue(str2);
}

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

お台場自由の女神とレインボーブリッジと、レインボーブリッジの右端から1cmの所の東京タワー

お台場の日帰り旅行日誌動画付き

■ 参考文献の紹介■

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

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

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

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

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

プログラミングのアンケートにご協力頂ける方はこちらのフォームで勉強法など色々と教えて下さい。

paiza レベルアップ問題集 「FINAL問題 約数の列挙」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASでforループとループの中で単純なIF文を使って、指定された整数の約数を全て列挙し出力することが出来るようになります。

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

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

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

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

プログラミングのアンケートにご協力頂ける方はこちらのフォームで勉強法など色々と教えて下さい。

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

約数の列挙 (paizaランク D 相当)

問題:
整数 N が与えられます。
N の約数を小さい方から順に改行区切りで出力してください。

この記事では、下記の入力例2の場合を例にして、標準入力でリストの要素数N=100を取得し、その約数を昇順に列挙して行きます。

入力例2
100

出力例2
1
2
4
5
10
20
25
50
100

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

■ Pythonでの解き方 ■

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

手順として、

1:Nを標準入力で取り込む

2:ループでi=1からNまでの範囲でループ内でIF文を使って、N%i==0と割り切れた場合にiを出力する

で、行います。

コードはこちらになります。

#Nを標準入力で取り込む
N=int(input())

#ループでi=1からNまでの範囲でループ内でIF文を使って、N%i==0と割り切れた場合にiを出力する
for i in range(1,N+1):
    if N%i==0:
        print(i)

この問題の類題のトレースは、前回の記事で詳しく行なっておりますので、変数の動きを知りたい方は前回の記事をご覧下さい。

■ GASでの解き方 ■

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

スプレッドシートの緑のセルに約数を列挙する整数N:100を入力しました。
黄色いセルには配列の中にあるNの約数の個数を出力します。

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

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

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

2:スプレッドシートの緑のセルから整数N(この例の場合は100)を取得する

3:整数Nが取得出来たことをログで確認する

4:約数をスプレッドシートに二次元配列として格納する配列divisorを宣言する

5:ループ内でIF文を使ってN=100の約数を見つけたら配列divisorに追加する

6:ループを抜けて、スプレッドシートに出力する前に配列divisorをログで出力する

7:スプレッドシートの黄色い所にdivisorを出力する

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

const ss=SpreadsheetApp.getActiveSheet();

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

手順2:スプレッドシートの緑のセルから整数N(この例の場合は100)を取得する

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

手順3:整数Nが取得出来たことをログで確認する

console.log(N);

手順4:約数をスプレッドシートに二次元配列として格納する配列divisorを宣言する

let divisor=[];

手順5:ループ内でIF文を使ってN=100の約数を見つけたら配列divisorに追加する

ループ内での約数を見つけた時の動きは、前回の記事で詳しく行なっておりますので、変数の動きを知りたい方は前回の記事をご覧下さい。

ループの部分のコードです。

//ループ内でIF文を使ってN=100の約数を見つけたら配列divisorに追加する
  for (let i=1;i<=N;i++){
    if(N%i==0){
      divisor.push([i]);
    }
  }

手順6:ループを抜けて、スプレッドシートに出力する前に配列divisorをログで出力する

console.log(divisor);

手順7:スプレッドシートの黄色い所にdivisorを出力する

ss.getRange(3,2,divisor.length).setValues(divisor);

実行後のスプレッドシートです。

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

function loop2no20(){

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

  //スプレッドシートの緑のセルから整数N(この例の場合は100)を取得する
  const N=ss.getRange(1,2).getValue();

  //整数Nが取得出来たことをログで確認する
  console.log(N);

  //約数をスプレッドシートに二次元配列として格納する配列divisorを宣言する
  let divisor=[];

  //ループ内でIF文を使ってN=100の約数を見つけたら配列divisorに追加する
  for (let i=1;i<=N;i++){
    if(N%i==0){
      divisor.push([i]);
    }
  }

  //ループを抜けて、スプレッドシートに出力する前に配列divisorをログで出力する
  console.log(divisor);

  //スプレッドシートの黄色い所にdivisorを出力する
  ss.getRange(3,2,divisor.length).setValues(divisor);

}

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

東京ドームシティ、恋するイタリア

■ 参考文献の紹介■

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

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

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

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

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

プログラミングのアンケートにご協力頂ける方はこちらのフォームで勉強法など色々と教えて下さい。

←前の問題へ          

paiza レベルアップ問題集 「STEP: 14 約数の個数」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASでforループとループの中で単純なIF文を使ってリスト(配列)の中で約数の個数を求めることが出来るようになります。

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

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

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

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

プログラミングのアンケートにご協力頂ける方はこちらのフォームで勉強法など色々と教えて下さい。

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

約数の個数 (paizaランク D 相当)

問題:
整数 N が与えられます。
N の約数の個数を出力してください。
約数とは、N を割り切る整数のことを指します。

この記事では、下記の入力例2の場合を例にして、標準入力でリストの要素数N=100を取得し、その約数の個数を求めます。

入力例2
100

出力例2
9

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

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

■ Pythonでの解き方 ■

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

手順として、

1:Nを標準入力で取り込む

2:約数の個数を格納する変数countを0で初期化する


3:ループでi=1からNまでの範囲で、N%i==0と割り切れた場合にcountをインクリメントする


4:countを出力する

で、行います。

では、ループのトレースのコードの出力結果を掲載します。

i=1の時

N=100をi=1で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=2の時

N=100をi=2で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=3の時

N=100をi=3で割っても割り切れないのでIF文を飛ばします。

i=4の時

N=100をi=4で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=5の時

N=100をi=5で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

以下省略して、割り切れる所を含む部分をトレースします。

i=10〜15の時

N=100をi=10で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=11〜15まで割れません。

i=20〜26の時

N=100をi=20で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=21〜24まで割れません。

N=100をi=25で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=26は割れません。

i=50〜56の時

N=100をi=50で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

I=51〜56まで割れません。

i=95〜100の時

N=100をi=95〜99まで割っても割れません。

N=100をi=100で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

約数の個数が9個になってループを抜けました。

ループを抜けた後、約数を出力しています。

ここまでのトレースのコードです。

#Nを標準入力で取り込む
N=int(input())

#約数の個数を格納する変数countを0で初期化する
count=0

#ループでi=1からNまでの範囲で、N%i==0と割り切れた場合にcountをインクリメントする
print('<<<ループに入ります。>>>')
for i in range(1,N+1):
    print('除算前のcount:「'+str(count)+'」')
    print('N='+str(N)+'を「i='+str(i)+'」で割ります。')
    if N%i==0:
        print('i='+str(i)+'で割り切れたので約数みっけ(=^x^=)')
        count+=1
        print('count:【'+str(count)+'】')
    print('------------------------------------')
print('<<<ループを抜けました。>>>')

#countを出力する
print(count) 

ループのrange(1,N+1)となっているのは、引数の最後のところがN+1未満、すなわちNまでの範囲が適用されるからです。

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

#Nを標準入力で取り込む
N=int(input())

#約数の個数を格納する変数countを0で初期化する
count=0

#ループでi=1からNまでの範囲で、N%i==0と割り切れた場合にcountをインクリメントする
#print('<<<ループに入ります。>>>')
for i in range(1,N+1):
    #print('除算前のcount:「'+str(count)+'」')
    #print('N='+str(N)+'を「i='+str(i)+'」で割ります。')
    if N%i==0:
        #print('i='+str(i)+'で割り切れたので約数みっけ(=^x^=)')
        count+=1
        #print('count:【'+str(count)+'】')
    #print('------------------------------------')
#print('<<<ループを抜けました。>>>')

#countを出力する
print(count)

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

#Nを標準入力で取り込む
N=int(input())

#約数の個数を格納する変数countを0で初期化する
count=0

#ループでi=1からNまでの範囲で、N%i==0と割り切れた場合にcountをインクリメントする
for i in range(1,N+1):
    if N%i==0:
        count+=1
        
#countを出力する
print(count)

ioの出力結果です。

■ GASでの解き方 ■

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

スプレッドシートの緑のセルに約数の個数を求める整数N:100を入力しました。
黄色いセルには配列の中にあるNの約数の個数を出力します。

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

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

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

2:スプレッドシートの緑のセルから整数N(この例の場合は100)を取得する


3:整数Nが取得出来たことをログで確認する


4:約数の個数countを0で初期化する


5:ループ内でIF文を使ってN=100の約数を見つけたらcountをインクリメントする


6:ループを抜けてcountをログで出力する


7:二次元配列としてcountを出力する配列count2を宣言する


8:count2に二次元配列になるようにcountを追加する


9:スプレッドシートに出力する前にcount2をログで確認する


10:スプレッドシートの黄色い所にcount2を出力する

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

const ss=SpreadsheetApp.getActiveSheet();

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

手順2:スプレッドシートの緑のセルから整数N(この例の場合は100)を取得する

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

手順3:整数Nが取得出来たことをログで確認する

console.log(N);

手順4:約数の個数countを0で初期化する

let count=0;

手順5:ループ内でIF文を使ってN=100の約数を見つけたらcountをインクリメントする

i=1の時

N=100をi=1で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=2の時

N=100をi=2で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=3の時

N=100をi=3で割っても割り切れないのでIF文を飛ばします。

i=4の時

N=100をi=4で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=5の時

N=100をi=5で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

以下省略して、割り切れる所を含む部分をトレースします。

i=10〜15の時

N=100をi=10で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=20〜24の時

N=100をi=20で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=21〜24まで割れません。

i=25〜30の時

N=100をi=25で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=26〜30まで割れません。

i=48〜53の時

i=48,49まで割れません。

N=100をi=50で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=51〜53まで割れません。

i=96〜100の時

N=100をi=96〜99まで割っても割れません。

N=100をi=100で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

約数の個数が9個になってループを抜けました。
ここまでのトレースのループ部分のコードです。

//ループ内でIF文を使ってN=100の約数を見つけたらcountをインクリメントする
  console.log('<<<ループに入ります。>>>');
  for(let i=1;i<=N;i++){
    console.log(`現在のcount:【${count}】`);
    console.log(`N=${N}を「i=${i}」で割る`);
    if(N%i==0){
      console.log(`約数みっけ(=^x^=) i:「${i}」はN:${N}の約数です。`);
      count++;
      console.log(`約数count:【${count}】個目です。`);
    }
    console.log('--------------------------------------------');
  }
  console.log('<<<ループを抜けました。>>>');

手順6:ループを抜けてcountを出力する

console.log(count);

手順7:二次元配列としてcountを出力する配列count2を宣言する

let count2=[];

手順8:count2に二次元配列になるようにcountを追加する

count2.push([count]);

手順9:スプレッドシートに出力する前にcount2をログで確認する

console.log(count2);

手順10:スプレッドシートの黄色い所にcount2を出力する

ss.getRange(3,2).setValue(count2);

実行後のスプレッドシートです。

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

function loop2no19(){

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

  //スプレッドシートの緑のセルから整数N(この例の場合は100)を取得する
  const N=ss.getRange(1,2).getValue();

  //整数Nが取得出来たことをログで確認する
  console.log(N);

  //約数の個数countを0で初期化する
  let count=0;

  //ループ内でIF文を使ってN=100の約数を見つけたらcountをインクリメントする
  console.log('<<<ループに入ります。>>>');
  for(let i=1;i<=N;i++){
    console.log(`現在のcount:【${count}】`);
    console.log(`N=${N}を「i=${i}」で割る`);
    if(N%i==0){
      console.log(`約数みっけ(=^x^=) i:「${i}」はN:${N}の約数です。`);
      count++;
      console.log(`約数count:【${count}】個目です。`);
    }
    console.log('--------------------------------------------');
  }
  console.log('<<<ループを抜けました。>>>');

  //ループを抜けてcountを出力する
  console.log(count);

  //二次元配列としてcountを出力する配列count2を宣言する
  let count2=[];

  //count2に二次元配列になるようにcountを追加する
  count2.push([count]);

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

  //スプレッドシートの黄色い所にcount2を出力する
  ss.getRange(3,2).setValue(count2);

}

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

大井競馬場メガイルミ

■ 参考文献の紹介■

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

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

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

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

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

プログラミングのアンケートにご協力頂ける方はこちらのフォームで勉強法など色々と教えて下さい。

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

paiza レベルアップ問題集 「STEP: 13 1 はどこにある?」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASでforループとループの中で単純なIF文を使ってリスト(配列)の中で指定の数がある位置を求めることができるようになります。

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

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

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

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

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

1 はどこにある? (paizaランク D 相当)

問題:
N 個の整数 a_1, a_2, …, a_N が与えられます。
a_1, a_2, …, a_N のうち、1 がある位置を先頭から順に改行区切りで出力してください。
a_1 を 1 番目とし、a_1, a_2, …, a_N には少なくとも 1 個は 1 が含まれます。

この記事では、下記の入力例2の場合を例にして、標準入力でリストの要素数N=5とリストを取得した後にリストarrayを取得し、その中に1が含まれている位置を出力します。リスト(配列)の先頭は0から始まります。下記の例では、リストの添字0と4が求まるので、それらに1を加えた1と5を出力するようにコードを書いて行きます。

入力例2
5
1 5 5 5 1

出力例2
1
5

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

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

■ Pythonでの解き方 ■

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

手順として、

1:Nを標準入力で取り込む

2:リストarrayを標準入力で取り込む


3:ループでリストarray[i]の中身を調べ、IF文でarray[i]==1の時に「i+1」を出力する

で、行います。

リストの添字は0から始まる為、「i+1」と1を加えています。

では、ループのトレースを行います。

i=0の時

array[0]=1でリストの中身が1の条件に該当するので、i=0に1を加えた「1」を出力します。

i=1の時

array[1]=5で条件に該当しないのでIF文は飛ばします。

i=2の時

array[2]=5で条件に該当しないのでIF文は飛ばします。

i=3の時

array[3]=5で条件に該当しないのでIF文は飛ばします。

i=4の時

array[4]=1でリストの中身が1の条件に該当するので、i=4に1を加えた「5」を出力します。

ここまでのトレースのコードです。

#Nを標準入力で取り込む
N=int(input())

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

#ループでリストarray[i]の中身を調べ、IF文でarray[i]==1の時に「i+1」を出力する
print('<<<ループに入ります>>>')
for i in range(N):
    print('array['+str(i)+']の中身は「'+str(array[i])+'」です。')
    if array[i]==1:
        print('1見っけ!! i+1=【'+str(i+1)+'】を出力します')
        print(i+1)
    print('------------------')
print('<<<ループを抜けました。>>>')    

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

#Nを標準入力で取り込む
N=int(input())

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

#ループでリストarray[i]の中身を調べ、IF文でarray[i]==1の時に「i+1」を出力する
#print('<<<ループに入ります>>>')
for i in range(N):
    #print('array['+str(i)+']の中身は「'+str(array[i])+'」です。')
    if array[i]==1:
        #print('1見っけ!! i+1=【'+str(i+1)+'】を出力します')
        print(i+1)
    #print('------------------')
#print('<<<ループを抜けました。>>>')    

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

#Nを標準入力で取り込む
N=int(input())

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

#ループでリストarray[i]の中身を調べ、IF文でarray[i]==1の時に「i+1」を出力する
for i in range(N):
    if array[i]==1:
        print(i+1)

■ GASでの解き方 ■

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

スプレッドシートの緑のセルに配列の数の整数5を入力しました。
灰色のセルには配列を入力しました。
黄色いセルには配列の中にある「1」を見つけたらその場所がどこにあるのか出力します。配列の添字は0から始まるため、出力する値は「i+1」です。

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

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

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

2:スプレッドシートの緑のセルから整数N(この例の場合は5)を取得する


3:スプレッドシートの灰色のセルから配列arrayを取得する


4:配列arrayが取得出来たことを確認するために出力する


5:配列arrayの中に1を見つけたらその位置「i+1」を格納する配列oneを宣言する


6:ループ内でarray[0][i]の値が「1」の場合は、その位置「i+1」がoneに二次元配列になるように追加する


7:ループを抜けてスプレッドシートに出力前の二次元配列oneをログ出力して確認する


8:スプレッドシートの黄色い所に配列arrayの中に含まれている1の位置が格納された二次元配列oneを出力する

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

const ss=SpreadsheetApp.getActiveSheet();

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

手順2:スプレッドシートの緑のセルから整数N(この例の場合は5)を取得する

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

手順3:スプレッドシートの灰色のセルから配列を取得する

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

手順4:配列が取得出来たことを確認するために出力する

console.log(array);

手順5:配列arrayの中に1を見つけたらその位置「i+1」を格納する配列oneを宣言する

let one=[];

手順6:ループ内でarray[0][i]の値が「1」の場合は、その位置「i+1」がoneに二次元配列になるように追加する。
スプレッドシートでは二次元配列として取得されるので、array[0][i]と書いています。
また、配列は添字が0から始まるので「i+1」をしています。

i=0の時

array[0][0]=1でリストの中身が1の条件に該当するので、i=0に1を加えた「1」を出力します。

i=1の時

array[0][1]=5で条件に該当しないのでIF文は飛ばします。

i=2の時

array[0][2]=5で条件に該当しないのでIF文は飛ばします。

i=3の時

array[0][3]=5で条件に該当しないのでIF文は飛ばします。

i=4の時

array[0][4]=1でリストの中身が1の条件に該当するので、i=4に1を加えた「5」を出力します。

ここまでを踏まえて、ループの部分のコードを掲載します。

//ループ内でarray[0][i]の値が「1」の場合は、その位置「i+1」がoneに二次元配列になるように追加する
  console.log('<<<ループに入ります。>>>');
  for(let i=0;i<N;i++){
    console.log(`現在の配列one:[[${one}]]`);
    console.log(`i:${i}の時、配列では先頭から${i+1}番目でarray[0][${i}]=${array[0][i]}`);
    if(array[0][i]==1){
      console.log(`1見っけ(=^x^=)!! 配列oneに【${i+1}】を追加`);
      one.push([i+1]);
      console.log(one);
    }
    console.log('------------------------------------------------');
  }
  console.log('<<<ループを抜けました。>>>');

手順7:ループを抜けてスプレッドシートに出力前の二次元配列oneをログ出力して確認する

console.log(one);

手順8:スプレッドシートの黄色い所に配列arrayの中に含まれている1の位置が格納された二次元配列oneを出力する

ss.getRange(4,2,one.length).setValues(one);

実行後のスプレッドシートです。

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

function loop2no18(){

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

  //スプレッドシートの緑のセルから整数N(この例の場合は5)を取得する
  const N=ss.getRange(1,2).getValue();

  //スプレッドシートの灰色のセルから配列arrayを取得する
  const array=ss.getRange(2,2,1,N).getValues();

  //配列arrayが取得出来たことを確認するために出力する
  console.log(array);

  //配列arrayの中に1を見つけたらその位置「i+1」を格納する配列oneを宣言する
  let one=[];

  //ループ内でarray[0][i]の値が「1」の場合は、その位置「i+1」がoneに二次元配列になるように追加する
  console.log('<<<ループに入ります。>>>');
  for(let i=0;i<N;i++){
    console.log(`現在の配列one:[[${one}]]`);
    console.log(`i:${i}の時、配列では先頭から${i+1}番目でarray[0][${i}]=${array[0][i]}`);
    if(array[0][i]==1){
      console.log(`1見っけ(=^x^=)!! 配列oneに【${i+1}】を追加`);
      one.push([i+1]);
      console.log(one);
    }
    console.log('------------------------------------------------');
  }
  console.log('<<<ループを抜けました。>>>');

  //ループを抜けてスプレッドシートに出力前の二次元配列oneをログ出力して確認する
  console.log(one);


  //スプレッドシートの黄色い所に配列arrayの中に含まれている1の位置が格納された二次元配列oneを出力する
  ss.getRange(4,2,one.length).setValues(one);

}

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

大井競馬場メガイルミの噴水

■ 参考文献の紹介■

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

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

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

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

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

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

paiza レベルアップ問題集 「STEP: 12 加算された数列の最小値」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASでforループを使って最小値を求められます。
Pythonでは計算結果を新たなリストに追加してmin関数でその最小値を求め、GASでは仮の最小値ans=201をループの中で更新して行って最小値を求めます。

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

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

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

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

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

加算された数列の最小値 (paizaランク D 相当)

問題:
N 個の整数 a_1, a_2, …, a_N が与えられます。
a_i に i を足したとき、N 個の整数の最小値を出力してください。

この記事では、下記の入力例1の場合を例にして、標準入力でリストの要素数N=5とリストを取得して、リストの中の数字と添字の合計を別の配列に格納して、最大値を求めます。

入力例1
5
1 2 3 4 5

出力例1
2

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

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

■ Pythonでの解き方 ■

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

手順として、

1:Nを標準入力で取り込む

2:リストarrayを標準入力で取り込む

3:リストarray内の数字と添字を合計した数を格納する配列sumArrayを宣言する

4:ループを使ってリストarrayの数値と添字を合計して配列sumArrayに追加する

5:sumArrayの最小値をmin関数を使って求める

で、行います。

リストの添字は0から始まる為、「i+1」と1を加えています。

では、ループのトレースを行います。

i=0の時

array[0]=1とi+1=1を合計して計算結果「2」がsumArrayに追加された

i=1の時

array[1]=2とi+1=2を合計して計算結果「4」がsumArrayに追加された

i=2の時

array[2]=3とi+1=3を合計して計算結果「6」がsumArrayに追加された

i=3の時

array[3]=4とi+1=4を合計して計算結果「8」がsumArrayに追加された

i=4の時

array[4]=5とi+1=5を合計して計算結果「10」がsumArrayに追加された

リストsumArrayから求まった最小値です。

ここまでのトレースのコードです。

#Nを標準入力で取り込む
N=int(input())

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

#リストarray内の数字と添字を合計した数を格納する配列sumArrayを宣言する
sumArray=[]

#ループを使ってリストarrayの数値と添字を合計して配列sumArrayに追加する
for i,num in enumerate(array):
    print('追加前のリストsumArray:'+str(sumArray))
    print('sumArrayに「'+str(num)+'」とi:'+str(i)+'+1=「'+str(i+1)+'」の【'+str(num+i+1)+'】を追加する')
    sumArray.append(num+i+1)
    print('追加後のリストsumArray:'+str(sumArray))
    print('-------------------------------------------')
    
#sumArrayの最小値をmin関数を使って求める
print(min(sumArray))

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

#Nを標準入力で取り込む
N=int(input())

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

#リストarray内の数字と添字を合計した数を格納する配列sumArrayを宣言する
sumArray=[]

#ループを使ってリストarrayの数値と添字を合計して配列sumArrayに追加する
for i,num in enumerate(array):
    #print('追加前のリストsumArray:'+str(sumArray))
    #print('sumArrayに「'+str(num)+'」とi:'+str(i)+'+1=「'+str(i+1)+'」の【'+str(num+i+1)+'】を追加する')
    sumArray.append(num+i+1)
    #print('追加後のリストsumArray:'+str(sumArray))
    #print('-------------------------------------------')
    
#sumArrayの最小値をmin関数を使って求める
print(min(sumArray))

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

#Nを標準入力で取り込む
N=int(input())

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

#リストarray内の数字と添字を合計した数を格納する配列sumArrayを宣言する
sumArray=[]

#ループを使ってリストarrayの数値と添字を合計して配列sumArrayに追加する
for i,num in enumerate(array):
    sumArray.append(num+i+1)
    
#sumArrayの最小値をmin関数を使って求める
print(min(sumArray))

ioの出力結果です。

■ GASでの解き方 ■

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

スプレッドシートの緑のセルに配列の数の整数5を入力しました。
灰色のセルには配列を入力しました。
黄色いセルには配列の値とその添字に1を加えた値のうちの最小値を出力します。
(配列の添字は0から始まるため)

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

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

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

2:スプレッドシートの緑のセルから整数N(この例の場合は5)を取得する


3:スプレッドシートの灰色のセルから配列を取得する


4:配列が取得出来たことを確認するために出力する


5:仮の最小値として変数ansを201で初期化する


6:ループ内で使う合計の計算結果を保存する変数tempを宣言する


7:ループ内で「i+1」とarray[0][i]を計算して変数tempに代入。
tempがansよりも小さかったらtempをansに代入する

8:ループを抜けてansに最小値が求まったことをログで確認する

9:ansを二次元配列として取得するans2を宣言して、ansを追加する

10:スプレッドシートに出力前にans2をログ出力して確認する

11:スプレッドシートの黄色い所に最小値の二次元配列ans2を出力する

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

const ss=SpreadsheetApp.getActiveSheet();

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

手順2:スプレッドシートの緑のセルから整数N(この例の場合は5)を取得する

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

手順3:スプレッドシートの灰色のセルから配列を取得する

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

手順4:配列が取得出来たことを確認するために出力する

console.log(array);

手順5:仮の最小値としてansを201で初期化する

let ans=201;

手順6:ループ内で使う合計の計算結果を保存する変数tempを宣言する

let temp;

手順7:ループ内で「i+1」とarray[0][i]を計算して変数tempに代入。
tempがansよりも小さかったらtempをansに代入して最小値を更新する

スプレッドシートでは二次元配列として取得されるので、array[0][i]と書いています。
また、配列は添字が0から始まるので「i+1」をしています。

i=0の時

array[0]=1とi+1=1を合計して計算結果:temp=2になった。
temp<ansなので、ansの値を更新した。

i=1の時

array[1]=2とi+1=2を合計して計算結果:temp=4になった。
temp>ansなので、ansの値は更新しない。

i=2の時

array[2]=3とi+1=3を合計して計算結果:temp=6になった。
temp>ansなので、ansの値は更新しない。

i=3の時

array[3]=4とI+1=4を合計して計算結果:temp=8になった。
temp>ansなので、ansの値は更新しない。

i=4の時

array[4]=5とi+1=5を合計して計算結果:temp=10になった。
temp>ansなので、ansの値は更新しない。

ここまでのループのトレースをしたコードはこちらです。

console.log('<<<ループに入る>>>');
  //ループ内で「i+1」とarray[0][i]を計算して変数tempに代入。
  //tempがansよりも小さかったらtempをansに代入する
  for (let i=0;i<N;i++){
    console.log(`現在の最小値ans:${ans}`);
    console.log(`i:${i}、i+1=「${i+1}」+array[0][${i}]:「${array[0][i]}」の計算結果をtempに格納`);
    temp=i+1+array[0][i];
    console.log(`temp:【${temp}】`);
    if(temp<ans){
      ans=temp;
      console.log(`ansを${temp}で更新しました。`);
    }
    console.log('--------------------------');
  }
  console.log('<<<ループを抜けた>>>');

手順8:ループを抜けてansに最小値が求まったことをログで確認する

console.log(ans);

手順9:ansを二次元配列として取得するans2を宣言して、ansを追加する

let ans2=[];
ans2.push([ans]);

手順10:スプレッドシートに出力前にans2をログ出力して確認する

console.log(ans2);

手順11:スプレッドシートの黄色い所に最大値の二次元配列ans2を出力する

ss.getRange(4,2).setValue(ans2);

実行後のスプレッドシートです。

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

function loop2no17(){

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

  //スプレッドシートの緑のセルから整数N(この例の場合は5)を取得する
  const N=ss.getRange(1,2).getValue();

  //スプレッドシートの灰色のセルから配列を取得する
  const array=ss.getRange(2,2,1,N).getValues();

  //配列が取得出来たことを確認するために出力する
  console.log(array);

  //仮の最大値として変数ansを201で初期化する
  let ans=201;

  //ループ内で使う合計の計算結果を保存する変数tempを宣言する
  let temp;

  console.log('<<<ループに入る>>>');
  //ループ内で「i+1」とarray[0][i]を計算して変数tempに代入。
  //tempがansよりも小さかったらtempをansに代入する
  for (let i=0;i<N;i++){
    console.log(`現在の最小値ans:${ans}`);
    console.log(`i:${i}、i+1=「${i+1}」+array[0][${i}]:「${array[0][i]}」の計算結果をtempに格納`);
    temp=i+1+array[0][i];
    console.log(`temp:【${temp}】`);
    if(temp<ans){
      ans=temp;
      console.log(`ansを${temp}で更新しました。`);
    }
    console.log('--------------------------');
  }
  console.log('<<<ループを抜けた>>>');

  //ループを抜けてansに最小値が求まったことをログで確認する
  console.log(ans);

  //ansを二次元配列として取得するans2を宣言して、ansを追加する
  let ans2=[];
  ans2.push([ans]);

  //スプレッドシートに出力前にans2をログ出力して確認する
  console.log(ans2);

  //スプレッドシートの黄色い所に最小値の二次元配列ans2を出力する
  ss.getRange(4,2).setValue(ans2);
}

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

新緑の水元公園2018年ゴールデンウィーク撮影

■ 参考文献の紹介■

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

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

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

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

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

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

paiza レベルアップ問題集 「STEP: 11 加算された数列の最大値」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASでforループを使って最大値を求められます。
Pythonでは計算結果を新たなリストに追加してmax関数でその最大値を求め、GASでは仮の最大値ans=0をループの中で更新して行って最大値を求めて行きます。

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

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

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

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

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

加算された数列の最大値 (paizaランク D 相当)

問題:
N 個の整数 a_1, a_2, …, a_N が与えられます。
a_i に i を足したとき、a_1 , … , a_N の最大値を出力してください。

この記事では、下記の入力例1の場合を例にして、標準入力でリストの要素数N=5とリストを取得して、リストの中の数字と添字の合計を別の配列に格納して、最大値を求めます。

入力例1
5
1 2 3 4 5

出力例1
10

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

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

■ Pythonでの解き方 ■

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

手順として、

1:Nを標準入力で取り込む

2:リストarrayを標準入力で取り込む


3:リストarray内の数字と添字を合計した数を格納する配列sumArrayを宣言する


4:ループを使ってリストarrayの数値と添字を合計して配列sumArrayに追加する


5:sumArrayの最大値をmax関数を使って求める

で、行います。

リストの添字は0から始まる為、「i+1」と1を加えています。

リストはこちらになります。

では、ループのトレースを行います。

i=0の時

array[0]=1とi+1=1を合計して計算結果2がsumArrayに追加された

i=1の時

array[1]=2とi+1=2を合計して計算結果4がsumArrayに追加された

i=2の時

array[2]=3とi+1=3を合計して計算結果6がsumArrayに追加された

i=3の時

array[3]=4とi+1=4を合計して計算結果8がsumArrayに追加された

i=4の時

array[4]=5とi+1=5を合計して計算結果10がsumArrayに追加された

ループを抜けた後に、max関数を使っって、sumArrayの最大値を出力した結果です。

ここまでのトレースのコードです。

#Nを標準入力で取り込む
N=int(input())

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

#リストarray内の数字と添字を合計した数を格納する配列sumArrayを宣言する
sumArray=[]

print("リスト:"+str(array)+'\n')

#ループを使ってリストarrayの数値と添字を合計して配列sumArrayに追加する
print('<<<ループに入る>>>')
for i,num in enumerate(array):
    print("array["+str(i)+"]"+"である「"+str(num)+"」と、添字i+1="+str(i+1)+"を合計して配列の末尾に追加する")
    sumArray.append(num+i+1)
    print("現在の配列:"+str(sumArray))
    print('----------------------------------------------')
print('<<<ループを抜けた>>>')

#sumArrayの最大値をmax関数を使って求める
print(max(sumArray))

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

#Nを標準入力で取り込む
N=int(input())

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

#リストarray内の数字と添字を合計した数を格納する配列sumArrayを宣言する
sumArray=[]

#print("リスト:"+str(array)+'\n')

#ループを使ってリストarrayの数値と添字を合計して配列sumArrayに追加する
#print('<<<ループに入る>>>')
for i,num in enumerate(array):
    #print("array["+str(i)+"]"+"である「"+str(num)+"」と、添字i+1="+str(i+1)+"を合計して配列の末尾に追加する")
    sumArray.append(num+i+1)
    #print("現在の配列:"+str(sumArray))
    #print('----------------------------------------------')
#print('<<<ループを抜けた>>>')

#sumArrayの最大値をmax関数を使って求める
print(max(sumArray))  

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

#Nを標準入力で取り込む
N=int(input())

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

#リストarray内の数字と添字を合計した数を格納する配列sumArrayを宣言する
sumArray=[]

for i,num in enumerate(array):
    sumArray.append(num+i+1)

#sumArrayの最大値をmax関数を使って求める
print(max(sumArray))

ioの出力結果です。

■ GASでの解き方 ■

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

スプレッドシートの緑のセルに配列の数の整数5を入力しました。
灰色のセルには配列を入力しました。
黄色いセルには配列の値とその添字に1を加えた値のうちの最大値を出力します。
(配列の添字は0から始まるため)

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

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

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

2:スプレッドシートの緑のセルから整数N(この例の場合は5)を取得する

3:スプレッドシートの灰色のセルから配列を取得する

4:配列が取得出来たことを確認するために出力する

5:仮の最大値として変数ansを0で初期化する

6:ループ内で使う合計の計算結果を保存する変数tempを宣言する

7:ループ内で「i+1」とarray[0][i]を計算してansよりも大きかったらtempをansに代入する

8:ループを抜けてansに最大値が求まったことをログで確認する

9:ansを二次元配列として取得するans2を宣言して、ansを追加する

10:スプレッドシートに出力前にans2をログ出力して確認する

11:スプレッドシートの黄色い所に最大値の二次元配列ans2を出力する

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

const ss=SpreadsheetApp.getActiveSheet();

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

手順2:スプレッドシートの緑のセルから整数N(この例の場合は5)を取得する

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

手順3:スプレッドシートの灰色のセルから配列を取得する

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

手順4:配列が取得出来たことを確認するために出力する

console.log(array);

手順5:仮の最小値としてansを0で初期化する

let ans=0;

手順6:ループ内で使う合計の計算結果を保存する変数tempを宣言する

let temp;

手順7:ループ内で「i+1」とarray[0][i]を計算してansよりも大きかったらtempをansに代入する

スプレッドシートでは二次元配列として取得されるので、array[0][i]と書いています。
また、配列は添字が0から始まるので「i+1」をしています。

i=0の時

array[0]=1とi+1=1を合計して計算結果:temp=2になった。
temp>ansなので、ansの値を更新した。

i=1の時

array[1]=2とi+1=2を合計して計算結果:temp=4になった。
temp>ansなので、ansの値を更新した。

i=2の時

array[2]=3とi+1=3を合計して計算結果:temp=6になった。
temp>ansなので、ansの値を更新した。

i=3の時

array[3]=4とi+1=4を合計して計算結果:temp=8になった。
temp>ansなので、ansの値を更新した。

i=4の時

array[4]=5とi+1=5を合計して計算結果:temp=10になった。
temp>ansなので、ansの値を更新した。

console.log('<<<ループに入る>>>');
  //ループ内で「i+1」とarray[0][i]を計算してansよりも大きかったらtempをansに代入する
  for(let i=0;i<N;i++){
    console.log(`i:「${i+1}」+array[0][${i}]:「${array[0][i]}」を計算する`);
    temp=(i+1)+array[0][i];
    console.log(`tempの計算結果${temp}`);
    if(temp>ans){
      ans=temp;
      console.log(`現在の最大値は${ans}です。`);
    }
    console.log('------------------');
  }
  console.log('<<<ループを抜けた>>>');

手順8:ループを抜けてansに最大値が求まったことをログで確認する

console.log(ans);

手順9:ansを二次元配列として取得するans2を宣言して、ansを追加する

let ans2=[];
ans2.push([ans]);

手順10:スプレッドシートに出力前にans2をログ出力して確認する

console.log(ans2);

手順11:スプレッドシートの黄色い所に最大値の二次元配列ans2を出力する

ss.getRange(4,2).setValue(ans2);

実行後のスプレッドシートです。

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

function loop2no16(){

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

  //スプレッドシートの緑のセルから整数N(この例の場合は5)を取得する
  const N=ss.getRange(1,2).getValue();

  //スプレッドシートの灰色のセルから配列を取得する
  const array=ss.getRange(2,2,1,N).getValues();

  //配列が取得出来たことを確認するために出力する
  console.log(array);
  
  //仮の最小値としてansを0で初期化する
  let ans=0;

  //ループ内で使う合計の計算結果を保存する変数tempを宣言する
  let temp;


  console.log('<<<ループに入る>>>');
  //ループ内で「i+1」とarray[0][i]を計算してansよりも大きかったらtempをansに代入する
  for(let i=0;i<N;i++){
    console.log(`i:「${i+1}」+array[0][${i}]:「${array[0][i]}」を計算する`);
    temp=(i+1)+array[0][i];
    console.log(`tempの計算結果${temp}`);
    if(temp>ans){
      ans=temp;
      console.log(`現在の最大値は${ans}です。`);
    }
    console.log('------------------');
  }
  console.log('<<<ループを抜けた>>>');

  //ループを抜けてansに最大値が求まったことをログで確認する
  console.log(ans);

  //ansを二次元配列として取得するans2を宣言して、ansを追加する
  let ans2=[];
  ans2.push([ans]);

  //スプレッドシートに出力前にans2をログ出力して確認する
  console.log(ans2);

  //スプレッドシートの黄色い所に最大値の二次元配列ans2を出力する
  ss.getRange(4,2).setValue(ans2);

}

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

谷根千のまねきねこ(=^x^=)

■ 参考文献の紹介■

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

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

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

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

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

←前に戻る         次に進む→

paiza レベルアップ問題集 「STEP: 10 階乗の末尾に 0 はいくつ付く?」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASでループを使って階乗の計算とその計算結果の末尾に「0」がいくつ付くのかを求めます。
階乗の計算はforループを使い、末尾の「0」はPythonでは文字列に変換して求めてからwhileループで末尾の0の数をリストを反転して求め、GASでは10と2×5がいくつ含まれているのかwhileループを使って求めます。

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

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

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

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

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

階乗の末尾に 0 はいくつ付く? (paizaランク C 相当)

問題:
整数 N が与えられます。
N の階乗 N! の末尾に 0 がいくつ付くか求め、出力してください。

この記事では、下記の入力例1の場合を例にして、整数N=100の階乗を求め、その計算結果100!の末尾に「0」がいくつ付くかを求めて行きます。

入力例1
100

出力例1
24

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

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

■ Pythonでの解き方 ■

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

手順として、

1:Nを標準入力で取り込む

2:階乗の計算結果factを1で初期化する


3:ループを使ってNの階乗N!を変数factに求める
階乗の計算で乗算する数をmultに格納する


4:factが膨大な数になり、通常の10で割っていって0の数を求める方法が適用出来ない為、文字列に変換する


5:末尾の’0’を求めるため、文字列を逆順にする


6:’0’の数を数える変数zeroを0で初期化する


7:whileループで文字列のfactのi番目が’0’というの条件を満たす間、ループを回して’0’の数を数える変数zeroをインクリメントする


8:zeroを表示

で、行います。

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

100!は、100×99×98×97×・・・×4×3×2×1で求まります。

97まで掛けたログです。

途中、飛ばします。

1まで掛けたログです。

とても膨大な数になりましたので、画像は一部のみを切り取りました。

この計算結果factは膨大すぎてそのままでは10で割って0の数を数えるということが出来ない為、文字列に変換しました。
Strを使って、文字列に出来ます。

fact=str(fact)

問題文によると、文字列の末尾から’0’を数えるので、上の画像の文字列を反転しました。文字列のリストとして反転してから数えるので、このようなコードになりました。

fact=list(reversed(fact))

その後、文字列の先頭から’0’を数えていくので、whileループでリストfact[i]=’0’の時に、変数zeroをインクリメントするコードを書きました。

Fact[0]からfact[4]までのトレースです。

途中、省略します。

求めた0の個数です。

ここまでのトレースのコードです。

#Nを標準入力で取り込む
N=int(input())


#階乗の計算結果factを1で初期化する
fact=1


#ループを使ってNの階乗N!を変数factに求める
#階乗の計算で乗算する数をmultに格納する
print('<<<forループに入ります。>>>')

for i in range(N):
    print('計算前のfact:'+str(fact))
    mult=N-i
    print('fact×「'+str(mult)+'」を計算する')
    fact*=mult
    print('計算後のfact:【'+str(fact)+'】')
    print('------------------')
    
print('<<<forループを抜けました。>>>')    

#factが膨大な数になり、通常の10で割っていって0の数を求める方法が適用出来ない為、文字列に変換する
fact=str(fact)
print('文字列に変換したfact')
print(fact)

#末尾の'0'を求めるため、文字列を反転する
fact=list(reversed(fact))
print('文字列を反転したfact')
print(fact)

#'0'の数を数える変数zeroを0で初期化する
zero=0

#whileループで文字列factのi番目が'0'というの条件を満たす間、ループを回して'0'の数を数える変数zeroをインクリメントする
print('<<<whileループに入ります。>>>')

i=0  #whileループの場合、ループの変数の初期化も忘れない!!
print('zeroの初期値'+str(zero))
while(fact[i]=='0'):
    print('fact['+str(i)+']=「0」なのでzeroをインクリメントする')
    zero+=1
    print('zero:'+str(zero))
    i+=1 #ループの変数のインクリメントを忘れない!!これを忘れると無限ループになる!!
    print('--------------')

print('<<<whileループを抜けました。>>>')    
    

#zeroを表示
print(zero)

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


#Nを標準入力で取り込む
N=int(input())


#階乗の計算結果factを1で初期化する
fact=1


#ループを使ってNの階乗N!を変数factに求める
#階乗の計算で乗算する数をmultに格納する
#print('<<<forループに入ります。>>>')

for i in range(N):
    #print('計算前のfact:'+str(fact))
    mult=N-i
    #print('fact×「'+str(mult)+'」を計算する')
    fact*=mult
    #print('計算後のfact:【'+str(fact)+'】')
    #print('------------------')
    
#print('<<<forループを抜けました。>>>')    

#factが膨大な数になり、通常の10で割っていって0の数を求める方法が適用出来ない為、文字列に変換する
fact=str(fact)
#print('文字列に変換したfact')
#print(fact)

#末尾の'0'を求めるため、文字列を反転する
fact=list(reversed(fact))
#print('文字列を反転したfact')
#print(fact)

#'0'の数を数える変数zeroを0で初期化する
zero=0

#whileループで文字列factのi番目が'0'というの条件を満たす間、ループを回して'0'の数を数える変数zeroをインクリメントする
#print('<<<whileループに入ります。>>>')

i=0  #whileループの場合、ループの変数の初期化も忘れない!!
#print('zeroの初期値'+str(zero))
while(fact[i]=='0'):
    #print('fact['+str(i)+']=「0」なのでzeroをインクリメントする')
    zero+=1
    #print('zero:'+str(zero))
    i+=1 #ループの変数のインクリメントを忘れない!!これを忘れると無限ループになる!!
    #print('--------------')

#print('<<<whileループを抜けました。>>>')    
    

#zeroを表示
print(zero)

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


#Nを標準入力で取り込む
N=int(input())


#階乗の計算結果factを1で初期化する
fact=1


#ループを使ってNの階乗N!を変数factに求める
#階乗の計算で乗算する数をmultに格納する
for i in range(N):
    mult=N-i
    fact*=mult


#factが膨大な数になり、通常の10で割っていって0の数を求める方法が適用出来ない為、文字列に変換する
fact=str(fact)


#末尾の'0'を求めるため、文字列を反転する
fact=list(reversed(fact))


#'0'の数を数える変数zeroを0で初期化する
zero=0


#whileループで文字列factのi番目が'0'というの条件を満たす間、ループを回して'0'の数を数える変数zeroをインクリメントする
i=0  #whileループの場合、ループの変数の初期化も忘れない!!
while(fact[i]=='0'):
    zero+=1
    i+=1 #ループの変数のインクリメントを忘れない!!これを忘れると無限ループになる!!


#zeroを表示
print(zero)

ioの出力結果です。

■ GASでの解き方 ■

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

スプレッドシートの緑のセルに階乗を求める整数の100を入力します。
灰色のセルには100!の計算結果を出力します。
黄色いセルには、100の階乗100!の末尾に0が付く個数を出力します。
0の個数は変数zeroに求めます。

また、factを二次元配列としてfact2に追加して、zeroを二次元配列zero2に追加して、それぞれスプレッドシートに出力します。

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

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

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

2:階乗を求める整数N(この例の場合は100)を取得する


3:階乗の計算結果factを1で初期化する


4:100×99×98×97・・・4×3×2×1の掛けていく数を格納するmultを宣言する


5:10で割れる回数tenを0で初期化する


6:5で割れる回数fiveを0で初期化する


7:2で割れる回数twoを0で初期化する


8:末尾に付く0の個数zeroを0で初期化する


9:multが10,5,2それぞれで何回割れるのか数えて変数countに格納するので0で初期化する


10:multを代入する変数tempを宣言する

11:forループで100!を計算する

12:階乗の計算に用いたmultをtempに代入してwhileループに入る

13:10,5,2のいずれかで割れる間にtempを割っていってcountとten,five,twoをインクリメントさせる

14:10,5,2それぞれの割れた回数をログ出力

15:2,5で割れた回数が少ない方と10で割れた回数を合計してzeroに格納する

16:0が付く個数をログ表示

17:factをスプレッドシートに表示する二次元配列fact2を宣言する

18:fact2にfactを二次元配列になるように追加する

19:zeroをスプレッドシートに表示する二次元配列zero2を宣言する

20:zero2にzeroを二次元配列になるように追加する

21:スプレッドシートに出力前のfact2とzero2をログ出力して確認する

22:スプレッドシートの灰色の所に100!と、黄色い所に0の個数をそれぞれ二次元配列として出力する

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

const ss=SpreadsheetApp.getActiveSheet();

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

手順2:階乗を求める整数N(この例の場合は100)を取得する

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

手順3:階乗の計算結果factを1で初期化する

let fact=1;

手順4:100×99×98×97・・・4×3×2×1の掛けていく数を格納するmultを宣言する

let mult;

手順5:10で割れる回数tenを0で初期化する

let ten=0;

手順6:5で割れる回数fiveを0で初期化する

let five=0;

手順7:2で割れる回数twoを0で初期化する

let two=0;

手順8:末尾に付く0の個数zeroを0で初期化する

let zero=0;

手順9:multが10,5,2それぞれで何回割れるのか数えて変数countに格納するので0で初期化する

let count;

手順10:multを代入する変数tempを宣言する

let temp;

手順11から13はループです。
まず、forループで100!を求めます。
100!はとてつもなく大きい数になるので、whileループを使って、末尾の0の数を「掛ける数mult」から求めます。

multの値が変わらないように、multをtempに代入して、10または5または2で割れる間割り算をして行き、それぞれの割れる回数ten,five,twoをインクリメントさせます。

手順11:forループで100!を計算する
手順12:階乗の計算に用いたmultをtempに代入してwhileループに入る
手順13:10,5,2のいずれかで割れる間にtempを割っていってcountとten,five,twoをインクリメントさせる

下の図は、fact=1にまず初めに100を掛ける所です。
forループで階乗の計算をしながら、multを使って10で何回割れるのか求める為に、変数tempを利用しています。

この、for,while部分のコードです。

console.log('<<<forループに入る>>>');

  //forループで100!を計算する
  //階乗の計算に用いたmultをtempに代入してwhileループに入る
  //10,5,2のいずれかで割れる間にtempを割っていってcountとten,five,twoをインクリメントさせる
  for (let i = 0; i < N; i++) {
    console.log(`計算前のfact:${fact}`);
    count = 0;
    mult = N - i;
    console.log(`mult=(N-i):【${mult}】`);

    console.log(`fact:${fact}*「${mult}」を計算`);
    fact *= mult;
    console.log(`計算後のfact:【${fact}】`);

    temp = mult;

    //10,5,2のいずれかで割れる間にtempを割っていってcountとten,five,twoをインクリメントさせる
    while (temp % 10 == 0 || temp % 5 == 0 || temp % 2 == 0) {

      console.log('<<<whileループに入りました。>>>');

      if (temp % 10 == 0) {
        temp /= 10
        count++;
        ten++;
        console.log(`mult:${mult}の時、10で${count}回割れました。`);
      } else if (temp % 5 == 0) {
        temp /= 5
        count++;
        five++;
        console.log(`mult:${mult}の時、5で${count}回割れました。`);
      } else if (temp % 2 == 0) {
        temp /= 2
        count++;
        two++;
        console.log(`mult:${mult}の時、2で${count}回割れました。`);
      }

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

    }

    console.log(`現在の計算結果fact:${fact}`);
    console.log('----------------------------');

  }

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

手順14:10,5,2それぞれの割れた回数をログ出力

//10,5,2それぞれの割れた回数をログ出力
  console.log(`multが10で割れた回数:${ten}回`);
  console.log(`multが5で割れた回数:${five}回`);
  console.log(`multが2で割れた回数:${two}回`);

手順15:2,5で割れた回数が少ない方(two または five)と10で割れた回数(ten)を合計してzeroに格納する。階乗の末尾に何個0が付くかは、「10で割れた回数」と「2×5で割れた回数」の合計になります。
なので、2×5のペアを作るため、twoとfiveの少ない方をtenに足した回数がzeroになります。

//2,5で割れた回数が少ない方と10で割れた回数を合計してzeroに格納する
  if (two < five) {
    zero = ten + two
    console.log(`5で割れた回数よりも2で割れた回数の方が少ないので、\n0が付く個数はzero=ten:${ten}+two:${two}=${zero}です。`);
  } else {
    zero = ten + five;
    console.log(`2で割れた回数よりも5で割れた回数の方が少ないので、\n0が付く個数はzero=ten:${ten}+five:${five}=${zero}です。`);
  }

手順16:0が付く個数をログ表示

console.log(`0は${zero}個付きます。`);

手順17:factをスプレッドシートに表示する二次元配列fact2を宣言する

let fact2=[];

手順18:fact2にfactを二次元配列になるように追加する

fact2.push([fact]);

手順19:zeroをスプレッドシートに表示する二次元配列zero2を宣言する

let zero2=[];

手順20:zero2にzeroを二次元配列になるように追加する

zero2.push([zero]);

手順21:スプレッドシートに出力前のfact2とzero2をログ出力して確認する

console.log(fact2);
console.log(zero2);

手順22:スプレッドシートの灰色の所に100!と、黄色い所に0の個数をそれぞれ二次元配列として出力する

ss.getRange(2,2).setValue(fact);
ss.getRange(3,2).setValue(zero2);

実行後のスプレッドシートです。

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

function loop2no15() {

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

  //階乗を求める整数N(この例の場合は100)を取得する
  const N = ss.getRange(1, 2).getValue();

  //階乗の計算結果factを1で初期化する
  let fact = 1;

  //100×99×98×97・・・4×3×2×1の掛けていく数を格納するmultを宣言する
  let mult;

  //10で割れる回数tenを0で初期化する
  let ten = 0;

  //5で割れる回数fiveを0で初期化する
  let five = 0;

  //2で割れる回数twoを0で初期化する
  let two = 0;

  //末尾に付く0の個数zeroを0で初期化する
  let zero = 0;

  //multが10,5,2それぞれで何回割れるのか数えて変数countに格納するので0で初期化する
  let count;

  //multを代入する変数tempを宣言する
  let temp;

  console.log('<<<forループに入る>>>');

  //forループで100!を計算する
  //階乗の計算に用いたmultをtempに代入してwhileループに入る
  //10,5,2のいずれかで割れる間にtempを割っていってcountとten,five,twoをインクリメントさせる
  for (let i = 0; i < N; i++) {
    console.log(`計算前のfact:${fact}`);
    count = 0;
    mult = N - i;
    console.log(`mult=(N-i):【${mult}】`);

    console.log(`fact:${fact}*「${mult}」を計算`);
    fact *= mult;
    console.log(`計算後のfact:【${fact}】`);

    temp = mult;

    //10,5,2のいずれかで割れる間にtempを割っていってcountとten,five,twoをインクリメントさせる
    while (temp % 10 == 0 || temp % 5 == 0 || temp % 2 == 0) {

      console.log('<<<whileループに入りました。>>>');

      if (temp % 10 == 0) {
        temp /= 10
        count++;
        ten++;
        console.log(`mult:${mult}の時、10で${count}回割れました。`);
      } else if (temp % 5 == 0) {
        temp /= 5
        count++;
        five++;
        console.log(`mult:${mult}の時、5で${count}回割れました。`);
      } else if (temp % 2 == 0) {
        temp /= 2
        count++;
        two++;
        console.log(`mult:${mult}の時、2で${count}回割れました。`);
      }

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

    }

    console.log(`現在の計算結果fact:${fact}`);
    console.log('----------------------------');

  }

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

  //10,5,2それぞれの割れた回数をログ出力
  console.log(`multが10で割れた回数:${ten}回`);
  console.log(`multが5で割れた回数:${five}回`);
  console.log(`multが2で割れた回数:${two}回`);

  //2,5で割れた回数が少ない方と10で割れた回数を合計してzeroに格納する
  if (two < five) {
    zero = ten + two
    console.log(`5で割れた回数よりも2で割れた回数の方が少ないので、\n0が付く個数はzero=ten:${ten}+two:${two}=${zero}です。`);
  } else {
    zero = ten + five;
    console.log(`2で割れた回数よりも5で割れた回数の方が少ないので、\n0が付く個数はzero=ten:${ten}+five:${five}=${zero}です。`);
  }

  //0が付く個数をログ表示
  console.log(`0は${zero}個付きます。`);

  //factをスプレッドシートに表示する二次元配列fact2を宣言する
  let fact2 = [];

  //fact2にfactを二次元配列になるように追加する
  fact2.push([fact]);

  //zeroをスプレッドシートに表示する二次元配列zero2を宣言する
  let zero2 = [];

  //zero2にzeroを二次元配列になるように追加する
  zero2.push([zero]);


  //スプレッドシートに出力前のfact2とzero2をログ出力して確認する
  console.log(fact2);
  console.log(zero2);


  //スプレッドシートの灰色の所に100!と、黄色い所に0の個数をそれぞれ二次元配列として出力する
  ss.getRange(2, 2).setValue(fact);
  ss.getRange(3, 2).setValue(zero2);


}

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

代々木公園で撮影した紫陽花

■ 参考文献の紹介■

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

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

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

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

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

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

paiza レベルアップ問題集 「STEP: 9 階乗の計算」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASでforループを使って階乗の計算の仕方を学べます。この記事では5!(5の階乗、5×4×3×2×1=120)を扱います。
また、ループの中で変動する値をトレースするコードも付け加えました。

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

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

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

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

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

階乗の計算 (paizaランク D 相当)

問題:
整数 N が与えられます。
N の階乗 N! を計算して出力してください。

この記事では、下記の入力例2の場合を例にして、5!を求めます。
5の階乗は、5×4×3×2×1=120です。

入力例2
5

出力例2
120

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

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

■ Pythonでの解き方 ■

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

手順として、

1:Nを標準入力で取り込む

2:階乗の計算結果factを1で初期化する


3:ループでfactにfact*=(N-i)を計算する


4:factを表示

で、行います。

まずは、プログラムの各変数の動きを追いやすいように、トレースのio出力結果と、トレースのコードを添えます。
ループの変数iは、0からこの例ですと4まで変動します。

fact=1,i=0の時

fact*=(5-0)
fact=5

fact=5,i=1の時

fact*=(5-1)
fact=20

fact=20,i=2の時

fact*=(5-2)
fact=60

fact=60,i=3の時

fact*=(5-3)
fact=120

fact=120,i=4の時

fact*=(5-4)
fact=120

これで、5!=120が求まりました。
ここまでのトレースのコードを掲載します。

計算結果です。


#標準入力で整数Nを取得する
N=int(input())

#階乗を計算するfactを1で初期化する
fact=1

#ループで階乗の計算をする

print('<<<forループに入ります。>>>')


for i in range(N):
    print('計算前のfactは'+str(fact)+'です。')
    print(str(fact)+'×「'+str(N-i)+'」を計算します。')
    fact*=(N-i)
    print('計算後のfactは【'+str(fact)+'】です。')
    print('----------------------')


print('<<<forループを抜けました。>>>')

print(fact)    

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

#標準入力で整数Nを取得する
N=int(input())

#階乗を計算するfactを1で初期化する
fact=1

#ループで階乗の計算をする

#print('<<<forループに入ります。>>>')


for i in range(N):
    #print('計算前のfactは'+str(fact)+'です。')
    #print(str(fact)+'×「'+str(N-i)+'」を計算します。')
    fact*=(N-i)
    #print('計算後のfactは【'+str(fact)+'】です。')
    #print('----------------------')


#print('<<<forループを抜けました。>>>')

print(fact)    

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

#標準入力で整数Nを取得する
N=int(input())


#階乗を計算するfactを1で初期化する
fact=1


#ループで階乗の計算をする
for i in range(N):
    fact*=(N-i)


print(fact)    

ioの出力結果です。

■ GASでの解き方 ■

では、同じ問題をGASで解いてみます。
まず、スプレッドシートにこの様に配置しました。
このシートの緑色のセルN=5を取得して、5!を計算し、階乗の計算結果を黄色いセルに格納します。

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

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

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

2:スプレッドシートの緑色のセルの整数N(この例では5)を取得する


3:階乗の計算に使用する変数factの初期値を1にする


4:forループで階乗を計算


5:factが計算出来たことをログ出力で確認


6:スプレッドシートに二次元配列として格納する変数fact2を宣言


7:fact2にfactの計算結果を二次元配列になるように追加


8:スプレッドシートに出力前のfact2をログ出力して確認する


9:スプレッドシートの黄色い所に階乗の計算結果を二次元配列として格納したfact2を出力する

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

const ss=SpreadsheetApp.getActiveSheet();

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

手順2:スプレッドシートの緑色のセルの整数N(この例では5)を取得する

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

手順3:階乗の計算に使用する変数factの初期値を1にする

let fact=1;

手順4:forループで階乗を計算

Forループ内をトレースします。

fact=1,i=0の時

fact*=(5-0)
fact=5

fact=5,i=1の時

fact*=(5-1)
fact=20

fact=20,i=2の時

fact*=(5-2)
fact=60

fact=60,i=3の時

fact*=(5-3)
fact=120

fact=120,i=4の時

fact*=(5-4)
fact=120

これで、5!=120が求まりました。
Forループ内のコードを掲載します。

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


  //forループで階乗を計算
  for (let i=0;i<N;i++){
    console.log(`計算前のfactは${fact}です。`);
    console.log(`${fact}×「${N-i}」を計算します。`);
    fact*=(N-i);
    console.log(`計算後のfactは【${fact}】です。`);
    console.log('--------------------------------');
  }

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

手順5:factが計算出来たことをログ出力で確認

console.log(fact);

手順6:スプレッドシートに二次元配列として格納する変数fact2を宣言

let fact2=[];

手順7:fact2にfactの計算結果を二次元配列になるように追加

fact2.push([fact]);

手順8:スプレッドシートに出力前のfact2をログ出力して確認する

console.log(fact2);

手順9:スプレッドシートの黄色い所に階乗の計算結果を二次元配列として格納したfact2を出力する

ss.getRange(2,2).setValue(fact2);

実行後のスプレッドシートです。

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

function loop2no14() {

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

  //スプレッドシートの緑色のセルの整数N(この例では5)を取得する
  const N = ss.getRange(1, 2).getValue();

  //階乗の計算に使用する変数factの初期値を1にする
  let fact = 1;


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


  //forループで階乗を計算
  for (let i = 0; i < N; i++) {
    console.log(`計算前のfactは${fact}です。`);
    console.log(`${fact}×「${N - i}」を計算します。`);
    fact *= (N - i);
    console.log(`計算後のfactは【${fact}】です。`);
    console.log('--------------------------------');
  }

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


  //factが計算出来たことをログ出力で確認
  console.log(fact);

  //スプレッドシートに二次元配列として格納する変数fact2を宣言
  let fact2 = [];

  //fact2にfactの計算結果を二次元配列になるように追加
  fact2.push([fact]);

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

  //スプレッドシートの黄色い所に階乗の計算結果を二次元配列として格納したfact2を出力する
  ss.getRange(2, 2).setValue(fact2);

}

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

癒しの海、房総半島外房、御宿の海。

■ 参考文献の紹介■

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

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

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

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

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

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

paiza レベルアップ問題集 「STEP: 8 毎日増加するお金」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASでwhileループを使って、変動する値を加算をしていく過程で、変数がどのように変化するのかを学べます。

毎日、所持金A円にA円の10%ずつ加算して行って、何日加算したら目標金額B円を超えるのかを求めます。

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

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

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

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

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

毎日増加するお金 (paizaランク D 相当)

問題:
現在所持金を A 円持っています。
所持金が毎日 10% ずつ増えるとき、何日後に B 円を超えるか出力してください。
また、増加するお金は小数点以下切り捨てで考えることとします。
例として、所持金が 831 円 のとき、10% は 83.1円 ですが、増加するお金は 83 円 です。

この記事では、下記の入力例3の場合を例にして、A円の813円が10%ずつ増えると「何日後にB円の10000円を超えるか」を求めて行きます。

入力例3
813 10000

出力例3
27

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

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

■ Pythonでの解き方 ■

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

手順として、

1:A,Bを標準入力で取り込む

2:ループの何日目でAの813円がBの10000を超えるかの日数を数える変数dayを0で初期化する


3:whileループでA<=Bの条件を満たす間、ループを回して加算する。dayをインクリメントする


4:dayを表示

で、行います。

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

Whileループのトレースをします。
27日間の増加の詳細です。

<1日〜3日目までのトレース>

<4日〜6日目までのトレース>

<7日〜9日目までのトレース>

<10日〜12日目までのトレース>

<13日〜15日目までのトレース>

<16日〜18日目までのトレース>

<19日〜21日目までのトレース>

<22日〜24日目までのトレース>

<25日〜27日目までのトレース>

元手のA円から目標金額B円までかかった日数dayはこちらです。

ここまでのwhileループによるトレースの部分のコードです。

#標準入力で元手の金額A円と基準の金額B円を取得する
A,B=map(int,input().rstrip().split(' '))


#元手A円がB円を超える日数dayを0で初期化する
day=0


#whileループでA<=Bの間、お金を増やす

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

while A<=B:
    print('計算前のAの金額:'+str(A)+'円')
    
    #増加するお金
    print('増加するお金は「'+str(int(A/10))+'円」です。')
    
    #お金を増やす
    A+=int(A/10)
    
    print('計算後のAの金額:'+str(A)+'円')
    
    #dayをインクリメント
    day+=1
    print('経過日数【'+str(day)+'】')
    
    print(('---------------------------'))

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

print(day)    

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

#標準入力で元手の金額A円と基準の金額B円を取得する
A,B=map(int,input().rstrip().split(' '))


#元手A円がB円を超える日数dayを0で初期化する
day=0


#whileループでA<=Bの間、お金を増やす

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

while A<=B:
    #print('計算前のAの金額:'+str(A)+'円')
    
    #増加するお金
    #print('増加するお金は「'+str(int(A/10))+'円」です。')
    
    #お金を増やす
    A+=int(A/10)
    
    #print('計算後のAの金額:'+str(A)+'円')
    
    #dayをインクリメント
    day+=1
    #print('経過日数【'+str(day)+'】')
    
    #print(('---------------------------'))

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

print(day)  

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

#標準入力で元手の金額A円と基準の金額B円を取得する
A,B=map(int,input().rstrip().split(' '))


#元手A円がB円を超える日数dayを0で初期化する
day=0


#whileループでA<=Bの間、お金を増やす
while A<=B:
    
    #お金を増やす
    A+=int(A/10)
    
    #dayをインクリメント
    day+=1

print(day)    

ioの出力結果です。

■ GASでの解き方 ■

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

スプレッドシートの黄色いセルの所に「加算される整数N(=1)、増加する数M(=3)、加算して超える基準値K(=8)」でKを超えるまでに加算した回数を出力します。
Whileループで加算する回数を変数countに格納します。
また、countを二次元配列count2に追加して、スプレッドシートに出力します。

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

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

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

2:整数A,Bを取得する配列arrayを宣言する


3:スプレッドシートの緑色のセルにある金額A円(この例では「813」)と、灰色のセルにある目標金額B円(この例では10000)を2行1列の配列分取得して、arrayに格納する


4:arrayを出力して、各数が配列に格納されていることをログで確認する


5:A=array[0][0]、B=array[1][0]として代入する。この時Aは変数で、Bは定数になる。


6:それぞれの変数、定数が正しく代入されたことをログで確認する


7:Aに10%の金額ずつ足していく日数dayを0で初期化する


8:whileループを使ってAに現在のAの10%ずつ加算する「A+=Math.floor(A/10)」の計算をして、dayをインクリメントする


9:スプレッドシートにdayに格納された日数を二次元配列として格納するday2を宣言する


10:day2に二次元配列になるようにdayを追加


11:スプレッドシートに出力前のday2を出力して確認する


12:スプレッドシートの黄色い所に日数を二次元配列として格納したday2を出力する

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

const ss=SpreadsheetApp.getActiveSheet();

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

手順2:整数A,Bを取得する配列arrayを宣言する

let array=[];

手順3:スプレッドシートの緑色のセルにある金額A円(この例では「813」)と、灰色のセルにある目標金額B円(この例では10000)を2行1列の配列分取得して、arrayに格納する。
下のスプレッドシートより、セルB1つまり(1,2)から2行分を取得するので、getRangeの引数に(1,2,2)と書きます。

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

手順4:arrayを出力して、各数が配列に格納されていることをログで確認する

console.log(array);

手順5:A=array[0][0]、B=array[1][0]として代入する。この時Aは変数で、Bは定数になる。

let A=array[0][0];
const B=array[1][0];

※ Aは10%ずつ加算されていくので値が変わるから変数、それに対して基準値のBは値が変わらないので定数 ※

手順6:それぞれの変数、定数が正しく代入されたことをログで確認する

数値と文字を一緒に出力するときは、[Shiftキー]を押しながら「@」を押して「 ` 」で囲います。

console.log(`現在の所持金A:「${A}円」,目標金額B:「${B}円」`);

手順7:Aに10%の金額ずつ足していく日数dayを0で初期化する

let day=0;

手順8:whileループを使ってAに現在のAの10%ずつ加算する「A+=Math.floor(A/10)」の計算をして、dayをインクリメントする

<1日〜3日目までのトレース>

<4日〜6日目までのトレース>

<7日〜9日目までのトレース>

<10日〜12日目までのトレース>

<13日〜15日目までのトレース>

<16日〜18日目までのトレース>

<19日〜21日目までのトレース>

<22日〜24日目までのトレース>

<25日〜27日目までのトレース>

Whileループの部分のコードです。

  //whileループを使ってAに現在のAの10%ずつ加算する「A+=Math.floor(A/10)」の計算をして、dayをインクリメントする
  
  console.log('<<<ループに入ります。>>>');

  while(A<=B){
    console.log(`加算前の金額A:${A}円`);
    console.log(`加算するAの10%の金額:${Math.floor(A/10)}円`);

    //加算処理
    A+=Math.floor(A/10);

    console.log(`加算後の金額A:${A}円`);

    //日数をインクリメント
    day++;

    console.log(`【${day}】日目`);

    console.log('----------------------');

  }

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

手順9:スプレッドシートにdayに格納された日数を二次元配列として格納するday2を宣言する

let day2=[];

手順10:day2に二次元配列になるようにdayを追加

day2.push([day]);

手順11:スプレッドシートに出力前のday2を出力して確認する

console.log(day2);

手順12:スプレッドシートの黄色い所に日数を二次元配列として格納したday2を出力する

ss.getRange(5,2).setValue(day2);

実行後のスプレッドシートです。

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

function loop2no13() {

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

  //整数A,Bを取得する配列arrayを宣言する
  let array = [];

  //スプレッドシートの緑色のセルにある金額A円(この例では「813」)と、灰色のセルにある目標金額B円(この例では10000)を2行1列の配列分取得して、arrayに格納する
  array = ss.getRange(1, 2, 2).getValues();

  //arrayを出力して、各数が配列に格納されていることをログで確認する
  console.log(array);

  //A=array[0][0]、B=array[1][0]として代入する。この時Aは変数で、Bは定数になる。
  let A = array[0][0];
  const B = array[1][0];

  //それぞれの変数、定数が正しく代入されたことをログで確認する
  console.log(`現在の所持金A:「${A}円」,目標金額B:「${B}円」`);

  //Aに10%の金額ずつ足していく日数dayを0で初期化する
  let day = 0;

  //whileループを使ってAに現在のAの10%ずつ加算する「A+=Math.floor(A/10)」の計算をして、dayをインクリメントする

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

  while (A <= B) {
    console.log(`加算前の金額A:${A}円`);
    console.log(`加算するAの10%の金額:${Math.floor(A / 10)}円`);

    //加算処理
    A += Math.floor(A / 10);

    console.log(`加算後の金額A:${A}円`);

    //日数をインクリメント
    day++;

    console.log(`【${day}】日目`);

    console.log('----------------------');

  }

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

  //スプレッドシートにdayに格納された日数を二次元配列として格納するday2を宣言する
  let day2 = [];

  //day2に二次元配列になるようにdayを追加
  day2.push([day]);


  //スプレッドシートに出力前のday2を出力して確認する
  console.log(day2);

  //スプレッドシートの黄色い所に日数を二次元配列として格納したday2を出力する
  ss.getRange(5, 2).setValue(day2);

}

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

お食事中の方、ごめんなさい、浅草で有名な「うんこビル」です。

■ 参考文献の紹介■

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

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

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

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

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

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

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