temp_stats.zig en Zig
Una semana de máximas diarias reducida a mínima, máxima y media, con una barra por día.
// One week of daily highs: spread, mean, and a scaled bar chart.
const std = @import("std");
const days = [_][]const u8{ "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
const temps = [_]i32{ 61, 68, 74, 79, 72, 65, 58 };
pub fn main() void {
var lo: i32 = temps[0];
var hi: i32 = temps[0];
var sum: i32 = 0;
for (temps) |t| {
if (t < lo) lo = t;
if (t > hi) hi = t;
sum += t;
}
const mean = @as(f32, @floatFromInt(sum)) / temps.len;
const span = @max(hi - lo, 1);
std.debug.print("day temp range diff\n", .{});
std.debug.print("------------------------------------\n", .{});
// Bars scale to the week's spread; the +1 keeps Sunday visible.
const bars = "#####################";
var warm_days: u32 = 0;
for (days, temps) |day, t| {
const width: usize = @intCast(@divTrunc(20 * (t - lo), span) + 1);
const diff = @as(f32, @floatFromInt(t)) - mean;
const sign: []const u8 = if (diff >= 0) "+" else "";
if (diff > 0) warm_days += 1;
std.debug.print("{s} {d:>4} {s:<21} {s}{d:.1}\n", .{
day, t, bars[0..width], sign, diff,
});
}
std.debug.print("------------------------------------\n", .{});
std.debug.print("low {d}, high {d}, mean {d:.1}\n", .{ lo, hi, mean });
std.debug.print("days above the mean: {d}\n", .{warm_days});
}
Cómo funciona
- Una pasada rastrea el día más fresco, el más cálido y la suma corriente.
for (days, temps)recorre ambos arreglos al paso — los largos deben coincidir.- Las barras escalan a la amplitud rebanando una cadena de numerales; el signo se elige a mano.
Palabras clave y builtins usados aquí
constelsef32fnfori32ifpubu32u8usizevarvoid
El intento, en números
- Líneas
- 36
- Caracteres a escribir
- 1246
- Tokens
- 389
- Ritmo de tres estrellas
- 65 tpm
Al ritmo de tres estrellas de 65 tokens por minuto, este intento toma unos 359 segundos.
Paso 3 de 3 en Bis; paso 27 de 27 en Fundamentos del lenguaje.