@ohmrun I wrote this 2D maze in Haskell circa 2011 (not likely to compile today):
module Maze where
import Control.Monad
import Foreign
import qualified Graphics.UI.SDL as SDL
import System.Random
import Data.List
import Data.Array
data Cell = Cell {
top :: Bool,
left :: Bool,
visited :: Bool
} deriving (Show, Eq)
type Maze = Array (Int, Int) Cell
newCell = Cell {top = True, left = True, visited = False}
newMaze :: Int -> Int -> Maze
newMaze rows columns = listArray ((0, 0), (rows - 1, columns - 1)) (repeat newCell)
genMaze maze (r, c) (seed:seeds)
| visited (maze ! (r, c)) == True = maze
| otherwise = foldl traverse maze' ((permutations neighbours) !! index)
where maze' = maze//[((r, c), (maze ! (r, c)) { visited = True })]
locs = [(r - 1, c), (r + 1, c), (r, c - 1), (r, c + 1)]
((_, _), (rmax, cmax)) = (bounds maze)
neighbours = [(r', c') | (r', c') <- locs,
r' >= 0 && r' <= rmax, c' >= 0 && c' <= cmax]
index = seed `mod` (length neighbours)
moveTo maze (r, c) (r', c')
| visited cell' = maze
| r' < r = maze//[((r, c), cell { top = False })]
| r' > r = maze//[((r', c'), cell' { top = False })]
| c' < c = maze//[((r, c), cell { left = False })]
| c' > c = maze//[((r', c'), cell' { left = False })]
| otherwise = error "Invalid move"
where cell = maze ! (r, c)
cell' = maze ! (r', c')
traverse maze' (r', c') = genMaze (moveTo maze' (r, c) (r', c')) (r', c') seeds
hline :: Int -> Int -> Int -> SDL.Pixel -> SDL.Surface -> IO ()
hline x y width (SDL.Pixel pixel) screen = do
screenWidth <- return (SDL.surfaceGetWidth screen)
pixels <- castPtr `liftM` SDL.surfaceGetPixels screen
forM_ [0..(width - 1)] $ \dx -> do
pokeElemOff pixels (y * screenWidth + x + dx) pixel
vline :: Int -> Int -> Int -> SDL.Pixel -> SDL.Surface -> IO ()
vline x y height (SDL.Pixel pixel) screen = do
screenWidth <- return (SDL.surfaceGetWidth screen)
pixels <- castPtr `liftM` SDL.surfaceGetPixels screen
forM_ [0..(height - 1)] $ \dy -> do
pokeElemOff pixels ((y + dy) * screenWidth + x) pixel
main :: IO()
main = do
startRow <- randomRIO (0 :: Int, rows - 1)
startColumn <- randomRIO (0 :: Int, columns - 1)
seeds <- replicateM (rows * columns) (randomRIO (0 :: Int, (max rows columns)))
maze <- return (genMaze (newMaze rows columns) (startRow, startColumn) seeds)
SDL.init [SDL.InitEverything]
screen <- SDL.setVideoMode screenWidth screenHeight 32 []
hline 0 0 screenWidth whitePixel screen
hline 0 (screenHeight - 1) screenWidth whitePixel screen
vline 0 0 screenHeight whitePixel screen
vline (screenWidth - 1) 0 screenHeight whitePixel screen
forM (assocs maze) $ \((r, c), cell) ->
if (top cell) then do
hline (blockWidth * c) (blockHeight * r) blockWidth whitePixel screen
else do return ()
forM (assocs maze) $ \((r, c), cell) ->
if (left cell) then do
vline (blockWidth * c) (blockHeight * r) blockHeight whitePixel screen
else do return ()
SDL.flip screen
eventLoop
SDL.quit
where
eventLoop = SDL.waitEvent >>= checkEvent
checkEvent SDL.Quit = return()
checkEvent (SDL.KeyUp _) = return()
checkEvent _ = eventLoop
blockWidth = 32
blockHeight = 32
rows = 16
columns = 16
screenWidth = columns * blockWidth
screenHeight = rows * blockHeight
whitePixel = SDL.Pixel 0x00FFFFFF
Ur welcome ;-)
I fixed some bugs in page tables of RISC-V Keystone enclaves (bootstrapping code of page tables) last Fall to get them working with CVA6 RISC-V CPU, and now I get steadily emails from people who are trying to use Keystone but cannot get it working for various reasons.
Not blaming those people but clearly the project is not too community oriented 🤷 I try respond politely that I don’t have the bandwidth.
Does not come as surprise tho because I wrote a trivial in-kernel driver PoC to which project showed no interest, still continuing with their OOT-drver:
Cannot recall which one was newer version because it is such a long time since I wrote these :-)
I love it that my play stats on Bandcamp look like an MSEG envelope curve.
⚡️ 🇦🇷 A theft of a radioactive material capsule in Buenos Aires, Argentina has raised concerns among the population. The capsule contained a 45ml container of radioactive liquid and was stolen from a nuclear medicine company. Authorities have been alerted and are investigating the incident. https://www.riskmap.com/incidents/2132301/articles/222305988/
New development policy: code generated by a large language model or similar technology (e.g. ChatGPT, GitHub Copilot) is presumed to be tainted (i.e. of unclear copyright, not fitting NetBSD's licensing goals) and cannot be committed to NetBSD.