2010-09-17 4 views
3

Представьте себе, что я хочу взять цифры от 1 до 3 и образует матрицу таким образом, что каждое возможное спаривание представлено, например,Наиболее краткая J синтаксис для создания числовой матрицы

1 1 
1 2 
1 3 
2 1 
2 2 
2 3 
3 1 
3 2 
3 3

Вот монадическая глагол я сформулировал в J, чтобы сделать это:

($~ (-:@# , 2:)) , ,"0/~ 1+i.y

Первоначально я думал, что ,"0/~ 1+i.y будет достаточно, но, к сожалению, получается следующий результат:

1 1 
1 2 
1 3 

2 1 
2 2 
2 3 

3 1 
3 2 
3 3

Другими словами, его форма 3 3 2, и я хочу что-то, чья форма равна 9 2. Единственный способ, который я мог бы исправить, - это влить все данные в новую форму. Я убежден, что должен быть более сжатый способ сделать это. Кто-нибудь знает?

ответ

4

Один из способов (который использует { как монады в ее способности к перестановке каталогизация):

>,{ 2#<1+i.y 

EDIT:

Некоторые весело было с этой схемой:

Все возможные перестановки :

>,{ y#<1+i.y 

Настраиваемый номер в последовательности:

>,{ x#<1+i.y 
+0

Очень круто! Я просто проводил время, играя с '{' и выясняя смысл вышеприведенного синтаксиса, который теперь кристально ясен для меня. Я подожду несколько дней, чтобы узнать, есть ли еще более сжатые ответы, но я предполагаю, что вы, вероятно, прибили это. Благодаря! –

+1

Добро пожаловать. Я редко могу найти хорошее применение для '{', и я считаю, что он не всегда делает то, что я хочу, но в том же списке он работает хорошо. – MPelletier

+0

Да, J - не самый популярный язык SO. Это тоже не моя любимая. Сообщество J тесно связано с jsoftware.com, но обычно возникает такой вопрос, который вызывается из-под контроля, и расширяется в бесчисленные ответы на базирующуюся оптимизацию и специальный код. – MPelletier

5

Реорганизация промежуточного результата может быть упрощена. Удаление верхней оси обычно выполняется с помощью ,/, поэтому в вашем случае завершенная фраза может быть ,/ ,"0/~ 1+i.y

+0

Очень умный. J - такой изгиб ума. –

+0

Теперь, когда я просмотрел его, кажется, что результат ', /' заключается в создании результата, форма которого равна умножению двух верхних осей, например., если вы примените ', /' к чему-то, у которого форма 7 4 2, это становится 28 2. Это действительно полезно! Спасибо. –

+0

+1 для бит ', /'. Узнай что-то новое каждый день :) – MPelletier

2
1 + 3 3 #: i.9 
1 1 
1 2 
1 3 
2 1 
2 2 
2 3 
3 1 
3 2 
3 3 

3 3 & #: дает две цифры. Общий глагол «base 3» равен 3 & #.^:_1.

+0

Но мой вопрос использовал только 3 в качестве примера. Я пытался создать общий глагол, который работал бы с любым числом. (Конечно, есть практический предел.) Несмотря на это, ваша идея очень интересная. –

+1

Фактически, он * делает * работает для любого числа. Вы запрашиваете каждую комбинацию из k элементов, взятых из пула n, с заменой. Размер этого множества равен n^k. Давайте напишем это 'R =:^~' в j. Например, '4 R 10' составляет 10^4 или 10000, и вы можете перечислить их путем подсчета от 0000 до 9999 в базе 10.' # 8 R 2' составляет 2^8, поэтому байты варьируются от 00000000. .11111111 в двоичном формате. Или то же самое в шестнадцатеричном формате: '# 2 R 16' = 00..FF. В принципе, каждый элемент в базе устанавливает свою цифру (0..n-1), а затем перечисляет все k-значные числа (включая меньшие числа, дополненные 0). – tangentstorm