Problem 54

Problem 54 - Project Euler
ただひたすらに面倒だった…
未だに文字列ベクトルをどう読みこむのが効率的なのか分からない.勝手に因子型にn
→今help見た.stringsAsFactorsで指定できた…
あと初めてgrepを使った気がする.

poker <- t(read.table("poker.txt", sep=" "))

poker.suit <- poker
suits <- c("D", "H", "C", "S")
for(s in suits){
  poker.suit[grep(s, poker)] <- s
}

poker.nums <- poker
nums <- c(as.character(2:9), "T", "J", "Q", "K", "A")
for(n in 1:13){
  poker.nums[grep(nums[n], poker)] <- n
}
poker.nums <- as.numeric(poker.nums)

is.flash <- function(suit, num){
  if(length(unique(suit))==1){
    return(c(5,max(num)))
  }else{
    return(FALSE)
  }
}

is.straight <- function(suit, num){
  if(setequal(num, c(13,1:4))){
    return(c(4, 4))
  }else if(sum(diff(sort(num))==1)==4){
    return(c(4, max(num)))
  }else{
    FALSE
  }
}

is.pairs <- function(num){
  pair <- c("one"=0, "two"=0, "thr"=0, "fou"=0, "ful"=0)
  p.rank <- c(1, 2, 3, 7, 6)
  for(n in 1:13){
    cards <- length(num[num==n])
    if(cards==2){
      if(pair[1]){
        pair[2] <- n
        pair[1] <- 0
      }else{
        pair[1] <- n
      }
    }else if(cards==3){
      pair[3] <- n
    }else if(cards==4){
      pair[4] <- n
    }
  }
  if(pair[1]&&pair[3]){
    pair[5] <- pair[3]
    pair[1] <- pair[3] <- 0
  }
  if(sum(pair)==0) return(FALSE)
  return(c(p.rank[pair>0], pair[pair>0]))
}

how.power <- function(suit, num){
  if(is.flash(suit,num)&&setequal(9:13,num)){
    return(c(9,13))
  }else if(is.flash(suit,num)&&is.straight(suit,num)){
    return(c(8,max(num)))
  }else if(length(is.straight(suit,num))>1){
    return(is.straight(suit,num))
  }else if(length(is.flash(suit,num))>1){
    return(is.flash(suit,num))
  }else if(length(is.pairs(num))>1){
    return(is.pairs(num))
  }else{
    return(c(0, max(num)))
  }
}
  

p1.wins <- 0
for(i in 0:999){
  p1.num <- poker.nums[(i*10+1):(i*10+5)]
  p1.suit <- poker.suit[(i*10+1):(i*10+5)]
  p2.num <- poker.nums[(i*10+6):(i*10+10)]
  p2.suit <- poker.suit[(i*10+6):(i*10+10)]

  p1.pow <- how.power(p1.suit, p1.num)
  p2.pow <- how.power(p2.suit, p2.num)

  if(p1.pow[1] > p2.pow[1]){
    p1.wins <- p1.wins+1
  }else if((p1.pow[1] ==  p2.pow[1]) && (p1.pow[2] > p2.pow[2])){
    p1.wins <- p1.wins+1
  }
}
p1.wins