[英]Finding integers divisible by x an y in J
將我的第一個J程序編寫到求解器Euler問題#1 (找到小於1000的所有自然數之和,即3或5的倍數),我得到以下解決方案:
+/(+./0=3 5|/n)#n=.i.1000
但是,我很確定有一種巧妙的方法,無需使用變量。 我試圖用叉子來重寫它,但是我看不出如何替換()之間的表達式作為應用於3 5
和i.1000
的動詞。 有人可以幫我嗎?
為了參數化這兩個值,並泛化成二進式動詞,我們需要將每個參數傳遞到需要它們的地方。 我們可以從這個分支開始,着眼於實際需要3 5
的唯一點:
3 5 ([ |/ i.@]) 1000
在整個程序中,我們需要將整數列表放在兩個位置。 名稱( n
)使我們可以輕松地在兩個地方使用該列表。 為了快速完成整個程序,在編寫此代碼時,我首先對列表進行了兩次計算:
3 5 ([: +/ i.@] # [:+./ 0= [ |/ i.@]) 1000
這樣可以成功地將您的整個程序短語化為二元動詞,但是使用i.
存在一些缺點i.
出現兩次。 通過使其成為叉子的正確尖齒,我們可以將其提取僅發生一次。 該分叉的中心是一個新的內部動詞。
3 5 ([: +/ [ (] # [:+./ 0= [ |/ ]) i.@]) 1000
NB. ___________________ new "inner" verb, parenthesized
該內部動詞需要接受3 5
作為自變量,因此我將最外面的動詞的左側自變量作為該內部動詞的左側自變量。 這意味着內部動詞中的Left( [
)引用最外面的參數時,其值與先前版本中的相同。 在這個新動詞中,Right( ]
指整數列表,出現在i.@]
之前出現的兩個位置。
附言:正如您在評論中所顯示的, [ |/ ]
簡化為|/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.