2016-04-08 1 views
2

"ブルガリアソリティア"は数学的な好奇心です。それは45のデッキ(任意の三角数字は動作します)のマークが付いていないカードでプレイされます。無作為に大きさの杭に入れてください。ラウンドをプレイするには、各パイルからカードを1枚取り出し、取り除いたカードで新しいパイルを作成します。このステップを繰り返すと、最終的にゲームの固定点であるソリティアの終わりである明らかにコンフィグレーション1 2 3 4 5 6 7 8 9(45枚のカード用)が得られます。働く "ブルガリアソリティア" J動詞を改善する

これについて数日待ってからJゲントについての長い洞察が得られたら、私はいくつかの意見を聞きたい解決策を思いつきました。それは、この動詞で始まる:

bsol =: ((#~ ~:&0) , #)@:(-&1)^:(<_) 

は合計三角形である正の整数のベクトルを考えると、この動詞は結果ソリティアのラウンドを示すランク2の配列を返します。私はまた、初期構成を生成するには、この動詞を思い付いたが、私はそれとあまり満足している:すなわち45から欠陥を返すt正の整数のベクトルy、、、数45 - +/ y考える

t  =: 45 & - @ (+/) NB. Would work with any triangular number 
cards =: (]`(]@,>:@?&[email protected]]))@.(0&<@t)^:_ 

議論によって表される杭の中で説明されていないカード。 tを使用して、動詞cardsは、このようなベクターy欠陥が0

が明示的にtを拡大しているまで繰り返し>: i. t yの整数、私は、

cards =: (]`(]@,>:@?&(45 & - @ (+/))@]))@.(0&<@(45 & - @ (+/)))^:_ 
私はこのように感じる

は非常に簡単ではありません取得に追加し、おそらくあまりにも括弧で囲まれている。しかし、それは仕事をし、そして完全なソリューションは、次のようになります。名前の動詞なし

bsol @ cards @ >: @ ? 44 NB. Choose the first pile randomly from >: i. 44 

(((#~ ~:&0) , #)@:(-&1)^:(<_)) @: ((]`(]@,>:@?&(45 & - @ (+/))@]))@.(0&<@(45 & - @ (+/)))^:_)@>:@? 44 

Jイディオムについて多くを知らない、私はこれについて、同じ気持ちを持っている:それはありません非常に短い、確かに冗長である(ここではtのようなローカル動詞を使用する方がいいでしょう。このプログラムを改善するためにはどのような機会が必要ですか?

+1

私はあなたがJ-フォーラムは、この種の問題のためのよりよい場所であることを見つけると思います。 – Eelvex

+0

ありがとうございます。私は(再)購読して、そこに投稿する前にちょっと待ってください。 –

答えて

2

あなたはあなたにいくつかの>:を惜しまます46 - +/を使用して

t =: 45 - +/ 

tを向上させることができます。

あなたは再帰的な定義でcardsを置き換えることができます。

cards =: }.`(($:@] , -) ?)@.(0&<) 

はどこ、今、cards nは合計nで初期設定を生成します。

あなたは( -.)ゼロを削除して、同じようにそれを並べ替える場合は、 -&1を必要としない bsol

bsol =: (0 -.~ [: (, #) <:)^:(<_)