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.

Était-ce utile?

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 |

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top