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
escape_countsiteraz = z * z + csobre cuatro puntos en paralelo.- Una máscara cuenta solo los carriles todavía vivos, y corta cuando todos escaparon.
- Cada conteo elige un carácter de sombreado, y así se dibuja una grilla de 60 por 24.
Palabras clave y builtins usados aquí
DTypeFloat64IntListSIMDStringbreakdefforiflenprintrangereturnvar
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.
Paso 1 de 2 en Bis; paso 21 de 22 en Parámetros y SIMD.