2011-07-18 7 views
4

この命令的な関数を、K(またはQ)のような機能的な配列ベースの言語で表現するにはどうすればいいですか?ずさんなC++のでK(またはQ)のような機能的な配列ベースの言語で、この命令的な関数をどのように表現できますか?

vector<int> x(10), y(10); // Assume these are initialized with some values. 

// BTW, 4 is just a const -- it's part of the algorithm and is arbitrarily chosen. 

vector<int> result1(x.size() - 4 + 1); // A place to hold a resulting array. 
vector<int> result2(x.size() - 4 + 1); // A place to hold another resulting array. 

// Here's the code I want to express functionally. 
for (int i = 0; i <= x.size() - 4; i++) { 
    int best = x[i + 0] - y[i + 0]; 
    int bad = best; 
    int worst = best; 
    for(int j = 0; j < 4; j++) { 
     int tmp = x[i + j] - y[i + 0]; 
     bad = min(bad, tmp); 
     if(tmp > best) { 
      best = tmp; 
      worst = bad; 
     } 
    } 
    result1[i] = best 
    result2[i] = worst 
} 

私が最もkdbとQでこれを見たいのですが、他の関数型言語は歓迎されています。 ClojureLispの方言)で

+2

このコードは何をしようとしていますか? –

+0

これは2つのことを計算しようとしています:まず、xの各ポイントで、次の4つの要素の最大値を求めます(Px = 0..3の位置PxでこのNx = max xの各点で、次のPx点に対して最小値を求めます。 – Badmanchild

答えて

5

(オープンソースK方言):Clojureの溶液と同じものを使用

まず、設定いくつかの例の値():次に

a:1+!8;b:8#0  /a is 1..8, b is eight 0s 

及びB

{(|/x;&/x)}@+{4#y _ x}[a+b;]'!#a 

いるあなたxとyの変数。 (Kは変数x、yおよびzのための特殊なケースを作る。)

もう少しそれを破壊する:Q収量への@ silentbicycleのK直接

maxmin:{(|/x;&/x)}/(max;min) pairs of x 
get4:{4#y _ x} /next 4 from x, starting at y 
        /with <4 remaining, will repeat; doesn't matter for min or max 
/maxmin applied to flipped results of get4(a-b) at each index 0..(length a)-1 
[email protected]+get4[a-b;]'!#a 

/result 
(4 5 6 7 8 8 8 8 
1 2 3 4 5 6 7 8) 
2

(defn minmax [x y](map #(vector (- (apply max %1) %2) (- (apply min %1) %2)))(partition-all 4 1 x) y) 

(minmax [1 2 3 4 5 6 7 8] [0 0 0 0 0 0 0 0]) 

[(4 1]〜[5 2] [6 3] [7 4] [8 5] [8を与えます6] [8 7] [8,8]) `出力として(その1、その2).. Konaでそして

(map #(first %1) result) is result1 
(map #(last %1) result) is result2 
4

移植を

q)a:1+til 8 
q)b:8#0 
q){(max x;min x)}flip{4#y _ x}[a+b;]each til count a 
4 5 6 7 8 8 8 8 
1 2 3 4 5 6 7 8 

もう少しベクトル化(imao):

q){(max;min)@\:flip 4#'(til count x)_\:x+y}[a;b] 
4 5 6 7 8 8 8 8 
1 2 3 4 5 6 7 8 
関連する問題