3

プロジェクトオイラー#1に対する私の初心者向けソリューション

+/((0=3|1+i.1000-1) +. (0=5|1+i.1000-1)) * (1+i.1000-1)

これはリファクタリングして関数に変換できることを知っています。その方法がわかりません。すべてのラボを読んで学習する必要があります。

4

2 に答える 2

9

ゼロを追加しても答えは変わらないため、「ゼロを処理する」必要はありませんi.。たとえば、1000 未満の数値のリストを生成するために使用できます。

   i. 10
0 1 2 3 4 5 6 7 8 9

|J は配列で最適に機能するため、3 と 5の剰余 ( ) を同時に求めることができるはずです。rank ( ) を使用"して、引数が剰余に与えられる方法を制御できます。

   3 5 |"0 1 i. 10
0 1 2 0 1 2 0 1 2 0
0 1 2 3 4 0 1 2 3 4

は、右の引数を一度に 1 行ずつ|"0 1フィードしながら、左の引数を|一度に項目にフィードするように指示します。右引数は 1 行だけで構成されているため、左引数項目のそれぞれに繰り返し供給されます。

0=これで、配列全体に対して次のことができます。

   0 = 3 5 |"0 1 i. 10
1 0 0 1 0 0 1 0 0 1
1 0 0 0 0 1 0 0 0 0

配列の 2 つの項目 (行) の間に OR 条件を挿入します。

  +./ 0 = 3 5 |"0 1 i. 10
1 0 0 1 0 1 1 0 0 1

リスト/ベクター内の各 1 のインデックスを取得します。

  I. +./ 0 = 3 5 |"0 1 i. 10
0 3 5 6 9

そして合計:

 +/ I. +./ 0 = 3 5 |"0 1 i. 10

23

これを明示的な関数/動詞にするのはかなり簡単です。

   euler1=: verb define
+/ I. +./ 0 = 3 5 |"0 1 i. y
)

または、暗黙の J のコツをつかんだら、次のように定義できます。

   euler1=: +/@I.@(+./)@(0 = 3 5 |"0 1 i.)
于 2011-10-01T03:36:32.753 に答える
1
  • リファクタリング0=(プログラムサイズが大きくなります)

+/((3|1+i.1000-1)+.&(0=])5|1+i.1000-1)*1+i.1000-1

  • リファクタリング1+i.1000-1

+/(((3|])+.&(0=[)5|])1+i.1000-1)*1+i.1000-1

  • 1+i.1000-1再度リファクタリング

+/(*(3|])+.&(0=[)5|])1+i.1000-1

これまでリファクタリングできなかったのは|演算子だけです

于 2009-10-12T18:30:19.380 に答える