Как я могу отформатировать вектор числа и вектор строки?(Дьялог АПЛ) - PullRequest
0 голосов
/ 24 октября 2018

Я изучал APL всего несколько недель, но мне действительно это нравится.Я пытался написать простые функции, чтобы практиковать то, что я изучаю.Это говорит мне, сколько денег у меня останется на следующие 13 месяцев, если я буду ежемесячно снимать W с начального капитала T.

 R←T Money W
 M←1 2 3 4 5 6 7 8 9 10 11 12 13
 Months←'Nov' 'Dec' 'Jan' 'Feb' 'Mar' 'Apr' 'May' 'Jun' 'Jul' 'Aug' 'Sep' 'Oct' 'Nov'
 P←-/T(M×W)
 R←Months,P

Это дает два правильных числа, но я не смог отформатировать их как

Nov....100,000
Dec.....97,000
Jan.....92,000
        ...

Как я могу это сделать?Торн не работает, потому что он работает только с числами.

Что-то вроде

R←13 2 ⍴ Months,P

тоже не работает:

 Nov  Dec                                                                           
 Jan  Feb                                                                           
 Mar  Apr                                                                           
 May  Jun                                                                           
 Jul  Aug                                                                           
 Sep  Oct                                                                           
 Nov  97000 94000 91000 88000 85000 82000 79000 76000 73000 70000 67000 64000 61000 
 Nov  Dec                                                                           
 Jan  Feb                                                                           
 Mar  Apr                                                                           
 May  Jun                                                                           
 Jul  Aug                                                                           
 Sep  Oct     

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Вы должны раскрыть () P после сокращения: P←⊃-/T(M×W) или использовать более простое P←T-M×W

Отформатируйте числа, как сказал MBaas в своем ответе: 'CF12.2'⎕fmt P или без дробной части: 'CI11'⎕fmt P

Если вы смешаете () названий месяцев в виде матрицы символов размером 12 на 3, их легче сгенерировать (,) слева: (↑Months),'CI11'⎕fmt P

Чтобы заменить пробелы точками: '.'@{⍵=' '}

Обратите внимание, что здесь результат за ноябрь составил 97000, а не 100000, но это легко исправить.

∇R←T Money W
 M←1 2 3 4 5 6 7 8 9 10 11 12 13
 Months←'Nov' 'Dec' 'Jan' 'Feb' 'Mar' 'Apr' 'May' 'Jun' 'Jul' 'Aug' 'Sep' 'Oct' 'Nov'
 P←T-M×W
 R←(↑Months),'.'@{' '=⍵}'CI11'⎕fmt P
∇

Попробуйте онлайн!

0 голосов
/ 25 октября 2018

Поскольку MBaas ответил , ⎕FMT "формат по спецификации" - это то, что вы ищете.Я просто хочу добавить, что все форматирование может быть обработано одним приложением ⎕FMT, , включая , заполненное точками:

 R←T Money W
 M←1 2 3 4 5 6 7 8 9 10 11 12 13
 Months←'Nov' 'Dec' 'Jan' 'Feb' 'Mar' 'Apr' 'May' 'Jun' 'Jul' 'Aug' 'Sep' 'Oct' 'Nov'
 P←-/T(M×W)
 R←(↑Months),'CR<.>I11'⎕FMT P

Части спецификации формата CR<.>I11следующие:
C вставляет запятые между триадами цифр, начиная с крайней правой цифры целочисленной части результата.
R<.> устанавливает в поле значение ., которое повторяется при необходимости для заполнения поля.field.
I11 целочисленный формат с общей шириной поля на столбец 11.

Попробуйте это онлайн! (Для хорошей практики я взял на себя свободулокализуйте ваши переменные с помощью ;M;Months;P)

⎕FMT Полная документация доступна здесь

Обратите внимание, что ⎕FMT может обрабатывать вложенные массивы, так что вы неНа самом деле, после сокращения следует раскрывать информацию, как это , предложенное ngn , но в целом его совет применим.

0 голосов
/ 25 октября 2018

Из ваших вопросов не совсем очевидно, как должна вызываться функция Money, поэтому я опущу это.Я думаю, что большая ошибка, которую вы допустили,

R←13 2 ⍴ Months,P

, потому что, поскольку вы как это создали что-то неожиданное.

Обычно вам нужно индексировать Months с номером соответствующего месяца, чтобы Months[someIndex] имел ту же форму, что и результат ваших вычислений P.Таким простым решением было бы сделать Months[someIndex],[1.5]P, который склеит их вместе, но будет представлять собой ось (столбцы).Это может быть использовано для дальнейшей обработки, то есть для форматирования чисел.

Лично я редко использую для форматирования чисел, но вместо этого использую ⎕FMT, как будто дает вам больший контроль наднужный формат.

Пример использования:

          'CF12.2'⎕fmt 1000×⍳12
    1,000.00
    2,000.00
    3,000.00
    4,000.00
    5,000.00
    6,000.00
    7,000.00
    8,000.00
    9,000.00
   10,000.00
   11,000.00
   12,000.00

Попробуйте онлайн!

...