2023-09-27
競技Excelチートシート
Excelの関数を使った競技プログラミングもどき「競技Excel」のためのチートシート
文字列操作系
連結
文字列の連結には演算子&を用いる.
= "hoge" & "fuga" // hogefuga
部分文字列
文字列strのi文字目からl文字分を取得するにはMID(str, i, l)と書く.
= MID("hoge", 2, 2) // og
分割
文字列を区切り文字で分割して得られる文字列の配列を取得するにはTEXTSPLIT関数を用いる.
= TEXTSPLIT("hoge,fuga,piyo", ",") // ["hoge", "fuga", "piyo"]
配列
連番の生成
SEQUENCE(行数, 列数, 初期値, 増分)で等差数列を生成することができる.
= SEQUENCE(3) // [[1], [2], [3]]
= SEQUENCE(2, 3, 0, 5) // [[0, 5, 10], [15, 20, 25]]
配列の生成
m行n列の配列を生成するにはMAKEARRAY関数を用いる.第3引数にラムダ式を指定することで,Pythonでいうリスト内包表記のように定義することできる.
= MAKEARRAY(2, 3, LAMBDA(i, j, i + j))
/*
[ [2, 3, 4],
[3, 4, 5] ]
*/
繰り返し
擬似for文
SEQUENCE関数を用いて生成した連番[[1], ..., [N]]の配列にMAP関数を適用することで,インデックスi (i = 1, ..., N)に対する処理を記述できる.
= MAP(SEQUENCE(5), LAMBDA(i, 2*i) ) // [[2], [4], [6], [8], [10]]
累積値
REDUCE関数を用いると,配列に対して累積値を得ることができる.
例えば,
LAMBDA(ARR, REDUCE(0, ARR, LAMBDA(RES, VAL, RES + VAL)))
は以下のPythonコードと等価である.
def f(ARR):
RES = 0
for VAL in ARRAY:
RES = RES + VAL
return RES
累積値の推移をまとめて配列として得るには,SCAN関数を用いる.
例えば,
LAMBDA(ARR, SCAN(0, ARR, LAMBDA(RES, VAL, RES + VAL)))
は以下のPythonコードと等価である.
def f(ARR):
RES = 0
SCN = []
for VAL in ARRAY:
RES = RES + VAL
SCN.append(RES)
return SCN