mirror of
				https://github.com/janet-lang/janet
				synced 2025-10-31 15:43:01 +00:00 
			
		
		
		
	Merge pull request #1283 from primo-ppcg/mean-partition
Update `partition`, `mean`
This commit is contained in:
		| @@ -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) |  | ||||||
|  |  | ||||||
| ### | ### | ||||||
| ### | ### | ||||||
|   | |||||||
| @@ -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") | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Calvin Rose
					Calvin Rose