Comment factoriser cela dans J?
-
21-09-2019 - |
Question
Ma solution débutant au projet Euler # 1
+/((0=3|1+i.1000-1) +. (0=5|1+i.1000-1)) * (1+i.1000-1)
Je sais que cela peut être refactorisé et transformé en fonction, je ne sais pas comment le faire, et je dois lire tous les laboratoires pour l'apprendre.
La solution
Il est pas nécessaire de « gérer zéro », car l'ajout zéro ne changera pas la réponse que vous pouvez simplement utiliser i.
pour générer votre liste des numéros ci-dessous 1000, par exemple:
i. 10
0 1 2 3 4 5 6 7 8 9
J fonctionne mieux avec les tableaux de sorte que vous devriez être en mesure de demander le résidu (|
) de 3 et 5 en même temps, vous pouvez utiliser le rang ("
) pour contrôler la façon dont les arguments sont introduits dans les résidus:
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
Le |"0 1
dit pour alimenter l'argument de gauche à |
un point-à-un-temps tout en alimentant les arguments droite une ligne-à-la-fois. Parce que l'argument de droite ne se compose que d'une seule ligne, il est alimenté de manière répétée pour chacun des éléments d'opérande gauche.
Maintenant, nous pouvons faire la 0=
à tout le tableau:
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
Insérer une condition OU entre les deux éléments (lignes) de la matrice:
+./ 0 = 3 5 |"0 1 i. 10
1 0 0 1 0 1 1 0 0 1
Retourne l'index de chaque 1 dans la liste / vecteur:
I. +./ 0 = 3 5 |"0 1 i. 10
0 3 5 6 9
Et somme:
+/ I. +./ 0 = 3 5 |"0 1 i. 10
23
Vous pouvez en faire une fonction explicite / verbe assez facilement:
euler1=: verb define
+/ I. +./ 0 = 3 5 |"0 1 i. y
)
Ou une fois que vous obtenez le coup de J tacite vous pouvez définir:
euler1=: +/@I.@(+./)@(0 = 3 5 |"0 1 i.)
Autres conseils
- Refactor
0=
(volonté augmente la taille du programme)
+/((3|1+i.1000-1)+.&(0=])5|1+i.1000-1)*1+i.1000-1
- Refactor
1+i.1000-1
+/(((3|])+.&(0=[)5|])1+i.1000-1)*1+i.1000-1
- Refactor
1+i.1000-1
nouveau
+/(*(3|])+.&(0=[)5|])1+i.1000-1
La seule chose que je ne pouvais pas factoriser est jusqu'à présent l'opérateur |