paiza レベルアップ問題集 標準入力その3「FINAL問題 【半角スペース区切りの入力】半角スペース区切りの 1,000 個の入力」をPythonとGASで解いたコードの紹介

この記事を読むことで、PythonとGASで空白スペースを含む1行の文字列を取得して、空白スペースの所で区切って、ループを使って1000行の文字列に出力する方法が学べます。

また、GASではスプレッドシートを用いて値を取得して出力しています。
更にPythonではループを基本的な書き方と内包表記の書き方の2通りで掲載します。

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

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

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

【半角スペース区切りの入力】半角スペース区切りの 1,000 個の入力 (paizaランク D 相当)

問題:文字列 s_1, s_2, … s_999, s_1000 が半角スペースで区切られて 1 行で与えられます。各文字列を出力するごとに改行し 1,000 行で出力してください。


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

手順として、

1:標準入力で空白スペースを含む文字列を区切って取得する

2:取得した文字列がリストになっていることを確認する


3:ループを使って出力する

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

今回は下記の入出力例1を用います。
(1000行は長すぎるので、このブログで入出力例を全て表示することは省かせて頂きます。)

入力例の前半と後半の一部を掲載致します。

<前半>

<後半>

Garbled CAPTCHA-style string: HEX9 LG6Dq ky7fezz pNeapDUhm hQ7rm2yyo

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

UI of a Python learning diag tool: a green rounded Run button labeled 実行 (Ctrl-Enter), a header reading 'Pythonを学ぶ | プログラミング力診断', and a large input area filled with random characters and red spellcheck underlines.

手順1で標準入力で空白文字を区切って取得します。

#標準入力で空白スペースを含む文字列を区切って取得する
s=input().split(' ')

手順2では先ほどの手順で取得した文字列を出力して、リストとして空白区切りで出力されていることを確認します。

s=input().split(' ')

#取得した文字列がリストになっていることを確認する
print(s)

出力結果です。

UI header with tabs labeled '输出 输入 评论' and a blue 0 badge, followed by a long line of single-quoted tokens like 'Fcrj', '7A...'.

手順3ではループを使って出力します。

s=input().split(' ')
#print(s) ←この行をコメントアウトする

#ループを使って出力する
for word in s:
    print(word)
Mobile app screen with a green Run button labeled 実行 (Ctrl-Enter), a tab bar showing 出力 入力 コメント and a blue 0 badge, and a text area filled with random characters.

これを内包表記を使って書いた場合のコードです。先ほどのコードと見比べると、1行になりよりシンプルなコードが書けました。

Pythonでコメントアウトする場合、1行でしたら「#(シャープ)」ですが、複数行をコメントアウトする際には、「’(シングルクォーテーション)」を3つで「”’」か、「”(ダブルクォーテーション)」を3つで「”””」を使います。
この記事では「”’」とシングルクォーテーションを使っております。

s=input().split(' ')
#print(s) 

'''
通常のループ
for word in s:
    print(word)
'''

#内包表記のループ
[print(word) for word in s]

実行結果は長いので、前半と後半に分けて掲載致します。
まずは前半です。

Mobile app screen showing a green Run button labeled 実行 (Ctrl-Enter) at top, a tab bar with 出力, 入力, コメント, and a gray text area filled with random strings.

後半です。

Mobile app screen showing a green Run button labeled 実行 (Ctrl-Enter), tabs 出力 入力 コメント, and a list of random strings such as PbrPLc and iH2nsug in a text area.

ここまでのコードから、コメントアウトの部分を削除したシンプルなコードです。

#標準入力で空白スペースを含む文字列を区切って取得する
s=input().split(' ')

#内包表記のループ
[print(word) for word in s]


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

Spreadsheet with an input header '入力' in column A and a yellow highlighted output column '出力' starting at row 3, with the blue selection handle at B3.

B1(1,2)から始まる緑色の所に入力した文字列を取得して、それをB3(3,2)から始まる黄色い所に出力します。

その際B3から始まるこの黄色く塗りつぶしたセルの所に、二次元配列として取得した文字列が格納された配列を出力します。

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

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

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

2:緑色のセルB1を取得して、空白区切り文字の所で区切って配列arrayに格納する

3:配列arrayとして格納出来たことをログ出力で確認する

4:スプレッドシートに出力するため、二次元配列として取得するarray2を宣言する

5:ループを使ってpushメソッドでarray2にarrayを二次元配列として追加する

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

7:スプレッドシートのB3から始まる黄色いセルに出力する

それでは各手順を具体的に見ていきます。

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

GASでは、「standardInput5」と言う関数にコードを書いていきます。
Standard Inputで標準入力の意味です。

const ss = SpreadsheetApp.getActiveSheet();

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

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();
  
}

手順2:緑色のセルB1(1,2)を取得して、空白区切り文字の所で区切って配列arrayに格納する

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

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();
  
  //B1(1,2)から始まる緑色のセルを配列arrayに取得する
  const array=ss.getRange(1,2).getValues().split(' ');

}

手順3:配列arrayに格納出来たことをログ出力で確認する

console.log(array);

function standardInput5() {

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

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

}

Execution start header in Japanese with a console message: Logging output too large. Truncating output, followed by a list of short codes.

手順4:スプレッドシートに出力するため、二次元配列として取得するarray2を宣言する

let array2 = [];

手順5:ループを使ってpushメソッドでarray2にarrayを二次元配列として追加する

function standardInput5() {

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

  //二次元配列を宣言
  const array2=[];

  //ループを使ってpushメソッドでarray2にarrayを二次元配列として追加する
  for(let i=0;i<array.length;i++){
    array2.push([array[i]]);
  }
}

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

console.log(array2);

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(1,2).getValue().split(' ');
  //console.log(array); ←ここ、コメントアウトする

  const array2=[];

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

  //スプレッドシートに出力する前に二次元配列として格納されていることをログ出力で確認する
  console.log(array2);

}

Execution started: a pale banner and a console log stating 'Logging output too large. Truncating output.' followed by a vertical list of short quoted codes like 'FCrj', '7A7SbR9i', 'S', 'Pza', etc.

手順7:スプレッドシートの黄色いセルB3(3,2)に出力する

ss.getRange(3,2,s2.length).setValues(array2);

コードと実行結果です。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(1,2).getValue().split(' ');
  //console.log(array); ←ここ、コメントアウトする

  const array2=[];

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

  console.log(array2);

  //スプレッドシートの黄色いセルB3から二次元配列の長さ分を出力する
  ss.getRange(3,2,array2.length).setValues(array2);

}

実行後のスプレッドシートですが、長いので前半と後半に分けて掲載致します。

まずは前半です。

Spreadsheet with Japanese labels: top input row labeled 入力 containing a long string, and a yellow-highlighted column labeled 出力 with a vertical list of short alphanumeric tokens.

後半です。

Spreadsheet column with yellow highlighted cells under the header 入力, showing a vertical list of random codes.

(入力データのある1行目は、行固定をしています。行番号を選択して、表示メニューの表示→固定から行1までを選んでいます。)


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

Blue illuminated crystal chandelier hanging in a glass-walled atrium, glowing vividly at night.

クリスマスシーズンに訪れた「恵比寿ガーデンプレイス」の、フランスのクリスタルメーカー「バカラ」のシャンデリアのクールなブルーです。

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

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

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

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

■ 関連記事 ■

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

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

投稿者アバター
nekosiestr
いつもブログをご覧頂きまして、誠に有難うございます。 Excelやデータベース、プログラミングを学習する傍ら、趣味で写真を撮影してPhotoshopで編集しております。

投稿者: nekosiestr

いつもブログをご覧頂きまして、誠に有難うございます。