Skip to content

Instantly share code, notes, and snippets.

@klaygomes
Last active May 26, 2022 22:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save klaygomes/ff2d1e6c64ea49fc2365bab0bd80dadc to your computer and use it in GitHub Desktop.
Save klaygomes/ff2d1e6c64ea49fc2365bab0bd80dadc to your computer and use it in GitHub Desktop.
Solution for discovery/microbit roulette challenge ( https://docs.rust-embedded.org/discovery/microbit/05-led-roulette/the-challenge.html ); It is able to rotate any matrix passed as parameter;
#![deny(unsafe_code)]
#![no_main]
#![no_std]
use cortex_m_rt::entry;
use microbit::{
board::Board,
display::blocking::Display,
hal::{prelude::*, Timer},
};
use panic_rtt_target as _;
use rtt_target::rtt_init_print;
fn rotate(roulette: &mut [[u8; 5]; 5]) {
let mut left = 0;
let mut right = roulette[0].len() - 1;
let mut top = 0;
let mut bottom = roulette.len() - 1;
let mut prev;
let mut cur;
while left < right && top < bottom {
prev = roulette[top + 1][left];
for n in left..=right {
cur = roulette[top][n];
roulette[top][n] = prev;
prev = cur;
}
top += 1;
for n in top..=bottom {
cur = roulette[n][right];
roulette[n][right] = prev;
prev = cur;
}
right -= 1;
for n in (left..=right).rev() {
cur = roulette[bottom][n];
roulette[bottom][n] = prev;
prev = cur;
}
bottom -= 1;
for n in (top..=bottom).rev() {
cur = roulette[n][left];
roulette[n][left] = prev;
prev = cur;
}
left += 1;
}
}
#[entry]
fn main() -> ! {
rtt_init_print!();
if let Some(board) = Board::take() {
let mut timer = Timer::new(board.TIMER0);
let mut display = Display::new(board.display_pins);
let mut roulette = [
[1u8, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
];
loop {
display.show(&mut timer, roulette, 100);
display.clear();
rotate(&mut roulette);
}
}
panic!("never reached");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment