"ブルガリアソリティア"は数学的な好奇心です。それは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
のようなローカル動詞を使用する方がいいでしょう。このプログラムを改善するためにはどのような機会が必要ですか?
私はあなたがJ-フォーラムは、この種の問題のためのよりよい場所であることを見つけると思います。 – Eelvex
ありがとうございます。私は(再)購読して、そこに投稿する前にちょっと待ってください。 –