Все булевы возможности заданной длины в J - PullRequest
3 голосов
/ 13 марта 2019

Мне нужен самый простой глагол, который дает список всех логических списков заданной длины.

например,

   f=. NB. Insert magic here

   f 2
0 0
0 1
1 0
1 1

   f 3
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

Ответы [ 2 ]

3 голосов
/ 13 марта 2019

Эта функциональность была недавно добавлена ​​в аддон stats/base.

   load 'stats/base/combinatorial'  NB. or just load 'stats'
   permrep 2    NB. permutations of size 2 from 2 items with replacement
0 0
0 1
1 0
1 1
   3 permrep 2  NB. permutations of size 3 from 2 items with replacement
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
   permrep      NB. display definition of permrep
$:~ :(# #: i.@^~)

Используя Qt IDE, вы можете просмотреть скрипт, определяющий permrep и друзей, введя open 'stats/base/combinatorial' в окне Term. В качестве альтернативы вы можете просмотреть его на Github .

Чтобы определить f, как указано в вашем вопросе, должно быть достаточно следующего:

   f=: permrep&2
   f=: (# #: i.@^~)&2  NB. alternatively
   f 3
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
1 голос
/ 13 марта 2019

На странице #: ("Antibase 2") есть пример, близкий к тому, что я хочу.Я не совсем понимаю этот примитив, но следующий код дает список из 2-х цифр от 0 до 2 ^ n-1:

   f=. #:@i.@(2^])

(Спасибо Дэну за то, что я поднял глаза #:.)

...