From ce64fa40e74b4245c14f811721dd38d6b7a848c8 Mon Sep 17 00:00:00 2001 From: Mike Lynch Date: Mon, 12 Jan 2026 18:44:36 +1100 Subject: [PATCH] Quick 07 --- 07/genuary07.py | 34 + 07/index.html | 2223 ++++++++++++++++++++++++++++++++++++++++++++ dist/06/animate.js | 140 +++ dist/06/index.html | 43 + dist/07/index.html | 2223 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 4663 insertions(+) create mode 100755 07/genuary07.py create mode 100644 07/index.html create mode 100644 dist/06/animate.js create mode 100644 dist/06/index.html create mode 100644 dist/07/index.html diff --git a/07/genuary07.py b/07/genuary07.py new file mode 100755 index 0000000..9057257 --- /dev/null +++ b/07/genuary07.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python + +r0 = 2 + +print('') + +cache = {} + +def bool_r(x, y): + if x in cache: + if y in cache[x]: + return cache[x][y] + else: + cache[x] = {} + if x < 1: + cache[x][y] = (y % 2 == 1) + else: + if y < 1: + cache[x][y] = (x % 2 == 1) + else: + a = bool_r(x - 1, y) + b = bool_r(x, y - 1) + cache[x][y] = (a and not b) or (b and not a) + return cache[x][y] + + +for x in range(128): + for y in range(128): + cx = r0 + x * r0 * 2 + cy = r0 + y * r0 * 2 + if bool_r(x, y): + print(f'') + +print("") diff --git a/07/index.html b/07/index.html new file mode 100644 index 0000000..a7b9c0d --- /dev/null +++ b/07/index.html @@ -0,0 +1,2223 @@ + + + +etc.mikelynch.org | Genuary 2026 + + + + +
+ +

Genuary 2026 - 7

+ +

Prompt: Boolean

+ +

I'm a bit behind after summer holidays. This is very simple, +each cell is the XOR of its left and upper neighbour. I think +I remember programming this out of one of those beginner's BASIC +books in the early 80s.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Back

+ + + +

The Python script

+ + + + + + diff --git a/dist/06/animate.js b/dist/06/animate.js new file mode 100644 index 0000000..942fb41 --- /dev/null +++ b/dist/06/animate.js @@ -0,0 +1,140 @@ + +const WIDTH = 800; +const HEIGHT = 800; +const NCRITTERS = 10; +const CLOSE = 20; +const BOUNCE = 0.02; +const STUN = 10; +const MIN_RADIUS = 2; +const HIDE_SPEED = 10.5; + +const pointer = { x: 0, y: 0 }; + +const critters = []; + +let lights = "off"; + +function dist(c1, c2) { + const dx = c1.x - c2.x; + const dy = c1.y - c2.y; + return Math.sqrt(dx * dx + dy * dy); +} + +class Critter { + constructor(i) { + this.i = i; + this.x = Math.random() * WIDTH; + this.y = Math.random() * HEIGHT; + this.vx = Math.random() * 0.1 - 0.05; + this.vy = Math.random() * 0.1 - 0.05; + this.status = "go"; + } + init() { + const i0 = `c00${this.i}`; + this.elt = document.getElementById(i0); + console.log(`elt ${i0} ${this.elt}`); + } + go_v(pos, vel) { + if( pos < 10 ) { + return vel + 0.01; + } else if ( pos > WIDTH - 10 ) { + return vel - 0.01; + } else { + return vel + Math.random() * 0.01 - 0.005; + } + } + update() { + if( this.status === "hide" ) { + if( this.tick > STUN ) { + this.tick--; + this.elt.setAttribute("r", this.tick + MIN_RADIUS); + } else { + this.hide_vec = Math.atan2(this.y - pointer.y, this.x - pointer.x); + this.vx = Math.cos(this.hide_vec) * HIDE_SPEED; + this.vy = Math.sin(this.hide_vec) * HIDE_SPEED; + } + } + if( this.status === "collide" ) { + this.tick--; + if( this.tick === 0 ) { + this.status = "go"; + this.elt.setAttribute("fill", "blue"); + } + } + if( this.status === "go" ) { + const collisions = critters.filter((c) => c.i != this.i && dist(c, this) < CLOSE); + if( collisions.length > 0 ) { + const hit = collisions[0]; + this.status = "collide"; + this.tick = 20; + this.elt.setAttribute("fill", "red"); + this.vx = (this.x - collisions[0].x) * BOUNCE; + this.vy = (this.y - collisions[0].y) * BOUNCE; + hit.status = "collide"; + hit.tick = 20; + hit.vx = -this.vx; + hit.vy = -this.vy; + } else { + this.vx = this.go_v(this.x, this.vx); + this.vy = this.go_v(this.y, this.vy); + } + } + this.x += this.vx; + this.y += this.vy; + this.elt.setAttribute("cx", this.x); + this.elt.setAttribute("cy", this.y); + } +} + + + +document.addEventListener('DOMContentLoaded', () => { + const svg = document.getElementsByTagName("svg")[0]; + if (svg) { // Check if container exists + + for( let i = 0; i < NCRITTERS; i++ ) { + const c = new Critter(i); + c.init(i); + c.update(); + critters.push(c); + } + + svg.addEventListener("click", () => { + const dark = document.getElementById("dark"); + if( lights === "on" ) { + lights = "off"; + dark.setAttribute("fill-opacity", "0.8"); + for( const c of critters ) { + c.status = "go"; + } + } else { + lights = "on"; + dark.setAttribute("fill-opacity", "0"); + for( const c of critters ) { + c.status = "hide"; + c.tick = Math.random() * 10 + 15; + } + } + }); + } else { + } + + + +}); + + +function animate() { + requestAnimationFrame(animate); +/* const rect = svg.getBoundingClientRect(); + const x = pointer.x - rect.left; + const y = pointer.y - rect.top; + */ for( const c of critters ) { + c.update(); + } +} + +animate(); + + + diff --git a/dist/06/index.html b/dist/06/index.html new file mode 100644 index 0000000..8a8fe40 --- /dev/null +++ b/dist/06/index.html @@ -0,0 +1,43 @@ + + + + etc.mikelynch.org | Genuary 2026 + + + + +
+ +

Genuary 2026 -

+ +

Prompt: Lights on/off. Make something that changes when you switch on or off the “digital” lights.

+ +

Not what I wanted, but I'm on holidays and need to go to bed

+ +
+ + + + + + + + + + + + + + +
+

Back

+ + + + + + + + + diff --git a/dist/07/index.html b/dist/07/index.html new file mode 100644 index 0000000..a7b9c0d --- /dev/null +++ b/dist/07/index.html @@ -0,0 +1,2223 @@ + + + +etc.mikelynch.org | Genuary 2026 + + + + +
+ +

Genuary 2026 - 7

+ +

Prompt: Boolean

+ +

I'm a bit behind after summer holidays. This is very simple, +each cell is the XOR of its left and upper neighbour. I think +I remember programming this out of one of those beginner's BASIC +books in the early 80s.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Back

+ + + +

The Python script

+ + + + + +