paiza レベルアップ問題集 「STEP: 7 N が M ずつ増えたときにいつ K を越える?」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASでwhileループを使って加算をしていく過程で、変数がどのように変化するのかを学べます。
整数NにMずつ加算して行って、何回加算したらKを超えるかを求めます。

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

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

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

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

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

N が M ずつ増えたときにいつ K を越える? (paizaランク D 相当)

問題:
整数 N, M, K が与えられます。
N が M ずつ増えるとき、何回目に K を越えるか出力してください。

この記事では、下記の入力例3の場合を例にして、N=1がM=3ずつ増えると「いつK=8を超えるか」を求めて行きます。

入力例3
1 3 8

出力例3
3

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

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

■ Pythonでの解き方 ■

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

手順として、

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

2:ループの何回目の足し算でNがKを超えるかを数える変数countを0で初期化する


3:whileループでN<=Kの条件を満たす間、ループを回して加算する。countをインクリメントする

4:countを表示

で、行います。

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

Whileループのトレースをします。

1回目の加算

2回目の除算

3回目の除算

ここまでのwhileループによるトレースの部分のコードです。

#N,M,Kを標準入力で取り込む
N,M,K=map(int,input().rstrip().split(' '))

#ループの何回目の足し算でNがKを超えるかを数える変数countを0で初期化する
count=0


#whileループでN<=Kの条件を満たす間、ループを回して加算する。countをインクリメントする。

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

while N<=K:
    print('計算前のNの値:「'+str(N)+'」')
    print(str(N)+'に'+str(M)+'を加算\n')
    #ここで、NにMを加算する
    N+=M
    print('計算後のNの値:「'+str(N)+'」')
    if N<=K:
        print('K:'+str(K)+'まで'+str(K-N)+'足りない')
    else:
        print('K:'+str(K)+'に対してN:'+str(N)+'で、Kを超えた!!')
    count+=1
    print('加算回数【'+str(count)+'】回')
    print('-----------------------')


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

#countを表示
print(count)

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

#N,M,Kを標準入力で取り込む
N,M,K=map(int,input().rstrip().split(' '))

#ループの何回目の足し算でNがKを超えるかを数える変数countを0で初期化する
count=0


#whileループでN<=Kの条件を満たす間、ループを回して加算する。countをインクリメントする。

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

while N<=K:
    #print('計算前のNの値:「'+str(N)+'」')
    #print(str(N)+'に'+str(M)+'を加算\n')
    #ここで、NにMを加算する
    N+=M
    #print('計算後のNの値:「'+str(N)+'」')
    #if N<=K:
        #print('K:'+str(K)+'まで'+str(K-N)+'足りない')
    #else:
        #print('K:'+str(K)+'に対してN:'+str(N)+'で、Kを超えた!!')
    count+=1
    #print('加算回数【'+str(count)+'】回')
    #print('-----------------------')


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

#countを表示
print(count)

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

#N,M,Kを標準入力で取り込む
N,M,K=map(int,input().rstrip().split(' '))


#ループの何回目の足し算でNがKを超えるかを数える変数countを0で初期化する。countをインクリメントする。
count=0


#whileループでN<=Kの条件を満たす間、ループを回して加算する
while N<=K:
    
    #ここで、NにMを加算する
    N+=M
    count+=1
    
#countを表示
print(count)

ioの出力結果です。

■ GASでの解き方 ■

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

「加算される整数N(=緑のセル「1」)、増加する数M(=灰色のセル「3」)、加算して超える基準値K(=ピンクのセル「8」)」でKを超えるまでに加算した回数をスプレッドシートの黄色いセルの所に出力します。

Whileループで加算する回数を変数countに格納します。
また、countを二次元配列count2に追加して、スプレッドシートに出力します。

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

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

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

2:整数N,M,Kを取得する配列arrayを宣言する


3:スプレッドシートの緑色のセルにある整数N(この例では「1」)と、灰色のセルにある、加算していく整数M(この例では「3」)と、ピンク色のセルにある加算によって超える基準値の整数K(この例では「8」)を3行1列の配列arrayに取得する


4:arrayを出力して、各数が配列に格納されていることをログで確認する


5:N=array[0][0]、M=array[1][0]、K=array[2][0]として代入する。この時Nのみ変数で、M,Kは定数になる。


6:それぞれの変数、定数が正しく代入されたことをログで確認する


7:NにMを足していく回数countを0で初期化する


8:whileループを使ってNにMずつ加算する(N+=Mを計算)して、countをインクリメントする


9:countを表示する


10:スプレッドシートにcountに格納された加算回数を二次元配列として格納するcount2を宣言する


11:count2に二次元配列としてcountを追加


12:スプレッドシートに出力前のcount2を出力して確認する


13:スプレッドシートの黄色い所に加算回数を二次元配列として格納したcount2を出力する

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

const ss=SpreadsheetApp.getActiveSheet();

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

手順2:整数N,M,Kを取得する配列arrayを宣言する

let array=[];

手順3:スプレッドシートの緑色のセルにある整数N(この例では「1」)と、灰色のセルにある、加算していく整数M(この例では「3」)と、ピンク色のセルにある加算によって超える基準値の整数K(この例では「8」)を3行1列の配列arrayに取得する

スプレッドシートのセルB1は1行目の2列目なので(1,2)と書き、そこから3行取得するので、引数に3も加えます。

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

手順4:arrayを出力して、各数が配列に格納されていることを確認する

console.log(array);

手順5:N=array[0][0]、M=array[1][0]、K=array[2][0]として代入する。この時Nのみ変数で、M,Kは定数になる。

let N=array[0][0];
const M=array[1][0];
const K=array[2][0];

※ NはMを加えていくので値が変わるから変数、それに対してMや基準値のKは値が変わらないので定数 ※

手順6:各変数・定数が格納されたことを確認する

数値と文字を一緒に出力するときは、[Shiftキー]を押しながら「@」を押して「 ` 」で囲います。

console.log(`N:${N},M:${M},K:${K}`);

手順7:NにMを足していく回数countを0で初期化する

let count=0;

手順8:whileループを使ってNにMずつ加算する(N+=Mを計算)して、countをインクリメントする

1回目の加算

2回目の加算

3回目の加算

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

  //whileループを使って余りを配列に格納する
  console.log('<<<whileループに入りました>>>');


  while (N >= 1) {
    console.log(`計算前のNの値:${N}`);
    console.log(`計算前の配列array:[${array}]`);
    console.log(`配列に追加する余り【${N % M}】`);

    //配列に追加
    array.push(N % M);

    //割り算の実行
    N /= M;

    //Nを整数にする
    N = Math.floor(N);

    console.log(`計算後のNの値:${N}`);
    console.log(`計算後の配列array:[${array}]`);

    console.log('------------------------');
  }

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

手順9:加算回数countを表示

console.log(count);

手順10:スプレッドシートにcountに格納された加算回数を二次元配列として格納するcount2を宣言する

let count2=[];

手順11:count2に二次元配列としてcountを追加

count2.push([count]);

手順12:スプレッドシートに出力前のcount2を出力して確認する

console.log(count2);

手順13:スプレッドシートの黄色い所に加算回数を二次元配列として格納したcount2を出力する

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

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

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

function loop2no12() {

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

  //整数N,M,Kを取得する配列arrayを宣言する
  let array = [];

  //スプレッドシートの緑色のセルにある整数N(この例では「1」)と、灰色のセルにある、加算していく整数M(この例では「3」)と、ピンク色のセルにある加算によって超える基準値の整数K(この例では「8」)を3行1列の配列arrayに取得する
  array = ss.getRange(1, 2, 3).getValues();

  //arrayを出力して、各数が配列に格納されていることを確認する
  console.log(array);

  //N=array[0][0]、M=array[1][0]、K=array[2][0]として代入する。この時Nのみ変数で、M,Kは定数になる。
  let N = array[0][0];
  const M = array[1][0];
  const K = array[2][0];

  //各変数・定数が格納されたことを確認する
  console.log(`N:${N},M:${M},K:${K}`);

  //NにMを足していく回数countを0で初期化する
  let count = 0;

  //whileループを使ってNにMずつ加算する(N+=Mを計算)して、countをインクリメントする

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

  while (N <= K) {
    console.log(`加算前のN:「${N}」`);
    console.log(`NにM=${M}を加算\n`);

    //加算処理とcountのインクリメント
    N += M;
    count++;

    console.log(`加算後のN:「${N}」`);
    console.log(`加算回数【${count}】回`);

    if (N <= K) {
      console.log(`N=${N}はK=${K}まで「${K - N}」足りない`);
    } else {
      console.log(`N=${N}はK=${K}を超えた!!`);
    }

    console.log('-------------------------');

  }

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

  //countを表示する
  console.log(count);

  //スプレッドシートにcountに格納された加算回数を二次元配列として格納するcount2を宣言する
  let count2 = [];

  //count2に二次元配列としてcountを追加
  count2.push([count]);

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

  //スプレッドシートの黄色い所に加算回数を二次元配列として格納したcount2を出力する
  ss.getRange(6, 2).setValue(count2);

}

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

横浜ランドマークタワーからの絶景!!
大観覧車の赤と青の自然な感じのコントラストに中央が黄金色なのも、また素敵!!

■ 参考文献の紹介■

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

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

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

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

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

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

paiza レベルアップ問題集 「STEP: 6 10 進数から M 進数に変換」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASで10進数から任意の進数(M進数)に基数変換するコードの書き方を学べます。
whileループでMで割った余りをリスト(配列)に格納し、Pythonではスライスを使ってForループでリストの逆順から表示させます。

別解として2進数に変換した結果を数値に格納するコードも記述しました。
GASではこの別解に基づいてコードを書いています。

基本的なループの書き方にスライスを使った書き方、剰余演算子、リスト(配列の追加)など、プログラミングの基幹となる文法の習得を強化できます。

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

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

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

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

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

10 進数から M 進数に変換 (paizaランク C 相当)

問題:
10 進数で表された整数 N, M が与えられます。
N を M 進数に変換して出力してください。

この記事では、下記の入力例2の場合に、10進数N=10と基数変換するM進数M=8が与えられた時に、8進数でどのような計算結果になるのかを求めて行きます。

入力例2
10 8

出力例2
12

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

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

■ Pythonでの解き方 ■

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

手順として、

1:10進数の数値N=10とM進数のM=8を取得する

2:余りを格納する整数arrayを宣言する


3:whileループでN>=1の間、Mで割り続けて余りをarrayに格納する


4:Forループでスライスを使ってarrayを逆順に取り出す

で、行います。

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

10進数の10を8進数に変換すると12になり、計算過程はこちらの画像をご覧下さい。

この計算をwhileループを使って行います。
では、Whileループのトレースをします。

1回目の除算

2回目の除算

以上を踏まえて、トレースの部分を表示したコードを掲載します。

#10進数の整数NとM進数のMを取得
N,M=map(int,input().rstrip().split(' '))

#余りを格納するリストを宣言
array=[]


#NがM以上の場合に除算を繰り返して余りをリストに格納する

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

while N>=1:
    print('除算実行前のNの値:'+str(N))
    print('除算実行前のリストarray:'+str(array))
    
    #NをMで除算して、余りをarrayに格納する
    array.append(N%M)
    #リストに格納する余り
    print('リストに追加した余り【'+str(N%M)+'】')
    #除算してNを更新する
    N/=M
    #Nを整数にする
    N=int(N)
    print('除算実行後のNの値:'+str(N))
    print('除算実行後のリストarray:'+str(array))
    
    print('-----------------------')
    

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


#リストを表示
print(array)
    
#リストを逆順から取り出す
for num in array[::-1]:
    print(num,end="")

print()    

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

#10進数の整数NとM進数のMを取得
N,M=map(int,input().rstrip().split(' '))

#余りを格納するリストを宣言
array=[]


#NがM以上の場合に除算を繰り返して余りをリストに格納する

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

while N>=1:
    #print('除算実行前のNの値:'+str(N))
    #print('除算実行前のリストarray:'+str(array))
    
    #NをMで除算して、余りをarrayに格納する
    array.append(N%M)
    #リストに格納する余り
    #print('リストに追加した余り【'+str(N%M)+'】')
    #除算してNを更新する
    N/=M
    #Nを整数にする
    N=int(N)
    #print('除算実行後のNの値:'+str(N))
    #print('除算実行後のリストarray:'+str(array))
    
    #print('-----------------------')
    

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


#リストを表示
#print(array)
    
#リストを逆順から取り出す
for num in array[::-1]:
    print(num,end="")

print()  

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

#10進数の整数NとM進数のMを取得
N,M=map(int,input().rstrip().split(' '))

#余りを格納するリストを宣言
array=[]


#NがM以上の場合に除算を繰り返して余りをリストに格納する

while N>=1:
    #NをMで除算して、余りをarrayに格納する
    array.append(N%M)
    #除算してNを更新する
    N/=M
    #Nを整数にする
    N=int(N)


#リストを逆順から取り出す
for num in array[::-1]:
    print(num,end="")

print()  

ioの出力結果です。

上の書き方ではスライスを使ってリストをForループで逆から取り出していましたが、リストを反転させて、[1,2]を12と表記させる方法のコードを掲載します。

別解のコードでは、Forループのトレースと、コメントアウトをしたコード、コメントアウトを取り除いたコードを掲載します。

#10進数の整数NとM進数のMを取得
N,M=map(int,input().rstrip().split(' '))

#余りを格納するリストを宣言
array=[]


#NがM以上の場合に除算を繰り返して余りをリストに格納する

while N>=1:
    #NをMで除算して、余りをarrayに格納する
    array.append(N%M)
    #除算してNを更新する
    N/=M
    #Nを整数にする
    N=int(N)

#リストを反転させる
print(array)
array=list(reversed(array))
print(array)


#8進数を格納する変数ansを0で初期化
ans=0

print()

#リストの数値を元に計算結果をansに格納

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

for num in array:
    print('計算前のansの値:'+str(ans))
    ans*=10
    print('10倍したansの値:'+str(ans))
    print(str(ans)+'に'+str(num)+'を加える')
    ans+=num
    print('計算後のansの値'+str(ans))
    print('-----------------')

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

print()

print(ans)

For文に入る前に、リストを反転させます。

では、For文のループでの変数の動きを見て行きます。

1回目のansの計算

2回目のansの計算

このコードを出力形式に合わせてコメントアウトしたコードです。

#10進数の整数NとM進数のMを取得
N,M=map(int,input().rstrip().split(' '))

#余りを格納するリストを宣言
array=[]


#NがM以上の場合に除算を繰り返して余りをリストに格納する

while N>=1:
    #NをMで除算して、余りをarrayに格納する
    array.append(N%M)
    #除算してNを更新する
    N/=M
    #Nを整数にする
    N=int(N)

#リストを反転させる
#print(array)
array=list(reversed(array))
#print(array)


#8進数を格納する変数ansを0で初期化
ans=0

#print()

#リストの数値を元に計算結果をansに格納

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

for num in array:
    #print('計算前のansの値:'+str(ans))
    ans*=10
    #print('10倍したansの値:'+str(ans))
    #print(str(ans)+'に'+str(num)+'を加える')
    ans+=num
    #print('計算後のansの値'+str(ans))
    #print('-----------------')

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

#print()

print(ans)

更に、コメント部分を取り除いた、スッキリとしたコードです。

#10進数の整数NとM進数のMを取得
N,M=map(int,input().rstrip().split(' '))

#余りを格納するリストを宣言
array=[]


#NがM以上の場合に除算を繰り返して余りをリストに格納する

while N>=1:
    #NをMで除算して、余りをarrayに格納する
    array.append(N%M)
    #除算してNを更新する
    N/=M
    #Nを整数にする
    N=int(N)

#リストを反転させる
array=list(reversed(array))

#8進数を格納する変数ansを0で初期化
ans=0

for num in array:
    ans*=10
    ans+=num
    
print(ans)

別解でも無事正解しました。

■ GASでの解き方 ■

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

スプレッドシートの黄色いセルの所に「10進数N(=10)をM(=8)進数に基数変換をした結果12」を出力します。

基数変換の計算結果はansに格納します。
また、ansを二次元配列ans2に追加して、スプレッドシートに出力します。

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

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

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

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


3:スプレッドシートの灰色のセルからM進数のM(この例では「8」)を取得する


4:8で割った余りを格納する配列を宣言する


5:whileループを使って余りを配列に格納する


6:配列を表示


7:配列を反転させる


8:反転した配列を表示


9:M進数を変数ansに格納する為、ansを0で初期化する


10:Forループで8進数を計算する


11:ansを表示


12:スプレッドシートに格納する二次元配列ans2を宣言


13:ansをans2に二次元配列として格納


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


15:スプレッドシートの黄色い所に8進数に基数変換した結果を格納する

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

const ss=SpreadsheetApp.getActiveSheet();

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

手順2:スプレッドシートの緑色のセルから10進数の整数N(この例では「10」)を取得する

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

※Nを割っていくので、Nの値が変わる、すなわち変数なので定数のconstではなく変数のletで宣言をします※

手順3:スプレッドシートの緑色のセルから10進数の整数N(この例では「10」)を取得する

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

手順4:2で割った余りを格納する配列を宣言する

let array=[]

手順5:whileループを使って余りを配列に格納する

1回目の除算

2回目の除算

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

//whileループを使って余りを配列に格納する
  console.log('<<<whileループに入りました>>>');
  

  while(N>=1){
    console.log(`計算前のNの値:${N}`);
    console.log(`計算前の配列array:[${array}]`);
    console.log(`配列に追加する余り【${N%M}】`);

    //配列に追加
    array.push(N%M);

    //割り算の実行
    N/=M;

    //Nを整数にする
    N=Math.floor(N);

    console.log(`計算後のNの値:${N}`);
    console.log(`計算後の配列array:[${array}]`);

    console.log('------------------------');
  }

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

手順6:配列を表示

console.log(array);

手順7:配列を反転させる

array=array.reverse();

手順8:反転した配列を表示

console.log(array);

配列を反転させる前と後の画像です。

手順9:2進数を変数ansに格納する為、ansを0で初期化する

let ans=0;

手順10:Forループでリストから2進数に基数変換する

1回目のansの計算

2回目のansの計算

Forループのコードです。

//Forループで8進数を計算する
console.log('<<<Forループに入りました>>>');

for(let i=0;i<=array.length-1;i++){
  
  //配列の値をansに計算する
  console.log(`計算前のansの値:${ans}`);
  ans*=10;
  console.log(`ansを10倍にした値:${ans}`);
  ans+=array[i];
  console.log(`計算後のansの値:${ans}`);

  console.log('------------------------');

}

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

手順11:ansを表示

console.log(ans);

手順12:スプレッドシートに格納する二次元配列ans2を宣言

let ans2=[];

手順13:ansをans2に二次元配列として格納

ans2.push([ans]);

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

console.log(ans2);

手順15:スプレッドシートの黄色い所に8進数に基数変換した結果を格納する

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

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

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

function loop2no11() {

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

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

  //スプレッドシートの灰色のセルからM進数のM(この例では「8」)を取得する
  const M = ss.getRange(2, 2).getValue();

  //8で割った余りを格納する配列を宣言する
  let array = [];


  //whileループを使って余りを配列に格納する
  console.log('<<<whileループに入りました>>>');


  while (N >= 1) {
    console.log(`計算前のNの値:${N}`);
    console.log(`計算前の配列array:[${array}]`);
    console.log(`配列に追加する余り【${N % M}】`);

    //配列に追加
    array.push(N % M);

    //割り算の実行
    N /= M;

    //Nを整数にする
    N = Math.floor(N);

    console.log(`計算後のNの値:${N}`);
    console.log(`計算後の配列array:[${array}]`);

    console.log('------------------------');
  }

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


  //配列を表示
  console.log(array);

  //配列を反転させる
  array = array.reverse();

  //反転した配列を表示
  console.log(array);

  //M進数を変数ansに格納する為、ansを0で初期化する
  let ans = 0;

  //Forループで8進数を計算する
  console.log('<<<Forループに入りました>>>');

  for (let i = 0; i <= array.length - 1; i++) {

    //配列の値をansに計算する
    console.log(`計算前のansの値:${ans}`);
    ans *= 10;
    console.log(`ansを10倍にした値:${ans}`);
    ans += array[i];
    console.log(`計算後のansの値:${ans}`);

    console.log('------------------------');

  }

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

  //ansを表示
  console.log(ans);

  //スプレッドシートに格納する二次元配列ans2を宣言
  let ans2 = [];

  //ansをans2に二次元配列として格納
  ans2.push([ans]);

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

  //スプレッドシートの黄色い所に8進数に基数変換した結果を格納する
  ss.getRange(4, 2).setValue(ans2);

}

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

神奈川県川崎市、工場地帯の工場萌え写真。

■ 参考文献の紹介■

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

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

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

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

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

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

paiza レベルアップ問題集 「STEP: 5 10 進数から 2 進数に変換」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASで10進数から2進数に基数変換するコードの書き方を学べ、whileやForループの書き方、スライスを使った書き方、剰余演算子、リスト(配列の追加)など、プログラミングの基幹となる文法の習得を強化できます。

whileループで2で割った余りをリスト(配列)に格納し、Pythonではスライスを使ってForループでリストの逆順から表示させます。

別解として2進数に変換した計算結果をansという変数に格納するコードも記述しました。GASではこの別解に基づいてコードを書いています。

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

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

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

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

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

10 進数から 2 進数に変換 (paizaランク D 相当)

10 進数で表された整数 N が与えられます。
N を 2 進数に変換して出力してください。

この記事では、下記の入力例3の場合、10進数N=10が与えられた時に2進数でどのように変化していくかを求めて行きます。

入力例3
10

出力例3
1010

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

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

■ Pythonでの解き方 ■

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

手順として、

1:10進数の数値N=10を取得する

2:余りを格納する整数arrayを宣言する

3:whileループでN>=1の間、2で割り続けて余りをarrayに格納する

4:Forループでスライスを使ってarrayを逆順に取り出す

で、行います。

10進数を2進数に基数変換をする時は、下記のような2で割った余りを求めて、下から記述する方法で計算しました。
これは、10進数の10を2進数の「1010」に変換する時の計算過程です。

この図では、10を2で割った余りが「0」、5を2で割った余りが「1」、2を2で割った余りは「0」、最後1が残ります。
この余りを下から上に向かって「1010」と書くことで10進数の10を2進数の「1010」に変換出来ました。

この計算過程をwhileループを使って行います。
余りは配列arrayに順次追加して行きます。

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

1回目の除算

2回目の除算

3回目の除算

4回目の除算

余りを格納したリストをForループでスライスを使って逆から取り出しました。
以上を踏まえて、トレースのコードを掲載します。

#10進数の整数Nを取得する
N=int(input())

#余りを格納するリストarrayを宣言する
array=[]

#whileループでN>=1の間、2で割り続けて余りをarrayに格納する

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

while N>=1:
    print('除算前のリストarray:'+str(array))
    print('除算前のNの値:'+str(N))
    array.append(N%2)
    print('格納する余り:「'+str(N%2)+'」')
    
    N/=2
    N=int(N)
    print('除算後のNの値:'+str(N))
    print('除算後リストarray:'+str(array))
    print('------------------------')


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

#arrayを表示する
print(array)

#Forループを使って逆順から取り出す
for num in array[::-1]:
    print(num,end="")

#ループを抜けた所で改行をする
print()

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

#10進数の整数Nを取得する
N=int(input())

#余りを格納するリストarrayを宣言する
array=[]

#whileループでN>=1の間、2で割り続けて余りをarrayに格納する

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

while N>=1:
    #print('除算前のリストarray:'+str(array))
    #print('除算前のNの値:'+str(N))
    array.append(N%2)
    #print('格納する余り:「'+str(N%2)+'」')
    
    N/=2
    N=int(N)
    #print('除算後のNの値:'+str(N))
    #print('除算後リストarray:'+str(array))
    #print('------------------------')


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

#arrayを表示する
#print(array)

#Forループを使って逆順から取り出す
for num in array[::-1]:
    print(num,end="")

#ループを抜けた所で改行をする
print()

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

#10進数の整数Nを取得する
N=int(input())

#余りを格納するリストarrayを宣言する
array=[]

while N>=1:
    array.append(N%2)

    N/=2
    N=int(N)

#Forループを使って逆順から取り出す
for num in array[::-1]:
    print(num,end="")

#ループを抜けた所で改行をする
print()

ioの出力結果です。

上記ではスライスを使ってリストをForループで逆から取り出していましたが、リストを反転させて、[1,0,1,0]を1010と表記させる方法のコードを掲載します。

この部分を別解のコードでは、[1,0,1,0]を1010になるようにansという変数を使って、Forループで計算しています。

ansの初期値は0で10倍すると0、
そこにリストから「1」を加えると「ans=1」になります。
ans=1を10倍すると10、そこにリストから「0」を加えて「ans=10」になります。
ans=10を10倍すると100、そこにリストから「1」を加えて「101」になります。
ans=101を10倍すると1010、そこにリストから「0」を加えて「1010」になります。

そのForループのトレースと、コメントアウトをしたコード、コメントアウトを取り除いたコードを掲載します。

ループに入る前にリストを反転します。

1回目のansの計算

2回目のansの計算

3回目のansの計算

4回目のansの計算

以上を踏まえて、トレースのコードを掲載します。

#10進数の整数Nを取得する
N=int(input())

#余りを格納するリストarrayを宣言する
array=[]

while N>=1:
    array.append(N%2)

    N/=2
    N=int(N)

#リストarrayを出力
print(array)

#リストarrayを反転させる
array=list(reversed(array))

#反転させたリストarrayを出力
print(array)

#基数変換の計算結果を格納する変数ansを0で初期化
ans=0

#Forでリスト内の数を基数変換した形式で表示する

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

for num in array:
    print('計算前のans:'+str(ans))
    ans*=10
    print('10倍したans:'+str(ans))
    ans+=num
    print('計算後のans:'+str(ans))
    print('-------------------')

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


#基数変換の計算結果ansを表示させる
print(ans)

冗長な部分をコメントアウトしたコードです。

#10進数の整数Nを取得する
N=int(input())

#余りを格納するリストarrayを宣言する
array=[]

while N>=1:
    array.append(N%2)

    N/=2
    N=int(N)

#リストarrayを出力
#print(array)

#リストarrayを反転させる
array=list(reversed(array))

#反転させたリストarrayを出力
#print(array)

#基数変換の計算結果を格納する変数ansを0で初期化
ans=0

#Forでリスト内の数を基数変換した形式で表示する

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

for num in array:
    #print('計算前のans:'+str(ans))
    ans*=10
    #print('10倍したans:'+str(ans))
    ans+=num
    #print('計算後のans:'+str(ans))
    #print('-------------------')

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


#基数変換の計算結果ansを表示させる
print(ans)

更にトレース部分のコメント部分を削除したコードです。


#10進数の整数Nを取得する
N=int(input())

#余りを格納するリストarrayを宣言する
array=[]

while N>=1:
    array.append(N%2)
    N/=2
    N=int(N)


#リストarrayを反転させる
array=list(reversed(array))

#基数変換の計算結果を格納する変数ansを0で初期化
ans=0


#Forでリスト内の数を基数変換した形式で表示する

for num in array:
    ans*=10
    ans+=num

#基数変換の計算結果ansを表示させる
print(ans)

別解でも無事正解しました。

■ GASでの解き方 ■

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

スプレッドシートの黄色いセルの所に「10進数N(=10)を2進数に基数変換をした結果1010」を出力します。
基数変換の計算結果はansに格納します。
また、ansを二次元配列ans2に追加して、スプレッドシートに出力します。

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

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

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

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


3:2で割った余りを格納する配列を宣言する


4:whileループを使って余りを配列に格納する


5:配列を表示


6:配列を反転させる


7:反転した配列を表示


8:2進数を変数ansに格納する為、ansを0で初期化する

9:ループで2進数を計算する

10:ansを表示

11:スプレッドシートに格納する二次元配列ans2を宣言

12:ansをans2に二次元配列として格納

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

14:スプレッドシートの黄色い所に2進数に基数変換した結果を格納する

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

const ss=SpreadsheetApp.getActiveSheet();

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

手順2:スプレッドシートの緑色のセルから10進数の整数N(この例では「10」)を取得する

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

※Nを2で割っていくので、Nの値が変わる、すなわち変数なので定数のconstではなく変数のletで宣言をします※

手順3:2で割った余りを格納する配列を宣言する

let array=[]

手順4:whileループを使って余りを配列に格納する

1回目の除算

2回目の除算

3回目の除算

4回目の除算

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

//whileループを使って余りを配列に格納する

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

  while(N>=1){
    console.log(`除算前のNの値:${N}`);
    console.log(`除算前の配列array[${array}]`);
    //配列に余りを追加する
    array.push(N%2);
    console.log(`余り:${N%2}`);
    //除算実行
    N/=2;
    //小数点を切り捨てる
    N=Math.floor(N);
    
    console.log(`除算後のNの値:${N}`);
    console.log(`除算前の配列array[${array}]`);
    console.log('--------------------');

  }

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

手順5:配列を表示

console.log(array);

手順6:配列を反転させる

array=array.reverse();

手順7:反転した配列を表示

console.log(array);

配列の反転前と反転後のログです。

手順8:2進数を変数ansに格納する為、ansを0で初期化する

let ans=0;

手順9:Forループで2進数に基数変換する

1回目のansの計算

2回目のansの計算

3回目のansの計算

4回目のansの計算

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

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

  //ループで2進数を計算する
  for(let i=0;i<=array.length-1;i++){
    console.log(`計算前のansの値:${ans}`);
    ans*=10;
    console.log(`10倍したansの値:${ans}`);
    ans+=array[i];
    console.log(`計算後のansの値:${ans}`);
    console.log('---------------------------');
  }

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

手順10:ansを表示

console.log(ans);

手順11:スプレッドシートに格納する二次元配列ans2を宣言

let ans2=[];

手順12:ansをans2に二次元配列として格納

ans2.push([ans]);

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

console.log(ans2);

手順14:スプレッドシートの黄色い所に2進数に基数変換した結果を格納する

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

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

function loop2no10(){

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


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

  
  //2で割った余りを格納する配列を宣言する
  let array=[]
  
  
  //whileループを使って余りを配列に格納する

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

  while(N>=1){
    console.log(`除算前のNの値:${N}`);
    console.log(`除算前の配列array[${array}]`);
    //配列に余りを追加する
    array.push(N%2);
    console.log(`余り:${N%2}`);
    //除算実行
    N/=2;
    //小数点を切り捨てる
    N=Math.floor(N);
    
    console.log(`除算後のNの値:${N}`);
    console.log(`除算前の配列array[${array}]`);
    console.log('--------------------');

  }

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


  //配列を表示
  console.log(array);

  //配列を反転させる
  array=array.reverse();

  //反転した配列を表示
  console.log(array);

  //2進数を変数ansに格納する為、ansを0で初期化する
  let ans=0;

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

  //ループで2進数を計算する
  for(let i=0;i<=array.length-1;i++){
    console.log(`計算前のansの値:${ans}`);
    ans*=10;
    console.log(`10倍したansの値:${ans}`);
    ans+=array[i];
    console.log(`計算後のansの値:${ans}`);
    console.log('---------------------------');
  }

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

  //ansを表示
  console.log(ans);

  //スプレッドシートに格納する二次元配列ans2を宣言
  let ans2=[];

  //ansをans2に二次元配列として格納
  ans2.push([ans]);

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

  //スプレッドシートの黄色い所に2進数に基数変換した結果を格納する
  ss.getRange(3,2).setValue(ans2);

}

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

みなとみらいの海と夜景

■ 参考文献の紹介■

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

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

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

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

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

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

paiza レベルアップ問題集 「STEP: 4 任意の数で何回割れる?」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASで標準入力で被除数(割られる数N)・除数(割る数M)を取得し、whileループを使って、任意の数(M)で何回割ることが出来るのか回数を数える方法が学べます。

どちらのコードでも割り算の過程や変数の値の変化を追いやすい様に、トレースのコードを設けています。

ループの最初にIF文で割り切れない(余りが0ではない)場合はbreakでループを抜けるようにしています。

このコーナーでは、学習コンテンツ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 が与えられます。
N が何回 M で割れるかを求め、出力してください。

この記事では、下記の入力例3の場合にリストの個数N=81,M=3として81が3で何回で割れるかを求めます。

入力例3
81 3

出力例3
4

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

■ Pythonでの解き方 ■

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

手順として、

1:数値N=81,M=3を取得する

2:割り算を実行する処理の回数をcountで求めるので、count変数を0で初期化する


3:ループの最初にNがMで割り切れない場合は、breakでループを抜けるよう設定しています。
whileループでNがM以上という条件を満たす間、ループを回します。
Mで割っていくのにNが2.999などの数ですと、割り切ることが出来ないからです。


4:ループの中で割り算を実行します。

5:countをインクリメントします。

6:countを表示します。

で、行います。

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

1回目の除算

2回目の除算

3回目の除算

4回目の除算

#被除数Nと除数Mを標準入力で取得
N,M=map(int,input().rstrip().split(' '))


#NをMで割れる回数を格納する変数countを初期化する
count=0


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

#whileループでNがM以上で尚且つ割り切れる条件の時にループを回す
while N>=M:
    print('除算前のcount:【'+str(count)+'回】')
    print('除算前のN:'+str(N))
    if N%M!=0:
        break
    
    #除算実行
    print('---「'+str(N)+'÷'+str(M)+'」を実行---')
    N/=M
    
    #countのインクリメント
    count+=1
    
    print('除算後のcount:【'+str(count)+'回】')
    print('除算後のN:'+str(N))
	
    #ループの区切り
    print('-------------------')

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

print(count)

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

#被除数Nと除数Mを標準入力で取得
N,M=map(int,input().rstrip().split(' '))


#NをMで割れる回数を格納する変数countを初期化する
count=0


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

#whileループでNがM以上で尚且つ割り切れる条件の時にループを回す
while N>=M:
    #print('除算前のcount:【'+str(count)+'回】')
    #print('除算前のN:'+str(N))
    if N%M!=0:
        break
    
    #除算実行
    #print('---「'+str(N)+'÷'+str(M)+'」を実行---')
    N/=M
    
    #countのインクリメント
    count+=1
    
    #print('除算後のcount:【'+str(count)+'回】')
    #print('除算後のN:'+str(N))

    #ループの区切り
    #print('-------------------')

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

print(count)

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


#被除数Nと除数Mを標準入力で取得
N,M=map(int,input().rstrip().split(' '))


#NをMで割れる回数を格納する変数countを初期化する
count=0

#whileループでNがM以上で尚且つ割り切れる条件の時にループを回す
while N>=M:
    if N%M!=0:
        break
    
    #除算実行
    #print('---「'+str(N)+'÷'+str(M)+'」を実行---')
    N/=M
    
    #countのインクリメント
    count+=1
    
print(count)

ioの出力結果です。

■ GASでの解き方 ■

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

スプレッドシートの黄色いセルの所に「Mで割り切れた回数」を出力します。
割り切れた回数は変数countに格納します。
また、countを二次元配列count2に追加して、スプレッドシートに出力します。

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

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

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

2:スプレッドシートの緑色のセルから割られる数の被除数N(この例では「81」)を取得する


3:スプレッドシートの灰色のセルから割る数の除数M(この例では「3」)を取得する


4:割り切れた回数を格納する変数countを宣言して0で初期化する


5:whileループでNがM以上という条件を満たす時にループを回す。
また、IF文でNをMで割り切れない(N%Mが0では無い)場合にはループを抜ける。
除算を実行して、割り切れた回数のcountをインクリメントする。

6:スプレッドシートに出力する二次元配列配列count2を宣言する

7:countをcount2に二次元配列として追加する

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

9:スプレッドシートの黄色いセルに割り切れた回数が格納された二次元配列count2を出力する

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

const ss=SpreadsheetApp.getActiveSheet();

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

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

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

※Nを割っていくので、Nの値が変わる、すなわち変数なので定数のconstではなく変数のletで宣言をします※

手順3:スプレッドシートの灰色のセルから割る数の除数M(この例では「3」)を取得する

const M = ss.getRange(2, 2).getValue();

手順4:割り切れた回数を格納する変数countを宣言して0で初期化する

let count=0;

手順5:
whileループでNがM以上という条件を満たす時にループを回す。
また、IF文で、NをMで割り切れない(N%Mが0では無い)時にループを抜ける。
除算を実行して、割り切れた回数のcountをインクリメントする。

1回目の除算

2回目の除算

3回目の除算

4回目の除算

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

/*
  whileループでNがM以上という条件を満たす時にループを回す。
  また、IF文でNをMで割り切れない(N%Mが0では無い)場合にはループを抜ける。
  除算を実行して、割り切れた回数のcountをインクリメントする。
  */

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

  while (N >= M) {
    if (N % M != 0) {
      break
    }

    console.log(`除算実行前のN:${N}`);
    console.log(`除算実行前のcount:【${count}回】`);

    //除算実行
    N /= M;

    //割り算の回数をインクリメント
    count++;

    console.log(`除算実行後のN:${N}`);
    console.log(`除算実行後のcount:【${count}回】`);

    //ループ区切り
    console.log('-----------------------');

  }

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

手順6:スプレッドシートに出力する二次元配列配列count2を宣言する

let count2=[];

手順7:countをcount2に二次元配列として追加する

count2.push([count]);

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

console.log(count2);

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

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

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

function loop2no9() {

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

  //スプレッドシートの緑色のセルから割られる数の被除数N(この例では「81」)を取得する
  let N = ss.getRange(1, 2).getValue();

  //スプレッドシートの灰色のセルから割る数の除数M(この例では「3」)を取得する
  const M = ss.getRange(2, 2).getValue();

  //割り切れた回数を格納する変数countを宣言して0で初期化する
  let count = 0;

  /*
  whileループでNがM以上という条件を満たす時にループを回す。
  また、IF文でNをMで割り切れない(N%Mが0では無い)場合にはループを抜ける。
  除算を実行して、割り切れた回数のcountをインクリメントする。
  */

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

  while (N >= M) {
    if (N % M != 0) {
      break
    }

    console.log(`除算実行前のN:${N}`);
    console.log(`除算実行前のcount:【${count}回】`);

    //除算実行
    N /= M;

    //割り算の回数をインクリメント
    count++;

    console.log(`除算実行後のN:${N}`);
    console.log(`除算実行後のcount:【${count}回】`);

    //ループ区切り
    console.log('-----------------------');

  }

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

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

  //countをcount2に二次元配列として追加する
  count2.push([count]);

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

  //スプレッドシートの黄色いセルに割り切れた回数が格納された二次元配列count2を出力する
  ss.getRange(4, 1).setValue(count2);

}

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

よみうりランドのXmasイルミネーション、「ジュエルミネーション」から1枚、アテネの宮廷

■ 参考文献の紹介■

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

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

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

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

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

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

paiza レベルアップ問題集 「STEP: 3 2 で何回割れる?」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASでwhileループを使って、2で何回割ることが出来るのか回数を数える方法が学べます。

どちらのコードでも割り算の過程や変数の値の変化を追いやすい様に、トレースのコードを設けています。

ループの最初にIF文で割り切れない(余りが0ではない)場合はbreakでループを抜けるようにしています。

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

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

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

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

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

2 で何回割れる? (paizaランク D 相当)

問題:
整数 N が与えられます。
N が何回 2 で割れるかを求め、出力してください。

この記事では、下記の入力例3の場合にリストの個数N=10として10が2で何回で割れるかを求めます。

入力例3
10

出力例3
1

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

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

■ Pythonでの解き方 ■

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

手順として、

1:数値N「10」を取得する

2:割り算を実行する処理の回数をcountで求めるので、count変数を0で初期化しています。

3:whileループでNが2以上という条件を満たす間、ループを回します。
2で割っていくのに1.999などの数ですと、割り切ることが出来ないからです。

4:ループの最初にNが2で割り切れない場合は、breakでループを抜けるよう設定しています。
10を2で割ると5、5を2で割ると2.5で、2以上という条件を満たしていますが、除算は実行出来ても割り切れてはいないので、計算を終了するためにループを抜けます。

5:割り算を実行します。

6:countをインクリメントします。

7:countを表示します。

で、行います。

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

#整数Nを取得
N=int(input())


#何回で割れるかを求めるcount変数を0で初期化
count=0

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

#ループで除算
while(N>=2):
    print('除算前のNの値:'+str(N))
    
    #2で割った時に余りが出る場合はループを抜ける
    if N%2!=0:
        break
    #除算実行
    N/=2
    print('除算後のNの値:'+str(N))
    
    #除算回数をカウントする
    count+=1
    print('割った回数は【'+str(count)+'】回です。')
    print('----------------------')

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

print(count)  

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

#整数Nを取得
N=int(input())


#何回で割れるかを求めるcount変数を0で初期化
count=0

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

#ループで除算
while(N>=2):
    #print('除算前のNの値:'+str(N))
    
    #2で割った時に余りが出る場合はループを抜ける
    if N%2!=0:
        break
    #除算実行
    N/=2
    #print('除算後のNの値:'+str(N))
    
    #除算回数をカウントする
    count+=1
    #print('割った回数は【'+str(count)+'】回です。')
    #print('----------------------')

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

print(count)    

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

#整数Nを取得
N=int(input())


#何回で割れるかを求めるcount変数を0で初期化
count=0

#ループで除算
while(N>=2):

    #2で割った時に余りが出る場合はループを抜ける
    if N%2!=0:
        break
    #除算実行
    N/=2
    #print('除算後のNの値:'+str(N))
    
    #除算回数をカウントする
    count+=1

print(count)   

ioの出力結果です。

■ GASでの解き方 ■

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

スプレッドシートの黄色いセルの所に「2で割り切れた回数」を出力します。
割り切れた回数は変数countに格納します。
また、countを二次元配列count2に追加して、スプレッドシートに出力します。

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

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

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

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


3:割り切れた回数を格納する変数countを宣言する


4:whileループでNが2以上という条件を満たす時にループを回す。
また、IF文でNを2で割り切れない(N%2が0では無い)時にループを抜ける。
除算を実行して、割り切れた回数のcountをインクリメントする。


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


6:countをcount2に二次元配列として追加する


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


8:スプレッドシートの黄色いセルに割り切れた回数が格納された二次元配列count2を出力する

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

const ss=SpreadsheetApp.getActiveSheet();

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

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

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

※Nを割っていくので、Nの値が変わる、すなわち変数なので定数のconstではなく変数のletで宣言をします※

手順3:割り切れた回数を格納する変数countを宣言する

let count=0;

手順4:
whileループでNが2以上という条件を満たす時にループを回す。
また、IF文で、Nを2で割り切れない(N%2が0では無い)時にループを抜ける。
除算を実行して、割り切れた回数のcountをインクリメントする。

文字と数値を同時に表示する場合は、console.logの中に「 ` 」(shift+@)で括り、数値は${}を使います。

console.log('<<<ループに入ります。>>>')
while(N>=2){

  console.log(`割り算を実行する前のNの値:${N}`);
  console.log(`割り算を実行する前のcountの値:【${count}回】`);

  if(N%2!=0){
    break;
  }

  N/=2;

  console.log(`割り算を実行した後のNの値:${N}`);

  //除算を実行して、割り切れた回数のcountをインクリメントする
  count++;
  console.log(`割り算を実行した後のcountの値:【${count}回】`);

  console.log('---------------------------------------');

}

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

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

let count2=[];

手順6:countをcount2に二次元配列として追加する

count2.push([count]);

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

console.log(count2);

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

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

function loop2no8(){

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

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

//割り切れた回数を格納する変数countを宣言する
let count=0;

//whileループでNが2以上という条件を満たす時にループを回す。
//また、IF文でNを2で割り切れない(N%2が0では無い)時にループを抜ける。

console.log('<<<ループに入ります。>>>')
while(N>=2){

  console.log(`割り算を実行する前のNの値:${N}`);
  console.log(`割り算を実行する前のcountの値:【${count}回】`);

  if(N%2!=0){
    break;
  }

  N/=2;

  console.log(`割り算を実行した後のNの値:${N}`);

  //除算を実行して、割り切れた回数のcountをインクリメントする
  count++;
  console.log(`割り算を実行した後のcountの値:【${count}回】`);

  console.log('---------------------------------------');

}

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


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

//countをcount2に二次元配列として追加する
count2.push([count]);

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

//スプレッドシートの黄色いセルに割り切れた回数が格納された二次元配列count2を出力する
ss.getRange(4,1).setValue(count2);

}

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

よみうりランドジュエルミネーション。
2019年12月、コロナ前に撮影

■ 参考文献の紹介■

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

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

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

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

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

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

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サンプル
基本情報技術者試験

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

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

この記事を読むことで、Python・GASで整数を標準入力で文字列として取得し、その長さを求め、ループで整数の変換しながら合計を求める方法で、特にループの所で変数の動きが分かりやすいようにトレースをしています。

整数の桁数を求める方法や、文字列を数値に変換する方法について、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 相当)

問題:
10 進数で表された整数 N が与えられます。
整数 N の各桁の和を計算し、出力してください。

この記事では、下記の入力例3の場合に整数をNとして「813」が与えられ、その各桁の和・8+1+3=12を求めるプログラミングの問題を解いて行きます。

入力例3
813

出力例3
12

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

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

■ Pythonでの解き方 ■

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

手順として、

1:標準入力で数値Nを「文字列として」取得

2:数値Nの桁数を求める


3:合計値ansを0で初期化


4:ForループとIFで格桁ごとに数値に変換して合計を求める


5:その合計を出力

で、行います。

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


#数値Nを文字列として取得
N=input()

#Nの桁数(文字列の長さ)を求める
length=len(N)

#合計結果ansを0で初期化
ans=0

#この文字列をリストとして、各桁を数値に変換して足していく
for i in range(length):
    print('現在の合計値ans:【'+str(ans)+'】')
    num=int(N[i])#ここで数値に変換している
    print(str(i+1)+'桁目の数は「'+str(num)+'」です。')
    print('現在の合計値ansに「'+str(num)+'」を加えます')
    ans+=num#合計値を加算演算子で計算
    print('計算後のans:【'+str(ans)+'】')
    print('------------------------')
    
#合計値を出力する
print(ans)

トレースコードのログです。

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


#数値Nを文字列として取得
N=input()

#Nの桁数(文字列の長さ)を求める
length=len(N)

#合計結果ansを0で初期化
ans=0

#この文字列をリストとして、各桁を数値に変換して足していく
for i in range(length):
    #print('現在の合計値ans:【'+str(ans)+'】')
    num=int(N[i])#ここで数値に変換している
    #print(str(i+1)+'桁目の数は「'+str(num)+'」です。')
    #print('現在の合計値ansに「'+str(num)+'」を加えます')
    ans+=num#合計値を加算演算子で計算
    #print('計算後のans:【'+str(ans)+'】')
    #print('------------------------')
    
#合計値を出力する
print(ans)

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

#数値Nを文字列として取得
N=input()

#Nの桁数(文字列の長さ)を求める
length=len(N)

#合計結果ansを0で初期化
ans=0

#この文字列をリストとして、各桁を数値に変換して足していく
for i in range(length):
    num=int(N[i])#ここで数値に変換している
    ans+=num#合計値を加算演算子で計算
    
#合計値を出力する
print(ans)

ioの出力結果です。

■ GASでの解き方 ■

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

緑のセルに整数が入力されています。
黄色いセルの所に「各桁の合計値」を出力します。

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

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

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

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


3:整数Nが取得できたことをログで確認


4:変数Lenに、整数Nの桁数を取得して代入する


5:桁数Lenが取得できたことをログで確認する


6:合計値として計算に使用する変数ansを0で初期化する


7:ForループとIF文でsliceメソッドを使って数字列Nから各桁を切り出して、数値に変換してansに加算演算子で加算する

8:ansの合計結果をログ出力で確認

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

10:ansをans2にpushメソッドで追加する

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

12:スプレッドシートの黄色いセルに格桁の合計が格納された二次元配列ans2を出力する

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

const ss=SpreadsheetApp.getActiveSheet();

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

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

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

手順3:ログで整数Nが取得できたことをログで確認

console.log(N);

手順4:整数Nの桁数を取得して、変数Lenに代入する

const Len = N.toString().length;

toStringは、整数Nの桁数を調べる為に一旦文字列にしてからlengthを使って桁数を調べます。
これはSAMURAI ENGINEERさんのtoStringメソッドの使い方の記事が分かりやすいです。

手順5:桁数Lenが取得できたことをログで確認する

console.log(`この数字列の桁数は、【${Len}】桁です。`);

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

手順6:合計値として計算に使用する変数ansを0で初期化する

let ans = 0;

計算の合計に使う値に何か入っていると正確な計算が出来ないので、必ず0で初期化します。

手順7:ForループとIF文でsliceメソッドを使って数字列Nから各桁を切り出して、数値に変換してansに加算演算子で加算する。

sliceメソッドで文字列を切り出す場合、この場合は

let num = N.toString().slice(i, i + 1);

と書いています。

slice(開始位置,終了位置の手前)

になるので、終了位置に+1としています。

この説明も、SAMURAI ENGINEERさんの文字列の任意の範囲を切り抜く方法の記事が分かりやすいです。

切り取った文字を数値に変換させています。

num=Number(num);

今回は、iを0からLen(長さ3)未満の範囲、つまりi=0,1,2でループを回しましたので、そのトレースを行います。

i=0の時

let num = N.toString().slice(0,1);

で、numに0番目の文字「8」が入り、合計が【8】になりました。

i=1の時

let num = N.toString().slice(1,2);

で、numに1番目の文字「1」が入り、合計が【9】になりました。

i=2の時

let num = N.toString().slice(2,3);

で、numに2番目の文字「3」が入り、合計が【12】になりました。

では、ループの部分とその前後のコードです。

//ForループとIF文でsliceメソッドを使って数字列Nから各桁を切り出して、数値に変換してansに加算演算子で加算する
  console.log('<<<ループに入ります!!>>>');

  for (let i = 0; i < Len; i++) {
    let num = N.toString().slice(i, i + 1);
    console.log(`現在の合計値ans:【${ans}】`);
    num=Number(num);
    console.log(`文字列「${i}」番目は「${num}」です。`);
    ans += num;  //ここで加算演算子を使ってansに加えている
    console.log(`「${num}」を加えた合計ansは【${ans}】になりました`);
    console.log('---------------------------------');
  }

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

手順8:ansの合計結果をログ出力で確認

console.log(ans);

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

ans2=[];

手順10:ansをans2にpushメソッドで追加する

ans2.push([ans]);

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

console.log(ans2);

手順12:スプレッドシートの黄色いセルに格桁の合計が格納された二次元配列ans2を出力する

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

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

function loop2no6() {

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

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

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

  //変数Lenに、整数Nの桁数を取得して代入する
  const Len = N.toString().length;

  //桁数Lenが取得できたことをログで確認する
  console.log(`この数字列の桁数は、【${Len}】桁です。`);

  //合計値として計算に使用する変数ansを0で初期化する
  let ans = 0;


  //ForループとIF文でsliceメソッドを使って数字列Nから各桁を切り出して、数値に変換してansに加算演算子で加算する
  console.log('<<<ループに入ります!!>>>');

  for (let i = 0; i < Len; i++) {
    let num = N.toString().slice(i, i + 1);
    console.log(`現在の合計値ans:【${ans}】`);
    num = Number(num);
    console.log(`文字列「${i}」番目は「${num}」です。`);
    ans += num;  //ここで加算演算子を使ってansに加えている
    console.log(`「${num}」を加えた合計ansは【${ans}】になりました`);
    console.log('---------------------------------');
  }

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


  //ansの合計結果をログ出力で確認
  console.log(ans);

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

  //ansをans2にpushメソッドで追加する
  ans2.push([ans]);


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

  //スプレッドシートの黄色いセルに格桁の合計が格納された二次元配列ans2を出力する
  ss.getRange(3, 2).setValue(ans2);

}

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

石神井公園の桜。サイクルボートに乗って撮影しました。

■ 参考文献の紹介■

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

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

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

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

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

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

paiza レベルアップ問題集 「FINAL問題 偶奇の判定」をPythonとGASで解いてみた

この記事を読むことで、整数やリストを標準入力で取得して、IF分岐とループを使って偶数・奇数の判定を出力する処理を、PythonとGASの両方のコードで習得することが可能になります。

Pythonでは、基本的なループとIF分岐のコードの他にそれらを1行で書き表せる【内包表記】のコードも追記しております。
最初に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 相当)

問題:
N 個の整数 a_1, a_2, …, a_N が与えられます。
この N 個の整数について、a_1 から順に 奇数か偶数か判定し、奇数なら「odd」 、偶数なら「even」を改行区切りで出力してください。

この記事では、下記の入力例1の場合、N=5で5個の数値のリストに「1 2 3 4 5」が与えられて、その奇数・偶数の判定を行う、という条件で解いて行きます。

入力例1
5
1 2 3 4 5

出力例1
odd
even
odd
even
odd

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

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

■ Pythonでの解き方 ■

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

手順として、

1:標準入力でリストの個数を取得

2:標準入力でリストを取得


2:ForループとIFで剰余演算子「%」を使って「%2==0」を「even(偶数)」、そうでないもの「odd(奇数)」を判定して出力

で、行います。
まずは、基本的なForとIFを用いたコードです。

#リストの要素数を取得する
N=int(input())

#リストを取得する
array=list(map(int,input().rstrip().split(' ')))

#ループで偶奇の判定をする
for num in array:
    if num%2==0:
        print('even')
    else:
        print('odd')

次に、上記のForとIFの箇所に【内包表記】を施したコードです。


#リストの要素数を取得する
N=int(input())

#リストを取得する
array=list(map(int,input().rstrip().split(' ')))


#【内包表記】ループで偶奇の判定をする
[print('even') if num%2==0 else print('odd') for num in array]        

ioの出力結果です。

■ GASでの解き方 ■

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

黄色いセルの所に「偶数・奇数の判定」を出力します。

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

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

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

2:スプレッドシートの緑色のセルから配列の個数を取得する

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

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

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

6:ForループとIF文で剰余演算子「%」を使って「%2==0」を「even(偶数)」、そうでないものを「odd(奇数)」と判定して配列array2に追加。

7:スプレッドシート出力前に「even,odd(偶数・奇数)の判定」が格納された二次元配列array2のログ出力で確認する

8:スプレッドシートの黄色いセルに「even,odd」が格納された二次元配列array2を出力する

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

const ss=SpreadsheetApp.getActiveSheet();

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

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

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

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

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

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

console.log(array);

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

let array2=[]

手順6:ForループとIF文で剰余演算子「%」を使って「%2==0」を「even(偶数)」、そうでないものを「odd(奇数)」と判定して配列array2に追加。

//ForループとIF文で剰余演算子「%」を使って「%2==0」を「even(偶数)」、そうでないものを「odd(奇数)」と判定して配列array2に追加。
  for (let i = 0; i < N; i++) {
    if (array[0][i] % 2 == 0) {
      array2.push(['even']);
    } else {
      array2.push(['odd']);
    }
  }

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

手順7:スプレッドシート出力前に「even,odd(偶数・奇数)の判定」が格納された二次元配列array2のログ出力で確認する

console.log(array2);

手順8:スプレッドシートの黄色いセルに「even,odd」が格納された二次元配列array2を出力する

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

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

function loop2no5() {

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

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

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

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

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

  //ForループとIF文で剰余演算子「%」を使って「%2==0」を「even(偶数)」、そうでないものを「odd(奇数)」と判定して配列array2に追加。
  for (let i = 0; i < N; i++) {
    if (array[0][i] % 2 == 0) {
      array2.push(['even']);
    } else {
      array2.push(['odd']);
    }
  }

  //スプレッドシート出力前に「even,odd(偶数・奇数)の判定」が格納された二次元配列array2のログ出力で確認する
  console.log(array2);

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

}

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

六本木ヒルズのハロウィン、お化けカボチャ

■ 参考文献の紹介■

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

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

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

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

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

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

paiza レベルアップ問題集 「STEP: 4 割り切れる数だけ出力」をPythonとGASで解いてみた

この記事を読むことで、「3で割り切れる数のみを出力する処理」を、PythonとGASの両方のコードでForループとIF文を使って習得することが可能です。

Pythonでは、基本的なループとIF分岐のコードの他にそれらを1行で書き表せる、
【内包表記】のコードも追記しております。

最初に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 相当)

問題:
N個の整数 a_1, a_2, …, a_N が与えられます。
このN個の整数のうち、a_1 から順に「3で割り切れるか」判定し、割り切れる場合のみ改行区切りで出力してください。また、N個の整数には3で割り切れる数が少なくとも 1 つ含まれています。

この記事では入力例1の場合、N=6で6個の数値のリストに「1 2 3 4 5 6」が与えられたという条件で解いて行きます。

入力例1
6
1 2 3 4 5 6

出力例1
3
6

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

<<Pythonでの解き方>>

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

手順として、
1:標準入力でリストの個数を取得
2:標準入力でリストを取得
2:ForループとIFで剰余演算子「%」を使って「%3==0」を「3で割り切れる数」と判定して出力

まずは、基本的なForとIFを用いたコードです。

#リストの数値の個数を取得
N=int(input())

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

#For文とIF文でリストの数値が3で割り切れる場合のみ出力する
for num in array:
    if num%3==0:
        print(num)

次に、上記のForとIFの箇所に【内包表記】を施したコードです。

#リストの数値の個数を取得
N=int(input())

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

#【内包表記】For文とIF文でリストの数値が3で割り切れる場合のみ出力する
[print(num) for num in array if num%3==0]        

ioの出力結果です。

<<GASでの解き方>>

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

黄色いセルの所に「3で割り切れる数」を出力します。

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

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

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

2:スプレッドシートの緑色のセルから配列の個数を取得する

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

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

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

6:ForループとIF文で剰余演算子「%」を使って「%3==0」を「3で割り切れる数」と判定して配列array2に追加。

7:スプレッドシート出力前に「3で割り切れる数」が格納された二次元配列array2のログ出力で確認する

8:スプレッドシートの黄色いセルに「3で割り切れる数」が格納された二次元配列array2を出力する

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

const ss=SpreadsheetApp.getActiveSheet();

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

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

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

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

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

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

console.log(array);

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

let array2=[]

手順6:ForループとIF文で剰余演算子「%」を使って「%3==0」を「3で割り切れる数」と判定して配列array2に追加。
スプレッドシートでは2次元配列で格納されているので、array[0][i]と記述して、配列の1行目をループで配列の中身が奇数かどうか確認しています。

//ForループとIF文で剰余演算子「%」を使って「%3==0」を「3で割り切れる数」と判定して配列array2に追加。
  for (let i = 0; i < N; i++) {
    if (array[0][i] % 3 == 0) {
      array2.push([array[0][i]]);
    }
  }

手順7:スプレッドシート出力前に「3で割り切れる数」が格納された二次元配列array2のログ出力で確認する

console.log(array2);

手順8:スプレッドシートの黄色いセルに「3で割り切れる数」が格納された二次元配列array2を出力する

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

(7,1,array2.length)は、スプレッドシートのセルA7からarray2の長さ分のセル範囲を確保して、「3で割り切れる数」が格納された配列のarray2を出力するように設定しています。

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

function loop2no4() {

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

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

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

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

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


  //ForループとIF文で剰余演算子「%」を使って「%3==0」を「3で割り切れる数」と判定して配列array2に追加。
  for (let i = 0; i < N; i++) {
    if (array[0][i] % 3 == 0) {
      array2.push([array[0][i]]);
    }
  }

  //スプレッドシート出力前に「3で割り切れる数」が格納された二次元配列array2のログ出力で確認する
  console.log(array2);


  //スプレッドシートの黄色いセルに「3で割り切れる数」が格納された二次元配列array2を出力する
  ss.getRange(7, 1, array2.length).setValues(array2);

}

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

バカラのシャンデリア(ピンク)

■ 参考文献の紹介■

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

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

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

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

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

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

paiza レベルアップ問題集 「STEP: 3 奇数だけ出力」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASの両方のコードで、ForループとIF文を使った奇数のみの出力の仕方を学べます。Pythonのコードでは、基本的なFor文・IF文のコードの他に、【内包表記】を使ってそれらを1行で記述するコードも追記しております。
最初に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 相当)

問題:
N 個の整数 a_1, a_2, …, a_N が与えられます。
この N 個の整数のうち、a_1 から順に奇数か偶数か判定し、奇数の場合のみ改行区切りで出力してください。
また、N 個の整数には奇数が少なくとも 1 つ含まれています。

この記事では、入力例1でN=5の5個の数値のリストに「1 2 3 4 5」が与えられて、その中から奇数を出力するという条件で解いて行きます。

入力例1
5
1 2 3 4 5

出力例1
1
3
5

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

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

<<Pythonでの解き方>>

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

手順として、
1:標準入力でリストの個数を取得
2:標準入力でリストを取得
2:ForループとIFで剰余演算子「%」を使って「%2==1」を奇数と判定して出力

まずは、基本的なForとIFを用いたコードです。

#数値の個数N
N=int(input())

#N個のリストarray
array=list(map(int,input().rstrip().split(' ')))

#ループで奇数の時だけ出力する
for num in array:
    if num%2==1:
        print(num)

次に、上記のForとIFに内包表記を施したコードです。

#数値の個数N
N=int(input())

#N個のリストarray
array=list(map(int,input().rstrip().split(' ')))

#【内包表記】ループで奇数の時だけ出力する
[print(num) for num in array if num%2==1]        

【内包表記】で、ループの部分が1行になっていることが確認出来ました。

Ioの出力結果です。

<<GASでの解き方>>

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

黄色いセルの所に奇数を出力します。

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

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

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

2:スプレッドシートの緑色のセルから配列の個数を取得する


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


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


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


6:ForループとIF文で剰余演算子「%」を使って「%2==1」を奇数と判定して配列array2に追加。


7:スプレッドシート出力前に奇数が格納された二次元配列array2のログ出力で確認する

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

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

const ss=SpreadsheetApp.getActiveSheet();

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

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

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

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

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

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

console.log(array);

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

let array2=[]

手順6:ForループとIF文で剰余演算子「%」を使って「%2==1」を奇数と判定して配列array2に追加。

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

//ForループとIF文で剰余演算子「%」を使って「%2==1」を奇数と判定して配列array2に追加。
  for(let i=0;i<N;i++){
    if(array[0][i]%2==1){
      array2.push([array[0][i]]);
    }
  }

手順7:スプレッドシート出力前に奇数が格納された二次元配列array2のログ出力で確認する

console.log(array2);

手順8:スプレッドシートの黄色いセルに奇数が格納されたarray2を出力する

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

(7,1,array2.length)は、スプレッドシートのセルA7からarray2の長さ分(array2.length)のセル範囲を確保して、奇数が格納された配列のarray2を出力するように設定しています。

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

function loop2no3() {

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

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

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

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

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


  //ForループとIF文で剰余演算子「%」を使って「%2==1」を奇数と判定して配列array2に追加。
  for (let i = 0; i < N; i++) {
    if (array[0][i] % 2 == 1) {
      array2.push([array[0][i]]);
    }
  }

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


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

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

目白庭園の紅葉

■ 参考文献の紹介■

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

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

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

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

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

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