fork download
  1. fn main() {
  2. use std::collections::HashSet;
  3. use Number::*;
  4. use Tile::*;
  5.  
  6. let mut hand = vec![
  7. Dots(One),
  8. Dots(One),
  9. Dots(One),
  10. Dots(Two),
  11. Dots(Three),
  12. Dots(Four),
  13. Dots(Five),
  14. Dots(Six),
  15. Dots(Seven),
  16. Dots(Eight),
  17. Dots(Nine),
  18. Dots(Nine),
  19. Dots(Nine),
  20. East,
  21. ];
  22.  
  23. hand.sort();
  24.  
  25. let mut current: HashSet<Vec<Vec<Tile>>> = HashSet::new();
  26. current.insert(vec![]);
  27.  
  28. for tile in hand.iter() {
  29. let mut temp = HashSet::new();
  30. for parts in current.iter() {
  31. for (i, part) in parts.iter().enumerate().filter(|(_, part)| part.len() < 3) {
  32. if let Some(new_part) = append(part, *tile) {
  33. let mut new_parts: Vec<_> = parts.to_owned();
  34. new_parts[i] = new_part;
  35. new_parts.sort();
  36. temp.insert(new_parts);
  37. }
  38. }
  39. let mut new_parts: Vec<_> = parts.to_owned();
  40. new_parts.push(vec![*tile]);
  41. new_parts.sort();
  42. temp.insert(new_parts);
  43. }
  44. current = temp;
  45. }
  46.  
  47. let min_len: usize = current.iter().map(Vec::len).min().unwrap();
  48.  
  49. current = current
  50. .into_iter()
  51. .filter(|parts| parts.len() == min_len)
  52. .collect();
  53.  
  54. println!("{}", current.len());
  55. for parts in current.iter() {
  56. println!("{:?}", parts);
  57. }
  58. }
  59.  
  60. fn append(part: &[Tile], tile: Tile) -> Option<Vec<Tile>> {
  61. use Tile::*;
  62. let mut part: Vec<_> = part.to_owned();
  63. part.push(tile);
  64. part.sort();
  65. if part.windows(2).all(|w| w[0] == w[1])
  66. || part.windows(2).all(|w| match w {
  67. [Dots(n1), Dots(n2)] if n1.diff(*n2) == 1 => true,
  68. [Bamboo(n1), Bamboo(n2)] if n1.diff(*n2) == 1 => true,
  69. [Characters(n1), Characters(n2)] if n1.diff(*n2) == 1 => true,
  70. _ => false,
  71. })
  72. || (match &part[..] {
  73. [Dots(n1), Dots(n2)] if n1.diff(*n2) == 2 => true,
  74. [Bamboo(n1), Bamboo(n2)] if n1.diff(*n2) == 2 => true,
  75. [Characters(n1), Characters(n2)] if n1.diff(*n2) == 2 => true,
  76. _ => false,
  77. })
  78. {
  79. Some(part)
  80. } else {
  81. None
  82. }
  83. }
  84.  
  85. #[allow(dead_code)]
  86. #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
  87. enum Number {
  88. One = 1,
  89. Two,
  90. Three,
  91. Four,
  92. Five,
  93. Six,
  94. Seven,
  95. Eight,
  96. Nine,
  97. }
  98.  
  99. #[allow(dead_code)]
  100. #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
  101. enum Tile {
  102. Dots(Number),
  103. Bamboo(Number),
  104. Characters(Number),
  105. East,
  106. South,
  107. West,
  108. North,
  109. Red,
  110. Green,
  111. White,
  112. }
  113.  
  114. impl Number {
  115. fn diff(self, other: Self) -> i32 {
  116. (self as i32 - other as i32).abs()
  117. }
  118. }
  119.  
Success #stdin #stdout 0.02s 5188KB
stdin
Standard input is empty
stdout
15
[[Dots(One), Dots(One), Dots(One)], [Dots(Two), Dots(Three), Dots(Four)], [Dots(Five), Dots(Six)], [Dots(Seven), Dots(Eight), Dots(Nine)], [Dots(Nine), Dots(Nine)], [East]]
[[Dots(One), Dots(One)], [Dots(One), Dots(Two), Dots(Three)], [Dots(Four), Dots(Five), Dots(Six)], [Dots(Seven), Dots(Eight), Dots(Nine)], [Dots(Nine), Dots(Nine)], [East]]
[[Dots(One), Dots(One)], [Dots(One), Dots(Two)], [Dots(Three), Dots(Four), Dots(Five)], [Dots(Six), Dots(Seven), Dots(Eight)], [Dots(Nine), Dots(Nine), Dots(Nine)], [East]]
[[Dots(One), Dots(One), Dots(One)], [Dots(Two), Dots(Three)], [Dots(Four), Dots(Five)], [Dots(Six), Dots(Seven), Dots(Eight)], [Dots(Nine), Dots(Nine), Dots(Nine)], [East]]
[[Dots(One), Dots(One), Dots(One)], [Dots(Two)], [Dots(Three), Dots(Four), Dots(Five)], [Dots(Six), Dots(Seven), Dots(Eight)], [Dots(Nine), Dots(Nine), Dots(Nine)], [East]]
[[Dots(One), Dots(One), Dots(One)], [Dots(Two), Dots(Three), Dots(Four)], [Dots(Five), Dots(Six), Dots(Seven)], [Dots(Eight)], [Dots(Nine), Dots(Nine), Dots(Nine)], [East]]
[[Dots(One), Dots(One), Dots(One)], [Dots(Two), Dots(Three)], [Dots(Four), Dots(Five), Dots(Six)], [Dots(Seven), Dots(Eight)], [Dots(Nine), Dots(Nine), Dots(Nine)], [East]]
[[Dots(One), Dots(One)], [Dots(One), Dots(Two), Dots(Three)], [Dots(Four), Dots(Five), Dots(Six)], [Dots(Seven), Dots(Eight)], [Dots(Nine), Dots(Nine), Dots(Nine)], [East]]
[[Dots(One), Dots(One), Dots(One)], [Dots(Two), Dots(Four)], [Dots(Three), Dots(Five)], [Dots(Six), Dots(Seven), Dots(Eight)], [Dots(Nine), Dots(Nine), Dots(Nine)], [East]]
[[Dots(One), Dots(One), Dots(One)], [Dots(Two), Dots(Three), Dots(Four)], [Dots(Five), Dots(Six)], [Dots(Seven), Dots(Eight)], [Dots(Nine), Dots(Nine), Dots(Nine)], [East]]
[[Dots(One), Dots(One), Dots(One)], [Dots(Two), Dots(Three), Dots(Four)], [Dots(Five), Dots(Seven)], [Dots(Six), Dots(Eight)], [Dots(Nine), Dots(Nine), Dots(Nine)], [East]]
[[Dots(One), Dots(One), Dots(One)], [Dots(Two), Dots(Three), Dots(Four)], [Dots(Five)], [Dots(Six), Dots(Seven), Dots(Eight)], [Dots(Nine), Dots(Nine), Dots(Nine)], [East]]
[[Dots(One), Dots(One)], [Dots(One), Dots(Two), Dots(Three)], [Dots(Four), Dots(Five)], [Dots(Six), Dots(Seven), Dots(Eight)], [Dots(Nine), Dots(Nine), Dots(Nine)], [East]]
[[Dots(One), Dots(One), Dots(One)], [Dots(Two), Dots(Three), Dots(Four)], [Dots(Five), Dots(Six), Dots(Seven)], [Dots(Eight), Dots(Nine)], [Dots(Nine), Dots(Nine)], [East]]
[[Dots(One), Dots(One), Dots(One)], [Dots(Two), Dots(Three)], [Dots(Four), Dots(Five), Dots(Six)], [Dots(Seven), Dots(Eight), Dots(Nine)], [Dots(Nine), Dots(Nine)], [East]]