paiza レベルアップ問題集 「STEP: 2 数列の A 番目から B 番目までの和」をPythonとGASで解いてみた

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

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

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

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

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

数列の A 番目から B 番目までの和 (paizaランク D 相当)

問題:N個の数列のA番目からB番目までの和を求める

具体例として入力例1の、N=5,A=1,B=3、リスト「1 2 3 4 5」で考えてみます。

入力例1
5 1 3
1 2 3 4 5

出力例1
6

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

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

<<Pythonでの解き方>>

下準備として、paiza.ioにこの様に入力します。

手順として、
1.標準入力でN,A,Bを読み込む
2.標準入力でリストとしてリストarrayを読み込む
3.計算結果ansを0で初期化
4.ループとスライスを使ってans+=numを加算代入演算子で合計を求めている
5.計算結果を出力

コードを見てみましょう。

手順1では、

N,A,B=map(int,input().rstrip().split(‘ ‘))

で、標準入力でリストの個数N,合計する最初のA番目,合計する最後のB番目を取り込んでいます。
mapで複数の数を読み込めます。

手順2では、

array=list(map(int,input().rstrip().split(‘ ‘)))

で、リストとして複数の数を標準入力で読み込んでいます。
listを使ってリストとしています。
mapで複数の数を読み込めます。
intで整数として読み込む形式を指定しています。
rstripで改行による影響を受けない様にして、split(‘ ‘)でスペース区切りの数値を読み込みます。

手順3では、

ans=0

計算結果の合計値を入れるansを0で初期化します。

手順4ではループとスライスを使って、A番目からB番目までの合計を求めています。
ここで注意すべき所は、リストの添字は0から始まることです。
つまり、ans=array[A-1]からarray[B-1]までの合計になります。

スライスを使う場合、array[最初:最後未満]なので、この場合は

array[A-1:B]

と指定します。

#ループとスライスを使って添字A-1からB-1までの合計を求める
for num in array[A-1:B]:
    ans+=num

手順5で計算結果を出力しています。

ここまでのコードはこの様になります。

#配列の数、合計の最初と最後を読み込む
N,A,B=map(int,input().rstrip().split(' '))

#N個の配列を読み込む
array=list(map(int,input().rstrip().split(' ')))

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

#ループとスライスを使って添字A-1からB-1までの合計を求める
for num in array[A-1:B]:
    ans+=num

#計算結果を出力
print(ans)    

<<GASでの解き方>>

では、同じ問題をGASで解いてみます。

まず、スプレッドシートにこの様に配置しました。

ピンク色の所にN=配列の要素数、灰色の所に配列、黄色の所にその合計値を求めます。

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

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

1:スプレッドシートからアクティブシートをアクセスする
2:ピンクのセルから配列の長さNに出力する数値(この問題の場合は「5」)を取得する。
3:緑のセルから配列の合計範囲の最初のA番目(この問題の場合は「1」)を取得する。
4:オレンジのセルから配列の合計範囲の最後のB番目(この問題の場合は「3」)を取得する。
5:灰色のセルから配列(この問題の場合は「1,2,3,4,5」)を読み込み、配列arrayとする
6:N,A,B,及び配列arrayをログ出力して正しく読み込めたことを確認する
7:合計値ans=0と0で初期化する
8:ループでA-1からBまでの間加算処理をする
9:計算結果をログ出力する
10:スプレッドシートに合計値を出力する配列calcを定義する
11:計算結果ansを出力用配列calcに二次元配列として追加する
12:配列calcに追加されたことをログ出力で確認する
13:スプレッドシートの黄色い所のB7である(7,2)に答えが格納された配列calcを出力する

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

const ss=SpreadsheetApp.getActiveSheet();

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

手順2:ピンクのセルから配列の長さNに出力する数値(この問題の場合は「5」)を取得する。

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

手順3:緑のセルから配列の合計範囲の最初のA番目(この問題の場合は「1」)を取得する。

let A=ss.getRange(2,2).getValue();

手順4:オレンジのセルから配列の合計範囲の最後のB番目(この問題の場合は「3」)を取得する。

let B=ss.getRange(3,2).getValue();

手順5:灰色のセルから配列(この問題の場合は「1,2,3,4,5」)を読み込み、配列arrayとする

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

手順6:N,A,B,及び配列arrayをログ出力して正しく読み込めたことを確認する

console.log(N);
console.log(A);
console.log(B);
console.log(array);

ログの実行結果です。

手順7:合計値ans=0と0で初期化する

let ans=0;

手順8:ループでA-1からBまでの間加算処理をする

加算代入演算子+=で、ansに合計しています。
スプレッドシートから取得した配列arrayは1行4列の二次元配列になっています。

ans+=array[0][i];

ループ全体のコードです。
配列の添字は0から始まるので、forの()内は下記の様になります。

  //ループでリストの指定された範囲の合計値を求める
  for(let i=A-1;i<B;i++){
    ans+=array[0][i]; 
  }

手順9:計算結果をログ出力する

console.log(ans);

手順10:スプレッドシートに合計値を出力する配列calcを定義する

let calc=[]

手順11:計算結果ansを出力用配列calcに二次元配列として追加する

calc.push([ans]);

手順12:配列calcに追加されたことをログ出力で確認する

console.log(calc);

手順13:スプレッドシートの黄色い所のB7である(7,2)に答えが格納された配列calcを出力する

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

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

<全コード>

function loop9(){

  //スプレッドシートからアクティブシートにアクセスする
  const ss=SpreadsheetApp.getActiveSheet();
  
  //リストの個数を読み込む
  let N=ss.getRange(1,2).getValue();

  //合計範囲の最初を読み込む
  let A=ss.getRange(2,2).getValue();

  //合計範囲の最後を読み込む
  let B=ss.getRange(3,2).getValue();

  //配列を読み込む
  let array=ss.getRange(5,2,1,N).getValues();

  //N,A,B,arrayが読み込めたことをそれぞれ確認する
  console.log(N);
  console.log(A);
  console.log(B);
  console.log(array);

  //合計値を初期化する
  let ans=0;

  //ループでリストの指定された範囲の合計値を求める
  for(let i=A-1;i<B;i++){
    ans+=array[0][i]; 
  }
  
  //合計値をログで確認する
  console.log(ans);

  //スプレッドシートに合計値を出力する配列calcを定義する
  let calc=[]

  //出力用配列calcに計算結果のansを二次元配列として追加する
  calc.push([ans]);

  //スプレッドシートに出力するcalcにansが格納されたことをログで確認する
  console.log(calc);

  //スプレッドシートの黄色いセルに計算結果を格納する
  ss.getRange(7,2).setValue(calc);

}

宜しかったらコピペしてアレンジして見て下さい。

お疲れ様でした。

ブレイクタイムフォトはこちらになります。

東京メガイルミ 大井競馬場

■ 参考文献の紹介■

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

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

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

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

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

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

【Python初心者必見!!】改行の仕方、円周率の使って面積、球体の体積、円周を計算する関数の使い方、二乗3乗などの累乗の計算の仕方、戻り値の小数点以下桁指定

この記事を読むと、今更聞けないPythonの改行の仕方、二乗・3乗などの累乗の計算、円周率を使った計算で円の面積、球の体積(公式も載せました!!)、円周を求める関数を呼び出し、小数点以下を含めた桁指定が習得出来ます。

おはこんばんちは!
うにゃうにゃエンジニアの猫です(=^x^=)

・あの、今更ですけど、Pythonで改行の仕方って聞いても良いですか?
・Pythonでxの二乗、3乗などの累乗ってどうするの?
・そもそも関数ってどうやって呼び出すの?
・関数を呼び出してそこで計算させた戻り値の小数点以下の桁数が多過ぎで、こんなに表示出来ないよ!

とお悩みな方にお役立て頂けたらと思い、記事を書きました。
私も初心者なので、思いっきり初心者目線で書いているので、冗長な所もあるかもしれません。悪しからず。

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

Python自作サンプル集へ
これからプログラミングを学ぶ方へ
プログラミングと資格へ
基本情報技術者試験トップへ
自己紹介

Pythonの進捗状況(私のロードマップ)

まず、改行ですが、

print('Hello World 1112 fri\n')

の「\n」(バックスラッシュn)で改行をしています。
Macですと、どうやってバックスラッシュを出すのか私は結構悩みました。やり方は簡単で、Windowsの時だった[Alt]に当たる[option]キーを押しながら、「エンマーク」で表示可能です。


この記事を書いている今日は11月12日の金曜日なのでHelloWorldの後に上記の様に日付と曜日を入力しています。

これは、プログラミング学習を始める前のルーティーンとしてPythonで求めています。
プログラミングは好きで始めたこととはいえ、どうしても気分が乗らないこともあります。そんな時でも「HelloWorldと日付だけ」を表示するプログラムを作ることが私のルーティーンとなっています。

五郎丸さんのルーティーンみたいなものかな。

さて、このプログラムでは、円の面積を求める関数area(引数:半径r)、球の体積を関数globe(引数:半径r)、円周を求めるcircle(引数:半径r)を使っています。

引数って、カレーライスを作るときに入れるニンジンとかジャガイモ、玉ねぎ、カレールーみたいなものかな。

今回は引数rは共通なので、それぞれの関数呼び出しの前に、

r=5

を記述しました。
ここでは半径rを5cmとしています。

それぞれの関数の呼び出しのコードです。
上から、円の面積、球の体積、円周の長さです。

#それぞれの関数の呼び出し
area_ans=(area(r))
globe_ans=(globe(r))
circle_ans=circle(r)

上記の3つの関数を呼び出して、そこで計算した値(戻り値)をそれぞれarea_ans(求めた円の面積)、globe_ans(求めた球の体積)、
circle_ans(求めた円周の長さ)に代入して、小数点以下も含めた桁指定をして、結果を表示します。

円周率を扱うのに、モジュールをインポートしています。

#円周率を扱うのに、インポートしている
import math

円の面積を計算するのに、事情はr**2で半径の二乗を求めています。
**の後を3にする球体や立方体など3次元の体積が求められます。

#円の面積を計算。**で二乗を使っている
def area(r):
    return r**2*math.pi

球体の体積の公式は、

V=\frac{4}{3}πr^{3}

なので、体積を計算する関数のコードは、

#球の体積を計算。**で3乗を使っている
def globe(r):
    return 4/3*math.pi*r**3

となります。

また、円周の長さを求めるコードは

#円周を求める
def circle(r):
    return 2*math.pi*r

となります。

円周率はご存知の通り、3.14159265359…と桁数が膨大なので、戻り値の表示はここでは整数も含めた5桁で表示します。
コードはこの様になります。

#桁数を指定して表示
print('円の面積は'+'{:.5}'.format(area_ans)+'cm ^2です。')
print('球の体積は'+'{:.5}'.format(globe_ans)+'cm ^3です。')
print('円周は、'+'{:.5}'.format(circle_ans)+'cmです。')

戻り値って、出来上がったカレーライスみたいなものかな。

計算結果です。

それでは、ここまで踏まえた全コードを掲載します。

#円周率を扱うのに、インポートしている
import math

#円の面積を計算。**で二乗を使っている
def area(r):
    return r**2*math.pi

#球の体積を計算。**で3乗を使っている
def globe(r):
    return 4/3*math.pi*r**3

#円周を求める
def circle(r):
    return 2*math.pi*r

#半径を指定
r=5

#それぞれの関数の呼び出し
area_ans=(area(r))
globe_ans=(globe(r))
circle_ans=circle(r)

print('Hello World 1112 fri\n')

#桁数を指定して表示
print('円の面積は'+'{:.5}'.format(area_ans)+'cm ^2です。')
print('球の体積は'+'{:.5}'.format(globe_ans)+'cm ^3です。')
print('円周は、'+'{:.5}'.format(circle_ans)+'cmです。')

最後までお読み頂きありがとにゃん(=^x^=)

■ 参考文献の紹介 ■
じっくり丁寧にPythonを学びたい方向けの書籍を紹介します。

Pythonを基礎から中級程度まで丁寧に学びたい方におすすめの書籍です。
まずはpaizaラーニングなどの学習コンテンツで1〜2巡(苦手な所は納得がいくまで何巡でも)してからこの本で学ぶと、自分の学習状況をブログなどでアウトプット出来るようになり、また、エラーなどの不明点を調べられる力もついていきます。

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

Python自作サンプル集へ
これからプログラミングを学ぶ方へ
プログラミングと資格へ
基本情報技術者試験トップへ
自己紹介

Pythonの進捗状況(私のロードマップ)