Happy Hanukkah! First we present an internationalized version of the Dreidel, a four-sided spinning top. And second we simulate a gambling dice game played with the Dreidel.
Command | Results |
---|---|
/ Here are labels for the 4 sides of the dreidel in three languages / sides gets {"yiddish": ["nisht", "halb", "gants", "shtel ayn"], ... "english": ["nothing", "half", "gets all", "share"], ... "hebrew": ["נ","ה","ג","ש"]} |
sides ← {"yiddish":["nisht","halb","gants","shtel ayn"],"english":["nothing","half","gets all","share"],"hebrew":["נ","ה","ג","ש"]} |
Second we simulate an entire game of dreidel. Our program uses the following variables:
n
is the number of playersN
is the number of turns played per gamet
is the current turn; each player gets one roll per turnp
is current player 0..n-1
result
is the player's roll: nisht, halb, ganz or shteyl aynpieces
is the number of game pieces (chocolate gelt, pennies, or raisins) each player begins withplayers
is an array that shows how many pieces each player haspot
is the number of pieces in the potsum
is the sum of the pot plus all the players' pieceszerosum
is a sanity check that says sum must equal n*pieces, it should always evaluate to trueante
is the number of game pieces each player must ante every time he rolls "shteyl ayn" or when the pot is emptyA game uses the following rules:
ante
game pieces into pot
. In addition, every time the pot is empty, every player puts ante
into the pot.ante
game piece(s) to the pot.Initially, let's make the following assumptions: assume n=2 players, ante=1, pieces=10. The system plays for N=100 turns. Here is the input:
setup gets { ... init gets { n set 2; ante set 1; pot set 0; pieces set 10; N set pieces^2; p set 0; t set 1; players set n#pieces }; ... anteup gets { players set players-ante; pot set pot+n*ante; true }; ... halb gets { amount set floor(1/2*(pot+1)); pot set pot-amount; players set update(players,(players after p)+amount,p); "halb" }; ... ganz gets { amount set (players after p)+pot; players set update(players,amount,p); pot set 0; "ganz" }; ... shtelayn gets { amount set (players after p)-ante; pot set pot+ante; players set update(players,amount,p); "shtel ayn" }; ... nisht gets { "nisht" }; ... sum gets pot + sum players; ... zerosum gets n*pieces=sum; ... play gets { ... init; ... while(t<=N) { ... while(p<n) { ... anteflag set if[pot=0, anteup, true, false]; ... roll set d4; ... result set if[roll=1,halb,roll=2,ganz,roll=3,shtelayn,roll=4,nisht]; ... str set str + "Turn=" + t + ", round=" + p + ", ante=" + anteflag + ", result=" + result + ", players=" + stringify(players) + ", pot=" + pot + ", zerosum=" + zerosum + "\n"; ... p set p+1 ... }; ... t set t+1; p set 0 ... }; ... str ... }; ... "ready" ... } setup play
Here is the corresponding output:
setup ← {/* Omitted for brevity */} setup → "ready" Turn=1, round=0, ante=true, result=ganz, players=[11,9], pot=0, zerosum=true Turn=1, round=1, ante=true, result=halb, players=[10,9], pot=1, zerosum=true Turn=2, round=0, ante=false, result=nisht, players=[10,9], pot=1, zerosum=true Turn=2, round=1, ante=false, result=halb, players=[10,10], pot=0, zerosum=true Turn=3, round=0, ante=true, result=ganz, players=[11,9], pot=0, zerosum=true Turn=3, round=1, ante=true, result=halb, players=[10,9], pot=1, zerosum=true Turn=4, round=0, ante=false, result=halb, players=[11,9], pot=0, zerosum=true Turn=4, round=1, ante=true, result=halb, players=[10,9], pot=1, zerosum=true Turn=5, round=0, ante=false, result=ganz, players=[11,9], pot=0, zerosum=true Turn=5, round=1, ante=true, result=nisht, players=[10,8], pot=2, zerosum=true
Lots of output omitted for brevity...
Turn=95, round=0, ante=false, result=shtel ayn, players=[20,-2], pot=2, zerosum=true Turn=95, round=1, ante=false, result=halb, players=[20,-1], pot=1, zerosum=true Turn=96, round=0, ante=false, result=shtel ayn, players=[19,-1], pot=2, zerosum=true Turn=96, round=1, ante=false, result=halb, players=[19,0], pot=1, zerosum=true Turn=97, round=0, ante=false, result=nisht, players=[19,0], pot=1, zerosum=true Turn=97, round=1, ante=false, result=ganz, players=[19,1], pot=0, zerosum=true Turn=98, round=0, ante=true, result=shtel ayn, players=[17,0], pot=3, zerosum=true Turn=98, round=1, ante=false, result=ganz, players=[17,3], pot=0, zerosum=true Turn=99, round=0, ante=true, result=ganz, players=[18,2], pot=0, zerosum=true Turn=99, round=1, ante=true, result=ganz, players=[17,3], pot=0, zerosum=true Turn=100, round=0, ante=true, result=shtel ayn, players=[15,2], pot=3, zerosum=true Turn=100, round=1, ante=false, result=ganz, players=[15,5], pot=0, zerosum=true play → "done"
At this point, if you wanted to play again, you could just issue the play
command.
Now let's change the following assumptions: assume n=4 players, ante=3.
NB. You could also modify the line anteflag set if[pot=0, anteup, true, false]; ...
so that players must ante up if pot=0 or pot=1
. Some versions of the rules call for this. We're not going to do this in our example though.
Here is the input:
setup gets { ... init gets { n set 4; ante set 3; pot set 0; pieces set 10; N set pieces^2; p set 0; t set 1; players set n#pieces }; ... anteup gets { players set players-ante; pot set pot+n*ante; true }; ... halb gets { amount set floor(1/2*(pot+1)); pot set pot-amount; players set update(players,(players after p)+amount,p); "halb" }; ... ganz gets { amount set (players after p)+pot; players set update(players,amount,p); pot set 0; "ganz" }; ... shtelayn gets { amount set (players after p)-ante; pot set pot+ante; players set update(players,amount,p); "shtel ayn" }; ... nisht gets { "nisht" }; ... sum gets pot + sum players; ... zerosum gets n*pieces=sum; ... play gets { ... init; ... while(t<=N) { ... while(p<n) { ... anteflag set if[pot=0, anteup, true, false]; ... roll set d4; ... result set if[roll=1,halb,roll=2,ganz,roll=3,shtelayn,roll=4,nisht]; ... str set str + "Turn=" + t + ", round=" + p + ", ante=" + anteflag + ", result=" + result + ", players=" + stringify(players) + ", pot=" + pot + ", zerosum=" + zerosum + "\n"; ... p set p+1 ... }; ... t set t+1; p set 0 ... }; ... str ... }; ... "ready" ... } setup play
Here is the corresponding output:
setup ← {/* Omitted for brevity */} setup → "ready" Turn=1, round=0, ante=true, result=ganz, players=[19,7,7,7], pot=0, zerosum=true Turn=1, round=1, ante=true, result=shtel ayn, players=[16,1,4,4], pot=15, zerosum=true Turn=1, round=2, ante=false, result=halb, players=[16,1,12,4], pot=7, zerosum=true Turn=1, round=3, ante=false, result=shtel ayn, players=[16,1,12,1], pot=10, zerosum=true Turn=2, round=0, ante=false, result=nisht, players=[16,1,12,1], pot=10, zerosum=true Turn=2, round=1, ante=false, result=ganz, players=[16,11,12,1], pot=0, zerosum=true Turn=2, round=2, ante=true, result=halb, players=[13,8,15,-2], pot=6, zerosum=true Turn=2, round=3, ante=false, result=ganz, players=[13,8,15,4], pot=0, zerosum=true Turn=3, round=0, ante=true, result=shtel ayn, players=[7,5,12,1], pot=15, zerosum=true Turn=3, round=1, ante=false, result=ganz, players=[7,20,12,1], pot=0, zerosum=true Turn=3, round=2, ante=true, result=nisht, players=[4,17,9,-2], pot=12, zerosum=true Turn=3, round=3, ante=false, result=ganz, players=[4,17,9,10], pot=0, zerosum=true Turn=4, round=0, ante=true, result=ganz, players=[13,14,6,7], pot=0, zerosum=true Turn=4, round=1, ante=true, result=nisht, players=[10,11,3,4], pot=12, zerosum=true Turn=4, round=2, ante=false, result=ganz, players=[10,11,15,4], pot=0, zerosum=true Turn=4, round=3, ante=true, result=halb, players=[7,8,12,7], pot=6, zerosum=true Turn=5, round=0, ante=false, result=halb, players=[10,8,12,7], pot=3, zerosum=true Turn=5, round=1, ante=false, result=halb, players=[10,10,12,7], pot=1, zerosum=true Turn=5, round=2, ante=false, result=shtel ayn, players=[10,10,9,7], pot=4, zerosum=true Turn=5, round=3, ante=false, result=nisht, players=[10,10,9,7], pot=4, zerosum=true
Lots of output omitted for brevity...
Turn=98, round=0, ante=false, result=nisht, players=[-13,14,91,-55], pot=3, zerosum=true Turn=98, round=1, ante=false, result=ganz, players=[-13,17,91,-55], pot=0, zerosum=true Turn=98, round=2, ante=true, result=nisht, players=[-16,14,88,-58], pot=12, zerosum=true Turn=98, round=3, ante=false, result=nisht, players=[-16,14,88,-58], pot=12, zerosum=true Turn=99, round=0, ante=false, result=shtel ayn, players=[-19,14,88,-58], pot=15, zerosum=true Turn=99, round=1, ante=false, result=ganz, players=[-19,29,88,-58], pot=0, zerosum=true Turn=99, round=2, ante=true, result=shtel ayn, players=[-22,26,82,-61], pot=15, zerosum=true Turn=99, round=3, ante=false, result=nisht, players=[-22,26,82,-61], pot=15, zerosum=true Turn=100, round=0, ante=false, result=shtel ayn, players=[-25,26,82,-61], pot=18, zerosum=true Turn=100, round=1, ante=false, result=halb, players=[-25,35,82,-61], pot=9, zerosum=true Turn=100, round=2, ante=false, result=ganz, players=[-25,35,91,-61], pot=0, zerosum=true Turn=100, round=3, ante=true, result=nisht, players=[-28,32,88,-64], pot=12, zerosum=true play → "done"
Last update: Fri Sep 23 2016