發表文章

目前顯示的是有「NARS2000」標籤的文章

以APL計算黃金比例

圖片
APL 語言之中,有一個運算子"power"可以幫助計算數學中的黃金比例。 APL 表達式幾乎與數學定義一樣漂亮、簡潔: 沒錯,只有7個 unicode 字元的表達式,便計算出黃金比例。對數論稍有認識的同仁,也許知道黃金比例的連續分數是: (圖片連結自 維基百科 ) 其定義不太明顯地使用了遞迴,以一般編程語言表現的話大概離不開: def phi(N): return 1 + (1 % phi(N)) end 根據數論,無理數只能以無限連續分數表達,即上面圖示中的 "..." 應該無窮盡地延伸下去,才為之正確的黃金比例。而上述函數定義亦導致無限遞迴,定義上雖然沒有錯,但運作上會導致 stack overflow,很難說是正確的程式。 那麼,APL 是如何僅憑十個字元計算出黃金比例呢?或者首先應該問:APL 返回的值正確嗎?以下係 Wolfram 所給的黃金比例的小數約數: 1.618033988749894848204586834365638117720309179805762862135... 而 APL 給出的值(使用 NARS2000 實作): 1.618033988749894 可見小數點後16個位被截斷 (truncate) 了,而小數點後1至15位都脗合。先撇除電腦表達、顯示浮點值的複雜問題, 1.618033988749894應該是可接受的約數。 下一個問題:APL 表達式是如何達致遞迴?秘訣在於 ⍣ 稱呼作"power"的運算子。 表達式 {1+1÷⍵}⍣≡1 中, ⍣ 的作用是 呼叫 {1+1÷⍵} 1 結果為整數2,與原先的參數(整數1)以函數 ≡ 比較 2≡1 返回整數0亦即布林值false 如果上一步得出結果為布林值true,則以整數2為答案,否則繼續下一步 返回第一步,以整數2作為輸入 也許將 ≡ 函數替換成先把左、右參數列印的匿名函數會比較容易理解: ...

Dyalog APL比賽-2019年-Phase 1-第2題

圖片
先看看題目要求: 這是相對容易的一條題目吧,以下用 NARS2000 解題。 題目要求寫一個函數Z,當Z被輸入引數 N(0至100)的時候,傳回相對應的字母評級,就好似小學生的考試評級一樣。 思路非常簡單:建立字母陣列V,V 由65個F(0分至64分)、5個D(65分至69分)、10個 C(依此類推)、10個B及11個A順序組成;然後用N做陣列V的指數,返回V[N+1]的值。用圖像表示: 提交的程式碼如下: 解說一下: 表達式 (65 5 10 10 11)/'FDCBA' 用 replicate 函數 " /"  建構陣列 V 於是陣列 V  由65個  F ,5個  D ,10個  C ,10個  B ,11個  A  組成 基於右引數 ⍵ ,提取V的第 ⍵+1 個元素(何以?因為 Z 0 要傳回 V 的第 1 個元素,而 Z 100 則需要傳回V的第 101 個元素,如此類推) 注意,這個寫法容許 ⍵ 係 陣列 ,也是題目的要求。例如: APL 的簡潔總是給人一種不能言喻的美感。 一項更正: 原文介紹 " / " 時把它稱作運算子,但在以上用法中,其作用應為函數。