5.3. 2-modifiers

    5⊑•type∘•BQN∘⋈¨⊸⊔∧"+-×÷⋆√⌊⌈∧∨¬|≤<>≥=≠≡≢⊣⊢⥊∾≍⋈↑↓↕«»⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!˙˜∘○⊸⟜⌾⊘◶⎊⎉˘⚇¨⌜⍟⁼´˝`"
"∘⊘⊸⌾⍟⎉⎊○◶⚇⟜"

Try it online⌨️

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" ⟩ ⟩

Try it online⌨️

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

Try it online⌨️

   Merge ← {𝕩+𝕨×⌈⌾(10⊸⋆⁼)𝕩}
   ⊢+×⟜(⌈⌾(10⊸⋆⁼))        # point-free version

•_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   "⎊"
           ┘