0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Excelワークシート関数: _forAllAdjPair -- 関係演算子をリスト全体に適用する

Last updated at Posted at 2024-05-17

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})
)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?