H # split comma/space/tab separated values g/\b[[:space:]]*[,[:space:]][[:space:]]*\b/s//\ /g # unary -> decimal (via Roman-ish) g/(.*)0([0-9]{3})/s//\1\2/ g/(.*)1([0-9]{3})/s//\1m\2/ g/(.*)2([0-9]{3})/s//\1mm\2/ g/(.*)3([0-9]{3})/s//\1mmm\2/ g/(.*)4([0-9]{3})/s//\1mmmm\2/ g/(.*)5([0-9]{3})/s//\1mmmmm\2/ g/(.*)6([0-9]{3})/s//\1mmmmmm\2/ g/(.*)7([0-9]{3})/s//\1mmmmmmm\2/ g/(.*)8([0-9]{3})/s//\1mmmmmmmm\2/ g/(.*)9([0-9]{3})/s//\1mmmmmmmmm\2/ g/(.*)0([0-9]{2})/s//\1\2/ g/(.*)1([0-9]{2})/s//\1c\2/ g/(.*)2([0-9]{2})/s//\1cc\2/ g/(.*)3([0-9]{2})/s//\1ccc\2/ g/(.*)4([0-9]{2})/s//\1cccc\2/ g/(.*)5([0-9]{2})/s//\1ccccc\2/ g/(.*)6([0-9]{2})/s//\1cccccc\2/ g/(.*)7([0-9]{2})/s//\1ccccccc\2/ g/(.*)8([0-9]{2})/s//\1cccccccc\2/ g/(.*)9([0-9]{2})/s//\1ccccccccc\2/ g/(.*)0([0-9])/s//\1\2/ g/(.*)1([0-9])/s//\1x\2/ g/(.*)2([0-9])/s//\1xx\2/ g/(.*)3([0-9])/s//\1xxx\2/ g/(.*)4([0-9])/s//\1xxxx\2/ g/(.*)5([0-9])/s//\1xxxxx\2/ g/(.*)6([0-9])/s//\1xxxxxx\2/ g/(.*)7([0-9])/s//\1xxxxxxx\2/ g/(.*)8([0-9])/s//\1xxxxxxxx\2/ g/(.*)9([0-9])/s//\1xxxxxxxxx\2/ g/(.*)0/s//\1/ g/(.*)1/s//\1i/ g/(.*)2/s//\1ii/ g/(.*)3/s//\1iii/ g/(.*)4/s//\1iiii/ g/(.*)5/s//\1iiiii/ g/(.*)6/s//\1iiiiii/ g/(.*)7/s//\1iiiiiii/ g/(.*)8/s//\1iiiiiiii/ g/(.*)9/s//\1iiiiiiiii/ g/m/s//iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii/g g/c/s//iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii/g g/x/s//iiiiiiiiii/g # actual logic g/.*/s// &/ ,j g/^[ ]/s/// s/\b((i+)i+)[ ]\2\b/\2 \1/g s//\2 \1/g s//\2 \1/g s//\2 \1/g s//\2 \1/g s//\2 \1/g s//\2 \1/g s//\2 \1/g s/[ ]/\ /g g/^$/d # unary -> decimal (for 0-10000 range) g/i{9000}(i{0,999})/s//9\1/ g/i{8000}(i{0,999})/s//8\1/ g/i{7000}(i{0,999})/s//7\1/ g/i{6000}(i{0,999})/s//6\1/ g/i{5000}(i{0,999})/s//5\1/ g/i{4000}(i{0,999})/s//4\1/ g/i{3000}(i{0,999})/s//3\1/ g/i{2000}(i{0,999})/s//2\1/ g/i{1000}(i{0,999})/s//1\1/ v/^[0-9]i*$/s/.*/0&/ g/i{900}(i{0,99})/s//9\1/ g/i{800}(i{0,99})/s//8\1/ g/i{700}(i{0,99})/s//7\1/ g/i{600}(i{0,99})/s//6\1/ g/i{500}(i{0,99})/s//5\1/ g/i{400}(i{0,99})/s//4\1/ g/i{300}(i{0,99})/s//3\1/ g/i{200}(i{0,99})/s//2\1/ g/i{100}(i{0,99})/s//1\1/ v/^[0-9]{2}i*$/s/^([0-9])(i*)$/\10\2/ g/i{90}(i{0,9})/s//9\1/ g/i{80}(i{0,9})/s//8\1/ g/i{70}(i{0,9})/s//7\1/ g/i{60}(i{0,9})/s//6\1/ g/i{50}(i{0,9})/s//5\1/ g/i{40}(i{0,9})/s//4\1/ g/i{30}(i{0,9})/s//3\1/ g/i{20}(i{0,9})/s//2\1/ g/i{10}(i{0,9})/s//1\1/ v/^[0-9]{3}i*$/s/^([0-9]{2})(i*)$/\10\2/ g/i{9}/s//9/ g/i{8}/s//8/ g/i{7}/s//7/ g/i{6}/s//6/ g/i{5}/s//5/ g/i{4}/s//4/ g/i{3}/s//3/ g/i{2}/s//2/ g/i{1}/s//1/ v/^[0-9]{4}i*$/s/^([0-9]{3})(i*)$/\10\2/ g/0+([0-9])/s//\1/ ,p Q