library(tidyverse)
library(openintro)

PAY RATE =0.54

Generate symbol for slot machine

get_symbols<- function(){
  wheel<- c("DD","7","BBB","BB","B","C","0")
  sample(wheel, size =3, replace =T,
         prob =c(0.03, 0.03, 0.06, 0.1, 0.25, 0.01, 0.52))
}

Slot machine function

score<- function(symbols){
  #identify case
  slots<- symbols[symbols!="DD"]
  same <- all(symbols==symbols[1])   
  bars <- symbols %in% c("B", "BB", "BBB")
  cherries<-  symbols =="C"
  diamonds<- symbols=="DD"
  # get the prize
  if (sum(diamonds)==3) {
    prize<-100
  } else if (same){
    payouts <- c("7" = 80,"BBB" = 40,  
                 "BB" = 25,"B" = 10, "C" = 10, "0" = 0)
    prize <- unname(payouts[slots[1]])
  } else if (all(bars)){          
    prize <- 5
  } else if (sum(cherries)>0){
    cher.tot<-sum(cherries)
    diam.tot<-sum(diamonds)
    prize <- c(0,2,5,10)[cher.tot+diam.tot+1]      
  } else{
    prize<-0
  }
  #adjust the prize 
  prize * 2^sum(diamonds) 
}

play <-function(){
  symbols<-get_symbols()
  print(symbols)
  score(symbols)
}

play()
## [1] "0" "0" "0"
## [1] 0

Test the expected value of slot machine,for

# make data frame contains all possibilities of slot machine
wheel<- c("DD","7","BBB","BB","B","C","0")
combos<-expand.grid(wheel,wheel,wheel,stringsAsFactors = F)
#look up table
prob<-c("DD"=0.03,"7"=0.03,"BBB"=0.06,"BB"=0.1,"B"=.25,"C"=0.01,"0"=0.52)
#new column in df combos<- ham lookup: lookup table[gia tri lookup]
combos$prob1 <- prob[combos$Var1] 
combos$prob2 <- prob[combos$Var2]
combos$prob3 <- prob[combos$Var3]

combos$prob <-combos$prob1 * combos$prob2 * combos$prob3
tail(combos)
##     Var1 Var2 Var3 prob1 prob2 prob3     prob
## 338    7    0    0  0.03  0.52  0.52 0.008112
## 339  BBB    0    0  0.06  0.52  0.52 0.016224
## 340   BB    0    0  0.10  0.52  0.52 0.027040
## 341    B    0    0  0.25  0.52  0.52 0.067600
## 342    C    0    0  0.01  0.52  0.52 0.002704
## 343    0    0    0  0.52  0.52  0.52 0.140608
# step3. determine the prize for each combination (tot value of each row)

combos$prize<- NA   #create a black column
for (i in 1:nrow(combos)){
  symbols<-c(combos[i,1],combos[i,2],combos[i,3])
  combos$prize[i] <-score(symbols)
}
head(combos)
##   Var1 Var2 Var3 prob1 prob2 prob3     prob prize
## 1   DD   DD   DD  0.03  0.03  0.03 0.000027   800
## 2    7   DD   DD  0.03  0.03  0.03 0.000027     0
## 3  BBB   DD   DD  0.06  0.03  0.03 0.000054     0
## 4   BB   DD   DD  0.10  0.03  0.03 0.000090     0
## 5    B   DD   DD  0.25  0.03  0.03 0.000225     0
## 6    C   DD   DD  0.01  0.03  0.03 0.000009    40
# find expected prize of the slot machine (Expected value)
sum(combos$prob*combos$prize)
## [1] 0.549336

###S3-display First, look up the value of the symbols attribute and save it as an object named symbols

Next, slot_display uses paste to collapse the three strings in symbols into a singlecharacter string Then, uses paste in a new way to combine symbols with the value of prize as what we want paste combines separate objects into a character string when you give it a sep argument is regular expression for new line (i.e. return or enter)

Final, calls cat on the new string. cat is like print; it displays its input at the command line. However, cat does not surround its output with quotation marks. cat also replaces every with a new line or line break

one_play<-play()
## [1] "B" "0" "B"

After how many games, go broke (start with a certain amount of $), while

plays_till_broke <- function(start_with) {
  cash <- start_with
  games <- 0
  while (cash > 0) {
    cash <- cash - 1 + play()
    games <- games + 1
  }
  games
}
plays_till_broke(2)
## [1] "0" "0" "B"
## [1] "0" "0" "0"
## [1] 2

REPEAT

plays_till_broke1<- function(all_money){
  cash<-all_money
  game<-0
  repeat{
    cash<-cash-1+play() #cash -$1 fee + $win
    game<-game+1        #count 1 game every time play
    if(cash<=0){
      break
    }
  }
  game
}
monday<-plays_till_broke1(5)
## [1] "0" "0" "0"
## [1] "DD" "0"  "0" 
## [1] "0" "0" "0"
## [1] "0" "0" "0"
## [1] "B"  "B"  "DD"
tues<-plays_till_broke1(5)
## [1] "0"  "BB" "0" 
## [1] "B" "0" "0"
## [1] "7"   "BBB" "7"  
## [1] "B" "0" "0"
## [1] "0" "B" "0"
wed<-plays_till_broke1(5)
## [1] "B" "0" "B"
## [1] "BBB" "0"   "DD" 
## [1] "B" "B" "0"
## [1] "BBB" "0"   "B"  
## [1] "0"   "BBB" "0"
monday
## [1] 5
tues
## [1] 5
wed
## [1] 5

PAY RATE =.93

score <- function(symbols) {
  diamonds <- sum(symbols == "DD")
  cherries <- sum(symbols == "C")
  # identify case
  # since diamonds are wild, only nondiamonds
  # matter for three of a kind and all bars
  slots <- symbols[symbols != "DD"]
  same <- length(unique(slots)) == 1
  bars <- slots %in% c("B", "BB", "BBB")
  # assign prize
  if (diamonds == 3) {
    prize <- 100
  } else if (same) {
    payouts <- c("7" = 80, "BBB" = 40, "BB" = 25,
                 "B" = 10, "C" = 10, "0" = 0)
    prize <- unname(payouts[slots[1]])
  } else if (all(bars)) {
    prize <- 5
  } else if (cherries > 0) {
    # diamonds count as cherries
    # so long as there is one real cherry
    prize <- c(0, 2, 5)[cherries + diamonds + 1]
  } else {
    prize <- 0
  }
  # double for each diamond
  prize * 2^diamonds
}
for (i in 1:nrow(combos)) {
  symbols <- c(combos[i, 1], combos[i, 2], combos[i, 3])
  combos$prize[i] <- score(symbols)
}
  head(combos)
##   Var1 Var2 Var3 prob1 prob2 prob3     prob prize
## 1   DD   DD   DD  0.03  0.03  0.03 0.000027   800
## 2    7   DD   DD  0.03  0.03  0.03 0.000027   320
## 3  BBB   DD   DD  0.06  0.03  0.03 0.000054   160
## 4   BB   DD   DD  0.10  0.03  0.03 0.000090   100
## 5    B   DD   DD  0.25  0.03  0.03 0.000225    40
## 6    C   DD   DD  0.01  0.03  0.03 0.000009    40
  sum(combos$prize * combos$prob)
## [1] 0.934356
LS0tDQp0aXRsZTogIkFTU0lHTk1FTlQgMy0gU0xPVCBNQUNISU5FIg0KYXV0aG9yOiAiV0lMTE4iDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IG9wZW5pbnRybzo6bGFiX3JlcG9ydA0KLS0tDQoNCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkob3BlbmludHJvKQ0KYGBgDQoNCi0tLQ0KdGl0bGU6ICJwcm9qZWN0IDMiDQphdXRob3I6ICJXaWxsTiINCmRhdGU6ICI4LzgvMjAyMCINCm91dHB1dDogaHRtbF9kb2N1bWVudA0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCiMjIyAqKlBBWSBSQVRFID0wLjU0KioNCiMjIyBHZW5lcmF0ZSBzeW1ib2wgZm9yIHNsb3QgbWFjaGluZQ0KYGBge3J9DQpnZXRfc3ltYm9sczwtIGZ1bmN0aW9uKCl7DQogIHdoZWVsPC0gYygiREQiLCI3IiwiQkJCIiwiQkIiLCJCIiwiQyIsIjAiKQ0KICBzYW1wbGUod2hlZWwsIHNpemUgPTMsIHJlcGxhY2UgPVQsDQogICAgICAgICBwcm9iID1jKDAuMDMsIDAuMDMsIDAuMDYsIDAuMSwgMC4yNSwgMC4wMSwgMC41MikpDQp9DQpgYGANCg0KIyMjIFNsb3QgbWFjaGluZSBmdW5jdGlvbg0KYGBge3J9DQpzY29yZTwtIGZ1bmN0aW9uKHN5bWJvbHMpew0KICAjaWRlbnRpZnkgY2FzZQ0KICBzbG90czwtIHN5bWJvbHNbc3ltYm9scyE9IkREIl0NCiAgc2FtZSA8LSBhbGwoc3ltYm9scz09c3ltYm9sc1sxXSkgICANCiAgYmFycyA8LSBzeW1ib2xzICVpbiUgYygiQiIsICJCQiIsICJCQkIiKQ0KICBjaGVycmllczwtICBzeW1ib2xzID09IkMiDQogIGRpYW1vbmRzPC0gc3ltYm9scz09IkREIg0KICAjIGdldCB0aGUgcHJpemUNCiAgaWYgKHN1bShkaWFtb25kcyk9PTMpIHsNCiAgICBwcml6ZTwtMTAwDQogIH0gZWxzZSBpZiAoc2FtZSl7DQogICAgcGF5b3V0cyA8LSBjKCI3IiA9IDgwLCJCQkIiID0gNDAsICANCiAgICAgICAgICAgICAgICAgIkJCIiA9IDI1LCJCIiA9IDEwLCAiQyIgPSAxMCwgIjAiID0gMCkNCiAgICBwcml6ZSA8LSB1bm5hbWUocGF5b3V0c1tzbG90c1sxXV0pDQogIH0gZWxzZSBpZiAoYWxsKGJhcnMpKXsgICAgICAgICAgDQogICAgcHJpemUgPC0gNQ0KICB9IGVsc2UgaWYgKHN1bShjaGVycmllcyk+MCl7DQogICAgY2hlci50b3Q8LXN1bShjaGVycmllcykNCiAgICBkaWFtLnRvdDwtc3VtKGRpYW1vbmRzKQ0KICAgIHByaXplIDwtIGMoMCwyLDUsMTApW2NoZXIudG90K2RpYW0udG90KzFdICAgICAgDQogIH0gZWxzZXsNCiAgICBwcml6ZTwtMA0KICB9DQogICNhZGp1c3QgdGhlIHByaXplIA0KICBwcml6ZSAqIDJec3VtKGRpYW1vbmRzKSANCn0NCg0KcGxheSA8LWZ1bmN0aW9uKCl7DQogIHN5bWJvbHM8LWdldF9zeW1ib2xzKCkNCiAgcHJpbnQoc3ltYm9scykNCiAgc2NvcmUoc3ltYm9scykNCn0NCg0KcGxheSgpDQpgYGANCg0KIyMjIFRlc3QgdGhlIGV4cGVjdGVkIHZhbHVlIG9mIHNsb3QgbWFjaGluZSwqKmZvcioqDQpgYGB7cn0NCiMgbWFrZSBkYXRhIGZyYW1lIGNvbnRhaW5zIGFsbCBwb3NzaWJpbGl0aWVzIG9mIHNsb3QgbWFjaGluZQ0Kd2hlZWw8LSBjKCJERCIsIjciLCJCQkIiLCJCQiIsIkIiLCJDIiwiMCIpDQpjb21ib3M8LWV4cGFuZC5ncmlkKHdoZWVsLHdoZWVsLHdoZWVsLHN0cmluZ3NBc0ZhY3RvcnMgPSBGKQ0KI2xvb2sgdXAgdGFibGUNCnByb2I8LWMoIkREIj0wLjAzLCI3Ij0wLjAzLCJCQkIiPTAuMDYsIkJCIj0wLjEsIkIiPS4yNSwiQyI9MC4wMSwiMCI9MC41MikNCiNuZXcgY29sdW1uIGluIGRmIGNvbWJvczwtIGhhbSBsb29rdXA6IGxvb2t1cCB0YWJsZVtnaWEgdHJpIGxvb2t1cF0NCmNvbWJvcyRwcm9iMSA8LSBwcm9iW2NvbWJvcyRWYXIxXSANCmNvbWJvcyRwcm9iMiA8LSBwcm9iW2NvbWJvcyRWYXIyXQ0KY29tYm9zJHByb2IzIDwtIHByb2JbY29tYm9zJFZhcjNdDQoNCmNvbWJvcyRwcm9iIDwtY29tYm9zJHByb2IxICogY29tYm9zJHByb2IyICogY29tYm9zJHByb2IzDQp0YWlsKGNvbWJvcykNCg0KIyBzdGVwMy4gZGV0ZXJtaW5lIHRoZSBwcml6ZSBmb3IgZWFjaCBjb21iaW5hdGlvbiAodG90IHZhbHVlIG9mIGVhY2ggcm93KQ0KDQpjb21ib3MkcHJpemU8LSBOQSAgICNjcmVhdGUgYSBibGFjayBjb2x1bW4NCmZvciAoaSBpbiAxOm5yb3coY29tYm9zKSl7DQogIHN5bWJvbHM8LWMoY29tYm9zW2ksMV0sY29tYm9zW2ksMl0sY29tYm9zW2ksM10pDQogIGNvbWJvcyRwcml6ZVtpXSA8LXNjb3JlKHN5bWJvbHMpDQp9DQpoZWFkKGNvbWJvcykNCiMgZmluZCBleHBlY3RlZCBwcml6ZSBvZiB0aGUgc2xvdCBtYWNoaW5lIChFeHBlY3RlZCB2YWx1ZSkNCnN1bShjb21ib3MkcHJvYipjb21ib3MkcHJpemUpDQpgYGANCg0KIyMjUzMtZGlzcGxheQ0KRmlyc3QsIGxvb2sgdXAgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2xzIGF0dHJpYnV0ZSBhbmQgc2F2ZSBpdCBhcyBhbiBvYmplY3QgbmFtZWQgc3ltYm9scyANCg0KTmV4dCwgc2xvdF9kaXNwbGF5IHVzZXMgcGFzdGUgdG8gY29sbGFwc2UgdGhlIHRocmVlIHN0cmluZ3MgaW4gc3ltYm9scyBpbnRvIGEgc2luZ2xlY2hhcmFjdGVyIHN0cmluZyBUaGVuLCB1c2VzIHBhc3RlIGluIGEgbmV3IHdheSB0byBjb21iaW5lIHN5bWJvbHMgd2l0aCB0aGUgdmFsdWUgb2YgcHJpemUgYXMgd2hhdCB3ZSB3YW50IHBhc3RlIGNvbWJpbmVzIHNlcGFyYXRlIG9iamVjdHMgaW50byBhIGNoYXJhY3RlciBzdHJpbmcgd2hlbiB5b3UgZ2l2ZSBpdCBhIHNlcCBhcmd1bWVudCBpcyByZWd1bGFyIGV4cHJlc3Npb24gZm9yIG5ldyBsaW5lIChpLmUuIHJldHVybiBvciBlbnRlcikgDQoNCkZpbmFsLCBjYWxscyBjYXQgb24gdGhlIG5ldyBzdHJpbmcuIGNhdCBpcyBsaWtlIHByaW50OyBpdCBkaXNwbGF5cyBpdHMgaW5wdXQgYXQgdGhlIGNvbW1hbmQgbGluZS4gSG93ZXZlciwgY2F0IGRvZXMgbm90IHN1cnJvdW5kIGl0cyBvdXRwdXQgd2l0aCBxdW90YXRpb24gbWFya3MuIGNhdCBhbHNvIHJlcGxhY2VzIGV2ZXJ5IHdpdGggYSBuZXcgbGluZSBvciBsaW5lIGJyZWFrDQpgYGB7cn0NCm9uZV9wbGF5PC1wbGF5KCkNCmBgYA0KDQojIyMgQWZ0ZXIgaG93IG1hbnkgZ2FtZXMsIGdvIGJyb2tlIChzdGFydCB3aXRoIGEgY2VydGFpbiBhbW91bnQgb2YgJCksICoqd2hpbGUqKg0KDQpgYGB7cn0NCnBsYXlzX3RpbGxfYnJva2UgPC0gZnVuY3Rpb24oc3RhcnRfd2l0aCkgew0KICBjYXNoIDwtIHN0YXJ0X3dpdGgNCiAgZ2FtZXMgPC0gMA0KICB3aGlsZSAoY2FzaCA+IDApIHsNCiAgICBjYXNoIDwtIGNhc2ggLSAxICsgcGxheSgpDQogICAgZ2FtZXMgPC0gZ2FtZXMgKyAxDQogIH0NCiAgZ2FtZXMNCn0NCnBsYXlzX3RpbGxfYnJva2UoMikNCmBgYA0KDQojIyMgUkVQRUFUDQpgYGB7cn0NCnBsYXlzX3RpbGxfYnJva2UxPC0gZnVuY3Rpb24oYWxsX21vbmV5KXsNCiAgY2FzaDwtYWxsX21vbmV5DQogIGdhbWU8LTANCiAgcmVwZWF0ew0KICAgIGNhc2g8LWNhc2gtMStwbGF5KCkgI2Nhc2ggLSQxIGZlZSArICR3aW4NCiAgICBnYW1lPC1nYW1lKzEgICAgICAgICNjb3VudCAxIGdhbWUgZXZlcnkgdGltZSBwbGF5DQogICAgaWYoY2FzaDw9MCl7DQogICAgICBicmVhaw0KICAgIH0NCiAgfQ0KICBnYW1lDQp9DQptb25kYXk8LXBsYXlzX3RpbGxfYnJva2UxKDUpDQp0dWVzPC1wbGF5c190aWxsX2Jyb2tlMSg1KQ0Kd2VkPC1wbGF5c190aWxsX2Jyb2tlMSg1KQ0KbW9uZGF5DQp0dWVzDQp3ZWQNCmBgYA0KDQojIyMgKipQQVkgUkFURSA9LjkzKioNCg0KYGBge3J9DQpzY29yZSA8LSBmdW5jdGlvbihzeW1ib2xzKSB7DQogIGRpYW1vbmRzIDwtIHN1bShzeW1ib2xzID09ICJERCIpDQogIGNoZXJyaWVzIDwtIHN1bShzeW1ib2xzID09ICJDIikNCiAgIyBpZGVudGlmeSBjYXNlDQogICMgc2luY2UgZGlhbW9uZHMgYXJlIHdpbGQsIG9ubHkgbm9uZGlhbW9uZHMNCiAgIyBtYXR0ZXIgZm9yIHRocmVlIG9mIGEga2luZCBhbmQgYWxsIGJhcnMNCiAgc2xvdHMgPC0gc3ltYm9sc1tzeW1ib2xzICE9ICJERCJdDQogIHNhbWUgPC0gbGVuZ3RoKHVuaXF1ZShzbG90cykpID09IDENCiAgYmFycyA8LSBzbG90cyAlaW4lIGMoIkIiLCAiQkIiLCAiQkJCIikNCiAgIyBhc3NpZ24gcHJpemUNCiAgaWYgKGRpYW1vbmRzID09IDMpIHsNCiAgICBwcml6ZSA8LSAxMDANCiAgfSBlbHNlIGlmIChzYW1lKSB7DQogICAgcGF5b3V0cyA8LSBjKCI3IiA9IDgwLCAiQkJCIiA9IDQwLCAiQkIiID0gMjUsDQogICAgICAgICAgICAgICAgICJCIiA9IDEwLCAiQyIgPSAxMCwgIjAiID0gMCkNCiAgICBwcml6ZSA8LSB1bm5hbWUocGF5b3V0c1tzbG90c1sxXV0pDQogIH0gZWxzZSBpZiAoYWxsKGJhcnMpKSB7DQogICAgcHJpemUgPC0gNQ0KICB9IGVsc2UgaWYgKGNoZXJyaWVzID4gMCkgew0KICAgICMgZGlhbW9uZHMgY291bnQgYXMgY2hlcnJpZXMNCiAgICAjIHNvIGxvbmcgYXMgdGhlcmUgaXMgb25lIHJlYWwgY2hlcnJ5DQogICAgcHJpemUgPC0gYygwLCAyLCA1KVtjaGVycmllcyArIGRpYW1vbmRzICsgMV0NCiAgfSBlbHNlIHsNCiAgICBwcml6ZSA8LSAwDQogIH0NCiAgIyBkb3VibGUgZm9yIGVhY2ggZGlhbW9uZA0KICBwcml6ZSAqIDJeZGlhbW9uZHMNCn0NCmZvciAoaSBpbiAxOm5yb3coY29tYm9zKSkgew0KICBzeW1ib2xzIDwtIGMoY29tYm9zW2ksIDFdLCBjb21ib3NbaSwgMl0sIGNvbWJvc1tpLCAzXSkNCiAgY29tYm9zJHByaXplW2ldIDwtIHNjb3JlKHN5bWJvbHMpDQp9DQogIGhlYWQoY29tYm9zKQ0KICANCiAgc3VtKGNvbWJvcyRwcml6ZSAqIGNvbWJvcyRwcm9iKQ0KYGBgDQogIA0KDQo=