Galton box animation: Difference between revisions
Content added Content deleted
m (→{{header|Wren}}: Wren-trait -> Wren-iterate) |
Simple9371 (talk | contribs) (→{{header|Zig}}: Works with latest compiler. Lots of possible improvements) |
||
Line 4,720: | Line 4,720: | ||
=={{header|Zig}}== |
=={{header|Zig}}== |
||
<syntaxhighlight lang="zig">const std = @import("std"); |
<syntaxhighlight lang="zig">const std = @import("std"); |
||
const rand = std.rand; |
const rand = std.rand; |
||
const time = std |
const time = std.time; |
||
const PEG_LINES = 20; |
const PEG_LINES = 20; |
||
const BALLS = 10; |
|||
fn boardSize(comptime peg_lines: u16) u16 { |
fn boardSize(comptime peg_lines: u16) u16 { |
||
var i: u16 = 0; |
var i: u16 = 0; |
||
var size: u16 = 0; |
var size: u16 = 0; |
||
inline while (i <= |
inline while (i <= peg_lines) : (i += 1) { |
||
size += i+1; |
size += i + 1; |
||
} |
} |
||
return size; |
return size; |
||
Line 4,738: | Line 4,738: | ||
const BOARD_SIZE = boardSize(PEG_LINES); |
const BOARD_SIZE = boardSize(PEG_LINES); |
||
fn stepBoard(board: *[BOARD_SIZE]u1, count: *[PEG_LINES+1]u8) void { |
fn stepBoard(board: *[BOARD_SIZE]u1, count: *[PEG_LINES + 1]u8) void { |
||
var prng = rand.DefaultPrng.init(time.timestamp()); |
var prng = rand.DefaultPrng.init(@bitCast(u64, time.timestamp())); |
||
var p: u8 = 0; |
var p: u8 = 0; |
||
var sum: u16 = 0; |
var sum: u16 = 0; |
||
while (p <= PEG_LINES) : (p += 1) { |
while (p <= PEG_LINES) : (p += 1) { |
||
const pegs = PEG_LINES-p; |
const pegs = PEG_LINES - p; |
||
var i: u16 = 0; |
var i: u16 = 0; |
||
while (i < pegs+1) : (i += 1) { |
while (i < pegs + 1) : (i += 1) { |
||
if (pegs != PEG_LINES and board[BOARD_SIZE-1-sum-i] == 1) { |
if (pegs != PEG_LINES and board[BOARD_SIZE - 1 - sum - i] == 1) { |
||
if (prng.random.boolean()) { |
if (prng.random().boolean()) { |
||
board.*[BOARD_SIZE-1-sum-i+pegs+1] = 1; |
board.*[BOARD_SIZE - 1 - sum - i + pegs + 1] = 1; |
||
} else { |
} else { |
||
board.*[BOARD_SIZE-1-sum-i+pegs+2] = 1; |
board.*[BOARD_SIZE - 1 - sum - i + pegs + 2] = 1; |
||
} |
} |
||
} else if (pegs == PEG_LINES and board[BOARD_SIZE-1-sum-i] == 1) { |
} else if (pegs == PEG_LINES and board[BOARD_SIZE - 1 - sum - i] == 1) { |
||
count.*[pegs-i] += 1; |
count.*[pegs - i] += 1; |
||
} |
} |
||
board.*[BOARD_SIZE-1-sum-i] = 0; |
board.*[BOARD_SIZE - 1 - sum - i] = 0; |
||
} |
} |
||
sum += pegs+1; |
sum += pegs + 1; |
||
} |
} |
||
} |
} |
||
fn printBoard(board: *[BOARD_SIZE]u1, count: *[PEG_LINES+1]u8) !void { |
fn printBoard(board: *[BOARD_SIZE]u1, count: *[PEG_LINES + 1]u8) !void { |
||
const stdout = std.io.getStdOut(); |
|||
try stdout.write("\x1B[2J\x1B[1;1H"); |
_ = try stdout.write("\x1B[2J\x1B[1;1H"); |
||
var pegs: u16 = 0; |
var pegs: u16 = 0; |
||
var sum: u16 = 0; |
var sum: u16 = 0; |
||
while (pegs <= PEG_LINES) : (pegs += 1) { |
while (pegs <= PEG_LINES) : (pegs += 1) { |
||
var i: u16 = 0; |
var i: u16 = 0; |
||
while (i < (PEG_LINES-pegs)) : (i += 1) try stdout.write(" "); |
while (i < (PEG_LINES - pegs)) : (i += 1) _ = try stdout.write(" "); |
||
i = 0; |
i = 0; |
||
while (i < pegs+1) : (i += 1) { |
while (i < pegs + 1) : (i += 1) { |
||
const spot = if (board[i+sum] == 1) "o" else " "; |
const spot = if (board[i + sum] == 1) "o" else " "; |
||
try stdout.write(spot); |
_ = try stdout.write(spot); |
||
if (i != pegs) try stdout.write("*"); |
if (i != pegs) _ = try stdout.write("*"); |
||
} |
} |
||
sum += pegs+1; |
sum += pegs + 1; |
||
try stdout.write("\n"); |
_ = try stdout.write("\n"); |
||
} |
} |
||
for (count) |n| { |
for (count) |n| { |
||
const num_char = [2]u8{'0'+n, ' '}; |
const num_char = [2]u8{'0' + n, ' '}; |
||
try stdout.write(num_char); |
_ = try stdout.write(&num_char); |
||
} |
} |
||
try stdout.write("\n"); |
_ = try stdout.write("\n"); |
||
} |
} |
||
pub fn main() !void { |
pub fn main() !void { |
||
var board: [BOARD_SIZE]u1 = []u1{0} ** BOARD_SIZE; |
var board: [BOARD_SIZE]u1 = [_]u1{0} ** BOARD_SIZE; |
||
var bottom_count: [PEG_LINES+1]u8 = []u8{0} ** (PEG_LINES+1); |
var bottom_count: [PEG_LINES+1]u8 = [_]u8{0} ** (PEG_LINES + 1); |
||
var i: u16 = 0; |
var i: u16 = 0; |
||
while (i < |
while (i < PEG_LINES + BALLS + 1) : (i += 1) { |
||
if (i < |
if (i < BALLS) board[0] = 1; |
||
try printBoard(&board, &bottom_count); |
try printBoard(&board, &bottom_count); |