The Compression Puzzle
One lovely Friday we were faced with this nice yet intriguing programming puzzle.
One shall write a program that compresses string "AAABBAAC" to its compressed form "3A2B2A1C".
These attempts were made,...
Basic rules
- No external libraries or tools shall be used. Only standard, bundled libraries apply.
- "Assert" inside your solution if the function does what it is suppose to do.
- You can apply as many solutions as you want to any language you want.
- Assume that the input is always a sequence of ASCII upper-case characters (no numbers or symbols).
Additional Q/A
Development
# Via Nix Shell
$ nix-shell shell.nix --run "make run"
# if you preffer to roll your own local brew
$ make
To run individual languages use:
make bash
make c++
make crystal
make clojure
make cs
make elixir
# ...
make php
Benchmarking
Although benchmarking is not the primary goal of this project; some authors are really kean to measure the performance of their solutions and compare them to others.
These languages have benchmarking suites made and feel free to give them a try.
# Python
python src/python/benchmarks.py
# F#
./src/fsharp/benchmark.fsx
# Crystal
./src/crystal/benchmark
P.s.: If you feel the urge that you need to benchmark your solution agains others; please feel free to do so and attach some instructions to your PR.
Authors
Author |
Solutions |
Alex Piechowski |
Crystal |
Aleš Justin |
Java |
Andraž Brodnik |
Python |
Bartłomiej Tomala |
Scala |
Blaž Smolnikar |
PHP, Swift |
Boleslav Březovský |
Red |
Boris |
Red |
David Kuridža |
Go |
David Ličen |
JavaScript: compress_da01.js, compress_da02.js |
Domen Gabrovšek |
JavaScript |
Eran Ws |
JavaScript: compress_ew.js, compress_ew2.js, Python: compress_ew.py, compress_ew2.py, compress_ew3.py, compress_ew4.py |
Goran Kodrun |
JavaScript, TypeScript |
Gregg Irwin |
Red |
Gregor Menih |
TypeScript |
Gregor Petrin |
Groovy |
Janko Metelko |
Rye: compress_jm_iter.rye, compress_jm_iter_steps.rye, compress_jm_rec.rye, compress_jm_rec_steps.rye, compress_js_hofs.rye, SQLite |
Jernej Virag |
Kotlin |
Kevin Meyer |
Assembler (x86) |
Klemen Kogovšek |
JavaScript, ReScript |
Krištof Črnivec |
Ruby: compress-kbc-0.rb, compress-kbc-1.rb |
Lech Głowiak |
Scala |
Lorand Dali |
Python |
Luka Kacil |
Bash, Python: compress_luka.py, compress_luka_faster.py, compress_luka_rec1.py, compress_luka_rec2.py, compress_luka_tailrec.py |
Luka Prebil Grintal |
JavaScript |
Marek Fajkus |
Haskell |
Marko Juvančič |
Pascal |
Miha Kloar |
TypeScript |
Miha Novak |
Kotlin |
Milan Slunečko |
Lua: compress.lua, compress-gsub.lua |
Mitja Živković |
Go |
Nace Štruc |
C#: Program.cs, Program.cs, Program.cs, MS SQL |
Nejc Ilenič |
C++: compress_fast.cpp, compress_slow.cpp |
Nejc Pušnik |
C# |
Oto Brglez |
JavaScript, Python, Scala: CompressionPuzzle01.scala, CompressionPuzzle02.scala |
Peter A. Pirc |
C# |
Peter Keše |
F#: compress-pk1.fsx, compress-pk2.fsx, compress-pk3.fsx |
Peter Levart |
Java |
Primož Žnidar |
Ruby: compress_prima_1.rb, compress_prima_2.rb |
Rob Cole |
Crystal |
Rok Kralj |
Scala |
Rok Kreslin |
JavaScript |
Roman Luštrik |
Python, R |
Simon Belak |
Clojure |
Simon Žlender |
Elixir: compress.exs, compress_rec.exs, Rust |
Teodor Janez Podobnik |
Python |
Tit Petrič |
Go |
Tomaž Štih |
C |
Urban Škudnik |
Python |
Zach Bresser |
Lua |
pikoslav |
C#: linq.cs, procedural.cs |
The Stats 📈
- The number of authors: 50
- The number of solutions: 85
- The number of programming languages: 30
- The language / solutions breakdown: Python: 15, JavaScript: 10, C#: 7, Scala: 5, Rye: 5, Ruby: 4, Lua: 3, Red: 3, Go: 3, TypeScript: 3, F#: 3, C++: 2, Kotlin: 2, Elixir: 2, Java: 2, Crystal: 2, Clojure: 1, R: 1, Rust: 1, C: 1, MS SQL: 1, Pascal: 1, Haskell: 1, Bash: 1, ReScript: 1, Assembler (x86): 1, SQLite: 1, Groovy: 1, PHP: 1, Swift: 1