(2&*~) 15 7 3 1
Выше фраза. В конце есть след и окончательный результат. Я понимаю, что эта фраза является монадой, я понимаю, что из-за ~ она имеет левый и правый аргумент. То же самое происходит, если вы запустите '15 7 3 1 (2 & *) 15 7 3 1'. Я также понял, что правильная таблица - это степени от 2 до 1, 3, 7, 15, а остальные записи - это их базовое число, умноженное на степень 2, но я просто не понимаю, почему.
В соответствующей заметке это фраза умножения ethopian на веб-сайте Rosetta Code (на самом деле, я тоже так далеко пытался это выяснить) и
'(1>. <. @ -:) ^: a:' - это фраза. </p>
(1>.<.@-:)^:a: 27
27 13 6 3 1
но
(1>. <. @ -:) ^: 27 возвращает коробочную версию самого себя, и я ожидаю, что она будет выполняться 27 раз. </p>
В последнем из трех связанных вопросов (все они связаны с разложением кода умножения Этопиана) полный код задается как:
double =: 2&*
halve =: %&2 NB. or the primitive -:
odd =: 2&|
ethiop =: +/@(odd@] # (double~ <@#)) (1>.<.@halve)^:a:
и это можно тривиально заменить на:
ethiop =: +/@(2&|@] # (2&*~ <@#)) (1>.<.@-:)^:a:
И это прекрасно работает! Окрыленный успехом, я полностью упал со скалы, когда подумал, что в командной строке работает монадный двойник:
+: 98
196
И двойной оператор должен быть быстрее двойного с присоединенной константой, может быть, двойной, просто сдвиг, поэтому я думаю, что
ethiop =: +/@(2&|@] # (+:~ <@#)) (1>.<.@-:)^:a:
Будет работать ... но это не так.
Я пробовал заглавные буквы, союзы и т. Д., И ничто не заставляет его работать, это всегда говорит "ошибка домена". Я начинаю думать, что код зависит от двоично-вызванной монады, чтобы создать таблицу удвоения способом, которого я не понимаю.
Единственная хорошая вещь - то, что глагол нечетный J не имеет ничего общего с проверкой нечетного числа.
Может кто-нибудь объяснить мне эти вещи, может быть, с английским объяснением того, как работает программа? Не то, как работает алгоритм, как он реализует алгоритм. Я помню, когда я играл в IBM 1130 APL в 1970 году. Это был интерпретатор APL, который работал в 8 тысячах слов, разумеется, он был ограничен. Например, у этого был бросок, но никакой сделки. Интерпретатор вводил и выводил память, поддерживаемые наложением кода 1130, он разделял бы ваши подпрограммы на группы, а когда одна группа вызывала другую, он загружал новую группу с диска (да, псевдо-свопинг в 8 Кб). Поэтому я написал версии соглашения, используя различные схемы, и случайно мы натолкнулись на вариант, который можно вводить и выводить без поиска, и эту версию, независимо от того, насколько плохо написано, сколько строк и сколько действий интерпретатора будут выполняться в 10 раз быстро, как и любой другой. Я понятия не имел, что я делаю, я буду продолжать добавлять бессмысленные задания и разбивать выражения между строками или комбинировать их, пока не получу такой, который будет работать без поиска. (52 сделки 52, которые искали, могли занять 45 секунд).
А потом прошлой ночью я вычислил 150-тысячное число Фибоначчи в J. Это должна была быть 64-битная версия, и это заняло один час 17 минут. Я использовал точную арифметику, число имеет 31349 цифр, и оно начинается 1012838344936638038 ...... И я понял, что 1130 никогда не мог рассчитать это, число не соответствовало бы, потому что вам нужно три из них, и самый большой из них сделан было 32 тыс. 16-битных слов. Я хочу выучить язык, который может это сделать, но в документе чего-то не хватает, которого я просто не получаю.
trace '(2&*) 15 7 3 1'
--------------- 4 Conj -------
2
&
*
2&*
--------------- 3 Adverb -----
2&*
~
2&*~
--------------- 8 Paren ------
(
2&*~
)
2&*~
--------------- 0 Monad ------
2&*~
15 7 3 1
491520 229376 98304 32768
1920 896 384 128
120 56 24 8
30 14 6 2
==============================
491520 229376 98304 32768
1920 896 384 128
120 56 24 8
30 14 6 2
Сноска Фибоначчи:
]t150k=:6!:2 'a150k =: $ ":r150k=: {: (,+/@(_2&{.) )^:150000 (0x 1x)'
4631.62
0 60 60 #: t150k
1 17 11.6167
r150k
10128383449366380384728502706681008427227914006240871521944866167854579423510169
50198752571599303492471943589300904953648270811064370506598260395645679940891823
17307901573781852234222080308236027906733606532470814177610613237408102006595571
1949713927351702...
a150k
31349