Dreidel

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.

Simulate the spinning top

CommandResults
/ 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": ["נ","ה","ג","ש"]}

/ We instantiate our dreidel using one of the languages, in this case Yiddish / dreidel gets quote(choose(sides after "yiddish"))

/ Roll the dreidel 3 times / dreidel; dreidel; dreidel

/ Make an array with three rolls / 3 # dreidel

/ Roll it 100,000 times and compute a frequency table rounded to 2 decimal places / 100000 # dreidel |> freq |> round

sides ← {"yiddish":["nisht","halb","gants","shtel ayn"],"english":["nothing","half","gets all","share"],"hebrew":["נ","ה","ג","ש"]}

dreidel ← quote(choose(sides ∘ "yiddish"))

dreidel → "halb" dreidel → "gants" dreidel → "shtel ayn"

3 # dreidel → ["nisht", "halb", "nisht"]

round(freq(100000 # dreidel)) → {"gants":0.25,"halb":0.25,"nisht":0.25,"shtel ayn":0.25}

Simulate the gambling game

Second we simulate an entire game of dreidel. Our program uses the following variables:

A game uses the following rules:

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"


AUTHORS BUGS DISCUSSION LICENSE NAME NEWS README SOURCE TODO TRY VERSION

Last update: Fri Sep 23 2016