Galton box animation: Difference between revisions
Content added Content deleted
(Add zig example) |
|||
Line 3,462: | Line 3,462: | ||
loop |
loop |
||
</lang> |
</lang> |
||
=={{header|zig}}== |
|||
<lang zig>const std = @import("std"); |
|||
const rand = std.rand; |
|||
const time = std.os.time; |
|||
const PEG_LINES = 20; |
|||
fn boardSize(comptime peg_lines: u16) u16 { |
|||
var i: u16 = 0; |
|||
var size: u16 = 0; |
|||
inline while (i <= PEG_LINES) : (i += 1) { |
|||
size += i+1; |
|||
} |
|||
return size; |
|||
} |
|||
const BOARD_SIZE = boardSize(PEG_LINES); |
|||
fn stepBoard(board: *[BOARD_SIZE]u1, count: *[PEG_LINES+1]u8) void { |
|||
var prng = rand.DefaultPrng.init(time.timestamp()); |
|||
var p: u8 = 0; |
|||
var sum: u16 = 0; |
|||
while (p <= PEG_LINES) : (p += 1) { |
|||
const pegs = PEG_LINES-p; |
|||
var i: u16 = 0; |
|||
while (i < pegs+1) : (i += 1) { |
|||
if (pegs != PEG_LINES and board[BOARD_SIZE-1-sum-i] == 1) { |
|||
if (prng.random.boolean()) { |
|||
board.*[BOARD_SIZE-1-sum-i+pegs+1] = 1; |
|||
} else { |
|||
board.*[BOARD_SIZE-1-sum-i+pegs+2] = 1; |
|||
} |
|||
} else if (pegs == PEG_LINES and board[BOARD_SIZE-1-sum-i] == 1) { |
|||
count.*[pegs-i] += 1; |
|||
} |
|||
board.*[BOARD_SIZE-1-sum-i] = 0; |
|||
} |
|||
sum += pegs+1; |
|||
} |
|||
} |
|||
fn printBoard(board: *[BOARD_SIZE]u1, count: *[PEG_LINES+1]u8) !void { |
|||
var stdout = try std.io.getStdOut(); |
|||
try stdout.write("\x1B[2J\x1B[1;1H"); |
|||
var pegs: u16 = 0; |
|||
var sum: u16 = 0; |
|||
while (pegs <= PEG_LINES) : (pegs += 1) { |
|||
var i: u16 = 0; |
|||
while (i < (PEG_LINES-pegs)) : (i += 1) try stdout.write(" "); |
|||
i = 0; |
|||
while (i < pegs+1) : (i += 1) { |
|||
const spot = if (board[i+sum] == 1) "o" else " "; |
|||
try stdout.write(spot); |
|||
if (i != pegs) try stdout.write("*"); |
|||
} |
|||
sum += pegs+1; |
|||
try stdout.write("\n"); |
|||
} |
|||
for (count) |n| { |
|||
const num_char = [2]u8{'0'+n, ' '}; |
|||
try stdout.write(num_char); |
|||
} |
|||
try stdout.write("\n"); |
|||
} |
|||
pub fn main() !void { |
|||
var board: [BOARD_SIZE]u1 = []u1{0} ** BOARD_SIZE; |
|||
var bottom_count: [PEG_LINES+1]u8 = []u8{0} ** (PEG_LINES+1); |
|||
var i: u16 = 0; |
|||
while (i < 35) : (i += 1) { |
|||
if (i < 10) board[0] = 1; |
|||
try printBoard(&board, &bottom_count); |
|||
stepBoard(&board, &bottom_count); |
|||
time.sleep(150000000); |
|||
} |
|||
}</lang> |