PostScript 50 двоичный, 113 ASCII
Это использует графический вывод. Hexdump программы с использованием двоичных токенов:
$ hexdump -C textRect_binary.ps
00000000 74 5b 30 20 39 5b 74 92 62 34 92 36 92 38 92 10 |t[0 9[t.b4.6.8..|
00000010 32 92 19 5d 7b 92 2c 7b 32 92 19 7d 92 83 92 3e |2..]{.,{2..}...>|
00000020 92 6e 7d 92 49 5d 39 20 39 92 6b 91 c7 39 92 8e |.n}.I]9 9.k..9..|
00000030 92 c3 |..|
00000032
Загрузите, чтобы попробовать . Используя Ghostscript, передаваемый текст может быть передан в программу следующим образом:
gs -st=helloworld textRect_binary.ps
Графический вывод выглядит так:

Тот же код с использованием токенов ASCII выглядит следующим образом:
t[0 9[t length
4 div dup
ceiling
2 copy]{cvi{2 copy}repeat
exch neg}forall]9 9 moveto/Courier 9 selectfont
xyshow
Стратегия заключается в том, xyshowчтобы определить, куда мы движемся после показа каждого персонажа, прежде чем показывать следующий. Мы начинаем в левом нижнем углу, двигаясь по часовой стрелке, то есть сначала вверх, затем вправо, затем вниз, затем влево. Мы всегда перемещаемся на 9 единиц, поэтому сначала у нас есть относительное движение 0 9, потом 9 0, потом 0 -9, потом -9 0. Мы можем перейти от одной пары этих чисел к следующей с помощью последовательности exch neg.
Нам нужно построить массив, xyshowкоторый будет содержать эти пары чисел, по одной паре для каждого символа. Это означает, что если у нас в helloworldкачестве примера строка, которая имеет 10 символов, мы хотим подняться дважды, затем вправо трижды, затем вниз дважды и влево трижды. Мы получим эти значения (два и три), разделив длину строки на 8, один раз округлив до пола, один раз до потолка.
Итак, мы копируем 0 9дважды, затем переключаемся на относительные координаты x / y exch neg, копируем их трижды и так далее.
Этот закомментированный код показывает, что происходит в стеке:
t[0 9 % t [ 0 9
[t length % t [ 0 9 [ length
4 div dup % t [ 0 9 [ length/4 length/4
ceiling % t [ 0 9 [ length/4=height width
2 copy] % t [ 0 9 [height width height width]
{%forall % t [ 0 9 ... x y height_or_width
cvi % t [ 0 9 ... x y height_or_width_integer
{2 copy} % t [ 0 9 ... x y height_or_width_integer {2 copy}
repeat % t [ 0 9 ... x y .. x y
exch neg % t [ 0 9 ... x y .. y -x
}forall] % t [0 9 ... -9 0]
9 9 moveto/Courier 9 selectfont
xyshow