ASCII Art
Friday, September 8, 2023
Raymond Hettinger, an active contributor to Python and responsible for many useful improvements to the language, likes to tweet short and sweet bits of useful Python knowledge. I stumbled into one fun one-liner from long ago:
I thought I would show how it might translate into Factor. To translate this code into a concatenative language, we are going to work from the inside and move out.
Step 1
We start with the sum
of the cartesian
product of
eight sequences of the numbers 0 through 5:
map(sum, product(range(6), repeat=8))
vs.
8 6 <iota> <repetition> [ sum ] product-map
Step 2
Next, we see that it counts each element, and produces a sorted list of items:
sorted(Counter(...).items())
vs.
histogram sort-keys
Step 3
And finally, create a string of lines of stars and print it:
print "\n".join('*'*(c//2000) for i,c in ...)
vs.
values [ 2000 /i CHAR: * <string> ] map "\n" join print
Solution
Putting it all together:
IN: scratchpad USING: assocs io math math.statistics sequences
sequences.product sorting strings ;
IN: scratchpad 8 6 <iota> <repetition> [ sum ] product-map
histogram sort-keys values
[ 2000 /i CHAR: * <string> ] map "\n" join print
It makes this nice ASCII Art visualization:
*
***
*****
********
************
******************
*************************
********************************
*****************************************
*************************************************
********************************************************
**************************************************************
******************************************************************
*******************************************************************
******************************************************************
**************************************************************
********************************************************
*************************************************
*****************************************
********************************
*************************
******************
************
********
*****
***
*