99 бутылок: dc
68. DC — программа для арифметических вычислений с произвольной точностью в Юникс-системах, это одна из старейших программ, старше языка «Си». Представляет собой стековый калькулятор с обратной польской записью.
Поддерживаются 256 стековых регистров и основной стек программы. На стеках могут размещаться числа и строки, последние могут исполняться, как подпрограммы. Команды однобуквенные, некоторые имеют операнд; числа записываются как есть, строки — между квадратными скобками.
Компактно «песню о пиве» можно записать таким кодом:
[n10P]su[[s]P]ss[[No bottles]Plon2+Q]sn
[d0=ndn[ bottle]n1!=slon]sb[ of beer]so
[ddlbx[ on the wall, ]nlbx[.]lux
[Take one down and pass it around,]lux
1-dlbx[ on the wall.]lux[]luxd0!=B]sB
99lBx
[No more bottles of beer on the wall, no more bottles of beer.
Go to the store and buy some more, 99 bottles of beer on the wall.
] n
А вот вариант с комментариями (которые, правда, не делают программу уж сильно понятнее):
# beer.dc
# Степанищев Е. В. bolknote.ru
# Печать с переводом строки, мне не нравится помещать
# его в строку символом — ломаются отступы
[
n 10 P
] su
# Печатаем «s»
[
[s] P
] ss
# Печатаем «No bottles of beer», убираем (сложением) ноль со стека,
# прерываем выполнение родителя (выходим из двух уровней)
[
[No bottles] P lon
2+Q
] sn
# Вывод кол-ва бутылок с «bottle(s) of beer»
[
d 0 =n
d n [ bottle] n 1 !=s lon
] sb
# « of beer» — в регистр «о», будем использовать
# для вывода части фразы
[ of beer] so
# основной цикл программы (вызывается рекурсивно)
[
d
d lbx [ on the wall, ] n lbx [.] lux
[Take one down and pass it around,] lux
1-
d lbx [ on the wall.] lux [] lux
d 0 !=B
] sB
99 lBx
[No more bottles of beer on the wall, no more bottles of beer.
Go to the store and buy some more, 99 bottles of beer on the wall.
] n