Guest User

Untitled

a guest
Jun 19th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.16 KB | None | 0 0
  1. #![deny(overflowing_literals)]
  2. #![allow(dead_code)]
  3.  
  4. fn count_steps(target: u64) -> usize {
  5. use std::cmp::Ordering;
  6.  
  7. if target == 0 || target == 1 {
  8. return 0;
  9. }
  10.  
  11. let mut prev = std::iter::once(1).collect::<Vec<_>>();
  12. let mut steps = 0;
  13.  
  14. loop {
  15. steps += 1;
  16. let mut buf = Vec::with_capacity(prev.len() * 3);
  17.  
  18. for &x in &prev {
  19. let x_1 = x + 1;
  20. match x_1.cmp(&target) {
  21. Ordering::Greater => unreachable!(),
  22. Ordering::Equal => return steps,
  23. Ordering::Less => {
  24. buf.push(x_1);
  25. }
  26. }
  27.  
  28. if let Some(x2) = x.checked_mul(2) {
  29. match x2.cmp(&target) {
  30. Ordering::Greater => (),
  31. Ordering::Equal => return steps,
  32. Ordering::Less => {
  33. buf.push(x2);
  34. if let Some(x3) = x.checked_mul(3) {
  35. match x3.cmp(&target) {
  36. Ordering::Greater => (),
  37. Ordering::Equal => return steps,
  38. Ordering::Less => {
  39. buf.push(x3);
  40. }
  41. }
  42. }
  43. }
  44. }
  45. }
  46. }
  47.  
  48. buf.sort_unstable();
  49. buf.dedup();
  50. prev = buf;
  51. }
  52. }
  53.  
  54. fn count_steps_hash(target: u64) -> usize {
  55. use std::cmp::Ordering;
  56. use std::collections::HashSet;
  57.  
  58. if target == 0 || target == 1 {
  59. return 0;
  60. }
  61.  
  62. let mut prev = std::iter::once(1).collect::<HashSet<_>>();
  63. let mut steps = 0;
  64.  
  65. loop {
  66. steps += 1;
  67. let mut buf = HashSet::new();
  68.  
  69. for &x in &prev {
  70. let x_1 = x + 1;
  71. match x_1.cmp(&target) {
  72. Ordering::Greater => unreachable!(),
  73. Ordering::Equal => return steps,
  74. Ordering::Less => {
  75. buf.insert(x_1);
  76. }
  77. }
  78.  
  79. if let Some(x2) = x.checked_mul(2) {
  80. match x2.cmp(&target) {
  81. Ordering::Greater => (),
  82. Ordering::Equal => return steps,
  83. Ordering::Less => {
  84. buf.insert(x2);
  85. if let Some(x3) = x.checked_mul(3) {
  86. match x3.cmp(&target) {
  87. Ordering::Greater => (),
  88. Ordering::Equal => return steps,
  89. Ordering::Less => {
  90. buf.insert(x3);
  91. }
  92. }
  93. }
  94. }
  95. }
  96. }
  97. }
  98.  
  99. prev = buf;
  100. }
  101. }
  102.  
  103. use std::collections::HashMap;
  104. struct StepsMemo(HashMap<u64, usize>);
  105.  
  106. impl StepsMemo {
  107. fn new() -> Self {
  108. let mut seed = HashMap::new();
  109. seed.insert(0, 0);
  110. seed.insert(1, 0);
  111. StepsMemo(seed)
  112. }
  113.  
  114. fn count_steps(&mut self, target: u64) -> usize {
  115. if target == 0 || target == 1 {
  116. return 0;
  117. }
  118.  
  119. let mut tasks = vec![target];
  120. while let Some(target) = tasks.pop() {
  121. if self.0.get(&target).is_none() {
  122. let target_1 = target - 1;
  123. match self.0.get(&target_1) {
  124. None => {
  125. tasks.push(target);
  126. tasks.push(target - 1);
  127. if target % 2 == 0 {
  128. tasks.push(target / 2)
  129. }
  130. if target % 3 == 0 {
  131. tasks.push(target / 3)
  132. }
  133. }
  134. Some(&step1) => {
  135. let mut steps = step1;
  136. if target % 2 == 0 {
  137. let target_div_2 = target / 2;
  138. match self.0.get(&target_div_2) {
  139. None => {
  140. tasks.push(target_div_2);
  141. if target % 3 == 0 {
  142. tasks.push(target / 3);
  143. }
  144. }
  145. Some(&step2) => steps = step2.min(steps),
  146. }
  147. }
  148. if target % 3 == 0 {
  149. let target_div_3 = target / 3;
  150. match self.0.get(&target_div_3) {
  151. None => tasks.push(target_div_3),
  152. Some(&step3) => steps = step3.min(steps),
  153. }
  154. }
  155. self.0.insert(target, steps + 1);
  156. }
  157. }
  158. }
  159. }
  160.  
  161. self.0[&target]
  162. }
  163. }
  164.  
  165. fn main() {
  166. use std::time::Instant;
  167.  
  168. let moment = Instant::now();
  169. let answer = count_steps(999_999);
  170. let elapsed = moment.elapsed();
  171. println!("{}", answer);
  172. println!("{:?}", elapsed);
  173. }
Add Comment
Please, Sign In to add comment