typestar

Mandelbrot en ASCII en Mojo

La demo por la que se conoce a Mojo: render por tiempo de escape, cuatro columnas a la vez.

comptime F4 = SIMD[DType.float64, 4]
comptime I4 = SIMD[DType.int32, 4]
comptime WIDTH = 60
comptime HEIGHT = 24
comptime MAX_ITERS = 40


def escape_counts(cx: F4, cy: F4) -> I4:
    var zx = F4(0.0)
    var zy = F4(0.0)
    var counts = I4(0)
    for _ in range(MAX_ITERS):
        var alive = (zx * zx + zy * zy).le(F4(4.0))
        if not alive.reduce_or():
            break
        counts += alive.select(I4(1), I4(0))
        var next_x = zx * zx - zy * zy + cx
        zy = 2.0 * zx * zy + cy
        zx = next_x
    return counts


def main():
    var shades: List[String] = [" ", ".", ":", "-", "=", "+", "*", "#", "@"]
    var levels = len(shades) - 1
    for row in range(HEIGHT):
        var cy = F4(-1.2 + 2.4 * Float64(row) / Float64(HEIGHT))
        var line = String()
        for block in range(0, WIDTH, 4):
            var cx = F4(0.0)
            for lane in range(4):
                var column = Float64(block + lane)
                cx[lane] = -2.2 + 3.0 * column / Float64(WIDTH)
            var counts = escape_counts(cx, cy)
            for lane in range(4):
                line += shades[Int(counts[lane]) * levels // MAX_ITERS]
        print(line)

Cómo funciona

  1. escape_counts itera z = z * z + c sobre cuatro puntos en paralelo.
  2. Una máscara cuenta solo los carriles todavía vivos, y corta cuando todos escaparon.
  3. Cada conteo elige un carácter de sombreado, y así se dibuja una grilla de 60 por 24.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
37
Caracteres a escribir
957
Tokens
318
Ritmo de tres estrellas
65 tpm

Al ritmo de tres estrellas de 65 tokens por minuto, este intento toma unos 294 segundos.

Escribe este fragmento

Paso 1 de 2 en Bis; paso 21 de 22 en Parámetros y SIMD.

← Anterior Siguiente →