2020 Dyalog APL Comp 第一部分解

因为我太菜了,虽然其实第一部分都做出来了,但也就想好第一题比较理想的 tacit 解 {(⌽⍣(⍺<0))(⍺↑⍵)(⍺↓⍵)} 显然的解。 APLcart 给了个 tacit idiom, 注意用到了 18.0 新出的 Over operator,在 17.1 只能用 $\{\alpha\; \omega\}$ Is(↑,⍥⊂↓)Y ⍝ ←→ Is (↑{⍺ ⍵}↓) Y ←→ Is {(⍺↑⍵)(⍺↓⍵)} Y 但不能直接用上去,因为在 $\alpha$ 是负数的时,结果和要求是反向的 ¯3 (↑,⍥⊂↓) 'FooBar' ┌───┬───┐ │Bar│Foo│ └───┴───┘ 这就是为啥我用了 reverse,并用 power operator 控制,对应 $\alpha <0, \alpha >0$ 两个 case。但用了 power operator 就很难转成 tacit form 了。那么上面的答案要如何写成 tacit 呢。 可以換个角度,在负数时转成正数。假设有 f 做了这个工作,那么 {(a↑⍵)((a←⍺ f ⍵)↓⍵)} ⍝ ←→ {(⍺ f ⍵)(↑,⍥⊂↓)⍵} ←→ f(↑,⍥⊂↓)⊢ 那么 f 是什么呢,是这个么?...

October 24, 2020 · LdBeth · GNU FDL

用 APL 写麻將听牌判斷 (1)--基础听牌形

首先这里不是用打表这种对于提高打牌技术没有实际意义的 baka 方法。 特殊型(国士,七对型)听牌先按下,字牌因为没有什么难度请读者自行作为课后作業。这里先只考慮由 1~9 的万,条,筒组成的牌形。 众所周知标准和牌形是由一对将+四面子组成的。听牌则有单骑,两面,嵌张。对于如下简单的情形的只要是稍会麻将的就能不难看出是听 2 5 筒的(请忽略最右的白牌)。 那么来分析一下人类玩家在看到这一手牌时做了什么样的思考,然后如何把这样的思考转化为算法。 表示法 首先,根據花色拆为 (12366 索), (345566 万), (24 索) 三组。 我们要一个在 APL 中表示手牌的方法。假设己经有做了分组,那么如上圖的手牌就可以用一个 nested array 表示 ⊢hand←(1 2 3 6 6)(3 4 5 5 6 7)(3 4) ┌─────────┬───────────┬───┐ │1 2 3 6 6│3 4 5 5 6 7│3 4│ └─────────┴───────────┴───┘ 然而这样的表示对于处理没有什么助益,所以要把每一组编码成一个长度为9的array,对应每种花色 1~9 的牌每张出现的数量。 enc←{⍺←9⊣⎕IO←1 ⋄ ((⊢∘≢⌸⍵)@(∪⍵))⍺⍴0} enc 1 2 3 6 6 1 1 1 0 0 2 0 0 0 enc¨hand ┌─────────────────┬─────────────────┬─────────────────┐ │1 1 1 0 0 2 0 0 0│0 0 1 1 2 1 1 0 0│0 0 1 1 0 0 0 0 0│ └─────────────────┴─────────────────┴─────────────────┘ 己完成的面子 在上面所示的听牌中,人类可以一眼看出三组中 345 567 万是己完成的面子,那这「一眼」中发生了什么?...

May 30, 2020 · LdBeth · GNU FDL

用 APL 写 Cellular Automaton (A NEW KIND OF SCIENCE)

⍝ CA 的原理很簡單,用 APL 的 primitive ⌺ (Stencil) 就可以表示 cell←{⍵⍪(⍺⍺⌺3),¯1↑⍵} ⍝ two-color ca 的映射 rule ← {⎕IO←0 ⋄ (2⊥⍵)⌷⌽(8⍴2)⊤⍺⍺} ⍝ three-color ca code ← {⎕IO←0 ⋄ (+/⍵)⌷⌽(7⍴3)⊤⍺⍺} ⍝from APL matrics to Netpbm format pgm ← {'P2'(⍕⌽⍴⍵)(⍕M),⍕¨↓⍵-⍨M←⌈/,⍵} 題图(code2040 size:1001×1001)生成方式 (⊂pgm ((2040 code)cell⍣1000) initi 500)⎕NPUT'a.pgm' ⍝ from shell $ pnmtopng a.pgm > z.png mobile automaton 就相当于两个 two-color ca。 不过我们可以先把 accumulator 给 abstract 出來。 acc ← {⍺←1 ⋄ ((⊢⍪(⍺⍺∘,¯1↑⊢))⍣⍺)⍵} ⍝ 这样之前的可以写成 (⊂pgm 1000 (2040 cell code acc) initi 500)⎕NPUT'a....

February 2, 2020 · LdBeth · GNU FDL

一个抽象的 binary addition 算法

∇R←DECODE N R←2⊥N ∇ ∇R←X ENCODE N R←(X⍴2)⊤N ∇ ∇R←ENCODE32 N R←(32⍴2)⊤N ∇ ∇R←ENCODE64 N R←(64⍴2)⊤N ∇ ⍝ example ⎕←A←ENCODE64 865940890845960854 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 1 0 1 0 0 1 1 0 1 1 1 1 1 0 1 1 0 1 0 1 1 0 1 1 1 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 DECODE A 8....

November 18, 2019 · LdBeth · GNU FDL

晚了三年的(划掉)计算机常识纠正-APL 和 J 和 Dyalog

看到一篇反映了一些多数人对 APL 的误解的 art,决定写点文章让更多人了解真正的 APL。 bhuztez:函数式-21天入门教程 在原始APL里,求平均数,通常的写法是 $avg\leftarrow \{(+\omega)\div\not\equiv \omega\}$ 我不知道原始的 APL 指的是啥,不过 direct definition (用 {} 定义匿名函数, $\alpha\ \omega$ 指代参数) 是 Dyalog 搞的,叫 D-function,后來改叫 dfns,然後其它如 GNU APL 仿了 Dyalog 的这个feature,而且这个实现的历史可沒那么早 你看,2010 年的 APLX1 都压根不支持 dfns。(APLX 是比較接近 APL2 的,不过 IBM 的 APL22 当然是最标准的,可惜我沒有 mainframe 可以用) 可以查到的是 These ideas were first presented in the Dyadic Vendor Forum at APL96 where they appeared to meet with general approval. Dfns were introduced with APL/W version 8....

October 15, 2019 · LdBeth · GNU FDL