5.3. 2-modifiers
5⊑•type∘•BQN∘⋈¨⊸⊔∧"+-×÷⋆√⌊⌈∧∨¬|≤<>≥=≠≡≢⊣⊢⥊∾≍⋈↑↓↕«»⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!˙˜∘○⊸⟜⌾⊘◶⎊⎉˘⚇¨⌜⍟⁼´˝`"
"∘⊘⊸⌾⍟⎉⎊○◶⚇⟜"
Rank '⎉
'の話は書きたいと思う。
Under
Under '⌾
'も面白い。
というよりも習得必須項目である。
例えば、以下のような2要素からなるレコードのリストを第2項目で整列するにはどうしたらいいだろうか。
l ← ⟨3‿"ee",2‿"zz",0‿"oh",5‿"co",1‿"st"⟩
∧l # これは第1項目での整列
⟨ ⟨ 0 "oh" ⟩ ⟨ 1 "st" ⟩ ⟨ 2 "zz" ⟩ ⟨ 3 "ee" ⟩ ⟨ 5 "co" ⟩ ⟩
Underを使うならレコードのリストを'>
'で配列化し、キーとなる要素が先頭に来るようにRotate '⌽
'した上で '∧
'で整列し、元に戻せばいいのでこのようになる。
∧⌾(1⌽˘>)l # 1は左へのシフト回数(1なら省略可能)
⟨ ⟨ 5 "co" ⟩ ⟨ 3 "ee" ⟩ ⟨ 0 "oh" ⟩ ⟨ 1 "st" ⟩ ⟨ 2 "zz" ⟩ ⟩
Underを使わないならGrade '⍋
'を使ったこういうコードだろう。同じ文字数になる。
(⍋1⊸⊑¨)⊸⊏l # こちらの1は省略不可
注意
このソートがうまくいくのは∧
にキーが先頭に来るように並べ替えたレコード全体を渡しているからであって、
∧⌾(1⊸⊑¨)
ではキーフィールドのみが整列されてしまうので注意。
∧
は名前空間を含む配列のソートでエラーを起こすので、そのような場合はキーフィールドに対する⍋⍒
を使うしかないだろう。
また、最近思いついた応用は、ヒープデータ構造でのparcolate_up
を追加要素から根へのパス上の整列問題と捉えてUnderで実装するというものである。
d ← ∞∾•rand.Deal 16
⟨ ∞ 12 2 16 5 13 3 9 1 7 8 4 11 14 15 0 6 ⟩
1‿2‿4‿8‿16 ⊏ d # 最終要素(追加要素)からの半減添字列
⟨ 12 2 5 1 6 ⟩
∧⌾(1‿2‿4‿8‿16⊸⊏) d # 半減列のみを昇順で整列
⟨ ∞ 1 2 16 5 13 3 9 6 7 8 4 11 14 15 0 12 ⟩
∧
を使うことで\(O(\log(n))\)の問題を\(O(\log(n)\log(\log(n)))\)にしてしまっているのだが、さて差は出るだろうか?
設問
二つの正整数を以下のように合成する関数Merge
を実装せよ。
1 Merge 2
12
33 Merge 1
331
100 Merge 200
100200
123 Merge 6789
1236789
•_while_
system valueの中に唯一含められている制御構造が•_while_
である。再帰をするよりもメモリ効率がよいので是非。
count ← 0
result ← {𝕊 cnt : •Show cnt ⋄ 1+cnt}•_while_{𝕊 cnt : 5>cnt}count
•Show result
0
1
2
3
4
5
5
•Show(1+•Show)•_while_(5⊸>)0 # 上の3行から冗長な部分を全て削除
0
1
2
3
4
5
5
2-modifier glyphの出現頻度
4.3での計算を基にした2-modifiersの出現頻度は以下の通り。
•Show>>2⊏s4
┌─
╎ 3046 "⊸"
1554 "∘"
1222 "⟜"
535 "◶"
525 "⍟"
473 "⌾"
367 "○"
156 "⊘"
120 "⎉"
93 "⚇"
17 "⎊"
┘