Факториал в APL
Первая строка задает значение индекса первого элемента в списках (в данном случае 0). Вторая строка задает точность при выводе чисел (она должна превышать длину максимального факториала).
Третья строка при чтении справа налево делает следующее:
⍳17
генерирует список из 17 индексов, начинающихся с 0, т.е. 0 … 16.17 / ⊂'!='
генерирует список из 17 строк!=
.⊂
— операторenclose
, который позволяет оперировать строками как скалярами, а не как массивами символов./
— оператор репликации.!⍳17
применяет к каждому элементу списка унарную операцию!
— факториал.,
— бинарная операция конкатенации правого и левого аргументов; после двух конкатенаций выражение принимает значение0 1 2 3 4 ... 15 16 != != ... != 1 1 2 6 24 120 720 5040 40320 362880 ...
, т.е. список чисел, список строк и затем список факториалов.3 17⍴
изменяет форму списка-аргумента, получая из него матрицу из 3 строк и 17 столбцов:┌→─┬──┬──┬──┬──┬───┬───┬────┬─────┬──────┬───────┬────────┬─────────┬──────────┬───────────┬─────────────┬──────────────┐ ↓0 │1 │2 │3 │4 │5 │6 │7 │8 │9 │10 │11 │12 │13 │14 │15 │16 │ ├~─┼~─┼~─┼~─┼~─┼~──┼~──┼~───┼~────┼~─────┼~──────┼~───────┼~────────┼~─────────┼~──────────┼~────────────┼~─────────────┤ │!=│!=│!=│!=│!=│!= │!= │!= │!= │!= │!= │!= │!= │!= │!= │!= │!= │ ├─→┼─→┼─→┼─→┼─→┼──→┼──→┼───→┼────→┼─────→┼──────→┼───────→┼────────→┼─────────→┼──────────→┼────────────→┼─────────────→┤ │1 │1 │2 │6 │24│120│720│5040│40320│362880│3628800│39916800│479001600│6227020800│87178291200│1307674368000│20922789888000│ └~─┴~─┴~─┴~─┴~─┴~──┴~──┴~───┴~────┴~─────┴~──────┴~───────┴~────────┴~─────────┴~──────────┴~────────────┴~─────────────┘
наконец,
⍉
транспонирует эту матрицу так, что в каждой строке находятся три элемента — число, строка-разделитель и факториал числа.
В итоге вывод программы имеет следующий вид:
┌→─┬──┬──────────────┐
↓0 │!=│1 │
├~─┼─→┼~─────────────┤
│1 │!=│1 │
├~─┼─→┼~─────────────┤
│2 │!=│2 │
├~─┼─→┼~─────────────┤
[...25 lines of output ...]
├~─┼─→┼~─────────────┤
│16│!=│20922789888000│
└~─┴─→┴~─────────────┘
Матрица оформлена как таблица с границами между ячейками из-за того, что она содержит boxed строки.
⎕IO←0
⎕PP←18
⍉3 17⍴ (⍳17) , (17 / ⊂'!=') , !⍳17
Комментарии
]]>blog comments powered by Disqus
]]>