Все логические возможности заданной длины в J

#j

#j

Вопрос:

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

например

    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
  

Комментарии:

1. (y#2) #: 2^y и множество риффов на эту тему.

Ответ №1:

Эта функциональность была недавно добавлена в 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=: permrepamp;2
   f=: (# #: i.@^~)amp;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
  

Ответ №2:

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

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

(Спасибо Дэну за то, что заставил меня посмотреть #: .)