2023-09-27

競技Excelチートシート

Excel

Excelの関数を使った競技プログラミングもどき「競技Excel」のためのチートシート

文字列操作系

連結

文字列の連結には演算子&を用いる.

= "hoge" & "fuga"   // hogefuga

部分文字列

文字列stri文字目から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]]

配列の生成

mn列の配列を生成するには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