Skip to content

Instantly share code, notes, and snippets.

@cubetastic33
Created August 25, 2018 04:29
Show Gist options
  • Save cubetastic33/9378d9dc5626b6bea9687cf18a219ddf to your computer and use it in GitHub Desktop.
Save cubetastic33/9378d9dc5626b6bea9687cf18a219ddf to your computer and use it in GitHub Desktop.
Reddit Daily Programmer - Challenge #353 [Intermediate]
//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