質問

Project Euler に対する私の初心者ソリューション #1

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

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

役に立ちましたか?

解決

あなたがちょうど1000年の下の数字のあなたのリストを生成するためにi.を使用できるようにゼロを追加すると、答えは変更されませんので、「ゼロを扱う」する必要はありません例えばます:

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

Jは、あなたが同時に3と5の残基(|)を求めることができるはずですので、あなたは引数が残留物に供給される方法を制御するためにランク(")を使用することができる配列で最適に動作します:

   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

|"0 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.)

他のヒント

  • リファクタリング 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

これまでのところリファクタリングできなかった唯一のことは、 | オペレーター

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top