문제

프로젝트 Euler #1에 대한 초보자 솔루션

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

나는 이것이 리팩토링 될 수 있고 함수로 변형 될 수 있다는 것을 알고 있으며, 어떻게 해야할지 모르겠습니다. 모든 실험실을 읽어 배워야 할 것입니다.

도움이 되었습니까?

해결책

0을 추가하면 답이 변경되지 않으므로 "0을 처리"할 필요는 없습니다. i. 예를 들어 1000 미만의 숫자 목록을 생성하려면 다음과 같습니다.

   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

배열의 두 항목 (라인) 사이에 또는 조건을 삽입하십시오.

  +./ 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