1
0
mirror of https://github.com/janet-lang/janet synced 2024-12-26 00:10:27 +00:00

Merge pull request #1283 from primo-ppcg/mean-partition

Update `partition`, `mean`
This commit is contained in:
Calvin Rose 2023-09-09 10:30:11 -05:00 committed by GitHub
commit e69954af2f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 11 deletions

View File

@ -643,7 +643,12 @@
(defn mean (defn mean
"Returns the mean of xs. If empty, returns NaN." "Returns the mean of xs. If empty, returns NaN."
[xs] [xs]
(/ (sum xs) (length xs))) (if (lengthable? xs)
(/ (sum xs) (length xs))
(do
(var [accum total] [0 0])
(each x xs (+= accum x) (++ total))
(/ accum total))))
(defn product (defn product
"Returns the product of xs. If xs is empty, returns 1." "Returns the product of xs. If xs is empty, returns 1."
@ -1730,20 +1735,28 @@
ret)) ret))
@[])) @[]))
(defn- partition-slice
[f n ind]
(var [start end] [0 n])
(def len (length ind))
(def parts (div len n))
(def ret (array/new-filled parts))
(forv k 0 parts
(put ret k (f ind start end))
(set start end)
(+= end n))
(if (< start len)
(array/push ret (f ind start)))
ret)
(defn partition (defn partition
``Partition an indexed data structure `ind` into tuples ``Partition an indexed data structure `ind` into tuples
of size `n`. Returns a new array.`` of size `n`. Returns a new array.``
[n ind] [n ind]
(var i 0) (var nextn n) (cond
(def len (length ind)) (indexed? ind) (partition-slice tuple/slice n ind)
(def ret (array/new (math/ceil (/ len n)))) (bytes? ind) (partition-slice string/slice n ind)
(def slicer (if (bytes? ind) string/slice tuple/slice)) (partition-slice tuple/slice n (values ind))))
(while (<= nextn len)
(array/push ret (slicer ind i nextn))
(set i nextn)
(+= nextn n))
(if (not= i len) (array/push ret (slicer ind i)))
ret)
### ###
### ###

View File

@ -349,6 +349,13 @@
"sort 5") "sort 5")
(assert (<= ;(sort (map (fn [x] (math/random)) (range 1000)))) "sort 6") (assert (<= ;(sort (map (fn [x] (math/random)) (range 1000)))) "sort 6")
# #1283
(assert (deep=
(partition 2 (generate [ i :in [:a :b :c :d :e]] i))
'@[(:a :b) (:c :d) (:e)]))
(assert (= (mean (generate [i :in [2 3 5 7 11]] i))
5.6))
# And and or # And and or
# c16a9d846 # c16a9d846
(assert (= (and true true) true) "and true true") (assert (= (and true true) true) "and true true")