Frage

Meine Neuling Lösung Projekt Euler # 1

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

Ich weiß, dass dieser Refactoring werden kann, und in eine Funktion umgewandelt, ich weiß nicht, wie es zu tun, und ich hätte all Labors zu lesen, es zu lernen.

War es hilfreich?

Lösung

Es ist nicht notwendig, um „Griff Null“, weil Null Zugabe wird die Antwort nicht ändern, so dass Sie nur i. verwenden können Sie Ihre Liste von Zahlen unter 1000, zum Beispiel zu generieren:

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

arbeitet J am besten mit Arrays so sollten Sie in der Lage sein, den Rückstand zu fragen (|) von 3 und 5 zur gleichen Zeit, können Sie Rang verwenden (") zu steuern, wie die Argumente Rückstand zugeführt werden:

   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

Die |"0 1 sagt das linke Argument zu füttern ein-Punkt-at-a-time | während der richtigen Argumente ein-line-at-a-time-Fütterung. Da das einzig richtige Argument einer Zeile besteht, wird es immer wieder zu jedem der linken Argumente Elemente zugeführt werden.

Jetzt können wir die 0= auf das ganze Feld tun:

   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

Insert eine ODER-Bedingung zwischen den beiden Elementen (Zeilen) des Arrays:

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

Ermittelt den Index jedes 1 in der Liste / Vektor:

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

Und Summe:

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

23

Sie können dies eine explizite Funktion machen / Verb ziemlich leicht:

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

Oder wenn man den Dreh von implizitem J bekommen könnten Sie definieren:

   euler1=: +/@I.@(+./)@(0 = 3 5 |"0 1 i.)

Andere Tipps

  • Umgestalten 0= (wird erhöht die Programmgröße)

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

  • Umgestalten 1+i.1000-1

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

  • Umgestalten 1+i.1000-1 wieder

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

Das einzige, was ich nicht so weit Refactoring könnte, ist der | Operator

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top