Yesterday, Raymond Hettinger, an active contributor to Python, tweeted a fun one-liner that works in Python 3.2. I thought I would show how to translate it into Factor.
Fun #python3.2 one-liner: print('\n'.join('*'*(c//2000) for i,c in sorted(Counter(map(sum, product(range(6), repeat=8))).items())))
The original Python "one-liner", including required imports looks like this:
from collections import Counter from itertools import product print('\n'.join('*'*(c//2000) for i,c in sorted(Counter(map(sum, product(range(6), repeat=8))).items())))
To translate this code into a concatenative language, we are going to work from the inside and move out. In this case, starting 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 ] replicate [ sum ] product-map
Next, we see that it counts each element, and produces a sorted list of items:
sorted(Counter(...).items())
vs.
histogram >alist sort-keys
And finally, prints a line of stars for each element:
print "\n".join('*'*(c//2000) for i,c in ...)
vs.
values [ 2000 /i CHAR: * <string> print ] each
Putting it all together, it makes this nice "ASCII Art" visualization:
( scratchpad ) USING: assocs io math math.statistics sequences sequences.product sorting strings ; ( scratchpad ) 8 [ 6 iota ] replicate [ sum ] product-map histogram >alist sort-keys values [ 2000 /i CHAR: * <string> print ] each * *** ***** ******** ************ ****************** ************************* ******************************** ***************************************** ************************************************* ******************************************************** ************************************************************** ****************************************************************** ******************************************************************* ****************************************************************** ************************************************************** ******************************************************** ************************************************* ***************************************** ******************************** ************************* ****************** ************ ******** ***** *** *