2024年5月18日
Scheme の (< 1 2 3 4 5)
のように、関係演算子を順に適用した結果の論理積を求めるような Excel ワークシート関数 _forAllAdjPair
を作ってみた。
_forAllAdjPair
関数
第1引数 | 関係演算子(関数)を指定する。 |
第2引数 | 配列(関数で生成した配列でもいいし、ワークシート上のセル範囲でもいい)を指定する。 |
評価値 | 第1引数の配列を TOCOL で1次元にしたリストで、隣接するデータを関係演算子に当てはめて、その結果の AND がこの関数の値である。比較するデータの個数が2個未満の場合は #N/A になる。
|
=LET(
_forAllAdjPair,
LAMBDA(_関係演算子,_データ配列,
LET(
_データ配列_直列, TOCOL(_データ配列),
IF(ROWS(_データ配列_直列)<2,
NA(),
AND(
BYROW(
HSTACK(
DROP(_データ配列_直列, -1),
DROP(_データ配列_直列, 1)),
LAMBDA(_r, _関係演算子(INDEX(_r,1,1), INDEX(_r,1,2)))))))),
_forAllAdjPair関数を使う数式をここに書く
)
SEQUENCE
関数を使う別バージョンも...(こっちの方が高速かも?)
=LET(
_forAllAdjPair,
LAMBDA(_関係演算子,_データ配列,
LET(
_データ配列_直列, TOCOL(_データ配列),
_データ配列_個数, ROWS(_データ配列_直列),
IF(_データ配列_個数<2,
NA(),
AND(
MAP(SEQUENCE(_データ配列_個数-1),
LAMBDA(_i,
_関係演算子(
INDEX(_データ配列_直列, _i),
INDEX(_データ配列_直列, _i+1)))))))),
_forAllAdjPair関数を使う数式をここに書く
)
使用例: 数値配列のすべての値が同じであることを確認する。
_関係演算子
として LAMBDA(_x,_y, _x=_y)
を指定する。(=
の代わりに EXACT
を使えば文字列リストでもこれが使える。)
=LET(
_forAllAdjPair,
~上記の定義~,
_forAllAdjPair(LAMBDA(_x, _y, _x=_y), {3.14, 3.14, 3.14, 3.14})
)
使用例: 数値配列が昇順であることを確認する。
_関係演算子
として LAMBDA(_x,_y, _x<=_y)
を指定する。
=LET(
_forAllAdjPair,
~上記の定義~,
_forAllAdjPair(LAMBDA(_x, _y, _x<=_y), {1, 1, 2, 3, 5, 8, 13, 21, 34})
)