A particularly nice example - https://www.shadertoy.com/view/4td3zj
And a nice '3D' one - https://www.shadertoy.com/view/4lSBzm
hex:
https://www.instagram.com/p/B2TRmM7p1BB
https://www.instagram.com/p/B2Q130pJwum
rectangular:
It's a shame that regular octagons do not tile the plane. Octagons + squares might work I suppose.
These are really useful for subtle background patterns on footers etc.
https://www.ravensburger.us/en-US/products/games/thinkfun/iz...
It's not a great game, but it's fun enough. The box is small, so we keep it around even if we don't play it much.
There are 9 square (non-identical) tiles in a set. Each edge of each tile displays half of a two-sided symbol (eg cats, dogs, flags, etc.). Goal is to arrange the tiles in a 3x3 grid so that all touching edges match with corresponding symbol halves.
Looks simple at first, but a real challenge.
Size of the entire solution space is 9! * 4^9 (billions), and brute-force solvers have been written in Python:
https://github.com/roadfoodr/scramble-squares-solver
What are the combinatorial rule(s) used to construct these tiles ?? Some clues: https://www.reddit.com/r/puzzles/comments/1e09up6/help_how_t...
Kathie Gavin (designer of Scramble Squares) says the design was inspired by "ancient Egyptian tile patterns" she saw in a museum. Does anyone know more about this?
I suppose I don't normally think about how you're actually using minimal Truchet tiles when you play one of SGT's puzzle games, since it's the most boring tileset:
https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/slan...
python3 -c 'import random, time, itertools; any(time.sleep(0.01) or print(random.choice("\u2571\u2572"), end="", flush=True) for x in itertools.repeat(None))'
(how about this fancy version with SVG output? :D No longer a single line though.)
python3 -c 'while I := __import__: I("time").sleep(0.01); print(I("random").choice("\u2571\u2572"), end="", flush=1)'
My reasoning including most failures:Whitespace is mostly trivial and not worth mentioning, except that the space between "or" and "print" can be eliminated by moving the `time.sleep` to before a string literal. Alternatively, using `!=` works almost anywhere (though not with some alternative ideas), or `;` with the `while` version.
There are several shorter ways to get an infinite loop:
itertools.repeat(None) # for reference
itertools.repeat(0)
itertools.count()
iter(lambda: 0, 1) # also removes the import, so 10 chars shorter
iter(''.upper, 1) # same length when spaces removed, shorter if not removed
iter(int.mro, 1) # spooky, but one char shorter still
range(9**99) # much longer than the age of the universe
range(9**9) # 44 days
# but it turns out we can skip it entirely
The loop itself: any(expr for x in it) # theoretically prevents the memory leak
[expr for x in it] # wastes 800 bytes per sec, 69 MB/day, 1 GB per 14 days
while 1: expr # breaks one-liner unless longer `__import__("")` is used, but worth it since it eliminates the entire iterable, even before doing I=__import__
while I := __import__: # 2 chars shorter than doing the assignment inside the loop
I looked into alternatives to calling sleep at all, but computers are too fast (and variable in speed) nowadays. `os.sync` looked promising but is only slow the first time. Trying to pass its return value as an argument also failed.`flush=1` is shorter than `flush=True`. Otherwise ... I tried `sys.stdout` but hardly anything was even close:
any(time.sleep(0.01) or print(random.choice("\u2571\u2572"), end="", flush=True) for it)
any(time.sleep(0.01) or print(random.choice("\u2571\u2572"), end="", flush=1) for it)
sys.stdout.writelines(time.sleep(0.1) or random.choice("\u2571\u2572")+"\0"*8191 for it) # can avoid the flush by filling the buffer manually, but requires several more chars to import sys as well
Random: random.choice("\u2571\u2572")
# UTF-8 b"\xe2\x95\xb1" doesn't seem useful
chr(9585+random.randrange(2)) # sigh
chr(9585+(random.random()<.5)) # nope
chr(9585+(os.getrandom(1)[0]&1)) # + has tigher precedence than &
# that last would save 1 byte with normal `import` (since the identifier is repeated), but loses with `__import__`
# is there a way to eliminate parens? Is >> or | or - useful? What about *splat?