2017-10-09 116 views
2
v=: ((1 2);(3 4);(0 5);<(2 1)) 
d =: (1,0.5,1,0.25);(0.5,1,0.75,0.25);(1,0.75,1,0);(0.75,0.25,0,1) 
force=:(v ((0{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(0{d) 
force=:(v ((1{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(1{d) 
force=:(v ((2{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(2{d) 
force=:(v ((3{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(3{d) 
force=:(v ((4{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(4{d) 
force=:(v ((y{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(y{d) 

鑑於v和d, 的力第一列給出了我們第(n + 1)個向量從訴定義Monad函數?

的力第二列給出了我們從V的每個向量。

的力第三列給我們兩個向量之間的常量。

也就是說,(1 2);(1 2)會在第3列有1列,但(1 2);(3 4)可能不是。 我想打一個單子函數,它給了我們

force=:(v ((1{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(1{d)

如果我們輸入force_constant 1

force=:(v ((2{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(2{d)

如果我們輸入force_constant 2

有人能幫忙嗎?

回答

4

你已經自己寫了大部分。只要把你的force最終版本,您使用y寫了一個,並在一個明確的定義把它包:

v =: ((1 2);(3 4);(0 5);<(2 1)) 
    d =: (1,0.5,1,0.25);(0.5,1,0.75,0.25);(1,0.75,1,0);(0.75,0.25,0,1) 

    force_constant =: monad def '(v ((y{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(y{d)' 

    force_constant 1 
+---+---+----+ 
|3 4|1 2|0.5 | 
+---+---+----+ 
|3 4|3 4|1 | 
+---+---+----+ 
|3 4|0 5|0.75| 
+---+---+----+ 
|3 4|2 1|0.25| 
+---+---+----+ 

    force_constant 2 
+---+---+----+ 
|0 5|1 2|1 | 
+---+---+----+ 
|0 5|3 4|0.75| 
+---+---+----+ 
|0 5|0 5|1 | 
+---+---+----+ 
|0 5|2 1|0 | 
+---+---+----+ 

現在,這一提法取決於名詞v和正在全球範圍內定義d。你可能會考慮改變它,所以force_constant或相關的動詞將這些數組作爲輸入。最簡單的方法是將monads更改爲二元組,並讓vd作爲左參數x ¹。


¹ 但我們可以把它簡單的現在。如果您需要更多關於代碼的反饋,請隨時在http://codereview.stackexchange.com/上發佈。

+1

我想丹的建議你調查代碼審查。舉一個例子,這個版本是對上述動詞的純粹簡化,沒有研究默認或提供'v'&'d'作爲參數:'force_constant =:monad def'((y {v),.v),。 <"0 > y {d' – Tikkanz

+0

@Tikkanz我會試着走得更遠,然後把箱子扔掉。使其成爲M x N x 2整數數組。在距離平面添加一個虛擬列('0's)以使其成爲常規。 –