3

私はJでA006751を実装しようとしています.Haskellで行うのはとても簡単です.

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

(明らかにそれは完全ではありませんが、それはその基本的な核心です。私はそれに約 10 秒を費やしたので、それに応じて処理してください。) J でこれをかなり簡単に実装できますが、私を逃している部分は良い、慣用的なものです。 Haskell のgroup関数に対応する J アルゴリズム。不器用なことは書けるけど、気持ち悪い J.

group良い J でHaskell を実装できる人はいますか?

4

2 に答える 2

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 番目の結果が必要な場合は、power を使用します。

   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
于 2012-03-05T15:11:16.547 に答える
3

私は、(Key)がJのグループに動詞を適用するための最良の一般的な方法であることに同意し/.ます。同じである連続した数をグループ化する必要があるこの場合の代替は、二項;.(Cut)です。

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

次のように、左の引数として使用するフレットを作成できます。

   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

2つをまとめる:

   (] <;.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

ルックアンドセイシーケンスの優れたJ実装を探している場合は、Rosettaコードの実装をお勧めします

   las=: ,@((# , {.);.1~ 1 , 2 ~:/\ ])&.(10x&#.inv)@]^:(1+i.@[)
   5 las 1           NB. left arg is sequence length, right arg is starting number
11 21 1211 111221 312211
于 2012-03-06T11:30:32.147 に答える