2016-04-08 24 views
2

"Bulgar Solitaire" matematiksel bir meraktır. İşaretsiz kartların 45 (herhangi bir üçgen sayı çalışacak) destesi ile oynanır. Onları rasgele boyutlu kazıklara koyun. Ardından, bir tur oynatmak için her bir desteden bir kart çıkarın ve çıkartılan kartlarla yeni bir yığın oluşturun. Bu adımı tekrarlamak, sonunda oyunun sabit bir noktası olan ve böylece solitaire sonu olan 1 2 3 4 5 6 7 8 9 (45 kart için) yapılandırmasını verir. Bu oyunu J.Çalışmayı geliştirin "Bulgar Solitaire" J fiil

'da simüle etmek istedim. Birkaç gün sonra bunu ve J ger'leri hakkında uzun zamandır beklenen bir bakış açısını düşündüğümde, bazı fikirleri almak istediğim bir çözüm buldum. Bu fiilin başlar:

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

toplamı üçgen pozitif tamsayılar bir vektör göz önüne alındığında, bu fiil sonuçları solitaire mermi gösteren bir rütbe 2 dizisini döndürür. Ben de bir ilk yapılandırmayı oluşturmak için bu fiilin ile geldi, ama onunla daha az mutluyum: Bir vektör pozitif tamsayılar y Verilen

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

, t, yani 45 ila sayısını 45 - +/ y hatasını döndürür kartlar argüman tarafından temsil edilen yığınlarda hesaba katılmamıştır. t kullanarak, fiil cards böyle bir vektör y kusur 0.

açıkça t Genişleyen kadar art arda >: i. t y kadar bir tamsayı, ben,

cards =: (]`(]@,>:@?&(45 & - @ (+/))@]))@.(0&<@(45 & - @ (+/)))^:_ 
böyle hissediyorum

çok kısa değil almak ekler ve belki aşırı parantez içinde. Ama çalışır ve tam çözüm şimdi şuna benzer:

J deyim hakkında bilmek
(((#~ ~:&0) , #)@:(-&1)^:(<_)) @: ((]`(]@,>:@?&(45 & - @ (+/))@]))@.(0&<@(45 & - @ (+/)))^:_)@>:@? 44 

değil, bu konuda aynı duygu var: o değil adlandırılmış fiiller olmadan

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

Çok kısa, kesinlikle gereksiz (t gibi yerel bir fiili kullanmak daha iyi olurdu, çünkü tekrarlanır, örneğin?) ve muhtemelen aşırı parantez içinde. Bu programı geliştirmek için hangi fırsatlara ihtiyacım var?

+1

Sana J-forumlar bu tür sorular için daha iyi bir yer olduğunu göreceksiniz düşünüyorum . – Eelvex

+0

Teşekkürler. Ben (re-) abone ve orada göndermeden önce bir süre için saklayacaktır. –

cevap

2

Sen bazı >: bağışlarım 46 - +/ kullanma

t =: 45 - +/ 

ile t artırabilir.

bir yinelemeli bir tanımlama cards yerine kullanılabilir:

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

burada, hemen, cards n toplamı n ile bir ilk yapılandırma üretir. Eğer sıfır (-.) kaldırmak ve yeniden düzenlemek durumunda bsol yılında

Eğer -&1 gerekmez hoşuna:

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