## Wednesday, March 30, 2011

### ASCII Art

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())))less than a minute ago via web

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

*
***
*****
********
************
******************
*************************
********************************
*****************************************
*************************************************
********************************************************
**************************************************************
******************************************************************
*******************************************************************
******************************************************************
**************************************************************
********************************************************
*************************************************
*****************************************
********************************
*************************
******************
************
********
*****
***
*

```