+/" gelöst , und der Durchschnitt aller Array-Elemente ist " +/%#".
Verschiedene Rezensionen von J wurden bereits mehr als einmal auf Habré veröffentlicht. Zum Beispiel in diesem Artikel und in diesem .
J ist eine Sprache mit einer 30-jährigen Geschichte und entwickelt und verbessert sich immer noch. Es gab jedoch nur einen „weißen Fleck“ in iterativen Algorithmen mit bedingtem Stopp. Hierzu wurde vorgeschlagen, die while-Konstruktion zu verwenden. gepaart mit Pause. und fortsetzen.
Verwenden von while. in J sieht überflüssig und umständlich aus. Darüber hinaus sinkt die Geschwindigkeit im Vergleich zu stillschweigenden Formen erheblich.
Und in der 9. Version der Sprache wurde eine neue Vereinigung F hinzugefügt (benannt nach dem ersten Buchstaben des Wortes "Falte").
Zum Vergleich lösen wir das Problem mit while. und Verwenden der neuen Vereinigung Die
Bedingung ist einfach: Holen Sie sich ein neues Array aus dem ursprünglichen Array, das die doppelten Werte der Elemente enthält. Die Länge des neuen Arrays wird extern angegeben und kann geringer sein als das Original.
Zuerst mit while.
t =: dyad define
c =. 0
i =. i.x
z =. $0
while. -. c = y
do.
z =. z , (+: (c { i))
c =. >: c
end.
z
)
10 t 5
0 2 4 6 8
Und jetzt die Lösung mit der neuen Union F. Fügen wir hinzu, dass die Bedingung für das Verlassen der Schleife mit dem Verb Z überprüft wird :
COUNT =: 6
v=: dyad define
_2 Z: -.* COUNT =: <: COUNT
x
)
'' +: F:. v (i.10)
0 2 4 6 8
Die Dokumentation verspricht, dass F. nicht nur bequemer, sondern auch schneller sein wird. Schließlich kommt J den Menschen näher!
PS Fachleute können feststellen, dass dieses Problem leicht gelöst werden kann, ohne sowohl zyklische als auch neue Konstruktionen zu verwenden. Es reicht aus, ein Subarray der erforderlichen Länge zu extrahieren und dann stillschweigend zu verarbeiten. Bei realen Problemen kommt es jedoch häufig vor, dass die Länge des Subarrays nicht im Voraus bekannt ist und die Stoppbedingung während des Betriebs des Algorithmus berechnet wird.