2016-06-21 6 views
3

裂け目は、コードの重複を最小限にするための非常に便利なコンビネータです。私はAbundant, Perfect, Deficient numbersを分類するとします:「実行時に計算値にクリーブを適用することはできません」ので実行時の計算値を切り捨てますか?

USING: arrays assocs combinators formatting io kernel math 
math.order math.primes.factors math.ranges sequences ; 
IN: adp 

CONSTANT: ADP { "deficient" "perfect" "abundant" } 

: proper-divisors (n -- seq) 
    dup zero? [ drop { } ] [ divisors dup length 1 - head ] if ; 

: adp-classify (n -- a/d/p) 
    dup proper-divisors sum <=> 
    { +lt+ +eq+ +gt+ } ADP zip 
    H{ } assoc-clone-like at ; 

: range>adp-classes (n -- seq) 
    1 swap 1 <range> [ adp-classify ] map 
    ADP dup 
    [ 
    [ 
     [ = ]  curry 
     [ count ] curry 
    ] map 
    cleave 3array 
    ] dip 
    swap zip H{ } assoc-clone-like ; 

: print-adp-stats (seq --) 
    ADP [ 
    [ dup [ swap at ] dip swap "%s: %s" sprintf ] curry 
    ] map cleave 
    [ print ] [email protected] ; 

range>adp-classesはコンパイルされません。

私は、劈開を使用できない場合は、私は基本的にしなければならない。

[ [ [ "deficient" = ] count ] 
    [ [ "abundant" = ] count ] 
    [ [ "perfect" = ] count ] 
    tri 
] dip 

ラメと長く、キー文字列の配列が長かった場合、本当に醜いと長くなるだろうどの。また、キーの配列が実行時に生成される場合、重要なことに、切断せずに実行することは不可能です。 print-adp-statsのための同様

cleaveせずに私は、このリテラルが私の元に転がっていなければならないでしょう:

{ 
    [ "deficient" dup [ swap at ] dip swap "%s: %s" sprintf ] 
    [ "perfect" dup [ swap at ] dip swap "%s: %s" sprintf ] 
    [ "abundant" dup [ swap at ] dip swap "%s: %s" sprintf ] 
} 

グロス。

cleaveを実行時の計算値に置き換えるコンビネータはありますか?実行時に計算を許可しながら、醜い複製を他の方法で最小化することはできますか?

答えて

2

cleaveここで正しい答えではない可能性があります。 Factorがと表示されている場合、ランタイム計算値に何かを適用できないことがよくあります。ここではcleaveをヒストグラムに置き換えたいと思います。

IN: scratchpad 100 [ { "abundant" "deficient" "perfect" } random ] replicate 
    histogram 

--- Data stack: 
H{ { "deficient" 33 } { "perfect" 30 } { "abundant" 37 } } 
関連する問題