]]> ]]>

Факториал в APL

Пример для версий Dyalog APL 13.1

Первая строка задает значение индекса первого элемента в списках (в данном случае 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

]]>

Работа программистам