This commit is contained in:
commit
fe84c73459
1 changed files with 84 additions and 0 deletions
84
lsca.uni.py
Normal file
84
lsca.uni.py
Normal file
|
@ -0,0 +1,84 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import numpy as np
|
||||
|
||||
|
||||
def lament(*args, **kwargs):
|
||||
return print(*args, file=sys.stderr, **kwargs)
|
||||
|
||||
|
||||
def colorize(x):
|
||||
return x * 17 % 256
|
||||
|
||||
|
||||
def render(row):
|
||||
grays = colorize(row)
|
||||
if scale > 1:
|
||||
grays = np.repeat(grays, scale)
|
||||
line = " ".join(str(x) for x in grays)
|
||||
for y in range(scale):
|
||||
print(line)
|
||||
|
||||
|
||||
def limit(row): # in-place
|
||||
row[row < 0] = 0
|
||||
row[row > 15] = 15
|
||||
return row
|
||||
|
||||
|
||||
def initialize():
|
||||
row = np.zeros(width, int)
|
||||
prev, here = 0, 0
|
||||
for i in range(width):
|
||||
if np.random.randint(0, 8) == 0:
|
||||
here = np.random.randint(16)
|
||||
row[i] = here
|
||||
prev = here
|
||||
limit(row)
|
||||
return row
|
||||
|
||||
|
||||
name, args = sys.argv[0], sys.argv[1:]
|
||||
|
||||
if len(args) == 0:
|
||||
rule_lut = None
|
||||
elif len(args) == 16:
|
||||
rule_lut = [int(x.strip(",")) for x in args]
|
||||
else:
|
||||
lament(f"usage: {name}")
|
||||
lament(f"usage: {name} {{rules 1 through 16}}")
|
||||
sys.exit(1)
|
||||
|
||||
scale = 3
|
||||
width, height = 960 // scale, 960 // scale
|
||||
|
||||
if rule_lut is None:
|
||||
rule_lut = np.random.randint(-2, 2 + 1, size=(4, 4))
|
||||
lament(" ".join(f"{x:+2}" for x in rule_lut.flat))
|
||||
else:
|
||||
rule_lut = np.array(rule_lut).reshape(4, 4)
|
||||
|
||||
print("P2") # magic code for an ascii Portable GrayMap (PGM) file
|
||||
print(width * scale, height * scale)
|
||||
print(255) # maximum color value
|
||||
|
||||
row = initialize()
|
||||
|
||||
for i in range(height):
|
||||
# left, center, right:
|
||||
L = np.roll(row, 1)
|
||||
C = row.copy()
|
||||
R = np.roll(row, -1)
|
||||
|
||||
diffusion = (L + C + C + R + 2) // 4
|
||||
|
||||
# v = [0,1,2,3,1,0,3,2,2,3,0,1,3,2,1,0][V]
|
||||
y = (L ^ (L >> 2)) % 4
|
||||
x = (R ^ (R >> 2)) % 4
|
||||
|
||||
delta = rule_lut[y, x]
|
||||
row = diffusion + delta
|
||||
|
||||
limit(row)
|
||||
render(row)
|
Loading…
Reference in a new issue