2010-09-17 12 views
3

想象一下,我想利用的數字從1至3,並形成一個矩陣,使得每個可能的配對來表示,例如,最簡潔Ĵ語法創建數字矩陣

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 

編輯:

所有可能的排列:

一些樂趣與這個方案可以了:

>,{ y#<1+i.y 

按順序配置的數字:

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

非常酷!我只是花了一段時間玩弄'{'並找出上述語法的含義,這對我來說已經很清楚了。我會等待幾天,看看是否有更簡潔的答案,但我的猜測是你可能已經釘上了這一個。謝謝! – 2010-09-17 21:41:04

+1

不客氣。我很少能夠很好地使用''',我發現它並不總是按照我想要的來做,但是在同一個列表中它運行良好。 – MPelletier 2010-09-17 22:13:19

+0

是的,J不是SO最流行的語言。它也不是我的最愛。 J社區與jsoftware.com密切相關,但通常會出現類似這樣的問題,失控並擴展爲對邊緣優化和特殊代碼的無數回覆。 – MPelletier 2010-09-18 18:19:01

5

重塑您的中間結果可以簡化。取出最上面的軸通常與,/這樣做在你的情況下完成的短語可能是,/ ,"0/~ 1+i.y

+0

非常聰明。 J是一種令人心曠神怡的語言。 – 2010-09-24 22:57:40

+0

現在我已經研究了它,看起來'',/'的結果是創建一個結果,其形狀等於頂部兩個軸的乘積,例如,,如果將',/'應用於形狀爲7 4 2的東西,則它變爲28 2。這非常有用!謝謝。 – 2010-09-24 23:56:54

+0

+1,'/'位。每天學習新東西:) – MPelletier 2010-09-26 18:49:38

2

我意識到這個問題是舊的,但有一個簡單的方法來做到這一點:在三元數到9,加1。

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 & #:給你兩位數字。一般的「基礎3」動詞是3 & #.^:_1

+0

但我的問題只用了3個例子。我試圖創建一個可以處理任何數字的通用動詞。 (當然,這有一個實際的限制。)儘管如此,你的想法非常有趣。 – 2015-01-13 20:47:04

+1

其實,它*確實*適用於任何號碼。您要求從n個庫中抽取的k個項目的每個組合,並進行替換。這個集合的大小是n^k。我們在j中寫下這個'R =:^〜'。例如,'4 R 10'爲10^4或10000,您可以通過在基數10中從0000到9999進行計數來枚舉它們。'#8 R 2'是2^8,這就是爲什麼字節範圍從00000000。 .11111111二進制。或者十六進制中的同一個事物:'#2 R 16' = 00..FF。基本上,給基地的每個項目設置自己的數字(0..n-1),然後列出所有的k數字(包括小數字,用0填充)。 – tangentstorm 2015-01-13 21:57:22