1
0
Fork 0
mirror of https://gitlab.com/mfocko/CodeWars.git synced 2024-11-25 18:21:55 +01:00
CodeWars/5kyu/my_smallest_code_interpreter_bf/solution.rs

87 lines
2.1 KiB
Rust
Raw Normal View History

use std::collections::HashMap;
fn find_left(instructions: &[u8], index: usize) -> usize {
let mut result = index - 1;
let mut count = 1;
while count != 0 {
if instructions[result] == ']' as u8 {
count += 1;
} else if instructions[result] == '[' as u8 {
count -= 1;
}
result -= 1;
}
result + 1
}
fn find_right(instructions: &[u8], index: usize) -> usize {
let mut result = index + 1;
let mut count = 1;
while count != 0 {
if instructions[result] == '[' as u8 {
count += 1;
} else if instructions[result] == ']' as u8 {
count -= 1;
}
result += 1;
}
result - 1
}
fn brain_luck(code: &str, input: Vec<u8>) -> Vec<u8> {
let instructions = code.as_bytes();
let mut result = Vec::<u8>::new();
let mut tape = HashMap::<i64, i16>::new();
let mut i = 0;
let mut tape_i = 0;
let mut input_i = 0;
while i < instructions.len() {
match instructions[i] as char {
'>' => tape_i += 1,
'<' => tape_i -= 1,
'+' => {
tape.insert(tape_i, (tape.get(&tape_i).unwrap_or(&0) + 1) % 256);
()
}
'-' => {
let new_value = tape.get(&tape_i).unwrap_or(&0) - 1;
tape.insert(tape_i, if new_value < 0 { 255 } else { new_value });
()
}
'.' => {
result.push(*tape.get(&tape_i).unwrap_or(&0) as u8);
()
}
',' => {
tape.insert(tape_i, input[input_i] as i16);
input_i += 1;
()
}
'[' => {
if *tape.get(&tape_i).unwrap_or(&0) == 0 {
i = find_right(instructions, i);
}
()
}
']' => {
if *tape.get(&tape_i).unwrap_or(&0) != 0 {
i = find_left(instructions, i);
}
()
}
_ => {}
}
i += 1;
}
result
}