import {units} from '../rules.mjs'; export function signature(l){const variants=[];for(let turn=0;turn<4;turn++)for(const mirror of [1,-1])for(const swap of [false,true]){const tf=([x,y])=>{x*=mirror;for(let j=0;jl.geometry==='hex'?[[c.q,c.r]]:units(c)).map(a=>a.map(tf));const minX=Math.min(...coords.flat().map(a=>a[0])),minY=Math.min(...coords.flat().map(a=>a[1]));const keys=coords.map(a=>a.map(([x,y])=>[x-minX,y-minY].join(',')).sort().join(';'));const order=keys.map((k,i)=>({k,i})).sort((a,b)=>a.k.localeCompare(b.k));const rank=new Map(order.map((o,i)=>[l.cells[o.i].id,i]));const vector={l:[-1,0],r:[1,0],u:[0,-1],d:[0,1]},side=([x,y])=>x<0?'l':x>0?'r':y<0?'u':'d';const nodes=order.map(({i,k})=>{const c=l.cells[i];return [k,c.clue??null,c.parity||null,c.direction?c.direction.split('').map(d=>side(tf(vector[d]))).sort().join(''):null,c.category?(swap?(c.category==='circle'?'triangle':'circle'):c.category):null];});const edges=a=>a.map(e=>e.map(id=>rank.get(id)).sort((a,b)=>a-b)).sort((a,b)=>a.join().localeCompare(b.join()));variants.push(JSON.stringify([l.geometry==='hex'?'hex':'rect',nodes,edges(l.walls||[]),(l.doors||[]).map(d=>[edges([d.edge])[0],d.initialOpen])]));}return variants.sort()[0];}