このコーナーでは、学習コンテンツpaizaのレベルアップ問題集の中から気になった問題をPythonとGASの両方で解いてみます。
paizaでの回答はPythonで行いましたが、この記事ではPythonのコードと共に、同じ問題を現在学習中のGASだったらどう解くのか、スプレッドシートでバインドして作ってみました。
問題文URL:部分配列 (paizaランク D 相当)
配列arrayは、array=[1,2,3,4,5]で、この配列のA番目からB番目までの部分配列を作ります。
Aが2、Bが4だとしたら、部分配列は[2,3,4]になります。
また、配列の要素数はNで、この場合はN=5です。
まず、Pythonで解いてみます。
入力例
1行目 A,B,N
2行目 配列array
具体例
1行目 2,4,5
2行目 1,2,3,4,5
出力
2
3
4
解き方
手順として、
1.A,B,Nを読み込む
2.配列aを読み込む
3.ループの中でスライスを使って部分配列を出力する
コードを見てみましょう。
手順1:A,B,Nを読み込む
A,B,N=map(int,input().rstrip().split(‘ ‘))
手順2:配列aを読み込む
a=list(map(int,input().rstrip().split(‘ ‘)))
手順3:ループの中でスライスを使って部分配列を出力する
for num in array[A-1:B]:
print(num)
スライスを使っている部分は、A=2番目はインデックス1、B=4番目はインデックス3になります。
なので、array[1:4]とすると、array[1]、array[2]、array[3]が出力されます。
[1:4]の4とすると、4より小さい3までの処理になります。
A=2、B=4を[1:4]にするには、array[A-1:B]です。
Pythonの全コードです。
#A番目、B番目、配列の要素数Nを読み込む
A,B,N=map(int,input().rstrip().split(' '))
#配列arrayを読み込む
array=list(map(int,input().rstrip().split(' ')))
#部分文字列をスライスを使って表示する
for num in array[A-1:B]:
print(num)
では、同じ問題をGASで解いてみます。
まず、スプレッドシートにこの様に配置しました。
左からA番目(2番目)をB1、左からB番目(4番目)をB2、配列の要素数N=5をB3に表示しました。
配列arrayは5行目にあり、要素交換後は8行目に出力します。
手順はこのようになります。
1:スプレッドシートからアクティブシートをアクセスする
2:左からA番目(2番目)を読み込む
3:左からB番目(4番目)を読み込む
4:配列arrayの要素数N=5を読み込む
5:配列array自体を読み込む
6:arrayの部分配列用のarray2を用意する
7.スライスを使ってarray2に部分配列を格納する
8.スプレッドシートに出力する
手順1,2,3,4:A,B,Nを読み込む
const sheet=SpreadsheetApp.getActiveSheet();
let A=sheet.getRange(1,2).getValue();
let B=sheet.getRange(2,2).getValue();
let N=sheet.getRange(3,2).getValue();
手順5:配列aを読み込む
let a=sheet.getRange(5,2,1,N).getValues();
ログを使って確認
console.log(array);
手順6:arrayの部分配列用のarray2を用意する
let array2=[];
手順7:スライスを使ってarray2に部分配列を格納する
array2[0]=array[0].slice(A-1,B);
array2をログで確認
console.log(array);
手順8:スプレッドシートに出力する
sheet.getRange(8,2,1,array2[0].length).setValues(array2);
実行結果です。8行目の黄色いセルに入っています。
GASの全コードです。
function arraySlice(){
//シートを取得
sheet=SpreadsheetApp.getActiveSheet();
//配列のA番目(左から2番目)を取得
let A=sheet.getRange(1,2).getValue();
//配列のB番目(左から4番目)を取得
let B=sheet.getRange(2,2).getValue();
//配列の要素数Nを取得
let N=sheet.getRange(3,2).getValue();
//配列arrayを取得
let array=sheet.getRange(5,2,1,N).getValues();
console.log(array);
//部分配列をarray2に入れる
let array2=[];
//スライスを使ってarray2に部分配列を格納する
array2[0]=array[0].slice(A-1,B);
console.log(array2);
//スプレッドシートに出力する
sheet.getRange(8,2,1,array2[0].length).setValues(array2);
}
お疲れ様でした。
ブレイクタイムフォトはこちらになります。
スカイツリーと河津桜
参考文献です。