2012-03-05 15 views
3

我試圖實現A006751在J.這是很容易在Haskell做,是這樣的:如何在J中實現分組算法?

concat . map (\g -> concat [show $ length g, [g !! 0]]) . group . show 

(顯然這是不完全的,但它是它的基本的心臟我花了大約10秒。 ),我可以在J中很容易地實現任何這一點,但是避開我的部分是一個很好的,慣用的J算法,它對應於Haskell的group函數。我可以寫一個笨拙的一個,但它並不覺得自己是最好J.

任何人都可以實現Haskell的良好Ĵgroup

+0

雖然Tikkanz指出了J中的Looksay的實現,但我想到了:'looksay =:3:''。 ,&''x'',(「:@#,{。)@>(<;。1〜1,2&(〜:/ \))」:y'「0'。因此:'lookay^:(i.10)1'(從1開始) – 2013-01-23 11:18:05

回答

4

組通常與/.副詞來完成。

1 1 2 1 </. 'abcd' 
┌───┬─┐ 
│abd│c│ 
└───┴─┘ 

正如你所看到的,它不是連續的。只是讓你鍵順序就像這樣(基本上確定一個項目是從下不同,並做所產生的0和1的運行總和):

neq =. 13 : '0, (}. y) ~: (}: y)' 
    seqkey =. 13 : '+/\neq y' 
    (seqkey 1 1 2 1) </. 'abcd' 
┌──┬─┬─┐ 
│ab│c│d│ 
└──┴─┴─┘ 

我需要的則是計算項目的功能(#),並告訴我他們是什麼({。只是選擇第一個)。我得到了一些靈​​感來自於nubcount

diffseqcount =. 13 : ',(seqkey y) (#,{.)/. y' 
    diffseqcount 2 
1 2 
    diffseqcount 1 2 
1 1 1 2 
    diffseqcount 1 1 1 2 
3 1 1 2 

如果你想第n個結果,只要使用功率:

diffseqcount(^:10) 2 NB. 10th result 
1 3 2 1 1 3 2 1 3 2 2 1 1 3 3 1 1 2 1 3 2 1 2 3 2 2 2 1 1 2 
+1

由於使答案平坦是練習的技巧,所以將'diffseqcount'定義爲''(seqkey y )(#{)/。y'',只是加上','在前面。 – MPelletier 2012-03-05 16:12:41

+0

布拉沃,MPelletier。我懷疑你可能回答這個問題。:) – 2012-03-05 20:18:45

+0

@GregoryHigley好,kaleidic是居民Ĵ大師,我可以」 t很多他的代碼,他寫了真正的*好的* J.我只是寫它,所以我可以理解它(也希望別人也可以) – MPelletier 2012-03-05 21:41:58

3

我同意/.(密鑰)是在應用動詞組最好的一般方法J.在這種情況下,我們需要對組連續數是相同的替代,是二元;.(剪切):

1 1 0 0 1 0 1 <(;.1) 3 1 1 1 2 2 3 
┌─┬─────┬───┬─┐ 
│3│1 1 1│2 2│3│ 
└─┴─────┴───┴─┘ 

我們CA氮素形態音柱爲左參數使用方法如下:

1 , 2 ~:/\ 3 1 1 1 2 2 3 NB. inserts ~: in the running sets of 2 numbers 
1 1 0 0 1 0 1 

把兩者結合起來:

(] <;.1~ 1 , 2 ~:/\ ]) 3 1 1 1 2 2 3 
┌─┬─────┬───┬─┐ 
│3│1 1 1│2 2│3│ 
└─┴─────┴───┴─┘ 

使用相同的機制,先前建議:

,@(] (# , {.);.1~ 1 , 2 ~:/\ ]) 3 1 1 1 2 2 3 
1 3 3 1 2 2 1 3 

如果你是尋找一個不錯的Ĵ實施的外觀數列,那麼我建議the one on Rosetta Code

las=: ,@((# , {.);.1~ 1 , 2 ~:/\ ])&.(10x&#.inv)@]^:([email protected][) 
    5 las 1   NB. left arg is sequence length, right arg is starting number 
11 21 1211 111221 312211 
+0

我以前從來沒有想過'〜:/ \'。我的注意力,哇,比'0,好多了〜〜:}:'。 – MPelletier 2012-03-06 12:00:23