簡體   English   中英

在J中找到可被x和y整除的整數

[英]Finding integers divisible by x an y in J

將我的第一個J程序編寫到求解器Euler問題#1 (找到小於1000的所有自然數之和,即3或5的倍數),我得到以下解決方案:

+/(+./0=3 5|/n)#n=.i.1000

但是,我很確定有一種巧妙的方法,無需使用變量。 我試圖用叉子來重寫它,但是我看不出如何替換()之間的表達式作為應用於3 5i.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM