【人狼ゲームでPythonの総復習】Pythonの入門〜関数までの基礎文法の総復習をゲームを通して出來るサンプルコード

この記事では、簡単な人狼ゲームを作りながら、Pythonの入門〜関数までの基礎文法の総復習が出来るサンプルコードを掲載しております。

この記事で学習出来ることは、

・「=」代入と「==」比較演算子の違い

・無料で使えるオンラインのエディター紹介

・乱数とIF文で勝敗バトル

・Whileループと乱数で勝敗バトル

・↑記事に関数を導入

・Forループの基本的な使い方

・人狼役職の配列表示

・配列とForループ

・プログラミング学習コンテンツの紹介

についての概要が掴めます。
Python学習中の皆さま方、どうか宜しくお願いします


プログラミングの学習を始めた頃、「=」と「==」の違いで少し迷った時期がありました。

これについては、実際に手を動かしてコードを書いてみると、その疑問が氷解出来ました。

まず、「=」の代入ですが、変数roleに役職「市民」を代入して、print文で表示させます。

ご存知の方には恐縮ですが、コメントは「#」を付けます。
また、英語でroleは「役目」を表す単語です。

プログラミングには英語が良く出て来ますが、英検3級に落ちた私でも分からなかったら即調べるを繰り返して基礎文法は身に付きましたので、どうかご安心なさって下さい。

#変数roleに「市民」を代入
role='市民'

#役職を表示する
print(role)

実行結果はこちらです。

roleという変数に、役職「市民」が代入されて出力されました。
この後、roleに「裏切り者」を代入して出力します。

role='市民'

#別の役職、「裏切り者」を代入
role='裏切り者'

print(role)

実行結果です。

このように、代入では入れる値によっては上書きされるというイメージを持って頂けたらと思います。

一方で、「==」は、等しいかどうかの判定を行います。
boolで真偽(True か False)を返します。

role='人狼'

#boolで等しい時はTrue、そうでなければFalse
print(bool(role=='市民'))

「人狼」と「市民」は等しくないので、この様な実行結果になります。

IF文では、もしも「まっさらな市民」だとしたら自分は退場して、騎士などの役職持ちのメンバーに頑張ってもらいたい時は、例えばこの様に記述します。

role='市民'

#役職が市民だったら退場する
if role=='市民':
    print('自分は退場して、騎士や霊媒師などに頑張ってもらう')

実行結果です。

ここでもし、「==」を「=」にしてしまうと、エラーが出てしまって、正しく実行されません。

7行目の所でエラーが出ています。

「=」の代入と、「==」の比較演算子の違いは、実際に書いてみるのが一番理解できました。

とはいえ、「書いてみて」と言われても、プログラミングって環境構築に結構な時間や手間が掛かりますよね。

そこで、すぐに試してコードを書いて実行できる、オンライン上で無料の開発環境IDEを次の項目で紹介します。


結論ですが、paiza.ioがオススメです。

「コード作成を試してみる(無料)」→ 「Python3」 からすぐに学習開始出来ます。

無料のオンラインエディタ(IDE)を調べたら10個ぐらい出てきて、どれを使おうか迷いましたが、

といった点から、paiza.ioをオススメします。

ここでは、標準入力を使ってみます。
paiza.ioの下のタブの「入力」を選択して、自分のやりたい役職を入力します。

この状態で下記のコードを実行します。
変数roleに標準入力で入れた役職が入り、それを出力します。

#標準入力で、やりたい役職を入力する
role=input()

#その役職を表示する
print('私が1番やりたい役職は【'+role+'】です。')

標準入力についてはここまでにして、次からはランダムな数字である乱数を使って、ゲーム的な要素をプログラミングに取り入れてみます。


ここから、乱数を使って、「市民チーム」と「人狼チーム」の勝敗を出力するといった、ゲーム的要素を入れたコードを書いて行きます。

1から10までの乱数を作って、5以上だったら人狼チームの勝ち、そうで無ければ市民チームの勝ちとします。

乱数は、import random で使える様になり、1から10のランダムな整数は random.randint(1,10)で生成します。
その乱数を変数numに代入します。

勝者を入れる変数は、winnerを使います。

#乱数を使える様にする
import random

#1から10までの乱数を作る
num=random.randint(1,10)

#5以上だったら人狼チームの勝利
if num>=5:
    winner='人狼'
else:
    winner='市民'

#勝敗結果を出力
print('勝者は【'+winner+'】チームです!!')

実行結果です。

何回か実行してみると、

実行結果が変わりました。
このままでも、どっちが勝ったのか分かるのですが、乱数の数値が何だったのか知りたいので、numも表示させてみます。

#乱数を使える様にする
import random

#1から10までの乱数を作る
num=random.randint(1,10)

#5以上だったら人狼チームの勝利
if num>=5:
    winner='人狼'
else:
    winner='市民'

#勝敗結果を出力
print('勝者は【'+winner+'】チームです!!')
print(num)

あとは、1行で表示されるようにしたいのと、numもprint文の中に一緒に入れたいのですが、数値型の変数を文字列型と一緒に使う場合には、str(num)と書きます。

#乱数を使える様にする
import random

#1から10までの乱数を作る
num=random.randint(1,10)

#5以上だったら人狼チームの勝利
if num>=5:
    winner='人狼'
else:
    winner='市民'

#勝敗結果と乱数を一緒に出力
print('numが「'+str(num)+'」より、勝者は【'+winner+'】チームです!!')

実行結果です。


ループを使ってちょっとRPGっぽく、市民チームと人狼チームのHPを指定して、HPが0になったらループを抜けて負けにしてみます。

Whileループの継続条件は、両方のチームのHPが0以上の場合です。

攻撃されるとHPが減って、攻撃によってどれぐらいHPが減るのかを乱数attackで指定します。

flagが0だったら人狼チームの攻撃、1だったら市民チームの攻撃にします。

改行は「\n」を使います。

ちょっと複雑だな・・・と思われた方は、次の次のForループの所まで読み飛ばして頂いても大丈夫です♪

#乱数を使える様にする
import random


#市民チームと人狼チームのHP初期値を10にする
shimin_HP=10
jinro_HP=10

#whileループでバトル!!
while shimin_HP>0 and jinro_HP>0:

    #相手チームに与えるダメージは1から5までの乱数にする
    attack=random.randint(1,5)

    #0だったら人狼チームの攻撃、1だったら市民チームの攻撃にする
    flag=random.randint(0,1)

    if flag==0:
        print('人狼チームが市民チームに「'+str(attack)+'」のダメージを与えた')
        #攻撃された市民チームのHPがマイナスされる
        shimin_HP-=attack
    else:
        print('市民チームが人狼チームに「'+str(attack)+'」のダメージを与えた')
        #攻撃された人狼チームのHPがマイナスされる
        jinro_HP-=attack
    print('市民チームHP残:'+str(shimin_HP)+'\n人狼チームHP残:'+str(jinro_HP))
    print('----------')
    
#勝敗結果
if shimin_HP>jinro_HP:
    winner='市民'
else:
    winner='人狼'

print('勝者は【'+winner+'】チーム!!')  

実行結果は長いので省略させて頂きますm(_ _)m

コード自体が長くなってきて、メンテナンスの意味も込めて、次の項目ではバトルの部分と勝敗結果をdefを使って関数にして、関数をループ中やprint文の中から呼び出してみるようにコードを書き換えてみます。


バトルの部分を関数battleにして、whileループで呼び出し、勝敗結果をprint文の中で呼び出すコードに書き換えてみました。

#乱数を使える様にする
import random


#市民チームと人狼チームのHP初期値を10にする
shimin_HP=10
jinro_HP=10


#defで関数battleを定義する
def battle(shimin_HP,jinro_HP):
    
    #相手チームに与えるダメージは1から5までの乱数にする
    attack=random.randint(1,5)

    #0だったら人狼チームの攻撃、1だったら市民チームの攻撃にする
    flag=random.randint(0,1)

    if flag==0:
        print('人狼チームが市民チームに「'+str(attack)+'」のダメージを与えた')
        #攻撃された市民チームのHPがマイナスされる
        shimin_HP-=attack
    else:
        print('市民チームが人狼チームに「'+str(attack)+'」のダメージを与えた')
        #攻撃された人狼チームのHPがマイナスされる
        jinro_HP-=attack
    print('市民チームHP残:'+str(shimin_HP)+'\n人狼チームHP残:'+str(jinro_HP))
    print('----------')
    
    return shimin_HP,jinro_HP


while shimin_HP>0 and jinro_HP>0:
    #関数battleを呼び出している
    shimin_HP,jinro_HP=battle(shimin_HP,jinro_HP)    
    
#defで関数winを定義している
def win():
    if shimin_HP>jinro_HP:
        winner='市民'
    else:
        winner='人狼'
    return winner

#print文の中で関数winを呼び出している
print('勝者は【'+win()+'】チーム!!')


上記のWhileループの他にForループがあって、配列と一緒に使うのに便利です。
人狼ゲームの役職の配列を作ってその中身を取り出すのにForループを使って行きます。
その前に、Forループの基本的な使い方を確認します。

・0から4まで1ずつ加算

#0から4まで1ずつ加算
for i in range(5):
    print(i)

実行結果です。

もっと短いコードで書ける、内包表記を使うとこの様になります。

#0から4まで1ずつ加算
for i in range(5):
    print(i)

#内包表記
[print(i) for i in range(5)]

内包表記の実行結果も上のループと同じになります。

・0から9まで2ずつ加算

#0から9まで2ずつ加算
for i in range(0,10,2):
    print(i)

#内包表記
[print(i) for i in range(0,10,2)]

実行結果(同じなので、片方だけのスクショです。)

・5から1まで1ずつ減算

#5から1まで1ずつ減算
for i in range(5,0,-1):
    print(i)

#内包表記
[print(i) for i in range(5,0,-1)]

以上が、Forループの基本的な使い方です。


配列って、なんか難しそうだ・・・と思われた方は、配列とは団地みたいなものをイメージして下さい。

団地の0号室に「市民」が住んでいて、1号室に「霊媒師」が住んでいて・・・そんなイメージです。

普通の団地と異なるのは、0号室から始まることです。

#配列を定義
array=['市民','霊媒師','占い師','騎士','裏切り者','人狼']

#配列を出力
print(array)

出力結果です。

配列は0から始まるので、例えば「占い師」を表示させたい場合は、array[2]になります。

#配列を定義
array=['市民','霊媒師','占い師','騎士','裏切り者','人狼']

#配列を出力
print(array[2])

次の項目では、先ほどのループと配列を合わせた、プログラミングでは使用頻度の高いコードを掲載します。


ループを使って、配列の中身を取り出します。
通常の表記と、内包表記を併記します。

#配列を定義
array=['市民','霊媒師','占い師','騎士','裏切り者','人狼']

#Forループで配列の出力
for role in array:
 print(role)
 
#内包表記
[print(role) for role in array]

実行結果です。

この記事ではここまでで、Pythonの入門〜関数までの総復習が出来たと思います。

もっと詳しく勉強したい方は、下記の学習コンテンツがオススメです。
いきなり本を買っても良いのですが、出来れば動画学習コンテンツで多少知識を入れてからの方が、本当に必要なお買い物が出来ると思います。

本も紹介させて頂きます。


初めてのプログラミング学習では、やはり講師の説明を聞きながら動画を見て、それを自分のPCで動かして試してみる・・・という方法がハードルが低いので、オススメの学習コンテンツを2つ紹介します。

どっちが良いのか迷われた方は、両方の無料レッスンを受けてみて、自分に合いそうな方を取り入れて下さい。

ドットインストール
paizaラーニング

ご精読誠にありがとうございました。

■ 独習Python ■
Kindle版
単行本(ソフトカバー)

長々と書いてしまいましたが、本当に読んで下さって有難うございます。
大変、お疲れ様でした。


ブレイクタイムPhotoは・・・

遊歩道の桜

地元の遊歩道の桜並木です。


Python自作サンプルに戻る
写真クリエイターとしての活動

自己紹介

paiza レベルアップ問題集 標準入力その7「STEP: 3 1 行目で与えられる N 個の文字列の入力」をPythonとGASで解いてみた

この記事を読むことで、Pythonで標準入力とsplitメソッドを用いて、文字列の数と全ての文字列をループの中で出力することが可能になります。GASではスプレッドシートで値を取得して、二次元配列にして出力しています。

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

1 行目で与えられる N 個の文字列の入力 (paizaランク D 相当)

問題:
1 行目で、整数 N と、続けて N 個の文字列 s_1, … , s_N が半角スペース区切りで与えられます。
s_1, … , s_N を改行区切りで出力してください。

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

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

■ Pythonでの解き方 ■

手順として、

1:1行目の文字列の個数Nと文字列を標準入力でリストarrayに取得する
2:文字列の個数NをN=int(array[0])で取得する
3:リストarray[1]〜array[N]までをループで出力

の3ステップで行います。

今回は入出力例1を用います。

入力例1
5 paiza 813 paiza813 Hello World!

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

下記のコードで入力と出力を行います。

#1行目の文字列の個数Nと文字列を標準入力でリストarrayに取得する
array=list(map(str,input().split(' ')))

#文字列の個数NをN=int(array[0])で取得する
N=int(array[0])

#リストarray[1]〜array[N]までをループで出力
for i in range(1,N+1):
    print(array[i])

このコードの実行(出力)結果です。

Pythonは以上です。

次は、GASで解いて行きます。

■ GASでの解き方 ■

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

灰色の所には、文字列の個数N個と、N個の文字列を入力しています。この灰色の所を配列arrayで取得し、N=array[0]として、array[1]〜array[N]までを黄色いセルの所に出力します。その際、array[1]〜array[N]までの部分の文字列が二次元配列になるよう、ループで新たな配列array2に追加して、その配列array2を出力します。

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

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

1:SpreadSheetAppから階層を辿って現在のシートにアクセスする
2:灰色のセルをsplitメソッドを用いてarrayに取得する
3:配列arrayをログ出力
4:文字列の数NをN=array[0]として取得する
5:array[1]〜array[N]までループを使ってarray2に二次元配列として追加する
6:配列array2をログ出力
7:スプレッドシートの黄色い所に格納する

手順1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

const ss = SpreadsheetApp.getActiveSheet();

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

手順2:灰色のセルをsplitメソッドを用いてarrayに取得する

const array=ss.getRange(1,1).getValue().split(‘ ‘);

手順3:配列arrayをログ出力

console.log(array);

手順4:文字列の数NをN=array[0]として取得する

const N=array[0];

手順5:array[1]〜array[N]までループを使ってarray2に二次元配列として追加する

//array[1]〜array[N]までループを使ってarray2に二次元配列として追加する
  let array2=[];
  for(let i=1;i<=N;i++){
    array2.push([array[i]]);
  }

手順6:配列array2をログ出力

console.log(array2);

スプレッドシートに格納する準備として、配列array2にループを使ってarrayを二次元配列array2に格納する

手順7:配列array2をログ出力

console.log(array2);

<ログarray2>

手順8:スプレッドシートの黄色い所に格納する

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

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

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

function standardInput31(){

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

  //灰色のセルをsplitメソッドを用いてarrayに取得する
  const array=ss.getRange(1,1).getValue().split(' ');

  //配列arrayをログ出力
  console.log(array);

  //文字列の数NをN=array[0]として取得する
  const N=array[0];

  //array[1]〜array[N]までループを使ってarray2に二次元配列として追加する
  let array2=[];
  for(let i=1;i<=N;i++){
    array2.push([array[i]]);
  }

  //配列array2をログ出力
  console.log(array2);

  //スプレッドシートの黄色い所に格納する
  ss.getRange(1,3,N).setValues(array2);

}

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

2019年いたばし花火大会

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

ご精読有難うございました。

■ GASの入門書の紹介です ■

詳解! Google Apps Script完全入門 [第3版]
単行本
Kindle版(電子書籍)

■ 関連記事 ■

paizaレベルアップ問題集「標準入力7」へ戻る
paizaレベルアップ問題集_PythonとGASのコード紹介トップページへ


写真クリエイターとしての活動
自己紹介

paiza レベルアップ問題集 標準入力その7「STEP: 2 2 行目で与えられる N 個の文字列の入力」をPythonとGASで解いてみた

この記事を読むことで、Pythonで標準入力とsplitメソッドを用いて、文字列の数と全ての文字列をループの中で出力することが可能になります。GASではスプレッドシートで値を取得して、二次元配列にして出力しています。

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

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

2 行目で与えられる N 個の文字列の入力 (paizaランク D 相当)

問題:
1 行目に整数 N が与えられます。
2 行目に、N 個の文字列 s_1, … , s_N が半角スペース区切りで与えられます。
s_1, … , s_N を改行区切りで出力してください。

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

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

■ Pythonでの解き方 ■

手順として、

1:1行目の文字列の個数Nを標準入力で整数として取得する
2:2行目の半角スペース区切りの文字列をリストarrayに格納する
3:リストをループで出力

の3ステップで行います。

今回は入出力例1を用います。

入力例1
5
paiza 813 paiza813 hello813 good

出力例1
paiza
813
paiza813
hello813
good

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

下記のコードで入力と出力を行います。

#1行目の文字列の個数Nを標準入力で整数として取得する
N=int(input())

#2行目の半角スペース区切りの文字列をリストarrayに格納する
array=list(map(str,input().split(' ')))

#リストをループで出力
for i in range(N):
    print(array[i])

このコードの実行(出力)結果です。

Pythonは以上です。

次は、GASで解いて行きます。

■ GASでの解き方 ■

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

緑色のセルに文字列の個数N=5、灰色の所に出力するN個の文字列を入力しています。この灰色の所を配列arrayで取得し、N個の文字列を黄色いセルに出力します。その際、この黄色いセルの所には、二次元配列として取得した整数が格納された配列を出力します。

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

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

1:SpreadSheetAppから階層を辿って現在のシートにアクセスする
2:緑色のセルと灰色のセルを配列areaに取得する
3:文字列の数NをN=area[0][0]として取得する
4:灰色のセルの文字列の部分をarray=area[1][0].split(‘ ‘)として取得する
5:配列arrayをログ出力
6:スプレッドシートに格納する準備として、配列array2にループを使ってarrayを二次元配列array2に格納する
7:配列array2をログ出力
8:スプレッドシートの黄色い所に格納する

手順1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

const ss = SpreadsheetApp.getActiveSheet();

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

手順2:緑色のセルと灰色のセルを配列areaに取得する

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

手順3:文字列の数NをN=area[0][0]として取得する

const N=area[0][0];

手順4:灰色のセルの文字列の部分をarray=area[1][0].split(‘ ‘)として取得する

const array=area[1][0].split(‘ ‘);

手順5:配列arrayをログ出力

console.log(array);

手順6:スプレッドシートに格納する準備として、配列array2にループを使ってarrayを二次元配列array2に格納する

//スプレッドシートに格納する準備として、配列array2にループを使ってarrayを二次元配列array2に格納する
  let array2=[];
  for(let i=0;i<N;i++){
    array2.push([array[i]]);
  }

手順7:配列array2をログ出力

console.log(array2);

この画像より、二次元配列になっていることが確認できます。

手順8:スプレッドシートの黄色い所に格納する

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

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

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

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

  //緑色のセルと灰色のセルを配列areaに取得する
  const area=ss.getRange(1,1,2).getValues();

  //文字列の数NをN=area[0][0]として取得する
  const N=area[0][0];

  //灰色のセルの文字列の部分をarray=area[1][0].split(' ')として取得する
  const array=area[1][0].split(' ');

  //配列arrayをログ出力
  console.log(array);

  //スプレッドシートに格納する準備として、配列array2にループを使ってarrayを二次元配列array2に格納する
  let array2=[];
  for(let i=0;i<N;i++){
    array2.push([array[i]]);
  }

  //配列array2をログ出力
  console.log(array2);

  //スプレッドシートの黄色い所に格納する
  ss.getRange(1,3,N).setValues(array2);
  
}

お疲れ様でした。ブレイクタイムPhotoは、

通勤経路の紫陽花

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

ご精読有難うございました。

■ GASの入門書の紹介です ■

詳解! Google Apps Script完全入門 [第3版]
単行本
Kindle版(電子書籍)

■ 関連記事 ■

paizaレベルアップ問題集「標準入力7」へ戻る
paizaレベルアップ問題集_PythonとGASのコード紹介トップページへ


写真クリエイターとしての活動
自己紹介

paiza レベルアップ問題集 標準入力その7「STEP: 1 改行区切りでの N 個の文字列の入力」をPythonとGASで解いてみた

この記事を読むことで、Pythonで標準入力inputと分割splitなどを用いて、文字列の個数と全ての文字列をループの中で出力することが可能になります。

GASではスプレッドシートで値を取得して、二次元配列にして出力しています。

このコーナーでは、プログラミング学習コンテンツpaizaラーニングレベルアップ問題集を、PythonとGAS(Google Apps Script)の両方で同じ問題を解いたコードを公開している学習ログです。

Python・GASのどちらの言語のコードも可能な限り詳細に解説致します。
GASはスプレッドシートのエディタを使ってコードを書いております。

Pythonではpaizaに入会しなくても問題集を解きたい方向けにpaiza.ioを用いております。paiza.ioの使い方はこちらから。

(入会するか否かは問題集を解いて見てからの読者様のご判断にお任せ致します。
どちらの選択をされても記事を読めるようになっておりますので、ご安心なさって下さい。)


改行区切りでの N 個の文字列の入力 (paizaランク D 相当)

問題:
1 行目に整数 N が与えられます。
2 行目以降に、N 個の文字列 s_1, … , s_N が N 行で与えられます。
s_1, … , s_N を改行区切りで出力してください。

ではまず、Pythonで解いて行きます。


手順として、

1: 1行目の文字列の個数Nを標準入力で整数として取得する

2: 2行目からN行間の文字列を出力する

の2ステップで行います。

今回は入出力例1を用います。

入力例1
5
hello
paiza
813
paiza2020
Nice

出力例1
hello
paiza
813
paiza2020
Nice

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

下記のコードで入力と出力を行います。

#1行目の文字列の個数Nを標準入力で整数として取得する
N=int(input())

#2行目からN行間の文字列を出力する
for i in range(N):
    string=input()
    print(string)

このコードの実行(出力)結果です。

Pythonは以上です。

次は、GASで解いて行きます。


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

緑色のセルA1(1,1)に文字列の個数N=5、その下の灰色のセルに出力するN個の文字列を貼り付けました。

paiza側の入力例1をコピーした後にスプレッドシートで[Ctrl] + [Shift] + [V] のショートカットキーで貼り付けると元の書式を崩さずに綺麗に貼り付けられます。

A2から始まる文字列の個数をN個として、文字列をC2(2,3)から始まる黄色いセルN=5行分出力します。

その際、この黄色いセルの所には、二次元配列として取得した整数が格納された配列を出力します。

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

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

1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

2: 緑色のセルA1から6行分(文字列の数N+1)を配列arrayに取得


3: 先頭のarray[0]を文字列の個数Nに代入


4: ShiftでNに代入した先頭の要素を配列arrayから取り除く


5: スプレッドシート出力用に空の配列arrary2を宣言して、ループを持ちてarrayをarray2に二次元配列になる様に格納する

6: スプレッドシートのC2(3,2)から始まる黄色いセル5行分に出力する

手順1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

const ss = SpreadsheetApp.getActiveSheet();

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


手順2:緑色のセルA1(1,1)から文字列の数N個+1を取得する

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

文字列は複数になりますので、getValuesとsが付く複数形になります。


手順3:先頭のarray[0]を文字列の個数Nに代入

const N=array[0];


手順4:ShiftでNに代入した先頭の要素を配列arrayから取り除く

array.shift();


手順5:スプレッドシート出力用に空の配列arrary2を宣言して、ループを持ちてarrayをarray2に二次元配列になる様に格納する

for(let i=0;i<N;i++)

array[i]のiの値は0,1,2,3,4とN=5回分ループの中で加算して変わります。
その為iは変数ですので、letで宣言をしています。

また、array2.push([array[i]])と、array[i]を全体に[ ] で括っていることによって、二次元配列として格納されます。

スプレッドシートに出力前に、array2が二次元配列になっていることを確認します。

console.log(array2);

このログの画像より、既に二次元配列になっていることが分かります。


手順6:スプレッドシートのC2(2,3)から始まる黄色いセルに文字列を5行分出力する

ss.getRange(2,3,N).setValues(array);

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

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

function standardInput29(){

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

  //緑色のセルA1から6行分(文字列の数N+1)を配列arrayに取得
  const array=ss.getRange(1,1,6).getValues() 

  //array[0]を文字列の個数として定数Nに代入する
  const N=array[0];

  //Nに代入した配列の先頭の要素をshiftを使って配列arrayから削除
 array.shift();

  //配列arrayをログ出力
  console.log(array);

  //空の配列array2を宣言する
  const array2=[];

  //ループを用いて、array2に二次元配列になる様にarrayの要素を追加
  for(let i=1;i<N;i++){
    array2.push([array[i]);
  }

 
 //スプレッドシート出力前にarray2が二次元配列になっていることを確認する
 console.log(array2);
 

  //スプレッドシートのC2(2,3)から始まる黄色いセルに出力する
  ss.getRange(2,3,N).setValues(array2);
}

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

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

←標準入力その6へ          次の問題へ→

ご精読有難うございました。

■ GASの入門書の紹介です ■

詳解! Google Apps Script完全入門 [第3版]
単行本
Kindle版(電子書籍)

■ 関連記事 ■

paizaレベルアップ問題集「標準入力7」へ戻る
paizaレベルアップ問題集_PythonとGASのコード紹介トップページへ


写真クリエイターとしての活動
自己紹介

paiza レベルアップ問題集 標準入力6「【N 個の整数の入力】1 行目で与えられる N 個の整数の入力 (large)」をPythonとGASで解いてみた

この記事を読むことで、Pythonで標準入力inputや分割splitなどを用いて、数値の個数と全ての数値をループの中で出力することが可能になります。

GASではスプレッドシートで値を取得して、二次元配列にして出力しています。

このコーナーでは、プログラミング学習コンテンツpaizaラーニングレベルアップ問題集を、PythonとGAS(Google Apps Script)の両方で同じ問題を解いたコードを公開している学習ログです。

Python・GASのどちらの言語のコードも可能な限り詳細に解説致します。
GASはスプレッドシートのエディタを使ってコードを書いております。

Pythonではpaizaに入会しなくても問題集を解きたい方向けにpaiza.ioを用いております。paiza.ioの使い方はこちらから。

(入会するか否かは問題集を解いて見てからの読者様のご判断にお任せ致します。
どちらの選択をされても記事を読めるようになっておりますので、ご安心なさって下さい。)


【N 個の整数の入力】1 行目で与えられる N 個の整数の入力 (large) (paizaランク D 相当)

問題:
1 行目で、整数 N と、続けて N 個の整数 a_1, … , a_N が半角スペース区切りで与えられます。
a_1, … , a_N を改行区切りで出力してください。

ではまず、Pythonで解いて行きます。


手順として、

1: 1行目を標準入力inputやsplitなどを使って半角スペース区切りにした整数をリストarrayとして取得する

2: arrayの最初の数は整数の個数ですので、整数の個数を表す変数Nに代入して、N=array[0]とする


3: 上記で変数Nに代入したarray[0]を配列から削除するためにdelメソッドを使ってリストarrayを出力する5つの整数のみにする

4: 残りのリストarrayをループで出力する

・基本的なループ
・リスト出力に適したループ
・上記の内包表記

の4ステップで行います。

今回は入出力例1を用います。

入力例1
5 8 1 3 1 3

出力例1
8
1
3
1
3

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

paiza問題集の入力例。1行に数値の個数と数値自体が入力されている。

この6個の数値「5 8 1 3 1 3」は下記のコードでリスト形式で取得出来ますが、1行に複数の関数などが使われているので、今回の例に即して簡潔にお伝えします。

input … 標準入力で文字や数値を取得する

split … 半角スペースなどの指定の区切り文字で分割して取得する

int … 上記で取得する対象が整数である


rstrip … 右側にある不要な空白を取り除く


map … まとめて適用


list … リスト(配列)変換

#1行分を全てリスト形式になる様に標準入力で取得する
array=list(map(int,input().rstrip().split(' ')))

#リストarrayに取得出来たことを確認する
print(array)

このコードの実行結果です。
数値の個数5を含めた整数1行分がリストarrayに出力されました。

取得したリストarray


このコードの先頭の5、つまりarray[0]を数値の個数を表す変数Nに代入します。

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

#リストの先頭の「5」をリストの個数を表す変数Nに代入する
N=array[0]

#Nに代入できたことを確認する
print(N)

このコードで、無事にNに5が代入されました。

リストから数値の個数の先頭の5を代入されたことを確認。


現在のarrayから、リストの個数であるNに代入した先頭の5をdelメソッドを使って削除します。

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

N=array[0]
print(N)

#数値の個数Nに代入したリストarrayの先頭の5を削除する
del array[0]

#削除されたことを確認する
print(array)
リストから先頭の要素をdelで取り除いた画像。

リストarrayから個数が削除され、出力すべき数値のみになりました。


では、リストの残ったarrayをループを用いて解答の出力例に沿って縦に出力します。
最も基礎的なループでは、この様な解説とコードになります。

ループの中では、iの値が0,1,2,3,4の5つ、1つ分増えて行きます。
リストの添字は0から始まり、N=5ですのでarray[i]は、

array[0]=8
array[1]=1
array[2]=3
array[3]=1
array[4]=3

の5つの値が取得出来ます。

for i in range(N):

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

N=array[0]
print(N)

del array[0]
print(array)

#基本的なループでリストarrayを出力
for i in range(N):
    print(array[i])

出力結果です。

ループを用いたリストの出力結果の確認

ここで、確認用に出力した変数や配列をコメントアウトします。

array=list(map(int,input().rstrip().split(' ')))
#print(array) ←コメントアウト

N=array[0]
#print(N) ←コメントアウト

del array[0]
#print(array) ←コメントアウト

#基本的なループでリストarrayを出力
for i in range(N):
    print(array[i])

基本的なループを用いて、解答の形に沿った縦型に出力出来ました。

paiza問題集ループを用いたリストの出力結果

次の少しだけ応用編(シンプルになるだけですので、大丈夫です)のループの出力に備えて、コメントアウトした分のコードを削除します。

array=list(map(int,input().rstrip().split(' ')))
N=array[0]
del array[0]


#基本的なループでリストarrayを出力
for i in range(N):
    print(array[i])


次に、リストを使った、更に便利なループの表記方法について掲載致します。

for リストの要素の文字 in リスト名:

今回の例ですと、

for num in array:

等になります。

リストの要素の所は自分や他の方が見て分かりやすい「num」などにすると、「整数を取り出すんだな」と伝わりやすいです。

array=list(map(int,input().rstrip().split(' ')))
N=array[0]
del array[0]


#arrayをリストに適したループで出力する
for num in array:
    print(num)

少しだけシンプルなコードで同じ出力結果が得られました。


更にコード短くするには、ループをたった1行で表記する内包表記を用います。

[出力結果のprint文 for リストの要素の文字 in リスト名]

今回の例ですと、

[print(num) for num in array]

と表記致します。

array=list(map(int,input().rstrip().split(' ')))
N=array[0]
del array[0]


#リストarrayを内包表記で出力する
[print(num) for num in array]

Pythonは以上です。
次は、GASで解いて行きます。


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

paizaの問題集をGoogle Apps Scriptで解くためのスプレッドシートの初期画像

入力の緑のセルA2の所に、paiza側の入力例1を貼り付けています。
その際、paiza側でコピーをした後、スプレッドシートのA2のところで、[Ctrl] + [Shift] + [V] を押すと、書式を崩さずに綺麗に貼り付けられます。

緑色のセルA2(2,1)の所に出力する数値と先頭の数値の個数5個を加えた「5 8 1 3 1 3」が入力されています。

先頭の5を除いた数値をC2(2,3)から始まる黄色いセル5行分に出力します。

その際、この黄色いセルの所には、二次元配列として取得した整数が格納された配列を出力します。

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

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

1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

2: 緑色のセルA2(2,1)を配列arrayに取得


3: 取得したarrayをログ出力


4: 数値の個数array[0]=5を定数Nに代入する


5: Nに代入したarray[0]を削除して出力する分の数値のみを残す

6: スプレッドシートに出力用の空の配列array2を宣言して、残った一次元配列であるarrayの要素をループを用いて二次元配列array2に格納する


7: スプレッドシートに出力する前に二次元配列array2をログ出力する


8: スプレッドシートのC2(2,3)から始まる黄色いセルに5行分出力する

手順1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

const ss = SpreadsheetApp.getActiveSheet();

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

下記のコードを関数「standardInput5」の中に書いて行きます。

Standard Inputで標準入力の意味です。

function standardInput5() {

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

}


手順2:緑色のセルA2(2,1)を配列arrayに取得

const array=ss.getRange(2,1).getValue().split(‘ ‘);

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();

  //色のセルA2(2,1)を配列arrayに取得
  const array=ss.getRange(2,1).getValue().split(' ');

}


手順3:取得したarrayをログ出力

console.log(array);

コードと実行結果です。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');

  //取得したarrayをログ出力する
  console.log(array);

}

取得した配列array


手順4:数値の数であるarray[0]=5を定数Nに代入する

const N=array[0];

下記のコードと実行結果です。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();

  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  //数値の数であるarray[0]=5を定数Nに代入する
  const N=array[0];

  //Nに5が代入されたことを確認する。
  console.log(N);

}

配列の先頭要素を定数Nに数値の個数として代入した実行結果の画像

配列arrayの先頭の5が無事にNに代入されました。


手順5: Nに代入したarray[0]を削除して出力する分の数値のみを残す

array.shift();

このshiftを用いて、arrayの先頭の数値の個数を削除します。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();

  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  const N=array[0];
  console.log(N);

  //Nに代入した配列arrayの先頭を削除
  array.shift();

  //配列から先頭にあった数値の個数5が削除されていることを確認
  console.log(array);

}
配列にshiftを用いて、先頭の要素を削除した後の配列array

この様に、配列.shift();を使うと先頭の要素が削除されたことが確認出来ました。


手順6:スプレッドシートに出力用の空の配列array2を宣言して、残った一次元配列であるarrayの要素をループを用いて二次元配列array2に格納する

ループの部分は、

let i=0; i<N ; i++

と表記しています。
iには、array[i]の添え字として0から4まで入ります。
N=5ですので、i<Nになります。

array2.push([array[i]]);

また、ループの中で[array[i]]とarray[i]全体にカッコで括っているのは、二次元配列としてarray2に追加をしている為です。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();

  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  const N=array[0];
  console.log(N);

  array.shift();
  console.log(array);

  //スプレッドシート出力用の空の配列array2を宣言
  const array2=[];

  //ループを用いて残りのarrayを二次元配列としてarray2に格納する
  for(let i=0;i<N;i++){
    array2.push([array[i]]);
  }

}


手順7:スプレッドシートに出力する前に二次元配列array2をログ出力する

console.log(array2);

前の手順でarrayからpushを持ちて二次元配列になるようにループで格納したarray2がスプレッドシートに出力可能な二次元配列の形になっていることを確認します。

array2がスプレッドシートに出力可能な二次元配列になっていることをログで確認


手順8:スプレッドシートのC2(2,3)から始まる黄色いセルに5行分出力する

ss.getRange(2,3,N).setValues(array2);

セルC2が(2,3)です。
getRange(2,3,N)でN行、つまり5行分出力をします。
getRange(2,3,N,1)と書くと1列分の列数も指定出来るのですが、1列の場合は省略可能です。

setValuesとsが付く複数形になっているのは、出力用配列array2に格納された数値の個数が5個と複数になっているからです。

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

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();

  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  const N=array[0];
  console.log(N);

  array.shift();
  console.log(array);

  const array2=[];

  for(let i=0;i<N;i++){
    array2.push([array[i]]);
  }

  console.log(array2);

  //スプレッドシートのC2(2,3)から始まる黄色いセルにN=5行分の数値を出力する
  ss.getRange(2,3,N).setValues(array2);

}
Google Apps Script実行後のスプレッドシート。二次元配列の数値を黄色いセルの所に出力している。

無事に黄色いセルに数値5個分が出力されました。

※ この記事の作成に参考になったサイトです ※
ありがとうございます。

Python「rstrip() メソッド」で文字列の右端を整えよう!
Python mapの使い方
Pythonでlistから要素を削除する方法

GASは以上です。


お疲れ様でした。ブレイクタイムPhotoは、

奥多摩の秋川渓谷を散策中に撮影した、東京都檜原村にある「払沢の滝」滝壺です。

←前の問題へ          標準入力その7→

ご精読有難うございました。

■ GASの入門書の紹介です ■

詳解! Google Apps Script完全入門 [第3版]
単行本
Kindle版(電子書籍)

■ 関連記事 ■

paizaレベルアップ問題集「標準入力6」へ戻る
paizaレベルアップ問題集_PythonとGASのコード紹介トップページへ

写真クリエイターとしての活動
自己紹介

paiza レベルアップ問題集 標準入力その6「STEP: 4 2 行目で与えられる N 個の整数の入力 (large)」をPythonとGASの両方で解いたコードを紹介

この記事を読むことで、Pythonで標準入力inputとsplitなどを用いて、数値の個数と、その全ての数値をループの中で出力することが可能になります。

GASではスプレッドシートで値を取得して、二次元配列にして出力しています。

このコーナーでは、プログラミング学習コンテンツpaizaラーニングレベルアップ問題集を、PythonとGAS(Google Apps Script)の両方で同じ問題を解いたコードを公開している学習ログです。

Python・GASのどちらの言語のコードも可能な限り詳細に解説致します。
GASはスプレッドシートのエディタを使ってコードを書いております。

Pythonではpaizaに入会しなくても問題集を解きたい方向けにpaiza.ioを用いております。paiza.ioの使い方はこちらから。

(入会するか否かは問題集を解いて見てからの読者様のご判断にお任せ致します。
どちらの選択をされても記事を読めるようになっておりますので、ご安心なさって下さい。)


2 行目で与えられる N 個の整数の入力 (large) (paizaランク D 相当)

問題:
1 行目で整数 N が与えられます。
2 行目で、N 個の整数 a_1, … , a_N が半角スペース区切りで与えられます。
a_1, … , a_N を改行区切りで出力してください。

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


手順として、

1: 1行目を標準入力で整数型Nとして取得する

2: 2行目を標準入力inputやsplitといった関数などを使って半角スペース区切りの整数をリストarrayに取得する

3: リストarrayをループで出力する

・基本的なループ
・リスト出力に適したループ
・上記の内包表記  

の3ステップで行います。

今回は入出力例1を用います。

入力例1
5
8 1 3 10 100

出力例1
8
1
3
10
100

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

まずは、1行目の数値の個数5を標準入力で取得して、変数Nに代入して、正しく取得できたことをprint関数で確認します。

#1行目を標準入力で数値として取得して個数Nに代入する
N=int(input())

#数値の個数Nが取得できたことを確認する
print(N)

実行結果です。

無事に数値の個数N=5個が取得出来ました。

入力例2行目の5個の数値「8 1 3 10 100」は下記のコードで取得出来ますが、1行に複数の関数などが使われているので、今回の例に即して簡潔にお伝えします。

input … 標準入力で文字や数値を取得する

split … 半角スペースなどの指定の区切り文字で分割して取得する

int … 上記で取得する対象が整数である


rstrip … 右側にある不要な空白を取り除く


map … まとめて適用


list … リスト(配列)変換

上記を用いてコードを掲載致します。
一気に色々出て来てしまいましたので、まずは、標準入力で取得した数値がリスト(配列)形式でarrayに取得出来たことをprint文で出力して確認します。

N=int(input())
print(N)

#2行目からN個分の数値をリストarrayに取得
array=list(map(int,input().rstrip().split(' ')))

#リストarrayにN個の数値が格納されたことを確認する
print(array)

出力結果です。

これで、リストとして無事に出力が出来ました。


では、リストarrayをループを用いて解答の出力例に沿って縦に出力します。
最も基礎的なループでは、この様な解説とコードになります。

ループの中では、iの値が0,1,2,3,4の5つ、1つ分増えて行きます。
リストの添字は0から始まり、N=5ですのでarray[i]は、

array[0]=8
array[1]=1
array[2]=3
array[3]=10
array[4]=100

の5つの値が取得出来ます。

for i in range(N):

N=int(input())

#確認用の出力の為、後で消す
print(N)

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

#確認用の出力の為、後で消す
print(array)

#リストarrayをループで出力する
for i in range(N):
    print(array[i])
    

出力結果です。

ループを用いて、解答の形に沿った縦型に出力出来ました。


ここで、一度コードの整理をしたいので、確認用に使ったprint文をコメントアウトします。

N=int(input())
#print(N)

array=list(map(int,input().rstrip().split(' ')))
#print(array)

#リストarrayをループで出力する
for i in range(N):
    print(array[i])


この状態で実行すると、

この様にスッキリしました。


次に、リストを使った、更に便利なループの表記方法について掲載致します。

for リストの要素の文字 in リスト名:

今回の例ですと、

for num in array:

等になります。

リストの要素の所は自分や他の方が見て分かりやすい「num」などにすると、「整数を取り出すんだな」と伝わりやすいです。

コメントアウトした部分を削除したコードを掲載致します。

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

#arrayをリストに適したループで出力する
for num in array:
    print(num)

この書き方でも同様の出力結果になりました。


更にコード短くするには、ループをたった1行で表記する内包表記を用います。

[出力結果のprint文 for リストの要素の文字 in リスト名]

今回の例ですと、

[print(num) for num in array]

と表記致します。

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

#リストarrayを内包表記で出力する
[print(num) for num in array]

Pythonは以上です。
次は、GASで解いて行きます。


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

スプレッドシートの出力前の画像です。

入力の所は、paiza側の入力例をコピーして、スプレッドシートに貼り付ける際には[Ctrl]+[Shift]+[V]で貼り付けると書式が崩れなくてスプレッドシートの元の書式を保ったまま綺麗に貼り付けられます。

緑色のセルA2(2,1)に数字の個数N=5を、灰色のセルA3(3,1)の5個の数値を取得し配列arrayに格納、それを加工してC2(2,3)から始まる黄色いセルに出力します。

その際この黄色いセル5行分は、二次元配列として取得した整数が格納された配列を出力します。

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

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

1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

2: 緑色のセルA2(2,1)と灰色のセルA3(3,1)の2行分をまとめて二次元配列numとして取得する


3: 取得したnum
とarrayをログ出力で確認する

4: num[0][0]を数字の個数N=5になるように格納する


5: num[1][0]にsplitメソッドを使って、配列arrayに格納
する

6: 取得した配列arrayをログ出力する


7: スプレッドシート出力用に空の配列array2を宣言して、配列arrayの要素を二次元配列になるようにarray2にループで格納
する

8: スプレッドシート出力前に二次元配列array2をログ出力する


9: スプレッドシートのC2(2,3)から始まる黄色いセル5行に数値を格納する

手順1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

const ss = SpreadsheetApp.getActiveSheet();

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

コードを関数「standardInput4」に書いて行きます。

Standard Inputで標準入力の意味です。

function standardInput4() {

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

手順2:緑色のセルA2(2,1)と灰色のセルA3(3,1)の2行分をまとめて二次元配列numとして取得する

num=ss.getRange(2,1,2).getValues();

getRangeの中の(2,1,2)ですが、セルA2が(2,1)です。
また、最後の2は2行分を表しています。
列の1列まで書くと(2,1,2,1)になりますが、1列の場合は省略可能です。

getValuesと複数形になっているのは、2つのセルを取得するので複数形のsが付いています。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  //緑色のセルA2(2,1)と灰色のセルA3(3,1)の2行分をまとめて二次元配列numとして取得する
  const num=ss.getRange(2,1,2).getValues();

}

手順3:取得した配列numをログ出力する

console.log(num);

このコードを実行して、リストnumをログ出力して、セルA2とA3が取得出来たことを確認します。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  //緑色のセルA2(2,1)と灰色のセルA3(3,1)の2行分をまとめて二次元配列numとして取得する
  const num=ss.getRange(2,1,2).getValues();

  //取得したnumをログ出力
  console.log(num);

}

手順4:num[0][0]を数字の個数Nに格納してログで確認する

const N=num[0][0];

取得した二次元配列のnum[0][0]がA2に当たります。
この配列は、2行1列ですので、A3はnum[1][0]になります。

ここでは、num[0][0]を定数Nに5個として取得するコードと、確認としてその実行結果のログを掲載致します。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  const num=ss.getRange(2,1,2).getValues();
  console.log(num);
  
  //セルA2に該当するnum[0][0]を数値の個数N=5として格納する
  const N=num[0][0];

  //定数Nに数値の個数5個が格納出来たことをログ出力で確認する
  console.log(N);

}


手順5:num[1][0]にsplitメソッドを使って、配列arrayに格納してログで確認する

const array=num[1][0].split(‘ ‘);

コードと実行結果です。
灰色のセルA3をsplitを使って、半角文字で区切って配列arrayに格納します。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  const num=ss.getRange(2,1,2).getValues();
  console.log(num);
  
  const N=num[0][0];
  console.log(N);

  //num[1][0]にsplitメソッドを使って、配列arrayに格納
  const array=num[1][0].split(' ');

}

手順6:取得した配列arrayをログ出力する

console.log(array);

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  const num=ss.getRange(2,1,2).getValues();
  console.log(num);
  
  const N=num[0][0];
  console.log(N);

 
  const array=num[1][0].split(' ');

  //取得した配列arrayをログ出力する
  console.log(array);

}
配列arrayに分割して格納。splitメソッドを使用

この画像について、最初の配列numではそのまま半角スペース込みで取得されています。

それを今回split(‘ ‘)を使ったことによって、配列arrayには半角スペースで区切られて取得出来たことが確認出来ました。


手順7:スプレッドシートに出力用の空の配列array2を宣言して、二次元配列array2になる様に配列arrayをループで末尾に追加しながら格納する

array2.push([array[i]]);

空の配列array2を宣言してそこにpushを使って、arrayの要素をループの中で順番に格納して行きます。

[array[i]]と、array[i]の全体に[ ]で括っているのは、二次元配列として格納してスプレッドシートに出力可能な形式にする為です。

ループの部分では、

for(let i=0;i<N;i++)

ここでは、array2にarrayをループで格納する際に、iの値を0,1,2,3,4と5つ分格納しています。

iの値が変わるので、変数になり let i=0 とループ開始の所でletを用いて宣言をしています。

リストは添字0から始まりますので、iには0から4までの値が代入され、Nは5になりますので、 「 i<N 」となっております。

ここまでのコードです。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  const num=ss.getRange(2,1,2).getValues();
  console.log(num);
  
  const N=num[0][0];
  console.log(N);

  const array=num[1][0].split(' ');
  console.log(array);

  //スプレッドシート出力用の空の配列array2を宣言
  const array2=[];

  //配列arrayを二次元配列array2にループで格納
  for(let i=0;i<N;i++){
    array2.push([array[i]]);
  }

}

この解説よりも、セルA2から個数のNを、セルA3から配列のarrayをそれぞれ取得する方法の方がシンプルです。

しかし、スプレッドシートにアクセスする回数を減らすため、一度に配列numとして取得して、それぞれにN=num[0][0]、array=num[1][0]を代入しました。

どちらも後ろのnumの値が[0]になっているのは、この配列が1列だからです。



手順8:スプレッドシート出力前に二次元配列array2をログ出力する

console.log(array2);

空の配列だったarray2に、スプレッドシートの出力形式に合う二次元配列として数値が格納されたことを下記コードのログで確認します。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  const num=ss.getRange(2,1,2).getValues();
  console.log(num);
  
  const N=num[0][0];
  console.log(N);

  const array=num[1][0].split(' ');
  console.log(array);

  const array2=[];

  for(let i=0;i<N;i++){
    array2.push([array[i]]);
  }

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

}

無事にarray2が二次元配列として格納されたことが確認出来ました。


手順9:スプレッドシートのC2(2,3)から始まる黄色いセル5行分にarray2に格納された数値を出力する

ss.getRange(2,3,N).setValues(array2);

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

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  const num=ss.getRange(2,1,2).getValues();
  console.log(num);
  
  const N=num[0][0];
  console.log(N);

  const array=num[1][0].split(' ');
  console.log(array);

  const array2=[];

  for(let i=0;i<N;i++){
    array2.push([array[i]]);
  }


  console.log(array2);

  //スプレッドシートのC2から始まる黄色いセルをN=5行分に出力する
  ss.getRange(2,3,N).setValues(array2);
  
}
Google Apps Scriptで出力したスプレッドシート

GASは以上です。

※ この記事の作成に参考になったサイトです ※
ありがとうございます。

Python「rstrip() メソッド」で文字列の右端を整えよう!
Python mapの使い方


お疲れ様でした。ブレイクタイムPhotoは、

よみうりランドのXmasイルミネーションの「ジュエルミネーション」です。

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

ご精読有難うございました。

■ GASの入門書の紹介です ■

詳解! Google Apps Script完全入門 [第3版]
単行本
Kindle版(電子書籍)

■ 関連記事 ■

paizaレベルアップ問題集「標準入力6」へ戻る
paizaレベルアップ問題集_PythonとGASのコード紹介トップページへ

写真クリエイターとしての活動
自己紹介

paiza レベルアップ問題集 標準入力その6「STEP: 3 1 行目で与えられる N 個の整数の入力」をPythonとGASの両方で解いたコードの紹介

この記事を読むことで、Pythonで標準入力とsplitなどのメソッドを複数用いて、リスト(配列)に数値を格納して、個数を除いたリスト内の数値をループの中で出力することが可能になります。

GASではスプレッドシートで値を取得して、二次元配列に格納して出力しています。

このコーナーでは、プログラミング学習コンテンツpaizaラーニングレベルアップ問題集を、PythonとGAS(Google Apps Script)の両方で同じ問題を解いたコードを公開している学習ログです。

Python・GASのどちらの言語のコードも可能な限り詳細に解説致します。
GASはスプレッドシートのエディタを使ってコードを書いております。

Pythonではpaizaに入会しなくても問題集を解きたい方向けにpaiza.ioを用いております。paiza.ioの使い方はこちらから。

(入会するか否かは問題集を解いて見てからの読者様のご判断にお任せ致します。
どちらの選択をされても記事を読めるようになっておりますので、ご安心なさって下さい。)


1 行目で与えられる N 個の整数の入力 (paizaランク D 相当)

問題:
1 行目で、整数 N と、続けて N 個の整数 a_1, … , a_N が半角スペース区切りで与えられます。
a_1, … , a_N を改行区切りで出力してください。

ではまず、Pythonで解いて行きます。


手順として、

1: 1行目の整数を標準入力で数値として取得する際標準入力と幾つかの関数を使って、数値の個数と出力する数値を全てリストarrayに格納する

2: リスト(添字0から始まる)の1番目の添字0の要素を数値の個数Nとする


3: リストの2番目の添字1の要素から最後の添字N-1の要素までをループで出力する

・シンプルなループ
・上記の内包表記

の3ステップで行います。

今回は入出力例1を用います。

入力例1
13 5085 2923 8669 3231 7032 73 2683 8317 5545 9774 7179 2646 2470

出力例1
5085
2923
8669
3231
7032
73
2683
8317
5545
9774
7179
2646
2470

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

この一番初めの13は、次の「5085」〜「2470」までの数値の個数13個を表しています。

まずはこの1行全てを標準入力で、いくつかの関数も使って数値として取得して、リストの形に変換してarrayに格納します。

このコード1行に複数の関数を使用しているので、今回の例に即して簡潔にお伝えします。

input … 標準入力で文字や数値を取得する

split … 指定の区切り文字で分割して取得する

int … 上記 inputで取得する対象が整数である


map … 関数をまとめて適用


list … リスト(配列)変換

上記の関数を用いてコードを掲載致します。

splitの区切り文字の指定は、問題文の通り半角スペースです。

関数が沢山に色々出て来てしまいましたので、まずは、標準入力で取得した数値がリスト(配列)形式でarrayに取得出来たことをprint文で出力して確認します。

#1行分をリストとして取得してarrayに格納
array=list(map(int,input().split(' ')))

#arrayにリストの形式で数値が格納されていることを確認
print(array)

この様にリストとして格納出来ました。

この先頭のarray[0]に当たる13を数値の個数Nとして取得と確認をします。

array=list(map(int,input().split(' ')))
print(array)

#数値の個数Nにarray[0]を代入する
N=array[0]

#Nに代入出来たことを確認する
print(N)

N=13が正しく代入されたことが確認出来ました。
この状態で、配列の2番目のarray[1]=5085 〜 配列の末尾array[13]までループで出力します。

その際、ループの開始条件の指定では、

for i in range(1,N+1):

と記述します。

これは、ループの添字(インデックス)のiが、i=1,2, … 13の要素を取得する際、rangeの終わりの値はその数未満、つまり12になってしまうので、Nに1を足す必要があります。

この説明が分かり辛いかもしれませんので、まずはN+1の「+1を省いて」出力致します。

array=list(map(int,input().split(' ')))
#確認用の為、コメントアウト
#print(array)

N=array[0]

#確認用の為、コメントアウト
#print(N)

#ループをi=1からNと指定して出力
for i in range(1,N):
    print(array[i])

このコードの出力結果ですが、array[12]の「2646」までしか出力されておらず、最後のarray[13]の「2470」が抜けた結果になっています。

これで視覚的にrange(1,N)だと、Nが13だから13未満の12までしかループが回らないことが確認出来ましたので、この部分をrange(1,N+1)に修正したコードと実行結果を掲載致します。

(確認用に出力したコメントアウトした分は削除しました。)

array=list(map(int,input().split(' ')))
N=array[0]

#ループをi=1からN+1と指定して出力
for i in range(1,N+1):
    print(array[i])


更にコード短くする方法として、内包表記を用います。

[出力結果のprint文 for から「:」の直前まで]

今回の例ですと、

[print(array[i]) for range(1,N+1)]

とループが1行のコードで出力可能になります。

array=list(map(int,input().split(' ')))
N=array[0]

#ループを内包表記で出力
[print(array[i]) for i in range(1,N+1)]   

これでループの部分が1行とスッキリした記述になりました。

Pythonは以上です。
次は、GASで解いて行きます。


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

緑のセルA2(2,1)の数値を取得し、最初の数値13を数値の個数として定数Nに代入して、2番目の数値から最後までをC2(2,3)から始まる黄色いセルに出力します。

その際、この黄色いセルの範囲には、二次元配列として取得した整数が格納された配列を出力します。

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

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

1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

2: 緑色のセルA2(2,1)の数値を個数13個と、その後の13個分の数値をsplitメソッドを用いて配列としてarrayに取得する


3: 取得した配列arrayをログ出力する


4: 配列の先頭の添字0の要素array[0]をNに代入してN=13になることを確認する


5: 空の配列array2を宣言して、arrayの2番目array[1]から最後の要素array[13]を二次元配列array2に格納する


6: スプレッドシートに出力前にarray2が二次元配列として数値を格納出来たことをログ出力して確認する


7: 二次元配列array2をスプレッドシートのC2(2,3)から始まる黄色いセルに出力する


手順1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

const ss = SpreadsheetApp.getActiveSheet();

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

コードを関数「standardInput3」に書いて行きます。

Standard Inputで標準入力の意味です。

function standardInput3() {

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

}


手順2:緑色のセルA2(2,1)の数値を個数13個と、その後の13個分の数値をsplitメソッドを用いて配列としてarrayに取得する

splitの区切り文字の指定は、問題文の通り半角スペースです。

array=ss.getRange(2,1).getValue().split(‘ ‘);

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

  //緑のセルA2の数値の個数と数値をsplitメソッドを用いて配列として取得
  const array=ss.getRange(2,1).getValue().split(' ');

}


手順3:取得した配列arrayをログ出力する

console.log(array);

コードと実行結果です。

function standardInput3() {
  
  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');

  //取得した配列arrayをログ出力する
  console.log(array);

}


手順4:配列の先頭の添字0の要素array[0]をNに代入してN=13になることを確認する

const N=array[0];

function standardInput3() {
  
  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  //配列の先頭の添字0の要素数array[0]をNに代入する
  const N=array[0];

  //Nをログ出力で確認する
  console.log(N);

}

実行結果のログです。


手順5:空の配列array2を宣言して、arrayの2番目array[1]から最後の要素array[13]を二次元配列array2に格納する

空の配列array2にpushメソッドを使ってarray[1]からarray[13]までを二次元配列になるようループで格納します。

ループの中で、array[i]の値が1から13まで変わるので変数としてletで宣言しています。
また、二次元配列になる様に、[array[i]]と配列array全体を[ ]で括っています。

function standardInput3() {
  
  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  const N=array[0];
  console.log(N);

  //スプレッドシート出力用の空の配列array2を宣言
  const array2=[];

  //配列arrayの2番目から最後の要素を二次元配列になるようにarray2に格納する
  for(let i=1;i<=N;i++){
    array2.push([array[i]]);
  }

}


手順6:スプレッドシートに出力前にarray2が二次元配列として数値を格納出来たことをログ出力して確認する

console.log(array2);

コードと実行結果のログです。

無事に二次元配列として格納されたことが確認出来ました。


手順7:二次元配列array2をスプレッドシートのC2(2,3)から始まる黄色いセルに出力する

ss.getRange(2,3,N).setValues(array2);

C2が(2,3)で、N行出力するのでgetRangeに(2,3,N)と指定します。
また1列の(2,3,N,1)の1は省略可能です。

また、配列の数値は複数ですので、setValuesとsを付けて複数形にします。

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

GASは以上です。

※ この記事の作成に参考になったサイトです ※
ありがとうございます。

Python mapの使い方


お疲れ様でした。ブレイクタイムPhotoは、

横浜みなとみらい、ランドマークタワーの夜景と観覧車です。

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

ご精読有難うございました。

■ GASの入門書の紹介です ■

詳解! Google Apps Script完全入門 [第3版]
単行本
Kindle版(電子書籍)

■ 関連記事 ■

paizaレベルアップ問題集「標準入力6」へ戻る
paizaレベルアップ問題集_PythonとGASのコード紹介トップページへ

写真クリエイターとしての活動
自己紹介

paiza レベルアップ問題集 標準入力その6「STEP: 2 2 行目で与えられる N 個の整数の入力」をPythonとGASの両方で解いたコードを紹介

この記事を読むことで、Pythonで標準入力とsplitメソッドなどを用いて、数値の個数と、全ての数値をリスト(配列)に格納して、ループで出力することが可能になります。

GASではスプレッドシートで値を取得して、二次元配列にして出力しています。

このコーナーでは、プログラミング学習コンテンツpaizaラーニングレベルアップ問題集を、PythonとGAS(Google Apps Script)の両方で同じ問題を解いたコードを公開している学習ログです。

Python・GASのどちらの言語のコードも可能な限り詳細に解説致します。
GASはスプレッドシートのエディタを使ってコードを書いております。

Pythonではpaizaに入会しなくても問題集を解きたい方向けにpaiza.ioを用いております。paiza.ioの使い方はこちらから。

(入会するか否かは問題集を解いて見てからの読者様のご判断にお任せ致します。
どちらの選択をされても記事を読めるようになっておりますので、ご安心なさって下さい。)


2 行目で与えられる N 個の整数の入力 (paizaランク D 相当)

問題:
1 行目で整数 N が与えられます。
2 行目で、N 個の整数 a_1, … , a_N が半角スペース区切りで与えられます。
a_1, … , a_N を改行区切りで出力してください。

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


手順として、

1: 1行目は整数の個数を標準入力で数値として取得して、変数Nに代入する

2: 2行目は標準入力と幾つかのメソッドを使って、N個の整数を全てリストarrayに格納する


3: 格納したリストの要素をループで出力する

・シンプルなループ
・リスト出力に適したループ
・上記の内包表記
 

手順として、

の3ステップで行います。

今回は入出力例1を用います。

入力例1
6
6561 3785 6338 9568 4956 557

出力例1
6561
3785
6338
9568
4956
557

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

まずは1行目の数値の個数6個を標準入力で取得して、変数Nに代入してその結果を確認します。

#標準入力で1行目の数値の個数6を取得して変数Nに代入する
N=int(input())

#数値の個数6個がNに代入されたことを確認する
print(N)

出力結果の画像です。

次に2行目の6個の数値を標準入力で取得してリストarrayに格納します。

それをリストの形に変換して、コード1行に複数の関数を使用しているので、今回の例に即して簡潔にお伝えします。

input … 標準入力で文字や数値を取得する

split … 指定の区切り文字で分割して取得する

int … 上記 inputで取得する対象が整数である


map … 関数をまとめて適用


list … リスト(配列)変換

上記の関数を用いてコードを掲載致します。

関数が沢山に色々出て来てしまいましたので、まずは、標準入力で取得した数値がリスト(配列)形式でarrayに取得出来たことをprint文で出力して確認します。

N=int(input())
print(N)

#6個の半角スペース区切りの数値をリストに変換してarrayに格納す
array=list(map(int,input().split(' ')))

#arrayに6つの数値が格納されたことを確認する
print(array)

無事に、arrayにリストとして6つの整数が格納されました。
このリストの数値をループで縦に出力します。

では、リストarrayをループを用いて解答の出力例に沿って縦に出力します。

for i in range(N):

N=int(input())
print(N)#確認用のprint文…後で消す

array=list(map(int,input().split(' ')))
print(array)#確認用のprint文…後で消す

#ループをN=6回回わして、順番にリストの数値を出力する
for i in range(N):
    print(array[i])

少し、確認用に出力した分が見辛くなって来ましたので、ここでNやarrayの確認用に使ったprint文を削除します。

そのコードと実行結果です。

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


#ループをN=6回回わして、順番にリストの数値を出力する
for i in range(N):
    print(array[i])


リストを使った、更に便利なループの表記方法について掲載致します。

for リストの要素の文字 in リスト名:

今回の例ですと、

for num in array:

になります。

リストの要素の所は自分や他の方が見て分かりやすい「num」などにすると、「整数を取り出すんだな」と伝わりやすいです。

N=int(input())
array=list(map(int,input().split(' ')))


#リスト出力に便利なループの書き方
for num in array:
    print(num)

更にコード短くするのに、内包表記を用います。

[出力結果のprint文 for リストの要素の文字 in リスト名]

今回の例ですと、

[print(num) for num in array]

とループが1行のコードで出力可能になります。

N=int(input())
array=list(map(int,input().split(' ')))

#リスト出力に便利なループの書き方の内包表記
[print(num) for num in array]

Pythonは以上です。
次は、GASで解いて行きます。


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

A列に入力例1を貼り付ける際、paizaの入力例1をコピーして、[Ctrl] + [Shift] + [V] で貼り付けると書式を崩さずに貼り付けられます。

緑色のセルA2(2,1)に入力した数列の個数を取得して、セルA3(3,1)の灰色の所の数列を取得し、それをC2(2,3)から始まる黄色いセルに緑色のセル分(6個)出力します。

その際、この黄色いセルの所には、二次元配列として取得した整数が格納された配列を出力します。

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

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

1:SpreadSheetAppから階層を辿って現在のシートにアクセスする

2:緑のセルA2(2,1)にある整数の個数を取得して定数Nに代入する


3:灰色のセルA3(3,1)をsplitメソッドで空白による分割をして配列arrayに格納


4:取得したarrayをログ出力する


5:スプレッドシートに出力する為、空の配列array2を用意して、二次元配列としてarrayの要素をループを用いてarray2に格納する


6:スプレッドシート出力前に二次元配列array2をログ出力する


7:C2(2,3)からN=6行分をスプレッドシートの黄色い所に出力する


手順1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

const ss = SpreadsheetApp.getActiveSheet();

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

関数「standardInput2」にコードを書いていきます。

Standard Inputで標準入力の意味です。

function standardInput2() {

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

}

手順2:緑のセルA2(2,1)にある数値の個数Nを取得して6個の6が取得出来たことを確認

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

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

  //緑のセルA2にある数値の個数を定数Nに取得
  const N=ss.getRange(2,1).getValue();

  //Nを出力して確認
  console.log(N);

}

手順3:灰色のセルA3(3,1)splitメソッドで空白による分割をして配列arrayに格納

const array=ss.getRange(3,1).getValue().split(‘ ‘);

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

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

  //灰色のセル1列をsplitメソッドで空白による分割をして配列arrayに取得
  const array=ss.getRange(3,1).getValue().split(' ');

}


手順4:取得した配列arrayをログ出力する

console.log(array);

コードと実行結果です。

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

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

  const array=ss.getRange(3,1).getValue().split(' ');

  //取得したarrayをログ出力する
  console.log(array);

}

arrayには数値がこのような一次元配列として格納されたことが確認出来ました。


手順5:スプレッドシート出力用の空の配列array2を用意して、ループを用いてarrayからarray2に二次元配列として格納する

ここで、ループを使用して、arrayの配列の要素をarray2にpushを使って追加していきます。

その際、[array[i]]と配列全体に[ ]で括っています。

また、ループでは配列が添字0から始まるため、i=0が開始の値で、i<array.lengthとすることで、iの値が0,1,2,3,4,5と長さ6つ分変化していきます。

注意点として、arrayの長さが6でiが0から始まるため、i<array.lengthと「<」を使っています。

「 i 」の値が変わるので変数として、ループの開始の所でletを用いて宣言しております。

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

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

  const array=ss.getRange(3,1).getValue().split(' ');
  console.log(array);


  //スプレッドシートに出力する為の空の配列array2を宣言
  const array2=[];

  //ループの中でpushを用いてarrayから二次元配列array2に二次元配列として格納する
  for(let i=0;i<array.length;i++){
    array2.push([array[i]]);
  }

}


手順6:スプレッドシート出力前にarray2に二次元配列として格納できたことをログ出力で確認する

console.log(array2);

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

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

  const array=ss.getRange(3,1).getValue().split(' ');
  console.log(array);


  
  const array2=[];

  for(let i=0;i<array.length;i++){
    array2.push([array[i]]);
  }

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

}

これで、array2が二重カッコになっていることから、二次元配列として格納されたことが確認出来ました。

この形になって初めてスプレッドシートに出力出来ます。


手順7:スプレッドシートのC2(2,3)から始まる黄色いセルにN=6行分出力する

ss.getRange(2,3,N).setValues(array2);

C2が(2,3)であり、そこから6行分のNで(2,3,N)、1列分で(2,3,N,1)になりますが、列の1は省略可能です。

また、数値の個数分がarray2に格納されて6個と複数個ですので、setValuesと複数形のsを付けます。

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

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

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

  const array=ss.getRange(3,1).getValue().split(' ');
  console.log(array);
  

  const array2=[];

  for(let i=0;i<array.length;i++){
    array2.push([array[i]]);
  }

  console.log(array2);


  //スプレッドシートのC2(2,3)から始まる黄色いセルに出力する
  ss.getRange(2,3,N).setValues(array2);

}

GASは以上です。

※ この記事の作成に参考になったサイトです ※
ありがとうございます。

Python mapの使い方


お疲れ様でした。ブレイクタイムPhotoは、

いたばし花火大会(東京都板橋区)です。

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

ご精読有難うございました。

■ GASの入門書の紹介です ■

詳解! Google Apps Script完全入門 [第3版]
単行本
Kindle版(電子書籍)

■ 関連記事 ■

paizaレベルアップ問題集「標準入力6」へ戻る
paizaレベルアップ問題集_PythonとGASのコード紹介トップページへ

写真クリエイターとしての活動
自己紹介

paiza レベルアップ問題集 標準入力その6「STEP: 1 改行区切りでの N 個の整数の入力」をPythonとGASの両方で解いたコードを紹介

この記事を読むことで、Pythonで標準入力を用いて数値の個数と、全ての数値をループの中で出力することが可能になります。

GASではスプレッドシートで値を取得して、二次元配列を用いてループを使わずに出力しています。

このコーナーでは、プログラミング学習コンテンツpaizaラーニングレベルアップ問題集を、PythonとGAS(Google Apps Script)の両方で同じ問題を解いたコードを公開している学習ログです。

Python・GASのどちらの言語のコードも可能な限り詳細に解説致します。
GASはスプレッドシートのエディタを使ってコードを書いております。

Pythonではpaizaに入会しなくても問題集を解きたい方向けにpaiza.ioを用いております。paiza.ioの使い方はこちらから。

(入会するか否かは問題集を解いて見てからの読者様のご判断にお任せ致します。
どちらの選択をされても記事を読めるようになっておりますので、ご安心なさって下さい。)

改行区切りでの N 個の整数の入力 (paizaランク D 相当)

問題:

1 行目で整数 N が与えられます。
2 行目以降で、N 個の整数 a_1, … , a_N が N 行で与えられます。
a_1, … , a_N を改行区切りで出力してください。

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


手順として、

1:標準入力で整数の個数Nを取得する

2:ループの中で標準入力を使い、N個全ての整数を出力する

の2ステップで行います。

今回は入出力例1を用います。

入力例1
20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

出力例1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

画像が縦長になりますので、少し縮小しました。

下記のコードで標準入力とprint文での出力を行います。

1から20までの整数の個数20が一番初めに入力例1にありますので、それをNに標準入力で整数として取得します。

ループの中でN回、つまり20回ループを回します。
変数tempに代入してprint文で出力しています。

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

#2:ループの中で標準入力を使い、N個全ての整数を出力する
for i in range(N):
    temp=int(input())
    print(temp)

このコードの実行(出力)結果です。

Pythonは以上です。

次は、GASで解いて行きます。


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

paizaの入力例1をコピーして、スプレッドシートのA列にショートカットキー[Ctrl] + [Shift] + [V] を用いて貼り付けると、書式が崩れないで貼り付けられます。

緑色セルA1(1,1)に入力した、数値の個数である20をNに代入して、A2(2,1)から始まる灰色のセルの数値を20個分取得し、それを黄色いセルC1(1,3)から始まる20行に出力します。

その際この灰色のA2(2,1)から始まる20行のセルを二次元配列として取得してarrayに格納して、その整数が格納された配列arrayをC1(1,3)の黄色いセル20行に出力します。

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

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

1:SpreadSheetAppから階層を辿って現在のシートにアクセスする

2:緑のセルA1(1,1)にある20を数値の個数Nとして取得

3:灰色のセルA2(2,1)から始まるN(20)行1列を配列arrayに取得

4:取得したarrayをログ出力して二次元配列として格納されてることを確認する。

5:スプレッドシートのC1(1,3)から始まる黄色いセル20行分に出力する

手順1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

const ss = SpreadsheetApp.getActiveSheet();

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

このコードを関数「standardInput1」に書いていきます。

Standard Inputで標準入力の意味です。

function standardInput1() {

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

手順2:緑のセルA1(1,1)に入力されている数値の個数20を取得して定数Nに格納する

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

function standardInput1() {

  const ss=SpreadsheetApp.getActiveSheet();

  //緑のセルA1(1,1)に入力されている数値の個数20を取得して定数Nに格納
  const N=ss.getRange(1,1).getValue();

  //Nが取得出来たことを確認
  console.log(N);
 
}

手順3:A2(2,1)から始まる灰色のセルをN(=20)行1列分を配列arrayに取得

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

セルA2は(2,1)で行数N=20ですので、(2,1,N)で(2,1,20)と同意です。
列数も入れると(2,1,N,1)ですが、1列の場合は省略出来ます。

配列の数値は20個と複数ですので、getValuesとsが付く複数形になります。

unction standardInput1() {

  const ss=SpreadsheetApp.getActiveSheet();
  const N=ss.getRange(1,1).getValue();
  console.log(N);

  //灰色のセルN行1列を配列arrayに取得
  const array=ss.getRange(2,1,N).getValues();
  
}

手順4:スプレッドシート出力前に灰色のセルのA2から取得した配列arrayをログ出力する

console.log(array);

コードの実行結果のログです。

function standardInput1() {

  const ss=SpreadsheetApp.getActiveSheet();
  const N=ss.getRange(1,1).getValue();
  console.log(N);

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

  //arrayをログ出力して灰色のセルA2から20行分が取得出来たことを確認する
  console.log(array);

}

arrayが二次元配列として取得出来たことが確認出来ました。

手順5:スプレッドシートのC1(1,3)から始まる黄色いセル20行分に配列arrayを出力する

ss.getRange(1,3,N).setValues(array);

function standardInput1() {

  const ss=SpreadsheetApp.getActiveSheet();
  const N=ss.getRange(1,1).getValue();
  console.log(N);

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

  //スプレッドシートのC1(1,3)から始まる黄色いセルに配列arrayを格納する
  ss.getRange(1,3,N).setValues(array);

}

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

GASは以上です。


お疲れ様でした。ブレイクタイムPhotoは、

雨露が輝く代々木公園のバラです。

←標準入力その5へ          次の問題へ→

ご精読有難うございました。

■ GASの入門書の紹介です ■

詳解! Google Apps Script完全入門 [第3版]
単行本
Kindle版(電子書籍)

■ 関連記事 ■

paizaレベルアップ問題集「標準入力6」へ戻る
paizaレベルアップ問題集_PythonとGASのコード紹介トップページへ

写真クリエイターとしての活動
自己紹介

paiza レベルアップ問題集 標準入力その5「FINAL問題 【整数の半角スペース区切りの入力】1,000個の整数の半角スペース区切りの入力」をPythonとGASの両方で解いたコードの紹介

この記事を読むことで、Pythonの標準入力でsplitメソッドを使って、半角スペース区切りの整数を1,000個に分割して配列に格納して、1,000行の整数を出力する方法の概要が掴めます。

このコーナーでは、プログラミング学習コンテンツpaizaラーニングレベルアップ問題集を、PythonとGAS(Google Apps Script)の両方で同じ問題を解いたコードを公開している学習ログです。

Python・GASのどちらの言語のコードも可能な限り詳細に解説致します。
GASはスプレッドシートのエディタを使ってコードを書いております。

Pythonではpaizaに入会しなくても問題集を解きたい方向けにpaiza.ioを用いております。paiza.ioの使い方はこちらから。

(入会するか否かは問題集を解いて見てからの読者様のご判断にお任せ致します。
どちらの選択をされても記事を読めるようになっておりますので、ご安心なさって下さい。)

【整数の半角スペース区切りの入力】1,000個の整数の半角スペース区切りの入力 (paizaランク D 相当)

問題:

整数 a_1, a_2, … , a_999, a_1000 が半角スペース区切りで与えられるので、改行区切りにして 1000 行で出力してください。

ではまず、Pythonでの解き方とコードです。


手順として、

1:標準入力でsplitメソッドを使って半角スペース区切りの整数をリストで取得する

2:取得したリストをループで出力する

・シンプルなループ
・リスト出力に適したループ
・上記の内包表記  

の2ステップで行います。

今回は入出力例1を用います。

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

数値が1000個と大量ですので、前半と後半の画像に分けて掲載致します。

<入力例1_前半>

<入力例1_後半>

下記のコードで入力と出力を行いますが、1行に複数の関数が使われているので、今回の例に即して簡潔にお伝えします。

input … 標準入力で文字や数値を取得する

split … 指定の区切り文字で分割して取得する

int … 上記で取得する対象が整数である


rstrip … 右側にある不要な空白を取り除く


map … 関数をまとめて適用


list … リスト(配列)変換

上記の関数を用いてコードを掲載致します。
関数が沢山に色々出て来てしまいましたので、まずは、標準入力で取得した数値がリスト(配列)形式でarrayに取得出来たことをprint文で出力して確認します。

#1000個の整数を標準入力で取得し右側の不要な空白を削除して分割してリストにする
array=list(map(int,input().rstrip().split(' ')))

#arrayが配列として取得できたことを確認する
print(array)

まずは、リストとして出力出来ました。

<リスト_前半>

<リスト_後半>

では、リストarrayをループを用いて解答の出力例に沿って縦に出力します。

ループを用いる前にリストarrayの長さを調べて、リストは0からarray[0]、array[1] …array[998],array[999]になるので後ほどループの回数に使用する、リストarrayの長さが1000(0,1,2 ……. ,998,999までの1000回)になることを、len関数を用いて確認します。

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

#リストの長さを求める
print(len(array))

このコードで、リストarrayの長さが1000であることが確認出来ました。

では、リストarrayをループで出力します。

for i in range(len(array)):

これで、iに0,1,2,3, … 997,998,999が入ります。
range(数)で、0からその数(1,000)未満の回数分ループを回します。

array=list(map(int,input().rstrip().split(' ')))
print(array)
print(len(array))

#ループを使ってリストを出力
for i in range(len(array)):
    print(array[i])

リストをループを使って出力した結果の画像です。

ループでリストを出力_前半>

ループでリストを出力_後半>

必要な分だけ出力するので、コメントアウトを致します。

array=list(map(int,input().rstrip().split(' ')))
#print(array) ←コメントアウト

#print(len(array)) ←コメントアウト

#ループを使ってリストを出力
for i in range(len(array)):
    print(array[i])

すると、解答提出に必要な分だけ出力されました。


リストを使った、更に便利なループの表記方法について掲載致します。

for リストの要素の文字 in リスト名:

今回の例ですと、

for num in array:

になります。
リストの要素の所は自分や他の方が見て分かりやすい「num」などにすると、「整数を取り出すんだな」と伝わりやすいです。

コメントアウトした部分を削除して、コードを掲載致します。

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

#リスト出力に便利なループの書き方
for num in array:
    print(num)

更にコード短くするのに、内包表記を用います。

[出力結果のprint文 for リストの要素の文字 in リスト名]

今回の例ですと、

[print(num) for num in array]

と表記いたします。

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

#リスト出力に便利なループの書き方の内包表記
[print(num) for num in array]

このコードの実行(出力)結果です。

Pythonは以上です。
次は、GASで解いて行きます。


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

paizaの入力例1をコピーして、緑色のセルA2に[Ctrl] + [Shift] + [V] で貼り付けると書式を保って貼り付けられます。

とは言え、セルA2からはみ出してしまっているので、「切り詰める」ボタンを押して整えます。

すると、

このように多少スッキリした見栄えになりました。
A列の列幅を少し狭くしました。

また、スプレッドシートの出力をスクロールして後半部分を表示するので、1行目で行固定しています。

1行目の行の左端の「1」をクリックすると行全体が選択出来るので、「表示」→「固定」→「行1まで」を選択しました。

緑色のセルA2(2,1)に入力した1,000個の整数を取得して、それをC2(2,3)から始まる黄色いセル1,000行分に出力します。

その際、この黄色いセルの所には、splitメソッドを用いて数字列を分割して、二次元配列として取得した整数が格納された配列を出力します。

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

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

1:SpreadSheetAppから階層を辿って現在のシートにアクセスする

2:緑のセルA2(2,1)の整数をsplitメソッドを使って配列arrayに格納する

3:配列arrayをログ出力して、数値が格納出来たことを確認する。

4:スプレッドシートに格納する為に、空の配列array2を宣言してarrayの数値をループで二次元配列になる様に追加して格納する

5:スプレッドシートに出力する前に、array2をログ出力する

6:スプレッドシートのC2(2,3)から始まる黄色い所に1,000行分出力する

手順1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

const ss = SpreadsheetApp.getActiveSheet();

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

このコードを「standardInput5」の中に書いていきます。

Standard Inputで標準入力の意味です。

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

}

手順2:緑のセルA2(2,1)の整数をsplitメソッドを使って配列arrayに格納する

const array=ss.getRange(2,1).getValue().split(‘ ‘);

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();

  //緑のセルの整数をsplitメソッドを使って配列arrayに格納する
  const array=ss.getRange(2,1).getValue().split(' ');

}

手順3:配列arrayをログ出力して、数値が格納出来たことを確認する。

console.log(array);

1,000個は多すぎて全部ログ出力出来なかったので一部のみの画像です。

手順4:スプレッドシートに出力用の空の配列array2を宣言して、ループでarrayの数値をarray2に二次元配列になる様に格納する

まず、出力用の二次元配列にする空の配列array2を宣言します。
また、一次元配列arrayは量が多いのでコメントアウトしています。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');
  //console.log(array); ←コメントアウト

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

}

ループを用いてarrayの要素を一つずつarray2に二次元配列として追加します。

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

配列は添字が0から始まるのでarray[i]である、array[0]、array[1] …. array[998]、array[999]をarray2に格納します。

array[i]のiを一つずつインクリメント(増加)する為、iの値は変わっていくので let i=0 として変数にしています。

i<array.lengthは、array.lengthが1,000ですので、スタートが0の場合はゴールが999になり、「<」を用いています。イコールは付けないのはその為です。

array2.push([array[i]]);

ループの中で、pushを使ってarray2の末尾にドンドンarrayの要素を追加しています。
[array[i]]とarrayの配列全体を[ ]で括っているのは、二次元配列として追加する為です。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');

  const array2=[];

  //ループを用いて一次元配列arrayの要素をarray2に二次元配列になる様に格納する
  for(let i=0;i<array.length;i++){
    array2.push([array[i]]);
    
  }
}

手順5:スプレッドシートに格納前に、array2をログ出力する

console.log(array2);

量が多いので一部のみですが、空の配列だったarray2が二次元配列として格納されたことを確認出来ました。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');

  const array2=[];

  for(let i=0;i<array.length;i++){
    array2.push([array[i]]);    
  }

  //スプレッドシートに出力する前に、array2が二次元配列になっていることをログ出力で確認する
  console.log(array2);

}

出力結果です。

手順6:スプレッドシートのC2から始まる黄色いセル1,000行分に格納する

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

C2は(2,3)で、行数1,000はarray2.lengthの配列の長さが使えます。
(2,3,1000)と(2,3,array2.length)は同意です。
列数1の分(2,3,1000,1)の1は省略可能です。

元の数値を分割して配列に格納したので数値は複数になり、setValuesはsが付く複数形です。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');

  const array2=[];

  for(let i=0;i<array.length;i++){
    array2.push([array[i]]);    
  }

  console.log(array2);

  //スプレッドシートのC2(2,3)から始まる黄色いセル1000行分出力する
  ss.getRange(2,3,array2.length).setValues(array2);

}

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

<出力結果_前半>

<出力結果_後半>

GASは以上です。

※ この記事の作成に参考になったサイトです ※
ありがとうございます。

Python「rstrip() メソッド」で文字列の右端を整えよう!
Python mapの使い方


お疲れ様でした。ブレイクタイムPhotoは、

マクセルアクアパーク品川の水槽を泳ぐ涼しげ魚たちです。

←前の問題へ          標準入力その6へ→

ご精読有難うございました。

■ GASの入門書の紹介です ■

詳解! Google Apps Script完全入門 [第3版]
単行本
Kindle版(電子書籍)

■ 関連記事 ■

paizaレベルアップ問題集「標準入力6」へ戻る
paizaレベルアップ問題集_PythonとGASのコード紹介トップページへ

写真クリエイターとしての活動
自己紹介