2016-04-08 16 views
2

"Bulgarische Solitaire" ist eine mathematische Kuriosität. Es wird mit einem Kartenspiel von 45 (jede Dreieckszahl wird funktionieren) unmarkierter Karten gespielt. Leg sie in zufällig große Stapel. Dann, um eine Runde zu spielen, entferne eine Karte von jedem Stapel und erstelle einen neuen Stapel mit den entfernten Karten. Die Wiederholung dieses Schrittes ergibt schließlich die Konfiguration 1 2 3 4 5 6 7 8 9 (für 45 Karten), die eindeutig ein Fixpunkt des Spiels und somit das Ende des Solitaires ist. Ich wollte dieses Spiel in J. simulieren.Verbessere ein funktionierendes "Bulgarische Solitaire" J Verb

Nachdem ich einige Tage darüber nachgedacht hatte und einige lang ersehnte Einblicke in J Gerundien hatte, kam ich auf eine Lösung, über die ich einige Meinungen hätte. Es beginnt mit diesem Verb:

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

einen Vektor von positiven ganzen Zahlen, deren Summe Dreieck gegeben, dieses Verb gibt einen Rang 2 Array mit den Runden des Solitär zeigt, die zur Folge hat. Ich kam auch mit diesem Verb bis eine Anfangskonfiguration zu erzeugen, aber ich bin weniger glücklich mit ihm:

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

Bei einem Vektor y von positiven ganzen Zahlen, t gibt den Fehler von 45, das heißt, die Zahl 45 - +/ y von Karten, die nicht in den Stapeln enthalten sind, die durch das Argument dargestellt werden. Mit t, das Verb cards anhängt, um einen solchen Vektor y eine ganze Zahl von >: i. t y so oft, bis der Fehler 0 ist

Erweiterung t ausdrücklich, ich

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

ich so das Gefühl, nicht sehr kurz ist, und vielleicht übermäßig eingeklammert. Aber es funktioniert, und die komplette Lösung sieht nun wie folgt aus:

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

Ohne die genannten Verben:

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

nicht viel über J Idiom zu wissen, ich habe das gleiche Gefühl bei der Sache: es ist nicht sehr kurz, sicherlich redundant (wäre es besser, ein lokales Verb wie t hier zu verwenden, da es sich wiederholt, zB?), und wahrscheinlich übermäßig eingeklammert. Welche Möglichkeiten habe ich, dieses Programm zu verbessern?

+1

Ich glaube, Sie werden feststellen, dass J-Foren ist ein besserer Ort für Fragen dieser Art . – Eelvex

+0

Danke. Ich habe mich (wieder) angemeldet und werde eine Weile lauern, bevor ich dort posten werde. –

Antwort

2

Sie können t mit

t =: 45 - +/ 

46 - +/ Mit verbessern Sie einige >: ersparen.

Sie können cards mit einer rekursiven Definition ersetzen:

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

wo jetzt produziert cards n eine Anfangskonfiguration mit Summe n.

In bsol Sie nicht -&1 brauchen, wenn Sie (-.), um die Nullen entfernen und neu anordnen es mögen:

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