From b2538b4b1975b200260651193a65e67aedbd2329 Mon Sep 17 00:00:00 2001 From: Adrian Mariano Date: Tue, 17 Mar 2020 22:01:21 -0400 Subject: [PATCH] nonrecursive rewrite of unique_count() --- arrays.scad | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/arrays.scad b/arrays.scad index 7a4acb74..18e80910 100644 --- a/arrays.scad +++ b/arrays.scad @@ -797,17 +797,11 @@ function unique(arr) = // Arguments: // arr = The list to analyze. function unique_count(arr) = - assert(is_list(arr)||is_string(list)) - len(arr)==0 ? [[],[]] : - len(arr)==1 ? [arr,[1]] : - _unique_count(sort(arr), ulist=[], counts=[], ind=1, curtot=1); - -function _unique_count(arr, ulist, counts, ind, curtot) = - ind == len(arr)+1 ? [ulist, counts] : - ind==len(arr) || arr[ind] != arr[ind-1] ? _unique_count(arr,concat(ulist,[arr[ind-1]]), concat(counts,[curtot]),ind+1,1) : - _unique_count(arr,ulist,counts,ind+1,curtot+1); - - + assert(is_list(arr) || is_string(arr)) + let( arr=sort(arr) ) + let(ind = [0,for(i=[1:1:len(arr)-1]) if (arr[i]!=arr[i-1]) i]) + [select(arr,ind), + deltas(concat(ind,[len(arr)]))]; // Section: List Iteration Helpers