5.4 配列変形演習

基本グリフを全て抑えたのでここで演習といこう。

設問1

以下のrank = 4の配列mに対する各設問に答えよ。

    m ← ⥊⟜(↕×´)2‿3‿3‿5
┌─
┆  0  1  2  3  4
   5  6  7  8  9
  10 11 12 13 14

  15 16 17 18 19
  20 21 22 23 24
  25 26 27 28 29

  30 31 32 33 34
  35 36 37 38 39
  40 41 42 43 44


  45 46 47 48 49
  50 51 52 53 54
  55 56 57 58 59

  60 61 62 63 64
  65 66 67 68 69
  70 71 72 73 74

  75 76 77 78 79
  80 81 82 83 84
  85 86 87 88 89
                 ┘

確認

以下が成立することを確かめよ。

    n ← (∾<˘)⍟3 m    # depthを一時的に増やしながらrankを落とすことを繰り返す
    n ≡ ↕×´2‿3‿3‿5
1

なお(∾<˘)(∾´<˘)とも書ける。

問1.1

下から数えて最初のrankでencloseを行え。すなわち以下の関数F1を実現せよ。

    F1 m
┌─
╎ ⟨  0  1  2  3  4 ⟩ ⟨  5  6  7  8  9 ⟩ ⟨ 10 11 12 13 14 ⟩
  ⟨ 15 16 17 18 19 ⟩ ⟨ 20 21 22 23 24 ⟩ ⟨ 25 26 27 28 29 ⟩
  ⟨ 30 31 32 33 34 ⟩ ⟨ 35 36 37 38 39 ⟩ ⟨ 40 41 42 43 44 ⟩

  ⟨ 45 46 47 48 49 ⟩ ⟨ 50 51 52 53 54 ⟩ ⟨ 55 56 57 58 59 ⟩
  ⟨ 60 61 62 63 64 ⟩ ⟨ 65 66 67 68 69 ⟩ ⟨ 70 71 72 73 74 ⟩
  ⟨ 75 76 77 78 79 ⟩ ⟨ 80 81 82 83 84 ⟩ ⟨ 85 86 87 88 89 ⟩
                                                           ┘

問1.2

下から数えて2番目のrankでencloseを行え。すなわち以下の関数F2を実現せよ。

    F2 m
┌─
╎ ⟨  0  5 10 ⟩ ⟨  1  6 11 ⟩ ⟨  2  7 12 ⟩ ⟨  3  8 13 ⟩ ⟨  4  9 14 ⟩
  ⟨ 15 20 25 ⟩ ⟨ 16 21 26 ⟩ ⟨ 17 22 27 ⟩ ⟨ 18 23 28 ⟩ ⟨ 19 24 29 ⟩
  ⟨ 30 35 40 ⟩ ⟨ 31 36 41 ⟩ ⟨ 32 37 42 ⟩ ⟨ 33 38 43 ⟩ ⟨ 34 39 44 ⟩

  ⟨ 45 50 55 ⟩ ⟨ 46 51 56 ⟩ ⟨ 47 52 57 ⟩ ⟨ 48 53 58 ⟩ ⟨ 49 54 59 ⟩
  ⟨ 60 65 70 ⟩ ⟨ 61 66 71 ⟩ ⟨ 62 67 72 ⟩ ⟨ 63 68 73 ⟩ ⟨ 64 69 74 ⟩
  ⟨ 75 80 85 ⟩ ⟨ 76 81 86 ⟩ ⟨ 77 82 87 ⟩ ⟨ 78 83 88 ⟩ ⟨ 79 84 89 ⟩
                                                                   ┘

問1.3

下から数えて3番目のrankでencloseを行え。すなわち以下の関数F3を実現せよ。

    F3 m
┌─
╎ ⟨ 0 15 30 ⟩  ⟨ 1 16 31 ⟩  ⟨ 2 17 32 ⟩  ⟨ 3 18 33 ⟩  ⟨ 4 19 34 ⟩
  ⟨ 5 20 35 ⟩  ⟨ 6 21 36 ⟩  ⟨ 7 22 37 ⟩  ⟨ 8 23 38 ⟩  ⟨ 9 24 39 ⟩
  ⟨ 10 25 40 ⟩ ⟨ 11 26 41 ⟩ ⟨ 12 27 42 ⟩ ⟨ 13 28 43 ⟩ ⟨ 14 29 44 ⟩

  ⟨ 45 60 75 ⟩ ⟨ 46 61 76 ⟩ ⟨ 47 62 77 ⟩ ⟨ 48 63 78 ⟩ ⟨ 49 64 79 ⟩
  ⟨ 50 65 80 ⟩ ⟨ 51 66 81 ⟩ ⟨ 52 67 82 ⟩ ⟨ 53 68 83 ⟩ ⟨ 54 69 84 ⟩
  ⟨ 55 70 85 ⟩ ⟨ 56 71 86 ⟩ ⟨ 57 72 87 ⟩ ⟨ 58 73 88 ⟩ ⟨ 59 74 89 ⟩
                                                                   ┘

問1.4

下から数えて4番目のrankでencloseを行え。すなわち以下の関数F4を実現せよ。

    F4 m
┌─
╎ ⟨ 0 45 ⟩  ⟨ 1 46 ⟩  ⟨ 2 47 ⟩  ⟨ 3 48 ⟩  ⟨ 4 49 ⟩
  ⟨ 5 50 ⟩  ⟨ 6 51 ⟩  ⟨ 7 52 ⟩  ⟨ 8 53 ⟩  ⟨ 9 54 ⟩
  ⟨ 10 55 ⟩ ⟨ 11 56 ⟩ ⟨ 12 57 ⟩ ⟨ 13 58 ⟩ ⟨ 14 59 ⟩

  ⟨ 15 60 ⟩ ⟨ 16 61 ⟩ ⟨ 17 62 ⟩ ⟨ 18 63 ⟩ ⟨ 19 64 ⟩
  ⟨ 20 65 ⟩ ⟨ 21 66 ⟩ ⟨ 22 67 ⟩ ⟨ 23 68 ⟩ ⟨ 24 69 ⟩
  ⟨ 25 70 ⟩ ⟨ 26 71 ⟩ ⟨ 27 72 ⟩ ⟨ 28 73 ⟩ ⟨ 29 74 ⟩

  ⟨ 30 75 ⟩ ⟨ 31 76 ⟩ ⟨ 32 77 ⟩ ⟨ 33 78 ⟩ ⟨ 34 79 ⟩
  ⟨ 35 80 ⟩ ⟨ 36 81 ⟩ ⟨ 37 82 ⟩ ⟨ 38 83 ⟩ ⟨ 39 84 ⟩
  ⟨ 40 85 ⟩ ⟨ 41 86 ⟩ ⟨ 42 87 ⟩ ⟨ 43 88 ⟩ ⟨ 44 89 ⟩
                                                    ┘

解答

rankが違うだけの設問であるのでを使って抽象化したい。

    F1 ← (∾¨´<˘)⎉1 # または <⎉1
    F2 ← (∾¨´<˘)⎉2
    F3 ← (∾¨´<˘)⎉3
    F4 ← (∾¨´<˘)⎉4

設問2

以下の仕様を満たす関数Firstsをpoint freeスタイルで定義せよ。

    Firsts⟨⟨1,2,3⟩,⟨2⟩,⟨0⟩,⟨"ab","xyz"⟩,⟨""⟩⟩
⟨⟨1⟩,⟨2⟩,⟨0⟩,⟨"ab"⟩,⟨""⟩⟩        # 各要素の先頭要素のみを含むリストに変形
    Firsts⟨⟨1,2,3⟩,⟨⟩,⟨0⟩,⟨"ab","xyz"⟩,⟨⟩⟩
⟨⟨1⟩,⟨⟩,⟨0⟩,⟨"ab"⟩,⟨⟩⟩           # 各要素が空リストなら空リストのままとする

解答

     Firsts ← (0<≠)⊸/¨

設問3

以下のようなdepth=2, rank=2の配列𝕩に対して𝕨番目のフィールドが最大のindexを探すMaxAtを定義せよ。

    m ← [
        0‿"reverse"‿670‿3
        1‿"map"‿3400‿1
        2‿"search"‿370‿2
        3‿"concat"‿2118‿5
        4‿"const"‿201‿4
    ]
┌─
╵ 0 "reverse" 670  3
  1 "map"     3400 1
  2 "search"  370  2
  3 "concat"  2118 5
  4 "const"   201  4
                     ┘
    1 MaxCellBy m     # 第1要素である文字列の辞書式順序で最大
⟨ 2 "search" 370 2 ⟩
    2 MaxCellBy m
⟨ 1 "map" 3400 1 ⟩

文字列の比較が絡むと実はそう簡単ではない。

⊑∧⌾(𝕨⊸⌽˘>)𝕩

以下削除