Challenges

Cumulative Counts

+9
−0

Challenge

Given an array of numbers return the cumulative count of each item.

This is the number of times an item has occurred so far.

Examples

[1,1,2,2,2,1,1,1,3,3] -> [1,2,1,2,3,3,4,5,1,2]
[3,7,5,4,9,2,3,2,6,6] -> [1,1,1,1,1,1,2,2,1,2]


Brownie points for beating my 7 byte APL answer.

Why does this post require moderator attention?
Why should this post be closed?

+3
−0

BQN, 5 bytes

1+⊒


Try it here!

3 characters, but, as there's no SBCS codepage for BQN, it must be counted as UTF-8.

Two of the three characters are just adding one to the built-in that almost solves the challenge too.

Why does this post require moderator attention?

+3
−0

APL (Dyalog Unicode), 11 bytes (SBCS)

1 1∘⍉+\∘.=⍨


Try it online!

This was a fun APL exercise. Working on figuring out how to get it down to 7 bytes.

Why does this post require moderator attention?

+3
−0

Jelly, 4 bytes

¹Ƥċ"


Try it online!

   "    For each element of the input,
ċ     how many times does it occur in
¹Ƥ "    the corresponding prefix of the input?

Why does this post require moderator attention?

+2
−0

Japt, 1411 8 bytes

£¯YÄ è¥X


Try it

-3 bytes thanks to @Shaggy

Why does this post require moderator attention?

+2
−0

APL (Dyalog Unicode), 11 7 bytes (SBCS)

Razetime and rak1507 came up with 7 byte equivalents of my original dfn (this one's rak1507's). See their solutions below.

+/¨⊢=,\


Try it online!

+/¨⊢=,\
,\ ⍝ Prefixes of the list
=   ⍝ Compare every prefix
⊢   ⍝ to the corresponding element in the original list
+/     ⍝ Sum each to get a count of how many elements in each prefix match

Why does this post require moderator attention?

+1
−0

JavaScript (Node.js), 34 bytes

(a,d={})=>a.map(v=>d[v]=1+d[v]||1)


Try it online!

Why does this post require moderator attention?

+1
−0

Ruby, 36 bytes

->a{i=-1;a.map{a[0..i+=1].count _1}}


Try it online!

The code in the TIO link is 2 bytes longer because _n block parameter names are not supported on TIO's Ruby instance yet. It will work the same, however. The code is:

->a{i=-1;a.map{a[0..i+=1].count a[i]}}

Why does this post require moderator attention?

+1
−0

Husk, 4 bytes

Sz#ḣ


Try it online!

Explanation

Sz#ḣ
Sz   zip the input
ḣ with its prefixes
#  using the count function
Why does this post require moderator attention?

+1
−0

Jelly, 7 bytes

=þÄŒDḢ


Try it online!

Why does this post require moderator attention?

+1
−0

Scala 3, 50 44 bytes

? => ?.indices zip?map(?take _+1 count _.==)


Try it in Scastie!

This is an annoying, stupid approach. The more elegant one using inits was much longer (x=>x.inits.toSeq.reverse.tail zip x map(_ count _.==)).

? =>   //The input
?.indices //The indices
zip ?   //Zip them with the elements of the input
.map(   //For every index i and the corresponding element x,
? take _+1   //Take the first i+1 elements of the input
count        //Count how many of them
_.==)        //Are equal to the element x

Why does this post require moderator attention?

+0
−0

Ruby, 31 bytes

->a{a.map{$*[_1]=1.+$*[_1]||0}}


Try this online!

\$* is a global variable, so calling this lambda multiple times (in a single process) would give wrong result. A 33 bytes version that does not rely on a global state:

->a{c=Hash.new 0;a.map{c[_1]+=1}}


If array consists of positive integers from a known range (lets say 0...1e3, then 30 bytes version is:

->a{b=[0]*1e3;a.map{b[_1]+=1}}
`
Why does this post require moderator attention?

Featured
Hot Posts
Challenges — "Hello, World!"
Challenges — Coat of Many Colours
Challenges — Cumulative Counts

This community is part of the Codidact network. We have other communities too — take a look!