Skip to content

Instantly share code, notes, and snippets.

@akihiro4chawon
Created July 2, 2012 04:55
Show Gist options
  • Save akihiro4chawon/3031176 to your computer and use it in GitHub Desktop.
Save akihiro4chawon/3031176 to your computer and use it in GitHub Desktop.
[ネタ] どう書くポーカーのScala 版
// solution to http://qiita.com/items/cbc3af152ee3f50a822f
// using parser combinators
import scala.util.parsing.combinator.RegexParsers
case class Card(suit: String, rank: String)
trait CardsParser extends RegexParsers {
def cards = repN(5, card)
def card: Parser[Card] = (suit ~ rank) ^^ {case s~r => Card(s, r)}
def suit: Parser[String] = "[SHDC]".r
def rank: Parser[String] = "[A2-9JQK]|10".r
}
object Main extends App with CardsParser {
val hand: String => String = Map(
"14" -> "4K", "23" -> "FH", "113" -> "3K",
"122" -> "2P", "1112" -> "1P", "11111" -> "--")
def toHand(cards: List[Card]): String =
hand(cards.groupBy(_.rank).map(_._2.length).toSeq.sorted.mkString)
def solve(deal: String): String =
parseAll(cards, deal).map(toHand).getOrElse("Parse Error!")
// test cases are taken from http://gist.github.com/3026343
assert(solve("DASAD10CAHA") == "4K")
assert(solve("S10HJDJCJSJ") == "4K")
assert(solve("S10HAD10DAC10") == "FH")
assert(solve("HJDJC3SJS3") == "FH")
assert(solve("S3S4H3D3DA") == "3K")
assert(solve("S2HADKCKSK") == "3K")
assert(solve("SASJDACJS10") == "2P")
assert(solve("S2S10H10HKD2") == "2P")
assert(solve("CKH10D10H3HJ") == "1P")
assert(solve("C3D3S10SKS2") == "1P")
assert(solve("S3SJDAC10SQ") == "--")
assert(solve("C3C9SAS10D2") == "--")
}
// simple scala solution to http://qiita.com/items/cbc3af152ee3f50a822f
object Main extends App {
val hand: String => String = Map(
"14" -> "4K", "23" -> "FH", "113" -> "3K",
"122" -> "2P", "1112" -> "1P", "11111" -> "--")
def solve(deal: String) =
hand("[A2-9JQK]|10".r.findAllIn(deal).toSeq.groupBy(identity)
.map(_._2.length).toSeq.sorted.mkString)
// test cases are taken from http://gist.github.com/3026343
assert(solve("DASAD10CAHA") == "4K")
assert(solve("S10HJDJCJSJ") == "4K")
assert(solve("S10HAD10DAC10") == "FH")
assert(solve("HJDJC3SJS3") == "FH")
assert(solve("S3S4H3D3DA") == "3K")
assert(solve("S2HADKCKSK") == "3K")
assert(solve("SASJDACJS10") == "2P")
assert(solve("S2S10H10HKD2") == "2P")
assert(solve("CKH10D10H3HJ") == "1P")
assert(solve("C3D3S10SKS2") == "1P")
assert(solve("S3SJDAC10SQ") == "--")
assert(solve("C3C9SAS10D2") == "--")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment