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が違うだけの設問であるので⎉
を使って抽象化したい。
設問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 ⟩
文字列の比較が絡むと実はそう簡単ではない。
⊑∧⌾(𝕨⊸⌽˘>)𝕩
以下削除