Any programming language may be used. 1 point will be given if you pass all the test cases with 1 bonus point going to whoevers performs the quickest and 1 for whoever can get the least amount of characters
To submit put the code and the language you used below
@Andy@programming.dev - 0.053s - 359 chars (factor)
If you submitted in factor, ruby, cobol, etc. itll take me a bit longer to check since I havent set up running those yet. Should be soon
Ruby, just because I wanted a bit more practice. Again, I went to lowering character count, so it is ugly. I'm just using a anchor-runner pointer strategy to do the work. I tried to think of a regex to do the work for me, but couldn't think of one that would work.
i=ARGV[0]
o=''
a=r=0
l=i.length
while l>a
r+=1
if r>l||i[a]!=i[r] then
o+=i[a]+(r-a).to_s
a=r
end
end
puts o
Slightly optimised by removing the frivolous conversion to string. I also made a somewhat silly opitmisation of using Bun.argv instead of Deno.args to save a character.
USING: kernel strings command-line namespaces math.parser sequences io ;
IN: l
: c ( s -- C )
"" swap
[ dup empty? not ] [
dup dup dup first '[ _ = not ] find drop
dup not [ drop length ] [ nip ] if
2dup tail
[ number>string [ first 1string ] dip append append ] dip
] while drop
;
MAIN: [ command-line get first c print ]
Benchmark using compiled binary:
$ hyperfine "./compress/compress aaabbhhhh33aaa"
Benchmark 1: ./compress/compress aaabbhhhh33aaa
Time (mean ± σ): 3.6 ms ± 0.4 ms [User: 1.4 ms, System: 2.2 ms]
Range (min … max): 3.0 ms … 6.0 ms 575 runs
Thanks! Yeah to use the optimized compiler to create a faster runnable binary, I've put instructions on the first challenge: https://programming.dev/comment/1980496
import sys
from itertools import pairwise as p
print(''.join(c+str(b-a)for(a,c),(b,_)in p([(i,r)for i,(l,r)in enumerate(p([None,*sys.argv[1],None]))if l!=r])))