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