##JavaScript (ES6), <s>156</s> <s>144</s> <s>136</s> 134 bytes Sadly, the infamous `String.fromCharCode()` costs 19 bytes. <!-- begin snippet: js hide: false console: true babel: false --> <!-- language: lang-js --> f=(x=y=!(k=32))=>k<127?(++x-22?(y+1>>1==5|y<9&x>>1==5|y>9&('11'[x-y]|'11'[21-y-x]))?String.fromCharCode(k++):' ':(x=!++y,` `))+f(x):'' console.log(f()) <!-- end snippet -->