Skip to content

Commit

Permalink
Add derive_rules
Browse files Browse the repository at this point in the history
  • Loading branch information
oxplot committed May 27, 2020
1 parent f188008 commit dc40fd3
Show file tree
Hide file tree
Showing 2 changed files with 95 additions and 0 deletions.
82 changes: 82 additions & 0 deletions derive_rules
@@ -0,0 +1,82 @@
#!/usr/bin/env python3

import collections
import re
import sys

line_pat = re.compile(r'^([^/=\s]+)\s*/\s*([trlb])\s*=\s*([^/=\s]+)/([trlb])$')
opp_side = dict(zip("trbl", "bltr"))
cw_side = dict(zip("trbl", "rblt"))
acw_side = dict(zip("trbl", "ltrb"))

def tile_cw_name(t):
if t.endswith('_90'):
return t[:-2] + '180'
if t.endswith('_180'):
return t[:-3] + '270'
if t.endswith('_270'):
return t[:-4]
return t + '_90'

def main():
for l in (l.strip() for l in sys.stdin):
if not l:
continue
m = line_pat.match(l)
if not m:
raise SystemExit("bad line format")

norms = set()
tile1, side1, tile2, side2 = m.groups()
if opp_side[side1] != side2:
if cw_side[side1] == side2:
norms.add((f'{tile1}_270', acw_side[side1], tile2, side2))
norms.add((tile1, side1, f'{tile2}_90', cw_side[side2]))
elif acw_side[side1] == side2:
norms.add((f'{tile1}_90', cw_side[side1], tile2, side2))
norms.add((tile1, side1, f'{tile2}_270', acw_side[side2]))
elif side1 == side2:
norms.add((f'{tile1}_180', opp_side[side1], tile2, side2))
norms.add((tile1, side1, f'{tile2}_180', opp_side[side2]))
else:
norms.add((tile1, side1, tile2, side2))

rules = collections.defaultdict(set)
for tile1, side1, tile2, side2 in norms:
for _ in range(4):
rules[(tile1, side1)].add((tile2, side2))
rules[(tile2, side2)].add((tile1, side1))
tile1 = tile_cw_name(tile1)
tile2 = tile_cw_name(tile2)
side1 = cw_side[side1]
side2 = cw_side[side2]

last_rule_count = -1
while last_rule_count != sum(len(v) for v in rules.values()):
last_rule_count = sum(len(v) for v in rules.values())
syms = set()
for (tile1, side1), twos in rules.items():
for tile2, side2 in twos:
if tile1 == tile2:
syms.add((tile1, min(side1, side2)))
for tile, side in syms:
for tile1, side1 in rules[(tile, side)]:
for tile2, side2 in rules[(tile, opp_side[side])]:
rules[(tile1, side1)].add((tile2, side2))

compacted = set()
for (tile1, side1), twos in rules.items():
for tile2, side2 in twos:
if tile1 < tile2:
compacted.add((tile1, side1, tile2, side2))
elif tile2 < tile1:
compacted.add((tile2, side2, tile1, side1))
elif side1 < side2:
compacted.add((tile1, side1, tile2, side2))
else:
compacted.add((tile2, side2, tile1, side1))
for tile1, side1, tile2, side2 in compacted:
print(f'{tile1}/{side1}={tile2}/{side2}')

if __name__ == '__main__':
main()
13 changes: 13 additions & 0 deletions main.go
Expand Up @@ -6,8 +6,10 @@ import (
"encoding/binary"
"flag"
"fmt"
"log"
"os"
"regexp"
"runtime/pprof"
"strconv"

"github.com/oxplot/vense/tile"
Expand Down Expand Up @@ -121,6 +123,17 @@ func run() error {
}

func main() {

f, err := os.Create("profile")
if err != nil {
log.Fatal("could not create CPU profile: ", err)
}
defer f.Close()
if err := pprof.StartCPUProfile(f); err != nil {
log.Fatal("could not start CPU profile: ", err)
}
defer pprof.StopCPUProfile()

flag.Var(gridSize, "size", "grid size in wxh - e.g. 12x14")
flag.Int64Var(&randomSeed, "seed", 0, "random seed - if 0 or not specified, a random seed is used")
flag.Parse()
Expand Down

0 comments on commit dc40fd3

Please sign in to comment.