collect(a) := block( [n: length(a), b: [ ], x: a[1], m: 1], for i from 2 thru n do (if a[i] = x then m: m + 1 else (b: endcons([x, m], b), x: a[i], m: 1)), b: endcons([x, m], b) )$ look_and_say(s) := apply(sconcat, map(lambda([p], sconcat(string(p[2]), p[1])), collect(charlist(s))))$ block([s: "1"], for i from 1 thru 10 do (disp(s), s: look_and_say(s))); /* "1" "11" "21" "1211" "111221" "312211" "13112221" "1113213211" "31131211131221" "13211311123113112211" */