Created
August 25, 2018 04:29
-
-
Save cubetastic33/9378d9dc5626b6bea9687cf18a219ddf to your computer and use it in GitHub Desktop.
Reddit Daily Programmer - Challenge #353 [Intermediate]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//A program for the r/dailyprogrammer challenge #353 [Intermediate], done using Rust. | |
use std::io; | |
fn main() { | |
println!("Let's get the pancakes sorted!"); | |
println!("----"); | |
loop { | |
let num: usize = get_input().parse().expect("Enter only numbers"); | |
let pancakes = get_input(); | |
let sorted_pancakes = sort_pancakes(num, pancakes); | |
println!("{} flips: {}", sorted_pancakes.0, sorted_pancakes.1); | |
println!("----"); | |
} | |
} | |
fn get_input() -> String { | |
//Get user input | |
let mut input = String::new(); | |
io::stdin().read_line(&mut input) | |
.expect("Failed to read line"); | |
input.trim().to_string() | |
} | |
fn sort_pancakes_asc(num: usize, raw_pancakes: String) -> (usize, Vec<Vec<usize>>) { | |
//Split pancakes | |
let mut pancakes: Vec<usize> = vec!(); | |
for pancake in raw_pancakes.split(" ") {pancakes.append(&mut vec!(pancake.parse().expect("Error: only enter numbers")));} | |
let mut flips: usize = 0; | |
let mut steps: Vec<Vec<usize>> = vec!(); | |
for i in (1..num+1).rev() { | |
while match pancakes[..i].iter().max() {Some(max) => max, None => &0} != &pancakes[i-1] { | |
if &pancakes[0] == match pancakes[..i].iter().max() {Some(max) => max, None => &0} { | |
//Pancake is in beginning, flip | |
let mut flipped_pancakes: Vec<usize> = pancakes[..i].iter().rev().cloned().collect(); | |
let mut other_pancakes: Vec<usize> = pancakes[i..].to_vec(); | |
flipped_pancakes.append(&mut other_pancakes); | |
pancakes = flipped_pancakes.clone(); | |
steps.append(&mut vec!(flipped_pancakes)); | |
} else { | |
//Bring pancake to beginning | |
let i_max = pancakes.iter().enumerate().find(|&r| r.1 == match pancakes[..i].iter().max() {Some(max) => max, None => &0}).unwrap().0; | |
let mut flipped_pancakes: Vec<usize> = pancakes[..i_max+1].iter().rev().cloned().collect(); | |
let mut other_pancakes: Vec<usize> = pancakes[i_max+1..].to_vec(); | |
flipped_pancakes.append(&mut other_pancakes); | |
pancakes = flipped_pancakes.clone(); | |
steps.append(&mut vec!(flipped_pancakes)); | |
} | |
flips += 1; | |
} | |
} | |
(flips, steps) | |
} | |
fn sort_pancakes_desc(num: usize, raw_pancakes: String) -> (usize, Vec<Vec<usize>>) { | |
//SPlit pancakes | |
let mut pancakes: Vec<usize> = vec!(); | |
for pancake in raw_pancakes.split(" ") {pancakes.append(&mut vec!(pancake.parse().expect("Error: only enter numbers")));} | |
let mut flips: usize = 0; | |
let mut steps: Vec<Vec<usize>> = vec!(); | |
for i in (1..num+1).rev() { | |
while match pancakes[..i].iter().min() {Some(min) => min, None => &0} != &pancakes[i-1] { | |
if &pancakes[0] == match pancakes[..i].iter().min() {Some(min) => min, None => &0} { | |
//Pancake is in beginning, flip | |
let mut flipped_pancakes: Vec<usize> = pancakes[..i].iter().rev().cloned().collect(); | |
let mut other_pancakes: Vec<usize> = pancakes[i..].to_vec(); | |
flipped_pancakes.append(&mut other_pancakes); | |
pancakes = flipped_pancakes.clone(); | |
steps.append(&mut vec!(flipped_pancakes)); | |
} else { | |
//Bring pancake to beginning | |
let i_min = pancakes.iter().enumerate().find(|&r| r.1 == match pancakes[..i].iter().min() {Some(min) => min, None => &0}).unwrap().0; | |
let mut flipped_pancakes: Vec<usize> = pancakes[..i_min+1].iter().rev().cloned().collect(); | |
let mut other_pancakes: Vec<usize> = pancakes[i_min+1..].to_vec(); | |
flipped_pancakes.append(&mut other_pancakes); | |
//println!("p: {:?}, f_p: {:?}", pancakes, flipped_pancakes); | |
pancakes = flipped_pancakes.clone(); | |
steps.append(&mut vec!(flipped_pancakes)); | |
} | |
flips += 1; | |
} | |
} | |
let flipped_pancakes: Vec<usize> = pancakes.iter().rev().cloned().collect(); | |
steps.append(&mut vec!(flipped_pancakes)); | |
(flips+1, steps) | |
} | |
fn sort_pancakes(num: usize, raw_pancakes: String) -> (usize, String) { | |
let asc_sorted_pancakes = sort_pancakes_asc(num.clone(), raw_pancakes.clone()); | |
let desc_sorted_pancakes = sort_pancakes_desc(num.clone(), raw_pancakes.clone()); | |
if asc_sorted_pancakes.0 <= desc_sorted_pancakes.0 { | |
return (asc_sorted_pancakes.0, format!("{:?}", asc_sorted_pancakes.1)); | |
} | |
(desc_sorted_pancakes.0, format!("{:?}", desc_sorted_pancakes.1)) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment