スピル配列を使って一つの式でデカルト積を作る on Microsoft Excel

Abusing the Power of MS Excel More Aggressively

=LET(
  data, A1:F5,
  M, ROWS(data),
  N, COLUMNS(data),
  r, SEQUENCE(N^M,,0),
  c, SEQUENCE(1,M,0),
  idx, MOD(INT(r / N^(M-1-c)), N),
  cartesian, INDEX(data, c+1, idx+1),
  filtered, FILTER(cartesian, BYROW(cartesian, LAMBDA(X, NOT(OR(ISNA(X)))))),
  p_1, CHOOSECOLS(filtered,1),
  p_2, CHOOSECOLS(filtered,2),
  p_3, CHOOSECOLS(filtered,3),
  p_4, CHOOSECOLS(filtered,4),
  p_5, CHOOSECOLS(filtered,5),
  very_smart_calculation, p_1+p_2-p_3/IF(p_4<=0,1,p_4)^p_5,
  stats, LAMBDA(X, HSTACK(MIN(X), MEDIAN(X), MAX(X)))(very_smart_calculation),
  stats
)

Microsoft Excel Onlineにおいて与えられたすべてのパラメタの組み合わせからある計算を行い、結果の最小値、中央値、最大値を計算する単一セルの式

Original Document

How to build a cartesian product from vectors in a single formula with spilled array.

スピル配列を使って一つの式でデカルト積を作る

複数の行ベクタからなる集合のデカルト積(直積集合)を構築したいとき、スピル配列のおかげで以下の式を使えば出来る。新しめのExcelが必要かも。入力ベクタの列数は揃っていなくても動作する。もちろん入力はVSTACKを使って構築してもいいし、可能ならスピル範囲演算子を使ってもよい。入力データにカンマが含まれている場合は、 &","&とTEXTSPLIT(B,",") の両方のカンマをなんか適当な文字に置き換えて使うことができる。

=LET(
INPUT, A1:M2,
CARTESIAN_PRODUCT, DROP(REDUCE("",REDUCE(TRANSPOSE(CHOOSEROWS(INPUT,1)), SEQUENCE(ROWS(INPUT)-1,,2),LAMBDA(X,Y, TOCOL(X &","&CHOOSEROWS(INPUT,Y)))),LAMBDA(A,B, VSTACK(A,TEXTSPLIT(B,",")))),1),
FILTER(CARTESIAN_PRODUCT,BYROW(CARTESIAN_PRODUCT="",LAMBDA(X,NOT(OR(X)))))
)

例

直積集合 - Wikipediaの例を用いる。

Input:

♠ ♣ ♥ ♦                  
1 2 3 4 5 6 7 8 9 10 11 12 13

(♠がA1セルにあるとする)

Output:

Suits Ranks
♠ 1
♠ 2
♠ 3
♠ 4
♠ 5
♠ 6
♠ 7
♠ 8
♠ 9
♠ 10
♠ 11
♠ 12
♠ 13
♣ 1
♣ 2
♣ 3
♣ 4
♣ 5
♣ 6
♣ 7
♣ 8
♣ 9
♣ 10
♣ 11
♣ 12
♣ 13
♥ 1
♥ 2
♥ 3
♥ 4
♥ 5
♥ 6
♥ 7
♥ 8
♥ 9
♥ 10
♥ 11
♥ 12
♥ 13
♦ 1
♦ 2
♦ 3
♦ 4
♦ 5
♦ 6
♦ 7
♦ 8
♦ 9
♦ 10
♦ 11
♦ 12
♦ 13

参考にしたサイト (Excel)TEXTSPLIT関数をスピル(複数のテキストに適用)させる - いきなり答える備忘録

Excelってすげぇや。

Posted by squeuei, licensed under CC BY 4.0 except where otherwise noted.
Published:
Updated: