cubing 0.25.13 → 0.26.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/.DS_Store +0 -0
- package/dist/esm/{2x2x2.kpuzzle.json-BHTFIME6.js → 2x2x2.kpuzzle.json-RJHNQ246.js} +1 -1
- package/dist/esm/{2x2x2.kpuzzle.json-BHTFIME6.js.map → 2x2x2.kpuzzle.json-RJHNQ246.js.map} +1 -1
- package/dist/esm/{2x2x2.sgs.json-NLV7NA3B.js → 2x2x2.sgs.json-OIAKZDZZ.js} +5 -5
- package/dist/esm/{2x2x2.sgs.json-NLV7NA3B.js.map → 2x2x2.sgs.json-OIAKZDZZ.js.map} +1 -1
- package/dist/esm/{3d-dynamic-ZXCKVS2R.js → 3d-dynamic-OTQHIOVR.js} +5 -5
- package/dist/esm/{3d-dynamic-ZXCKVS2R.js.map → 3d-dynamic-OTQHIOVR.js.map} +1 -1
- package/dist/esm/{3x3x3-min2phase-UBW46KDU.js → 3x3x3-min2phase-GFNNX26U.js} +1 -1
- package/dist/esm/{3x3x3-min2phase-UBW46KDU.js.map → 3x3x3-min2phase-GFNNX26U.js.map} +1 -1
- package/dist/esm/{444-solver-XVU6Q26C.js → 444-solver-2ECPETB3.js} +6 -6
- package/dist/esm/{444-solver-XVU6Q26C.js.map → 444-solver-2ECPETB3.js.map} +1 -1
- package/dist/esm/alg/index.js +1 -1
- package/dist/esm/bluetooth/index.js +6 -8
- package/dist/esm/bluetooth/index.js.map +1 -1
- package/dist/esm/{chunk-FB7SFELN.js → chunk-3CEMUTUD.js} +2 -2
- package/dist/esm/{chunk-FB7SFELN.js.map → chunk-3CEMUTUD.js.map} +1 -1
- package/dist/esm/{chunk-NSLR2SC4.js → chunk-5Q4SJSNY.js} +2 -2
- package/dist/esm/{chunk-NSLR2SC4.js.map → chunk-5Q4SJSNY.js.map} +1 -1
- package/dist/esm/{chunk-ZPAGJE7S.js → chunk-AD6PFNOU.js} +2 -2
- package/dist/esm/{chunk-ZPAGJE7S.js.map → chunk-AD6PFNOU.js.map} +1 -1
- package/dist/esm/{chunk-GBMX6FHY.js → chunk-ALBEW4DJ.js} +1 -1
- package/dist/esm/{chunk-GBMX6FHY.js.map → chunk-ALBEW4DJ.js.map} +1 -1
- package/dist/esm/{chunk-KWHGWTPB.js → chunk-CRU5TVHA.js} +4 -4
- package/dist/esm/{chunk-KWHGWTPB.js.map → chunk-CRU5TVHA.js.map} +1 -1
- package/dist/esm/{chunk-AT7N3AOZ.js → chunk-CYG3DDTX.js} +3 -2
- package/dist/esm/chunk-CYG3DDTX.js.map +7 -0
- package/dist/esm/{chunk-YAOUFM4D.js → chunk-HUCMGBEC.js} +295 -2
- package/dist/esm/chunk-HUCMGBEC.js.map +7 -0
- package/dist/esm/{chunk-RPPJMADS.js → chunk-J7OB2GEM.js} +6 -6
- package/dist/esm/{chunk-RPPJMADS.js.map → chunk-J7OB2GEM.js.map} +1 -1
- package/dist/esm/{chunk-FIUPFE4L.js → chunk-JIBAUV55.js} +7 -7
- package/dist/esm/{chunk-FIUPFE4L.js.map → chunk-JIBAUV55.js.map} +1 -1
- package/dist/esm/{chunk-ASJ4L4HQ.js → chunk-MC2D6L32.js} +3 -3
- package/dist/esm/{chunk-ASJ4L4HQ.js.map → chunk-MC2D6L32.js.map} +1 -1
- package/dist/esm/{chunk-RN5JA7BB.js → chunk-PDVAUAMY.js} +2 -2
- package/dist/esm/{chunk-RN5JA7BB.js.map → chunk-PDVAUAMY.js.map} +1 -1
- package/dist/esm/{chunk-AMOANNTB.js → chunk-PMKVGKT4.js} +4 -4
- package/dist/esm/{chunk-AMOANNTB.js.map → chunk-PMKVGKT4.js.map} +1 -1
- package/dist/esm/{chunk-DO7GZAW4.js → chunk-QZOJPCN5.js} +1 -1
- package/dist/esm/{chunk-DO7GZAW4.js.map → chunk-QZOJPCN5.js.map} +1 -1
- package/dist/esm/{chunk-BEXHMXCT.js → chunk-RHC3DIN3.js} +1 -1
- package/dist/esm/{chunk-BEXHMXCT.js.map → chunk-RHC3DIN3.js.map} +1 -1
- package/dist/esm/{chunk-43SBQEWR.js → chunk-V55YSWJY.js} +3 -3
- package/dist/esm/chunk-V55YSWJY.js.map +7 -0
- package/dist/esm/{chunk-YRNGJPFS.js → chunk-XQKTAWAA.js} +6 -6
- package/dist/esm/{chunk-YRNGJPFS.js.map → chunk-XQKTAWAA.js.map} +1 -1
- package/dist/esm/{clock.kpuzzle.json-PYHONPBY.js → clock.kpuzzle.json-3Q7KDODZ.js} +1 -1
- package/dist/esm/clock.kpuzzle.json-3Q7KDODZ.js.map +7 -0
- package/dist/esm/{fto-solver-TOOJNOZB.js → fto-solver-5EQEC77M.js} +2 -2
- package/dist/esm/{fto-solver-TOOJNOZB.js.map → fto-solver-5EQEC77M.js.map} +1 -1
- package/dist/esm/{fto.dynamic-ZIN22CCJ.js → fto.dynamic-ISSUUAOX.js} +6 -6
- package/dist/esm/{fto.dynamic-ZIN22CCJ.js.map → fto.dynamic-ISSUUAOX.js.map} +1 -1
- package/dist/esm/{kilosolver-A3MNW2DJ.js → kilosolver-RP3POREU.js} +3 -3
- package/dist/esm/{kilosolver-A3MNW2DJ.js.map → kilosolver-RP3POREU.js.map} +1 -1
- package/dist/esm/kpuzzle/index.js +2 -2
- package/dist/esm/{master_tetraminx-solver-QSJNGET5.js → master_tetraminx-solver-RFBUNQMC.js} +2 -2
- package/dist/esm/{master_tetraminx-solver-QSJNGET5.js.map → master_tetraminx-solver-RFBUNQMC.js.map} +1 -1
- package/dist/esm/{megaminx.sgs.json-4RFNTV3K.js → megaminx.sgs.json-NUXKWG2L.js} +6 -6
- package/dist/esm/{megaminx.sgs.json-4RFNTV3K.js.map → megaminx.sgs.json-NUXKWG2L.js.map} +0 -0
- package/dist/esm/notation/index.js +2 -2
- package/dist/esm/protocol/index.js +2 -3
- package/dist/esm/puzzle-geometry/index.js +2 -2
- package/dist/esm/puzzles/index.js +3 -3
- package/dist/esm/pyraminx.sgs.json-2BVIFZAF.js +14 -0
- package/dist/esm/{pyraminx.sgs.json-XWDFTFGD.js.map → pyraminx.sgs.json-2BVIFZAF.js.map} +0 -0
- package/dist/esm/{redi_cube-FYRLEZZH.js → redi_cube-5B6YHJGL.js} +3 -3
- package/dist/esm/{redi_cube-FYRLEZZH.js.map → redi_cube-5B6YHJGL.js.map} +1 -1
- package/dist/esm/{redi_cube.kpuzzle.json-43CP47Z6.js → redi_cube.kpuzzle.json-VGO74GBL.js} +1 -1
- package/dist/esm/{redi_cube.kpuzzle.json-43CP47Z6.js.map → redi_cube.kpuzzle.json-VGO74GBL.js.map} +1 -1
- package/dist/esm/scramble/index.js +8 -8
- package/dist/esm/search/index.js +8 -8
- package/dist/esm/{search-worker-js-entry-MQ5EKNR4.js → search-worker-js-entry-CZHIWNVF.js} +24 -24
- package/dist/esm/{search-worker-js-entry-MQ5EKNR4.js.map → search-worker-js-entry-CZHIWNVF.js.map} +1 -1
- package/dist/esm/{search-worker-ts-entry-AEZHCL75.js → search-worker-ts-entry-4WJDKASM.js} +5 -5
- package/dist/esm/{search-worker-ts-entry-AEZHCL75.js.map → search-worker-ts-entry-4WJDKASM.js.map} +1 -1
- package/dist/esm/skewb.sgs.json-IMR7QJQC.js +16 -0
- package/dist/esm/{skewb.sgs.json-ENZWYZTX.js.map → skewb.sgs.json-IMR7QJQC.js.map} +0 -0
- package/dist/esm/{sq1-hyperorbit.kpuzzle.json-AMXAFQCM.js → sq1-hyperorbit.kpuzzle.json-NHAYS6MD.js} +1 -1
- package/dist/esm/sq1-hyperorbit.kpuzzle.json-NHAYS6MD.js.map +7 -0
- package/dist/esm/{sq1-solver-KMN2GSOU.js → sq1-solver-G73T6FTJ.js} +2 -2
- package/dist/esm/{sq1-solver-KMN2GSOU.js.map → sq1-solver-G73T6FTJ.js.map} +1 -1
- package/dist/esm/stream/index.js +1 -1
- package/dist/esm/stream/index.js.map +1 -1
- package/dist/esm/twisty/index.js +73 -52
- package/dist/esm/twisty/index.js.map +2 -2
- package/dist/esm/{worker-inside-generated-string-HCFERKXI.js → worker-inside-generated-string-4FDHMKDI.js} +27 -27
- package/dist/esm/worker-inside-generated-string-4FDHMKDI.js.map +7 -0
- package/dist/types/Alg-6f3dc52c.d.ts +278 -0
- package/dist/types/KPuzzleDefinition-8531b592.d.ts +349 -0
- package/dist/types/KState-ba36d9a3.d.ts +70 -0
- package/dist/types/PuzzleLoader-a7faf593.d.ts +172 -0
- package/dist/types/alg/index.d.ts +49 -13
- package/dist/types/bluetooth/index.d.ts +147 -11
- package/dist/types/{bluetooth/smart-puzzle/bluetooth-puzzle.d.ts → bluetooth-puzzle-bc1a5264.d.ts} +14 -8
- package/dist/types/kpuzzle/index.d.ts +8 -6
- package/dist/types/notation/index.d.ts +8 -2
- package/dist/types/outside-d6602f71.d.ts +22 -0
- package/dist/types/parse-6d363160.d.ts +9 -0
- package/dist/types/protocol/index.d.ts +26 -4
- package/dist/types/puzzle-geometry/index.d.ts +7 -6
- package/dist/types/puzzles/index.d.ts +29 -12
- package/dist/types/scramble/index.d.ts +4 -1
- package/dist/types/search/index.d.ts +8 -2
- package/dist/types/stream/index.d.ts +57 -3
- package/dist/types/twisty/index.d.ts +1027 -16
- package/package.json +4 -2
- package/dist/esm/chunk-43SBQEWR.js.map +0 -7
- package/dist/esm/chunk-6BUCXDZU.js +0 -274
- package/dist/esm/chunk-6BUCXDZU.js.map +0 -7
- package/dist/esm/chunk-AT7N3AOZ.js.map +0 -7
- package/dist/esm/chunk-YAOUFM4D.js.map +0 -7
- package/dist/esm/clock.kpuzzle.json-PYHONPBY.js.map +0 -7
- package/dist/esm/pyraminx.sgs.json-XWDFTFGD.js +0 -14
- package/dist/esm/skewb.sgs.json-ENZWYZTX.js +0 -16
- package/dist/esm/sq1-hyperorbit.kpuzzle.json-AMXAFQCM.js.map +0 -7
- package/dist/esm/worker-inside-generated-string-HCFERKXI.js.map +0 -7
- package/dist/types/alg/Alg.d.ts +0 -118
- package/dist/types/alg/Alg.spec.d.ts +0 -1
- package/dist/types/alg/AlgBuilder.d.ts +0 -11
- package/dist/types/alg/Serializable.d.ts +0 -0
- package/dist/types/alg/common.d.ts +0 -19
- package/dist/types/alg/debug.d.ts +0 -4
- package/dist/types/alg/example.d.ts +0 -14
- package/dist/types/alg/is.d.ts +0 -4
- package/dist/types/alg/iteration.d.ts +0 -9
- package/dist/types/alg/keyboard.d.ts +0 -2
- package/dist/types/alg/limits.d.ts +0 -4
- package/dist/types/alg/operation.d.ts +0 -6
- package/dist/types/alg/operation.spec.d.ts +0 -1
- package/dist/types/alg/parse.d.ts +0 -12
- package/dist/types/alg/parse.spec.d.ts +0 -1
- package/dist/types/alg/test/alg-comparison.d.ts +0 -10
- package/dist/types/alg/test/alg.spec.d.ts +0 -1
- package/dist/types/alg/traversal.d.ts +0 -39
- package/dist/types/alg/units/QuantumWithAmount.d.ts +0 -11
- package/dist/types/alg/units/Unit.d.ts +0 -9
- package/dist/types/alg/units/containers/Commutator.d.ts +0 -14
- package/dist/types/alg/units/containers/Conjugate.d.ts +0 -14
- package/dist/types/alg/units/containers/Grouping.d.ts +0 -19
- package/dist/types/alg/units/index.d.ts +0 -8
- package/dist/types/alg/units/leaves/LineComment.d.ts +0 -12
- package/dist/types/alg/units/leaves/LineComment.spec.d.ts +0 -1
- package/dist/types/alg/units/leaves/Move.d.ts +0 -50
- package/dist/types/alg/units/leaves/Move.spec.d.ts +0 -1
- package/dist/types/alg/units/leaves/Newline.d.ts +0 -9
- package/dist/types/alg/units/leaves/Pause.d.ts +0 -9
- package/dist/types/alg/url.d.ts +0 -11
- package/dist/types/alg/url.spec.d.ts +0 -1
- package/dist/types/alg/validation.d.ts +0 -19
- package/dist/types/alg/warnOnce.d.ts +0 -1
- package/dist/types/bluetooth/connect/index.d.ts +0 -6
- package/dist/types/bluetooth/debug.d.ts +0 -2
- package/dist/types/bluetooth/keyboard.d.ts +0 -14
- package/dist/types/bluetooth/smart-puzzle/Heykube.d.ts +0 -17
- package/dist/types/bluetooth/smart-puzzle/connect.d.ts +0 -3
- package/dist/types/bluetooth/smart-puzzle/endianness.d.ts +0 -1
- package/dist/types/bluetooth/smart-puzzle/gan.d.ts +0 -34
- package/dist/types/bluetooth/smart-puzzle/giiker.d.ts +0 -21
- package/dist/types/bluetooth/smart-puzzle/giiker.spec.d.ts +0 -4
- package/dist/types/bluetooth/smart-puzzle/gocube.d.ts +0 -22
- package/dist/types/bluetooth/smart-robot/GanRobot.d.ts +0 -35
- package/dist/types/bluetooth/smart-robot/index.d.ts +0 -4
- package/dist/types/bluetooth/smart-timer/GanTimer.d.ts +0 -19
- package/dist/types/bluetooth/smart-timer/index.d.ts +0 -4
- package/dist/types/bluetooth/transformer.d.ts +0 -9
- package/dist/types/cubing.bundle-global.d.ts +0 -1
- package/dist/types/cubing.bundle-global.exports.d.ts +0 -24
- package/dist/types/kpuzzle/3x3x3/3x3x3.kpuzzle.json.d.ts +0 -2
- package/dist/types/kpuzzle/3x3x3/3x3x3.kpuzzle.json.spec.d.ts +0 -1
- package/dist/types/kpuzzle/3x3x3/puzzle-orientation.d.ts +0 -4
- package/dist/types/kpuzzle/KPuzzle.d.ts +0 -30
- package/dist/types/kpuzzle/KPuzzleDefinition.d.ts +0 -21
- package/dist/types/kpuzzle/KState.d.ts +0 -19
- package/dist/types/kpuzzle/KTransformation.d.ts +0 -24
- package/dist/types/kpuzzle/calculate.d.ts +0 -16
- package/dist/types/kpuzzle/combine.d.ts +0 -3
- package/dist/types/kpuzzle/construct.d.ts +0 -5
- package/dist/types/notation/CountAnimatedLeaves.d.ts +0 -2
- package/dist/types/notation/CountMoves.d.ts +0 -3
- package/dist/types/protocol/binary/binary3x3x3.d.ts +0 -19
- package/dist/types/protocol/binary/binary3x3x3.spec.d.ts +0 -1
- package/dist/types/protocol/binary/hex.d.ts +0 -2
- package/dist/types/protocol/binary/hex.spec.d.ts +0 -1
- package/dist/types/protocol/binary/orbit-indexing.d.ts +0 -5
- package/dist/types/protocol/binary/orbit-indexing.spec.d.ts +0 -1
- package/dist/types/protocol/binary/puzzle-orientation.d.ts +0 -4
- package/dist/types/puzzle-geometry/FaceNameSwizzler.d.ts +0 -12
- package/dist/types/puzzle-geometry/Options.d.ts +0 -45
- package/dist/types/puzzle-geometry/PGPuzzles.d.ts +0 -5
- package/dist/types/puzzle-geometry/PGPuzzles.spec.d.ts +0 -4
- package/dist/types/puzzle-geometry/Perm.d.ts +0 -18
- package/dist/types/puzzle-geometry/PermOriSet.d.ts +0 -71
- package/dist/types/puzzle-geometry/PlatonicGenerator.d.ts +0 -10
- package/dist/types/puzzle-geometry/PuzzleGeometry.d.ts +0 -176
- package/dist/types/puzzle-geometry/Quat.d.ts +0 -43
- package/dist/types/puzzle-geometry/Quat.spec.d.ts +0 -1
- package/dist/types/puzzle-geometry/SchreierSims.d.ts +0 -2
- package/dist/types/puzzle-geometry/notation-mapping/FTONotationMapper.d.ts +0 -10
- package/dist/types/puzzle-geometry/notation-mapping/FaceRenamingMapper.d.ts +0 -12
- package/dist/types/puzzle-geometry/notation-mapping/MegaminxScramblingNotationMapper.d.ts +0 -8
- package/dist/types/puzzle-geometry/notation-mapping/NotationMapper.d.ts +0 -7
- package/dist/types/puzzle-geometry/notation-mapping/NullMapper.d.ts +0 -6
- package/dist/types/puzzle-geometry/notation-mapping/NxNxNCubeMapper.d.ts +0 -8
- package/dist/types/puzzle-geometry/notation-mapping/PyraminxNotationMapper.d.ts +0 -15
- package/dist/types/puzzle-geometry/notation-mapping/SkewbNotationMapper.d.ts +0 -9
- package/dist/types/puzzle-geometry/notation-mapping/index.d.ts +0 -8
- package/dist/types/puzzle-geometry/orientcenters.spec.d.ts +0 -1
- package/dist/types/puzzles/PuzzleLoader.d.ts +0 -18
- package/dist/types/puzzles/async/async-pg3d.d.ts +0 -33
- package/dist/types/puzzles/async/lazy-cached.d.ts +0 -1
- package/dist/types/puzzles/customPGPuzzleLoader.d.ts +0 -11
- package/dist/types/puzzles/events.d.ts +0 -8
- package/dist/types/puzzles/implementations/2x2x2/2x2x2.kpuzzle.json.d.ts +0 -2
- package/dist/types/puzzles/implementations/2x2x2/2x2x2.kpuzzle.svg.d.ts +0 -2
- package/dist/types/puzzles/implementations/2x2x2/index.d.ts +0 -2
- package/dist/types/puzzles/implementations/3x3x3/3x3x3-ll.kpuzzle.svg.d.ts +0 -2
- package/dist/types/puzzles/implementations/3x3x3/3x3x3.kpuzzle.svg.d.ts +0 -2
- package/dist/types/puzzles/implementations/3x3x3/index.d.ts +0 -2
- package/dist/types/puzzles/implementations/clock/clock.kpuzzle.json.d.ts +0 -2
- package/dist/types/puzzles/implementations/clock/clock.kpuzzle.svg.d.ts +0 -2
- package/dist/types/puzzles/implementations/clock/index.d.ts +0 -2
- package/dist/types/puzzles/implementations/fto/fto.kpuzzle.svg.d.ts +0 -1
- package/dist/types/puzzles/implementations/fto/index.d.ts +0 -12
- package/dist/types/puzzles/implementations/kilominx/index.d.ts +0 -2
- package/dist/types/puzzles/implementations/kilominx/kilominx.kpuzzle.svg.d.ts +0 -1
- package/dist/types/puzzles/implementations/megaminx/index.d.ts +0 -11
- package/dist/types/puzzles/implementations/pyraminx/index.d.ts +0 -7
- package/dist/types/puzzles/implementations/pyraminx/pyraminx.kpuzzle.json.d.ts +0 -2
- package/dist/types/puzzles/implementations/pyraminx/pyraminx.kpuzzle.svg.d.ts +0 -2
- package/dist/types/puzzles/implementations/redi-cube/index.d.ts +0 -2
- package/dist/types/puzzles/implementations/redi-cube/redi_cube.kpuzzle.json.d.ts +0 -2
- package/dist/types/puzzles/implementations/redi-cube/redi_cube.kpuzzle.svg.d.ts +0 -1
- package/dist/types/puzzles/implementations/square1/index.d.ts +0 -2
- package/dist/types/puzzles/implementations/square1/sq1-hyperorbit.kpuzzle.json.d.ts +0 -2
- package/dist/types/puzzles/implementations/square1/sq1-hyperorbit.kpuzzle.svg.d.ts +0 -2
- package/dist/types/puzzles/stickerings/appearance.d.ts +0 -50
- package/dist/types/puzzles/stickerings/cube-stickerings.d.ts +0 -5
- package/dist/types/puzzles/stickerings/fto-stickerings.d.ts +0 -5
- package/dist/types/puzzles/stickerings/global-custom-stickering-hack.d.ts +0 -2
- package/dist/types/puzzles/stickerings/megaminx-stickerings.d.ts +0 -5
- package/dist/types/search/inside/api.d.ts +0 -21
- package/dist/types/search/inside/api.spec.d.ts +0 -1
- package/dist/types/search/inside/inside-worker.d.ts +0 -2
- package/dist/types/search/inside/search-worker-js-entry.d.ts +0 -1
- package/dist/types/search/inside/search-worker-ts-entry-path-getter.d.ts +0 -1
- package/dist/types/search/inside/search-worker-ts-entry.d.ts +0 -1
- package/dist/types/search/inside/solve/addOrientationSuffix.d.ts +0 -2
- package/dist/types/search/inside/solve/parseSGS.d.ts +0 -18
- package/dist/types/search/inside/solve/puzzles/2x2x2.d.ts +0 -6
- package/dist/types/search/inside/solve/puzzles/2x2x2.sgs.json.d.ts +0 -3
- package/dist/types/search/inside/solve/puzzles/3x3x3/convert.d.ts +0 -2
- package/dist/types/search/inside/solve/puzzles/3x3x3/filter.d.ts +0 -4
- package/dist/types/search/inside/solve/puzzles/3x3x3/index.d.ts +0 -8
- package/dist/types/search/inside/solve/puzzles/3x3x3/legacy-sgs.d.ts +0 -1
- package/dist/types/search/inside/solve/puzzles/3x3x3-inefficient.sgs.json.d.ts +0 -3
- package/dist/types/search/inside/solve/puzzles/4x4x4.d.ts +0 -4
- package/dist/types/search/inside/solve/puzzles/5x5x5.d.ts +0 -2
- package/dist/types/search/inside/solve/puzzles/big-cubes.d.ts +0 -2
- package/dist/types/search/inside/solve/puzzles/clock.d.ts +0 -1
- package/dist/types/search/inside/solve/puzzles/fto.d.ts +0 -5
- package/dist/types/search/inside/solve/puzzles/fto.dynamic.d.ts +0 -3
- package/dist/types/search/inside/solve/puzzles/kilominx.d.ts +0 -2
- package/dist/types/search/inside/solve/puzzles/master_tetraminx.d.ts +0 -2
- package/dist/types/search/inside/solve/puzzles/megaminx.d.ts +0 -4
- package/dist/types/search/inside/solve/puzzles/megaminx.sgs.json.d.ts +0 -5
- package/dist/types/search/inside/solve/puzzles/pyraminx.d.ts +0 -6
- package/dist/types/search/inside/solve/puzzles/pyraminx.sgs.json.d.ts +0 -3
- package/dist/types/search/inside/solve/puzzles/redi_cube.d.ts +0 -2
- package/dist/types/search/inside/solve/puzzles/sgs-defs.spec.d.ts +0 -1
- package/dist/types/search/inside/solve/puzzles/skewb.d.ts +0 -6
- package/dist/types/search/inside/solve/puzzles/skewb.sgs.json.d.ts +0 -5
- package/dist/types/search/inside/solve/puzzles/sq1.d.ts +0 -2
- package/dist/types/search/inside/solve/puzzles/wca-minx.d.ts +0 -1
- package/dist/types/search/inside/solve/tremble.d.ts +0 -13
- package/dist/types/search/inside/worker-guard.d.ts +0 -3
- package/dist/types/search/instantiator.d.ts +0 -4
- package/dist/types/search/outside.d.ts +0 -17
- package/dist/types/search/worker-inside-generated-string.d.ts +0 -1
- package/dist/types/stream/process/ReorientedStream.d.ts +0 -20
- package/dist/types/stream/proxy-event.d.ts +0 -13
- package/dist/types/stream/twizzle/TwizzleStream.d.ts +0 -18
- package/dist/types/stream/twizzle/stream-types.d.ts +0 -32
- package/dist/types/stream/websocket-proxy.d.ts +0 -21
- package/dist/types/twisty/controllers/AnimationTypes.d.ts +0 -32
- package/dist/types/twisty/controllers/RenderScheduler.d.ts +0 -12
- package/dist/types/twisty/controllers/TwistyAnimationController.d.ts +0 -36
- package/dist/types/twisty/controllers/TwistyPlayerController.d.ts +0 -15
- package/dist/types/twisty/controllers/easing.d.ts +0 -1
- package/dist/types/twisty/controllers/indexer/AlgDuration.d.ts +0 -17
- package/dist/types/twisty/controllers/indexer/AlgIndexer.d.ts +0 -36
- package/dist/types/twisty/controllers/indexer/SimpleAlgIndexer.d.ts +0 -19
- package/dist/types/twisty/controllers/indexer/simultaneous-moves/SimultaneousMoveIndexer.d.ts +0 -22
- package/dist/types/twisty/controllers/indexer/simultaneous-moves/simul-moves.d.ts +0 -25
- package/dist/types/twisty/controllers/indexer/tree/AlgWalker.d.ts +0 -63
- package/dist/types/twisty/controllers/indexer/tree/TreeAlgIndexer.d.ts +0 -20
- package/dist/types/twisty/controllers/indexer/tree/chunkAlgs.d.ts +0 -2
- package/dist/types/twisty/controllers/stream/timeline-move-calculation-draft.d.ts +0 -15
- package/dist/types/twisty/heavy-code-imports/3d.d.ts +0 -2
- package/dist/types/twisty/heavy-code-imports/dynamic-entries/3d-dynamic.d.ts +0 -10
- package/dist/types/twisty/model/PromiseFreshener.d.ts +0 -13
- package/dist/types/twisty/model/TwistyPlayerModel.d.ts +0 -85
- package/dist/types/twisty/model/TwistySceneModel.d.ts +0 -27
- package/dist/types/twisty/model/UserVisibleErrorTracker.d.ts +0 -10
- package/dist/types/twisty/model/helpers.d.ts +0 -4
- package/dist/types/twisty/model/props/TwistyProp.d.ts +0 -59
- package/dist/types/twisty/model/props/TwistyProp.spec.d.ts +0 -4
- package/dist/types/twisty/model/props/TwistyPropDebugger.d.ts +0 -26
- package/dist/types/twisty/model/props/general/ArbitraryStringProp.d.ts +0 -4
- package/dist/types/twisty/model/props/general/URLProp.d.ts +0 -5
- package/dist/types/twisty/model/props/puzzle/display/FoundationDisplayProp.d.ts +0 -5
- package/dist/types/twisty/model/props/puzzle/display/HintFaceletProp.d.ts +0 -10
- package/dist/types/twisty/model/props/puzzle/display/SpriteProp.d.ts +0 -9
- package/dist/types/twisty/model/props/puzzle/display/StickeringProp.d.ts +0 -50
- package/dist/types/twisty/model/props/puzzle/state/AlgProp.d.ts +0 -26
- package/dist/types/twisty/model/props/puzzle/state/AlgTransformationProp.d.ts +0 -11
- package/dist/types/twisty/model/props/puzzle/state/AnchorTransformationProp.d.ts +0 -14
- package/dist/types/twisty/model/props/puzzle/state/CatchUpMoveProp.d.ts +0 -10
- package/dist/types/twisty/model/props/puzzle/state/CurrentLeavesSimplified.d.ts +0 -16
- package/dist/types/twisty/model/props/puzzle/state/CurrentMoveInfoProp.d.ts +0 -13
- package/dist/types/twisty/model/props/puzzle/state/CurrentStateProp.d.ts +0 -14
- package/dist/types/twisty/model/props/puzzle/state/IndexerConstructorProp.d.ts +0 -19
- package/dist/types/twisty/model/props/puzzle/state/IndexerConstructorRequestProp.d.ts +0 -11
- package/dist/types/twisty/model/props/puzzle/state/IndexerProp.d.ts +0 -14
- package/dist/types/twisty/model/props/puzzle/state/LegacyPositionProp.d.ts +0 -11
- package/dist/types/twisty/model/props/puzzle/state/MovePressInputProp.d.ts +0 -10
- package/dist/types/twisty/model/props/puzzle/state/NaiveMoveCountProp.d.ts +0 -9
- package/dist/types/twisty/model/props/puzzle/state/PuzzleAlgProp.d.ts +0 -13
- package/dist/types/twisty/model/props/puzzle/state/SetupAnchorProp.d.ts +0 -9
- package/dist/types/twisty/model/props/puzzle/state/SetupTransformationProp.d.ts +0 -5
- package/dist/types/twisty/model/props/puzzle/structure/KPuzzleProp.d.ts +0 -10
- package/dist/types/twisty/model/props/puzzle/structure/PuzzleDescriptionProp.d.ts +0 -5
- package/dist/types/twisty/model/props/puzzle/structure/PuzzleIDProp.d.ts +0 -10
- package/dist/types/twisty/model/props/puzzle/structure/PuzzleIDRequestProp.d.ts +0 -25
- package/dist/types/twisty/model/props/puzzle/structure/PuzzleLoaderProp.d.ts +0 -12
- package/dist/types/twisty/model/props/timeline/CoarseTimelineInfoProp.d.ts +0 -24
- package/dist/types/twisty/model/props/timeline/DetailedTimelineInfoProp.d.ts +0 -21
- package/dist/types/twisty/model/props/timeline/PlayingInfoProp.d.ts +0 -14
- package/dist/types/twisty/model/props/timeline/TempoScaleProp.d.ts +0 -5
- package/dist/types/twisty/model/props/timeline/TimestampRequestProp.d.ts +0 -15
- package/dist/types/twisty/model/props/viewer/BackViewProp.d.ts +0 -11
- package/dist/types/twisty/model/props/viewer/BackgroundProp.d.ts +0 -10
- package/dist/types/twisty/model/props/viewer/ButtonAppearanceProp.d.ts +0 -21
- package/dist/types/twisty/model/props/viewer/ControlPanelProp.d.ts +0 -10
- package/dist/types/twisty/model/props/viewer/LatitudeLimit.d.ts +0 -5
- package/dist/types/twisty/model/props/viewer/OrbitCoordinatesProp.d.ts +0 -28
- package/dist/types/twisty/model/props/viewer/OrbitCoordinatesRequestProp.d.ts +0 -14
- package/dist/types/twisty/model/props/viewer/TimeRangeProp.d.ts +0 -10
- package/dist/types/twisty/model/props/viewer/ViewerLinkProp.d.ts +0 -11
- package/dist/types/twisty/model/props/viewer/VisualizationProp.d.ts +0 -12
- package/dist/types/twisty/model/props/viewer/VisualizationStrategyProp.d.ts +0 -12
- package/dist/types/twisty/views/2D/KPuzzleSVGWrapper.d.ts +0 -17
- package/dist/types/twisty/views/2D/Twisty2DPuzzle.css.d.ts +0 -2
- package/dist/types/twisty/views/2D/Twisty2DPuzzle.d.ts +0 -27
- package/dist/types/twisty/views/2D/Twisty2DPuzzleWrapper.d.ts +0 -15
- package/dist/types/twisty/views/2D/Twisty2DSceneWrapper.d.ts +0 -19
- package/dist/types/twisty/views/3D/DragTracker.d.ts +0 -27
- package/dist/types/twisty/views/3D/RendererPool.d.ts +0 -3
- package/dist/types/twisty/views/3D/TAU.d.ts +0 -2
- package/dist/types/twisty/views/3D/Twisty3DPuzzleWrapper.d.ts +0 -21
- package/dist/types/twisty/views/3D/Twisty3DRenderTarget.d.ts +0 -3
- package/dist/types/twisty/views/3D/Twisty3DScene.d.ts +0 -14
- package/dist/types/twisty/views/3D/Twisty3DSceneWrapper.d.ts +0 -33
- package/dist/types/twisty/views/3D/Twisty3DVantage.css.d.ts +0 -2
- package/dist/types/twisty/views/3D/Twisty3DVantage.d.ts +0 -36
- package/dist/types/twisty/views/3D/TwistyOrbitControls.d.ts +0 -23
- package/dist/types/twisty/views/3D/TwistyOrbitControls.spec.d.ts +0 -4
- package/dist/types/twisty/views/3D/puzzles/Cube3D.d.ts +0 -58
- package/dist/types/twisty/views/3D/puzzles/PG3D.d.ts +0 -64
- package/dist/types/twisty/views/3D/puzzles/Twisty3DPuzzle.d.ts +0 -5
- package/dist/types/twisty/views/ClassListManager.d.ts +0 -10
- package/dist/types/twisty/views/ManagedCustomElement.d.ts +0 -19
- package/dist/types/twisty/views/TwistyAlgEditor/LeafTokens.d.ts +0 -17
- package/dist/types/twisty/views/TwistyAlgEditor/TwistyAlgEditor.css.d.ts +0 -2
- package/dist/types/twisty/views/TwistyAlgEditor/TwistyAlgEditor.d.ts +0 -40
- package/dist/types/twisty/views/TwistyAlgEditor/TwistyAlgEditor.spec.d.ts +0 -4
- package/dist/types/twisty/views/TwistyAlgEditor/model.d.ts +0 -60
- package/dist/types/twisty/views/TwistyAlgViewer.css.d.ts +0 -2
- package/dist/types/twisty/views/TwistyAlgViewer.d.ts +0 -51
- package/dist/types/twisty/views/TwistyPlayer.css.d.ts +0 -2
- package/dist/types/twisty/views/TwistyPlayer.d.ts +0 -112
- package/dist/types/twisty/views/TwistyPlayerSettable.d.ts +0 -79
- package/dist/types/twisty/views/TwistyViewerWrapper.css.d.ts +0 -2
- package/dist/types/twisty/views/canvas.d.ts +0 -2
- package/dist/types/twisty/views/control-panel/TwistyButtons.css.d.ts +0 -3
- package/dist/types/twisty/views/control-panel/TwistyButtons.d.ts +0 -32
- package/dist/types/twisty/views/control-panel/TwistyScrubber.css.d.ts +0 -2
- package/dist/types/twisty/views/control-panel/TwistyScrubber.d.ts +0 -13
- package/dist/types/twisty/views/control-panel/webkit-fullscreen.d.ts +0 -14
- package/dist/types/twisty/views/document.d.ts +0 -1
- package/dist/types/twisty/views/node-custom-element-shims.d.ts +0 -4
- package/dist/types/twisty/views/screenshot.d.ts +0 -11
- package/dist/types/twisty/views/stream/TwistyStreamSource.css.d.ts +0 -2
- package/dist/types/twisty/views/stream/TwistyStreamSource.d.ts +0 -12
- package/dist/types/twisty/views/twizzle/TwizzleLink.css.d.ts +0 -2
- package/dist/types/twisty/views/twizzle/TwizzleLink.d.ts +0 -11
- package/dist/types/twisty/views/twizzle/url-params.d.ts +0 -18
- package/dist/types/vendor/comlink-everywhere/inside/index.d.ts +0 -4
- package/dist/types/vendor/comlink-everywhere/node-adapter.d.ts +0 -6
- package/dist/types/vendor/comlink-everywhere/outside/index.d.ts +0 -5
- package/dist/types/vendor/cstimer/src/js/lib/mathlib.d.ts +0 -4
- package/dist/types/vendor/cstimer/src/js/scramble/444-solver.d.ts +0 -3
- package/dist/types/vendor/min2phase/3x3x3-min2phase.d.ts +0 -2
- package/dist/types/vendor/p-lazy/p-lazy.d.ts +0 -9
- package/dist/types/vendor/random-uint-below/get-random-values.d.ts +0 -2
- package/dist/types/vendor/random-uint-below/index.d.ts +0 -3
- package/dist/types/vendor/random-uint-below/random-choice.d.ts +0 -1
- package/dist/types/vendor/random-uint-below/random53BitValue.d.ts +0 -1
- package/dist/types/vendor/sq12phase/sq1-solver.d.ts +0 -1
- package/dist/types/vendor/three/examples/jsm/libs/stats.modified.module.d.ts +0 -32
- package/dist/types/vendor/unsafe-raw-aes/unsafe-raw-aes.d.ts +0 -3
- package/dist/types/vendor/xyzzy/fto-solver-original.d.ts +0 -148
- package/dist/types/vendor/xyzzy/fto-solver.d.ts +0 -1
- package/dist/types/vendor/xyzzy/kilosolver.d.ts +0 -2
- package/dist/types/vendor/xyzzy/master_tetraminx-solver.d.ts +0 -1
- package/dist/types/vendor/xyzzy/redi_cube.d.ts +0 -2
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/cubing/puzzle-geometry/FaceNameSwizzler.ts", "../../src/cubing/puzzle-geometry/notation-mapping/NullMapper.ts", "../../src/cubing/puzzle-geometry/notation-mapping/FTONotationMapper.ts", "../../src/cubing/puzzle-geometry/notation-mapping/FaceRenamingMapper.ts", "../../src/cubing/puzzle-geometry/notation-mapping/MegaminxScramblingNotationMapper.ts", "../../src/cubing/puzzle-geometry/notation-mapping/NxNxNCubeMapper.ts", "../../src/cubing/puzzle-geometry/notation-mapping/PyraminxNotationMapper.ts", "../../src/cubing/puzzle-geometry/notation-mapping/SkewbNotationMapper.ts", "../../src/cubing/puzzle-geometry/Options.ts", "../../src/cubing/puzzle-geometry/Perm.ts", "../../src/cubing/puzzle-geometry/PermOriSet.ts", "../../src/cubing/puzzle-geometry/PGPuzzles.ts", "../../src/cubing/puzzle-geometry/Quat.ts", "../../src/cubing/puzzle-geometry/PlatonicGenerator.ts", "../../src/cubing/puzzle-geometry/SchreierSims.ts", "../../src/cubing/puzzle-geometry/PuzzleGeometry.ts"],
|
|
4
|
-
"sourcesContent": ["// Manages a set of face names. Detects whether they are prefix-free.\n// Implements greedy splitting into face names and comparisons between\n// concatenated face names and grip names.\n\nexport class FaceNameSwizzler {\n public prefixFree: boolean = true;\n public gripnames: string[] = [];\n constructor(public facenames: string[], gripnames_arg?: string[]) {\n if (gripnames_arg) {\n this.gripnames = gripnames_arg;\n }\n for (let i = 0; this.prefixFree && i < facenames.length; i++) {\n for (let j = 0; this.prefixFree && j < facenames.length; j++) {\n if (i !== j && facenames[i].startsWith(facenames[j])) {\n this.prefixFree = false;\n }\n }\n }\n }\n\n public setGripNames(names: string[]): void {\n this.gripnames = names;\n }\n\n // split a string into face names and return a list of\n // indices.\n public splitByFaceNames(s: string): number[] {\n const r = [];\n let at = 0;\n while (at < s.length) {\n if (at > 0 && at < s.length && s[at] === \"_\") {\n at++;\n }\n let currentMatch = -1;\n for (let i = 0; i < this.facenames.length; i++) {\n if (\n s.substr(at).startsWith(this.facenames[i]) &&\n (currentMatch < 0 ||\n this.facenames[i].length > this.facenames[currentMatch].length)\n ) {\n currentMatch = i;\n }\n }\n if (currentMatch >= 0) {\n r.push(currentMatch);\n at += this.facenames[currentMatch].length;\n } else {\n throw new Error(\"Could not split \" + s + \" into face names.\");\n }\n }\n return r;\n }\n\n // cons a grip from an array of numbers.\n public joinByFaceIndices(list: number[]): string {\n let sep = \"\";\n const r = [];\n for (let i = 0; i < list.length; i++) {\n r.push(sep);\n r.push(this.facenames[list[i]]);\n if (!this.prefixFree) {\n sep = \"_\";\n }\n }\n return r.join(\"\");\n }\n\n /*\n * Try to match something the user gave us with some geometric\n * feature. We used to have strict requirements:\n *\n * a) The set of face names are prefix free\n * b) When specifying a corner, all coincident planes were\n * specified\n *\n * But, to allow megaminx to have more reasonable and\n * conventional names, and to permit shorter canonical\n * names, we are relaxing these requirements and adding\n * new syntax. Now:\n *\n * a) Face names need not be syntax free.\n * b) When parsing a geometric name, we use greedy\n * matching, so the longest name that matches the\n * user string at the current position is the one\n * assumed to match.\n * c) Underscores are permitted to separate face names\n * (both in user input and in geometric\n * descriptions).\n * d) Default names of corner moves where corners have\n * more than three corners, need only include three\n * of the corners.\n *\n * This code is not performance-sensitive so we can do it a\n * slow and simple way.\n */\n public spinmatch(userinput: string, longname: string): boolean {\n // are these the same rotationally?\n if (userinput === longname) {\n return true;\n }\n try {\n const e1 = this.splitByFaceNames(userinput);\n const e2 = this.splitByFaceNames(longname);\n // All elements of userinput need to be in the longname.\n // There should be no duplicate elements in the userinput.\n // if both have length 1 or length 2, the sets must be equal.\n // if both have length 3 or more, then the first set must be\n // a subset of the second. Order doesn't matter.\n if (e1.length !== e2.length && e1.length < 3) {\n return false;\n }\n for (let i = 0; i < e1.length; i++) {\n for (let j = 0; j < i; j++) {\n if (e1[i] === e1[j]) {\n return false;\n }\n }\n let found = false;\n for (let j = 0; j < e2.length; j++) {\n if (e1[i] === e2[j]) {\n found = true;\n break;\n }\n }\n if (!found) {\n return false;\n }\n }\n return true;\n } catch (e) {\n return false;\n }\n }\n\n /* same as above, but permit both to have v's on the end. */\n public spinmatchv(userinput: string, longname: string): boolean {\n if (userinput.endsWith(\"v\") && longname.endsWith(\"v\")) {\n return this.spinmatch(\n userinput.slice(0, userinput.length - 1),\n longname.slice(0, longname.length - 1),\n );\n } else {\n return this.spinmatch(userinput, longname);\n }\n }\n\n public unswizzle(s: string): string {\n if ((s.endsWith(\"v\") || s.endsWith(\"w\")) && s[0] <= \"Z\") {\n s = s.slice(0, s.length - 1);\n }\n const upperCaseGrip = s.toUpperCase();\n for (let i = 0; i < this.gripnames.length; i++) {\n const g = this.gripnames[i];\n if (this.spinmatch(upperCaseGrip, g)) {\n return g;\n }\n }\n return s;\n }\n}\n", "import type { Move } from \"../../alg\";\nimport type { NotationMapper } from \"./NotationMapper\";\n\nexport class NullMapper implements NotationMapper {\n public notationToInternal(move: Move): Move | null {\n return move;\n }\n\n public notationToExternal(move: Move): Move | null {\n return move;\n }\n}\n", "import { Move, QuantumMove } from \"../../alg\";\nimport type { FaceNameSwizzler } from \"../FaceNameSwizzler\";\nimport type { NotationMapper } from \"./NotationMapper\";\n\nexport class FTONotationMapper implements NotationMapper {\n constructor(private child: NotationMapper, private sw: FaceNameSwizzler) {}\n\n public notationToInternal(move: Move): Move | null {\n if (\n move.family === \"T\" &&\n move.innerLayer === undefined &&\n move.outerLayer === undefined\n ) {\n return new Move(\n new QuantumMove(\"FLRv\", move.innerLayer, move.outerLayer),\n move.amount,\n );\n } else {\n const r = this.child.notationToInternal(move);\n return r;\n }\n }\n\n // we never rewrite click moves to these moves.\n public notationToExternal(move: Move): Move | null {\n let fam = move.family;\n if (fam.length > 0 && fam[fam.length - 1] === \"v\") {\n fam = fam.substring(0, fam.length - 1);\n }\n if (this.sw.spinmatch(fam, \"FLUR\")) {\n return new Move(\n new QuantumMove(\"T\", move.innerLayer, move.outerLayer),\n move.amount,\n );\n }\n return this.child.notationToExternal(move);\n }\n}\n", "// face renaming mapper. Accepts two face name remappers. We\n// work between the two.\n\nimport { Move, QuantumMove } from \"../../alg\";\nimport type { FaceNameSwizzler } from \"../FaceNameSwizzler\";\nimport type { NotationMapper } from \"./NotationMapper\";\n\nexport class FaceRenamingMapper implements NotationMapper {\n constructor(\n public internalNames: FaceNameSwizzler,\n public externalNames: FaceNameSwizzler,\n ) {}\n\n // TODO: consider putting a cache in front of this\n public convertString(\n grip: string,\n a: FaceNameSwizzler,\n b: FaceNameSwizzler,\n ): string {\n let suffix = \"\";\n if ((grip.endsWith(\"v\") || grip.endsWith(\"v\")) && grip <= \"_\") {\n suffix = grip.slice(grip.length - 1);\n grip = grip.slice(0, grip.length - 1);\n }\n const upper = grip.toUpperCase();\n let isLowerCase = false;\n if (grip !== upper) {\n isLowerCase = true;\n grip = upper;\n }\n grip = b.joinByFaceIndices(a.splitByFaceNames(grip));\n if (isLowerCase) {\n grip = grip.toLowerCase();\n }\n return grip + suffix;\n }\n\n public convert(move: Move, a: FaceNameSwizzler, b: FaceNameSwizzler): Move {\n const grip = move.family;\n const ngrip = this.convertString(grip, a, b);\n if (grip === ngrip) {\n return move;\n } else {\n return new Move(\n new QuantumMove(ngrip, move.innerLayer, move.outerLayer),\n move.amount,\n );\n }\n }\n\n public notationToInternal(move: Move): Move {\n const r = this.convert(move, this.externalNames, this.internalNames);\n return r;\n }\n\n public notationToExternal(move: Move): Move {\n return this.convert(move, this.internalNames, this.externalNames);\n }\n}\n", "// Sits on top of a (possibly null) notation mapper, and\n\nimport { Move, QuantumMove } from \"../../alg\";\nimport type { NotationMapper } from \"./NotationMapper\";\n\n// adds R++/R--/D++/D-- notation mapping.\nexport class MegaminxScramblingNotationMapper implements NotationMapper {\n constructor(private child: NotationMapper) {}\n\n public notationToInternal(move: Move): Move | null {\n if (move.innerLayer === undefined && move.outerLayer === undefined) {\n if (Math.abs(move.amount) === 1) {\n if (move.family === \"R++\") {\n return new Move(new QuantumMove(\"L\", 3, 2), -2 * move.amount);\n } else if (move.family === \"R--\") {\n return new Move(new QuantumMove(\"L\", 3, 2), 2 * move.amount);\n } else if (move.family === \"D++\") {\n return new Move(new QuantumMove(\"U\", 3, 2), -2 * move.amount);\n } else if (move.family === \"D--\") {\n return new Move(new QuantumMove(\"U\", 3, 2), 2 * move.amount);\n }\n\n // TODO: Figure out if `cubing/alg` should parse `R++` to a family of `R++`.\n if (move.family === \"R_PLUSPLUS_\") {\n return new Move(new QuantumMove(\"L\", 3, 2), -2 * move.amount);\n } else if (move.family === \"D_PLUSPLUS_\") {\n return new Move(new QuantumMove(\"U\", 3, 2), -2 * move.amount);\n }\n }\n if (move.family === \"y\") {\n return new Move(\"Uv\", move.amount);\n }\n }\n return this.child.notationToInternal(move);\n }\n\n // we never rewrite click moves to these moves.\n public notationToExternal(move: Move): Move | null {\n if (move.family === \"Uv\") {\n return new Move(\n new QuantumMove(\"y\", move.innerLayer, move.outerLayer),\n move.amount,\n );\n }\n if (move.family === \"Dv\") {\n return new Move(\"y\", -move.amount);\n }\n return this.child.notationToExternal(move);\n }\n}\n", "import { Move, QuantumMove } from \"../../alg\";\nimport type { NotationMapper } from \"./NotationMapper\";\n\nexport class NxNxNCubeMapper implements NotationMapper {\n constructor(public slices: number) {}\n\n public notationToInternal(move: Move): Move {\n const grip = move.family;\n if (!move.innerLayer && !move.outerLayer) {\n if (grip === \"x\") {\n move = new Move(\"Rv\", move.amount);\n } else if (grip === \"y\") {\n move = new Move(\"Uv\", move.amount);\n } else if (grip === \"z\") {\n move = new Move(\"Fv\", move.amount);\n }\n if ((this.slices & 1) === 1) {\n if (grip === \"E\") {\n move = new Move(\n new QuantumMove(\"D\", (this.slices + 1) / 2),\n move.amount,\n );\n } else if (grip === \"M\") {\n move = new Move(\n new QuantumMove(\"L\", (this.slices + 1) / 2),\n move.amount,\n );\n } else if (grip === \"S\") {\n move = new Move(\n new QuantumMove(\"F\", (this.slices + 1) / 2),\n move.amount,\n );\n }\n }\n if (this.slices > 2) {\n if (grip === \"e\") {\n move = new Move(\n new QuantumMove(\"D\", this.slices - 1, 2),\n move.amount,\n );\n } else if (grip === \"m\") {\n move = new Move(\n new QuantumMove(\"L\", this.slices - 1, 2),\n move.amount,\n );\n } else if (grip === \"s\") {\n move = new Move(\n new QuantumMove(\"F\", this.slices - 1, 2),\n move.amount,\n );\n }\n }\n }\n return move;\n }\n\n // do we want to map slice moves to E/M/S instead of 2U/etc.?\n public notationToExternal(move: Move): Move {\n const grip = move.family;\n if (!move.innerLayer && !move.outerLayer) {\n if (grip === \"Rv\") {\n return new Move(\"x\", move.amount);\n } else if (grip === \"Uv\") {\n return new Move(\"y\", move.amount);\n } else if (grip === \"Fv\") {\n return new Move(\"z\", move.amount);\n } else if (grip === \"Lv\") {\n return new Move(\"x\", -move.amount);\n } else if (grip === \"Dv\") {\n return new Move(\"y\", -move.amount);\n } else if (grip === \"Bv\") {\n return new Move(\"z\", -move.amount);\n }\n }\n return move;\n }\n}\n", "import { Move, QuantumMove } from \"../../alg\";\nimport type { FaceNameSwizzler } from \"../FaceNameSwizzler\";\nimport type { NotationMapper } from \"./NotationMapper\";\n\nconst pyraminxFamilyMap: Record<string, string> = {\n U: \"frl\",\n L: \"fld\",\n R: \"fdr\",\n B: \"dlr\",\n u: \"FRL\",\n l: \"FLD\",\n r: \"FDR\",\n b: \"DLR\",\n Uv: \"FRLv\",\n Lv: \"FLDv\",\n Rv: \"FDRv\",\n Bv: \"DLRv\",\n D: \"D\",\n F: \"F\",\n BL: \"L\",\n BR: \"R\",\n};\nconst tetraminxFamilyMap: Record<string, string> = {\n U: \"FRL\",\n L: \"FLD\",\n R: \"FDR\",\n B: \"DLR\",\n u: \"frl\",\n l: \"fld\",\n r: \"fdr\",\n b: \"dlr\",\n Uv: \"FRLv\",\n Lv: \"FLDv\",\n Rv: \"FDRv\",\n Bv: \"DLRv\",\n D: \"D\",\n F: \"F\",\n BL: \"L\",\n BR: \"R\",\n d: \"d\",\n f: \"f\",\n bl: \"l\",\n br: \"r\",\n};\n\nconst pyraminxFamilyMapWCA: Record<string, string> = {\n U: \"FRL\",\n L: \"FLD\",\n R: \"FDR\",\n B: \"DLR\",\n};\n\nconst pyraminxExternalQuantumY = new QuantumMove(\"y\");\nconst pyraminxInternalQuantumY = new QuantumMove(\"Dv\");\n\nexport class PyraminxNotationMapper implements NotationMapper {\n protected wcaHack: boolean = false;\n map: Record<string, string> = pyraminxFamilyMap;\n\n constructor(private child: FaceNameSwizzler) {}\n\n public notationToInternal(move: Move): Move | null {\n if (this.wcaHack && move.innerLayer === 2 && move.outerLayer === null) {\n const newFamilyWCA = pyraminxFamilyMapWCA[move.family];\n if (newFamilyWCA) {\n return new Move(\n new QuantumMove(newFamilyWCA, move.innerLayer, move.outerLayer),\n move.amount,\n );\n }\n }\n const newFamily = this.map[move.family];\n\n if (newFamily) {\n return new Move(\n new QuantumMove(newFamily, move.innerLayer, move.outerLayer),\n move.amount,\n );\n } else if (pyraminxExternalQuantumY.isIdentical(move.quantum)) {\n return new Move(pyraminxInternalQuantumY, -move.amount);\n } else {\n return null;\n }\n }\n\n // we never rewrite click moves to these moves.\n public notationToExternal(move: Move): Move | null {\n if (this.wcaHack && move.innerLayer === 2 && move.outerLayer === null) {\n for (const [external, internal] of Object.entries(pyraminxFamilyMapWCA)) {\n if (this.child.spinmatch(move.family, internal)) {\n return new Move(\n new QuantumMove(external, move.innerLayer, move.outerLayer),\n move.amount,\n );\n }\n }\n }\n for (const [external, internal] of Object.entries(this.map)) {\n if (this.child.spinmatch(move.family, internal)) {\n return new Move(\n new QuantumMove(external, move.innerLayer, move.outerLayer),\n move.amount,\n );\n }\n }\n if (pyraminxInternalQuantumY.isIdentical(move.quantum)) {\n return new Move(pyraminxExternalQuantumY, -move.amount);\n } else {\n return null;\n }\n }\n}\n\nexport class TetraminxNotationMapper extends PyraminxNotationMapper {\n protected wcaHack: true;\n\n constructor(child: FaceNameSwizzler) {\n super(child);\n this.map = tetraminxFamilyMap;\n }\n}\n", "import { Move, QuantumMove } from \"../../alg\";\nimport type { FaceNameSwizzler } from \"../FaceNameSwizzler\";\nimport type { NotationMapper } from \"./NotationMapper\";\n\nconst skewbFamilyMap: Record<string, string> = {\n U: \"UBL\",\n UL: \"ULF\",\n F: \"UFR\",\n UR: \"URB\",\n B: \"DBL\",\n D: \"DFR\",\n L: \"DLF\",\n R: \"DRB\",\n Uv: \"UBLv\",\n ULv: \"ULFv\",\n Fv: \"UFRv\",\n URv: \"URBv\",\n Bv: \"DBLv\",\n Dv: \"DFRv\",\n Lv: \"DLFv\",\n Rv: \"DRBv\",\n};\n\n// TODO: combine using a similar table.\nconst skewbExternalQuantumX = new QuantumMove(\"x\");\nconst skewbInternalQuantumX = new QuantumMove(\"Rv\");\nconst skewbInternalQuantumXPrime = new QuantumMove(\"Lv\");\nconst skewbExternalQuantumY = new QuantumMove(\"y\");\nconst skewbInternalQuantumY = new QuantumMove(\"Uv\");\nconst skewbInternalQuantumYPrime = new QuantumMove(\"Dv\");\nconst skewbExternalQuantumZ = new QuantumMove(\"z\");\nconst skewbInternalQuantumZ = new QuantumMove(\"Fv\");\nconst skewbInternalQuantumZPrime = new QuantumMove(\"Bv\");\n\nexport class SkewbNotationMapper implements NotationMapper {\n constructor(private child: FaceNameSwizzler) {}\n\n public notationToInternal(move: Move): Move | null {\n if (move.innerLayer || move.outerLayer) {\n return null;\n }\n const newFamily = skewbFamilyMap[move.family];\n if (newFamily) {\n return new Move(\n new QuantumMove(newFamily, move.outerLayer, move.innerLayer),\n move.amount,\n );\n }\n if (skewbExternalQuantumX.isIdentical(move.quantum)) {\n return new Move(skewbInternalQuantumX, move.amount);\n }\n if (skewbExternalQuantumY.isIdentical(move.quantum)) {\n return new Move(skewbInternalQuantumY, move.amount);\n }\n if (skewbExternalQuantumZ.isIdentical(move.quantum)) {\n return new Move(skewbInternalQuantumZ, move.amount);\n }\n return null;\n /*\n * (1) We are not including x/y/z in Skewb; they aren't WCA notation and\n * it's unclear anyone needs them for reconstructions.\n *\n } else if (move.family === \"x\") {\n return new BlockMove(move.outerLayer, move.innerLayer, \"Rv\", move.amount);\n } else if (move.family === \"y\") {\n return new BlockMove(move.outerLayer, move.innerLayer, \"Uv\", move.amount);\n } else if (move.family === \"z\") {\n return new BlockMove(move.outerLayer, move.innerLayer, \"Fv\", move.amount);\n */\n }\n\n // we never rewrite click moves to these moves.\n public notationToExternal(move: Move): Move | null {\n for (const [external, internal] of Object.entries(skewbFamilyMap)) {\n if (this.child.spinmatchv(move.family, internal)) {\n return new Move(\n new QuantumMove(external, move.innerLayer, move.outerLayer),\n move.amount,\n );\n }\n }\n if (skewbInternalQuantumX.isIdentical(move.quantum)) {\n return new Move(skewbExternalQuantumX, move.amount);\n }\n if (skewbInternalQuantumXPrime.isIdentical(move.quantum)) {\n return new Move(skewbExternalQuantumX, -move.amount);\n }\n if (skewbInternalQuantumY.isIdentical(move.quantum)) {\n return new Move(skewbExternalQuantumY, move.amount);\n }\n if (skewbInternalQuantumYPrime.isIdentical(move.quantum)) {\n return new Move(skewbExternalQuantumY, -move.amount);\n }\n if (skewbInternalQuantumZ.isIdentical(move.quantum)) {\n return new Move(skewbExternalQuantumZ, move.amount);\n }\n if (skewbInternalQuantumZPrime.isIdentical(move.quantum)) {\n return new Move(skewbExternalQuantumZ, -move.amount);\n }\n return null;\n /*\n * See (1) above.\n *\n if (move.family === \"Rv\") {\n return new BlockMove(move.outerLayer, move.innerLayer, \"x\", move.amount);\n } else if (move.family === \"Uv\") {\n return new BlockMove(move.outerLayer, move.innerLayer, \"y\", move.amount);\n } else if (move.family === \"Fv\") {\n return new BlockMove(move.outerLayer, move.innerLayer, \"z\", move.amount);\n */\n // } else {\n // return null;\n // }\n }\n}\n", "import { parsePuzzleDescription, PuzzleDescription } from \"./PuzzleGeometry\";\n\nexport function parseOptions(argv: string[]): {\n puzzleDescription: PuzzleDescription | null;\n options: PuzzleGeometryOptions;\n} {\n let argp = 0;\n const options: PuzzleGeometryOptions = {};\n while (argp < argv.length && argv[argp][0] === \"-\") {\n const option = argv[argp++];\n if (option === \"--rotations\") {\n options.addRotations = true;\n } else if (option === \"--allmoves\") {\n options.allMoves = true;\n } else if (option === \"--outerblockmoves\") {\n options.outerBlockMoves = true;\n } else if (option === \"--vertexmoves\") {\n options.vertexMoves = true;\n } else if (option === \"--nocorners\") {\n options.includeCornerOrbits = false;\n } else if (option === \"--noedges\") {\n options.includeEdgeOrbits = false;\n } else if (option === \"--noorientation\") {\n options.fixedOrientation = true;\n } else if (option === \"--nocenters\") {\n options.includeCenterOrbits = false;\n } else if (option === \"--omit\") {\n options.excludeOrbits = argv[argp].split(\",\");\n argp++;\n } else if (option === \"--moves\") {\n options.moveList = argv[argp].split(\",\");\n argp++;\n } else if (option === \"--optimize\") {\n options.optimizeOrbits = true;\n } else if (option === \"--scramble\") {\n options.scrambleAmount = 100;\n } else if (option === \"--fixcorner\") {\n options.fixedPieceType = \"v\";\n } else if (option === \"--fixedge\") {\n options.fixedPieceType = \"e\";\n } else if (option === \"--fixcenter\") {\n options.fixedPieceType = \"f\";\n } else if (option === \"--orientcenters\") {\n options.orientCenters = true;\n } else if (option === \"--puzzleorientation\") {\n options.puzzleOrientation = JSON.parse(argv[argp]); // TODO: Validate input.\n argp++;\n } else {\n throw new Error(\"Bad option: \" + option);\n }\n }\n const puzzleDescription = parsePuzzleDescription(argv.slice(argp).join(\" \"));\n return { puzzleDescription, options };\n}\n\ntype FaceName = string;\ntype OrientationDirection = [number, number, number];\nexport type FaceBasedOrientationDescription = [\n [FaceName, OrientationDirection],\n [FaceName, OrientationDirection],\n];\nexport type BaseFaceCount = 4 | 6 | 8 | 12 | 20;\nexport type FaceBasedOrientationDescriptionLookup = Record<\n BaseFaceCount,\n FaceBasedOrientationDescription\n>;\n\nfunction asstructured(v: any): any {\n if (typeof v === \"string\") {\n return JSON.parse(v);\n }\n return v;\n}\nfunction asboolean(v: any): boolean {\n if (typeof v === \"string\") {\n if (v === \"false\") {\n return false;\n }\n return true;\n } else {\n return v ? true : false;\n }\n}\n\nexport class PuzzleGeometryFullOptions {\n verbosity: number = 0; // verbosity (console.log)\n\n allMoves: boolean = false; // generate all slice moves in ksolve\n outerBlockMoves: boolean; // generate outer block moves\n vertexMoves: boolean = false; // generate vertex moves\n addRotations: boolean = false; // add symmetry information to ksolve output\n moveList: string[] | null = null; // move list to generate\n\n fixedOrientation: boolean = false; // eliminate any orientations\n fixedPieceType: null | \"e\" | \"v\" | \"f\" = null; // fix a piece?\n orientCenters: boolean = false; // orient centers?\n\n // TODO: Group these into a single object?\n includeCornerOrbits: boolean = true; // include corner orbits\n includeCenterOrbits: boolean = true; // include center orbits\n includeEdgeOrbits: boolean = true; // include edge orbits\n // Overrides the previous options.\n excludeOrbits: string[] = []; // exclude these orbits\n optimizeOrbits: boolean = false; // optimize PermOri\n\n grayCorners: boolean = false; // make corner sets gray\n grayCenters: boolean = false; // make center sets gray\n grayEdges: boolean = false; // make edge sets gray\n\n puzzleOrientation: FaceBasedOrientationDescription | null = null; // single puzzle orientation from options\n puzzleOrientations: FaceBasedOrientationDescriptionLookup | null = null; // puzzle orientation override object from options // TODO: is this needed?\n\n scrambleAmount: number = 0; // scramble?\n\n constructor(options: PuzzleGeometryOptions = {}) {\n Object.assign(this, options);\n }\n}\n\nexport type PuzzleGeometryOptions = Partial<PuzzleGeometryFullOptions>;\n\nexport function parsePGOptionList(optionlist?: any[]): PuzzleGeometryOptions {\n const options: PuzzleGeometryOptions = {};\n if (optionlist !== undefined) {\n if (optionlist.length % 2 !== 0) {\n throw new Error(\"Odd length in option list?\");\n }\n for (let i = 0; i < optionlist.length; i += 2) {\n if (optionlist[i] === \"verbose\") {\n options.verbosity = (options.verbosity ?? 0) + 1;\n } else if (optionlist[i] === \"quiet\") {\n options.verbosity = 0;\n } else if (optionlist[i] === \"allmoves\") {\n options.allMoves = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"outerblockmoves\") {\n options.outerBlockMoves = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"vertexmoves\") {\n options.vertexMoves = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"rotations\") {\n options.addRotations = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"cornersets\") {\n options.includeCornerOrbits = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"centersets\") {\n options.includeCenterOrbits = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"edgesets\") {\n options.includeEdgeOrbits = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"omit\") {\n options.excludeOrbits = optionlist[i + 1];\n } else if (optionlist[i] === \"graycorners\") {\n options.grayCorners = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"graycenters\") {\n options.grayCenters = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"grayedges\") {\n options.grayEdges = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"movelist\") {\n options.moveList = asstructured(optionlist[i + 1]);\n } else if (optionlist[i] === \"killorientation\") {\n options.fixedOrientation = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"optimize\") {\n options.optimizeOrbits = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"scramble\") {\n options.scrambleAmount = optionlist[i + 1];\n } else if (optionlist[i] === \"fix\") {\n options.fixedPieceType = optionlist[i + 1];\n } else if (optionlist[i] === \"orientcenters\") {\n options.orientCenters = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"puzzleorientation\") {\n options.puzzleOrientation = asstructured(optionlist[i + 1]);\n } else if (optionlist[i] === \"puzzleorientations\") {\n options.puzzleOrientations = asstructured(optionlist[i + 1]);\n } else {\n throw new Error(\n \"Bad option while processing option list \" + optionlist[i],\n );\n }\n }\n }\n return options;\n}\n", "const zeroCache: number[][] = [];\nconst iotaCache: number[][] = [];\n\nexport function zeros(n: number): number[] {\n if (!zeroCache[n]) {\n const c = Array(n);\n for (let i = 0; i < n; i++) {\n c[i] = 0;\n }\n zeroCache[n] = c;\n }\n return zeroCache[n];\n}\n\nexport function iota(n: number): number[] {\n if (!iotaCache[n]) {\n const c = Array(n);\n for (let i = 0; i < n; i++) {\n c[i] = i;\n }\n iotaCache[n] = c;\n }\n return iotaCache[n];\n}\n\nexport function identity(n: number): Perm {\n return new Perm(iota(n));\n}\n\nexport function random(n: number): Perm {\n // random\n const c = Array(n);\n for (let i = 0; i < n; i++) {\n c[i] = i;\n }\n for (let i = 0; i < n; i++) {\n const j = i + Math.floor((n - i) * Math.random());\n const t = c[i];\n c[i] = c[j];\n c[j] = t;\n }\n return new Perm(c);\n}\n\nexport function factorial(a: number): number {\n let r = 1;\n while (a > 1) {\n r *= a;\n a--;\n }\n return r;\n}\n\nfunction gcd(a: number, b: number): number {\n if (a > b) {\n const t = a;\n a = b;\n b = t;\n }\n while (a > 0) {\n const m = b % a;\n b = a;\n a = m;\n }\n return b;\n}\n\nexport function lcm(a: number, b: number): number {\n return (a / gcd(a, b)) * b;\n}\n\nexport class Perm {\n public n: number; // length\n public p: number[]; // The permutation itself\n constructor(a: number[]) {\n this.n = a.length;\n this.p = a;\n }\n\n public toString(): string {\n // stringify\n return \"Perm[\" + this.p.join(\" \") + \"]\";\n }\n\n public mul(p2: Perm): Perm {\n // multiply\n const c: number[] = Array(this.n);\n for (let i = 0; i < this.n; i++) {\n c[i] = p2.p[this.p[i]];\n }\n return new Perm(c);\n }\n\n public rmul(p2: Perm): Perm {\n // multiply the other way\n const c = Array(this.n);\n for (let i = 0; i < this.n; i++) {\n c[i] = this.p[p2.p[i]];\n }\n return new Perm(c);\n }\n\n public inv(): Perm {\n const c = Array(this.n);\n for (let i = 0; i < this.n; i++) {\n c[this.p[i]] = i;\n }\n return new Perm(c);\n }\n\n public compareTo(p2: Perm): number {\n // comparison\n for (let i = 0; i < this.n; i++) {\n if (this.p[i] !== p2.p[i]) {\n return this.p[i] - p2.p[i];\n }\n }\n return 0;\n }\n\n public toGap(): string {\n const cyc = new Array<string>();\n const seen = new Array<boolean>(this.n);\n for (let i = 0; i < this.p.length; i++) {\n if (seen[i] || this.p[i] === i) {\n continue;\n }\n const incyc = new Array<number>();\n for (let j = i; !seen[j]; j = this.p[j]) {\n incyc.push(1 + j);\n seen[j] = true;\n }\n cyc.push(\"(\" + incyc.join(\",\") + \")\");\n }\n return cyc.join(\"\");\n }\n\n public order(): number {\n let r = 1;\n const seen = new Array<boolean>(this.n);\n for (let i = 0; i < this.p.length; i++) {\n if (seen[i] || this.p[i] === i) {\n continue;\n }\n let cs = 0;\n for (let j = i; !seen[j]; j = this.p[j]) {\n cs++;\n seen[j] = true;\n }\n r = lcm(r, cs);\n }\n return r;\n }\n}\n", "import { Move } from \"../alg\";\nimport type { KPuzzleDefinition, KTransformationData } from \"../kpuzzle\"; // TODO\nimport { NullMapper } from \"./notation-mapping\";\nimport type { NotationMapper } from \"./notation-mapping/NotationMapper\";\n/* tslint:disable no-bitwise */\n/* tslint:disable prefer-for-of */ import {\n factorial,\n iota,\n lcm,\n Perm,\n zeros,\n} from \"./Perm\";\nexport class PGOrbitDef {\n constructor(public size: number, public mod: number) {}\n public reassemblySize(): number {\n return factorial(this.size) * Math.pow(this.mod, this.size);\n }\n}\n\nlet lastGlobalDefinitionCounter = 0;\n\nexport function externalName(\n mapper: NotationMapper,\n moveString: string,\n): string {\n const mv = Move.fromString(moveString);\n const mv2 = mapper.notationToExternal(mv);\n if (mv2 === null || mv === mv2) {\n return moveString;\n }\n return mv2.toString();\n}\n\nexport class PGOrbitsDef {\n constructor(\n public orbitnames: string[],\n private orbitdefs: PGOrbitDef[],\n public solved: VisibleState,\n public movenames: string[],\n public moveops: PGTransform[],\n ) {}\n\n public transformToKTransformationData(t: PGTransform): KTransformationData {\n const mp: { [orbitName: string]: any } = {};\n for (let j = 0; j < this.orbitnames.length; j++) {\n mp[this.orbitnames[j]] = t.orbits[j].toKPuzzle();\n }\n return mp;\n }\n\n public static transformToKTransformationData(\n orbitnames: string[],\n t: PGTransform,\n ): KTransformationData {\n const mp: { [orbitName: string]: any } = {};\n for (let j = 0; j < orbitnames.length; j++) {\n mp[orbitnames[j]] = t.orbits[j].toKPuzzle();\n }\n return mp;\n }\n\n public toKsolve(\n name: string,\n mapper: NotationMapper = new NullMapper(),\n ): string[] {\n const result = [];\n result.push(\"Name \" + name);\n result.push(\"\");\n for (let i = 0; i < this.orbitnames.length; i++) {\n result.push(\n `Set ${this.orbitnames[i]} ${this.orbitdefs[i].size} ${this.orbitdefs[i].mod}`,\n );\n }\n result.push(\"\");\n result.push(\"Solved\");\n for (let i = 0; i < this.orbitnames.length; i++) {\n this.solved.orbits[i].appendDefinition(\n result,\n this.orbitnames[i],\n false,\n false,\n );\n }\n result.push(\"End\");\n for (let i = 0; i < this.movenames.length; i++) {\n result.push(\"\");\n let name = externalName(mapper, this.movenames[i]);\n let doinv = false;\n if (name[name.length - 1] === \"'\") {\n doinv = true;\n name = name.substring(0, name.length - 1);\n }\n result.push(\"Move \" + name);\n for (let j = 0; j < this.orbitnames.length; j++) {\n if (doinv) {\n this.moveops[i].orbits[j]\n .inv()\n .appendDefinition(result, this.orbitnames[j], true);\n } else {\n this.moveops[i].orbits[j].appendDefinition(\n result,\n this.orbitnames[j],\n true,\n );\n }\n }\n result.push(\"End\");\n }\n // extra blank line on end lets us use join(\"\\n\") to terminate all\n return result;\n }\n\n // TODO: return type.\n public toKPuzzleDefinition(includemoves: boolean): KPuzzleDefinition {\n const orbits: KPuzzleDefinition[\"orbits\"] = {};\n const start: KPuzzleDefinition[\"startStateData\"] = {};\n for (let i = 0; i < this.orbitnames.length; i++) {\n orbits[this.orbitnames[i]] = {\n numPieces: this.orbitdefs[i].size,\n numOrientations: this.orbitdefs[i].mod,\n };\n const startTransformation = this.solved.orbits[i].toKPuzzle();\n start[this.orbitnames[i]] = {\n pieces: startTransformation.permutation,\n orientation: startTransformation.orientation,\n };\n }\n const moves: { [moveName: string]: any } = {};\n if (includemoves) {\n for (let i = 0; i < this.movenames.length; i++) {\n moves[this.movenames[i]] = this.transformToKTransformationData(\n this.moveops[i],\n );\n }\n }\n return {\n name: `PG3D #${++lastGlobalDefinitionCounter}`,\n orbits,\n startStateData: start,\n moves,\n };\n }\n\n public optimize(): PGOrbitsDef {\n const neworbitnames: string[] = [];\n const neworbitdefs: PGOrbitDef[] = [];\n const newsolved: PGOrbit[] = [];\n const newmoveops: PGOrbit[][] = [];\n for (let j = 0; j < this.moveops.length; j++) {\n newmoveops.push([]);\n }\n for (let i = 0; i < this.orbitdefs.length; i++) {\n const om = this.orbitdefs[i].mod;\n const n = this.orbitdefs[i].size;\n const du = new DisjointUnion(n);\n const changed = new Array<boolean>(this.orbitdefs[i].size);\n for (let k = 0; k < n; k++) {\n changed[k] = false;\n }\n for (let j = 0; j < this.moveops.length; j++) {\n for (let k = 0; k < n; k++) {\n if (\n this.moveops[j].orbits[i].perm[k] !== k ||\n this.moveops[j].orbits[i].ori[k] !== 0\n ) {\n changed[k] = true;\n du.union(k, this.moveops[j].orbits[i].perm[k]);\n }\n }\n }\n let keepori = true;\n // right now we kill ori only if solved is unique and\n // if we can kill it completely. This is not all the optimization\n // we can perform.\n if (om > 1) {\n keepori = false;\n const duo = new DisjointUnion(this.orbitdefs[i].size * om);\n for (let j = 0; j < this.moveops.length; j++) {\n for (let k = 0; k < n; k++) {\n if (\n this.moveops[j].orbits[i].perm[k] !== k ||\n this.moveops[j].orbits[i].ori[k] !== 0\n ) {\n for (let o = 0; o < om; o++) {\n duo.union(\n k * om + o,\n this.moveops[j].orbits[i].perm[k] * om +\n ((o + this.moveops[j].orbits[i].ori[k]) % om),\n );\n }\n }\n }\n }\n for (let j = 0; !keepori && j < n; j++) {\n for (let o = 1; o < om; o++) {\n if (duo.find(j * om) === duo.find(j * om + o)) {\n keepori = true;\n }\n }\n }\n for (let j = 0; !keepori && j < n; j++) {\n for (let k = 0; k < j; k++) {\n if (\n this.solved.orbits[i].perm[j] === this.solved.orbits[i].perm[k]\n ) {\n keepori = true;\n }\n }\n }\n }\n // is there just one result set, or more than one?\n let nontriv = -1;\n let multiple = false;\n for (let j = 0; j < this.orbitdefs[i].size; j++) {\n if (changed[j]) {\n const h = du.find(j);\n if (nontriv < 0) {\n nontriv = h;\n } else if (nontriv !== h) {\n multiple = true;\n }\n }\n }\n for (let j = 0; j < this.orbitdefs[i].size; j++) {\n if (!changed[j]) {\n continue;\n }\n const h = du.find(j);\n if (h !== j) {\n continue;\n }\n const no: number[] = [];\n const on: number[] = [];\n let nv = 0;\n for (let k = 0; k < this.orbitdefs[i].size; k++) {\n if (du.find(k) === j) {\n no[nv] = k;\n on[k] = nv;\n nv++;\n }\n }\n if (multiple) {\n neworbitnames.push(`${this.orbitnames[i]}_p${j}`);\n } else {\n neworbitnames.push(this.orbitnames[i]);\n }\n if (keepori) {\n neworbitdefs.push(new PGOrbitDef(nv, this.orbitdefs[i].mod));\n newsolved.push(this.solved.orbits[i].remapVS(no, nv));\n for (let k = 0; k < this.moveops.length; k++) {\n newmoveops[k].push(this.moveops[k].orbits[i].remap(no, on, nv));\n }\n } else {\n neworbitdefs.push(new PGOrbitDef(nv, 1));\n newsolved.push(this.solved.orbits[i].remapVS(no, nv).killOri());\n for (let k = 0; k < this.moveops.length; k++) {\n newmoveops[k].push(\n this.moveops[k].orbits[i].remap(no, on, nv).killOri(),\n );\n }\n }\n }\n }\n return new PGOrbitsDef(\n neworbitnames,\n neworbitdefs,\n new VisibleState(newsolved),\n this.movenames,\n newmoveops.map((_) => new PGTransform(_)),\n );\n }\n\n // replace the solved state with a new scrambled state.\n public scramble(n: number): void {\n this.solved = this.solved.mul(this.getScrambleTransformation(n));\n }\n\n // generate a new \"random\" position based on an entropy pool\n // this should be significantly faster and more random than just\n // doing a large number of random moves, especially on big puzzles.\n public getScrambleTransformation(n: number): PGTransform {\n // don't let n be too tiny\n if (n < 100) {\n n = 100;\n }\n const pool: PGTransform[] = [];\n for (let i = 0; i < this.moveops.length; i++) {\n pool[i] = this.moveops[i];\n }\n for (let i = 0; i < pool.length; i++) {\n const j = Math.floor(Math.random() * pool.length);\n const t = pool[i];\n pool[i] = pool[j];\n pool[j] = t;\n }\n if (n < pool.length) {\n n = pool.length;\n }\n for (let i = 0; i < n; i++) {\n const ri = Math.floor(Math.random() * pool.length);\n const rj = Math.floor(Math.random() * pool.length);\n const rm = Math.floor(Math.random() * this.moveops.length);\n pool[ri] = pool[ri].mul(pool[rj]).mul(this.moveops[rm]);\n if (Math.random() < 0.1) {\n // break up parity\n pool[ri] = pool[ri].mul(this.moveops[rm]);\n }\n }\n let s = pool[0];\n for (let i = 1; i < pool.length; i++) {\n s = s.mul(pool[i]);\n }\n return s;\n }\n\n public reassemblySize(): number {\n let n = 1;\n for (let i = 0; i < this.orbitdefs.length; i++) {\n n *= this.orbitdefs[i].reassemblySize();\n }\n return n;\n }\n}\n\nexport class PGOrbit {\n private static kcache: Record<string, number[]>[] = [];\n\n public static e(n: number, mod: number): PGOrbit {\n return new PGOrbit(iota(n), zeros(n), mod);\n }\n\n constructor(\n public perm: number[],\n public ori: number[],\n public orimod: number,\n ) {}\n\n public mul(b: PGOrbit): PGOrbit {\n const n = this.perm.length;\n const newPerm = new Array<number>(n);\n if (this.orimod === 1) {\n for (let i = 0; i < n; i++) {\n newPerm[i] = this.perm[b.perm[i]];\n }\n return new PGOrbit(newPerm, this.ori, this.orimod);\n } else {\n const newOri = new Array<number>(n);\n for (let i = 0; i < n; i++) {\n newPerm[i] = this.perm[b.perm[i]];\n newOri[i] = (this.ori[b.perm[i]] + b.ori[i]) % this.orimod;\n }\n return new PGOrbit(newPerm, newOri, this.orimod);\n }\n }\n\n public inv(): PGOrbit {\n const n = this.perm.length;\n const newPerm = new Array<number>(n);\n const newOri = new Array<number>(n);\n for (let i = 0; i < n; i++) {\n newPerm[this.perm[i]] = i;\n newOri[this.perm[i]] = (this.orimod - this.ori[i]) % this.orimod;\n }\n return new PGOrbit(newPerm, newOri, this.orimod);\n }\n\n public equal(b: PGOrbit): boolean {\n const n = this.perm.length;\n for (let i = 0; i < n; i++) {\n if (this.perm[i] !== b.perm[i] || this.ori[i] !== b.ori[i]) {\n return false;\n }\n }\n return true;\n }\n\n // in-place mutator\n public killOri(): this {\n const n = this.perm.length;\n for (let i = 0; i < n; i++) {\n this.ori[i] = 0;\n }\n this.orimod = 1;\n return this;\n }\n\n public toPerm(): Perm {\n const o = this.orimod;\n if (o === 1) {\n return new Perm(this.perm);\n }\n const n = this.perm.length;\n const newPerm = new Array<number>(n * o);\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < o; j++) {\n newPerm[i * o + j] = o * this.perm[i] + ((this.ori[i] + j) % o);\n }\n }\n return new Perm(newPerm);\n }\n\n // returns tuple of sets of identical pieces in this orbit\n public identicalPieces(): number[][] {\n const done: boolean[] = [];\n const n = this.perm.length;\n const r: number[][] = [];\n for (let i = 0; i < n; i++) {\n const v = this.perm[i];\n if (done[v] === undefined) {\n const s: number[] = [i];\n done[v] = true;\n for (let j = i + 1; j < n; j++) {\n if (this.perm[j] === v) {\n s.push(j);\n }\n }\n r.push(s);\n }\n }\n return r;\n }\n\n public order(): number {\n // can be made more efficient\n return this.toPerm().order();\n }\n\n public isIdentity(): boolean {\n const n = this.perm.length;\n if (this.perm === iota(n) && this.ori === zeros(n)) {\n return true;\n }\n for (let i = 0; i < n; i++) {\n if (this.perm[i] !== i || this.ori[i] !== 0) {\n return false;\n }\n }\n return true;\n }\n\n private zeroOris(): boolean {\n const n = this.perm.length;\n if (this.ori === zeros(n)) {\n return true;\n }\n for (let i = 0; i < n; i++) {\n if (this.ori[i] !== 0) {\n return false;\n }\n }\n return true;\n }\n\n public remap(no: number[], on: number[], nv: number): PGOrbit {\n const newPerm = new Array<number>(nv);\n const newOri = new Array<number>(nv);\n for (let i = 0; i < nv; i++) {\n newPerm[i] = on[this.perm[no[i]]];\n newOri[i] = this.ori[no[i]];\n }\n return new PGOrbit(newPerm, newOri, this.orimod);\n }\n\n public remapVS(no: number[], nv: number): PGOrbit {\n const newPerm = new Array<number>(nv);\n const newOri = new Array<number>(nv);\n let nextNew = 0;\n const reassign = [];\n for (let i = 0; i < nv; i++) {\n const ov = this.perm[no[i]];\n if (reassign[ov] === undefined) {\n reassign[ov] = nextNew++;\n }\n newPerm[i] = reassign[ov];\n newOri[i] = this.ori[no[i]];\n }\n return new PGOrbit(newPerm, newOri, this.orimod);\n }\n\n public appendDefinition(\n result: string[],\n name: string,\n useVS: boolean,\n concise: boolean = true,\n ): void {\n if (concise && this.isIdentity()) {\n return;\n }\n result.push(name);\n result.push(this.perm.map((_: number) => _ + 1).join(\" \"));\n if (!this.zeroOris()) {\n if (useVS) {\n const newori = new Array<number>(this.ori.length);\n for (let i = 0; i < newori.length; i++) {\n newori[this.perm[i]] = this.ori[i];\n }\n result.push(newori.join(\" \"));\n } else {\n result.push(this.ori.join(\" \"));\n }\n }\n }\n\n // TODO: return type\n public toKPuzzle(): Record<string, number[]> {\n const n = this.perm.length;\n if (this.isIdentity()) {\n if (!PGOrbit.kcache[n]) {\n PGOrbit.kcache[n] = { permutation: iota(n), orientation: zeros(n) };\n }\n return PGOrbit.kcache[n];\n } else {\n return { permutation: this.perm, orientation: this.ori };\n }\n }\n}\nexport class PGTransformBase {\n constructor(public orbits: PGOrbit[]) {}\n public internalMul(b: PGTransformBase): PGOrbit[] {\n const newOrbits: PGOrbit[] = [];\n for (let i = 0; i < this.orbits.length; i++) {\n newOrbits.push(this.orbits[i].mul(b.orbits[i]));\n }\n return newOrbits;\n }\n\n protected internalInv(): PGOrbit[] {\n const newOrbits: PGOrbit[] = [];\n for (const orbit of this.orbits) {\n newOrbits.push(orbit.inv());\n }\n return newOrbits;\n }\n\n public equal(b: PGTransformBase): boolean {\n for (let i = 0; i < this.orbits.length; i++) {\n if (!this.orbits[i].equal(b.orbits[i])) {\n return false;\n }\n }\n return true;\n }\n\n protected killOri(): this {\n for (const orbit of this.orbits) {\n orbit.killOri();\n }\n return this;\n }\n\n public toPerm(): Perm {\n const perms = new Array<Perm>();\n let n = 0;\n for (const orbit of this.orbits) {\n const p = orbit.toPerm();\n perms.push(p);\n n += p.n;\n }\n const newPerm = new Array<number>(n);\n n = 0;\n for (const p of perms) {\n for (let j = 0; j < p.n; j++) {\n newPerm[n + j] = n + p.p[j];\n }\n n += p.n;\n }\n return new Perm(newPerm);\n }\n\n public identicalPieces(): number[][] {\n const r: number[][] = [];\n let n = 0;\n for (const orbit of this.orbits) {\n const o = orbit.orimod;\n const s = orbit.identicalPieces();\n for (let j = 0; j < s.length; j++) {\n r.push(s[j].map((_) => _ * o + n));\n }\n n += o * orbit.perm.length;\n }\n return r;\n }\n\n public order(): number {\n let r = 1;\n for (const orbit of this.orbits) {\n r = lcm(r, orbit.order());\n }\n return r;\n }\n}\nexport class PGTransform extends PGTransformBase {\n constructor(orbits: PGOrbit[]) {\n super(orbits);\n }\n\n public mul(b: PGTransform): PGTransform {\n return new PGTransform(this.internalMul(b));\n }\n\n public mulScalar(n: number): PGTransform {\n if (n === 0) {\n return this.e();\n }\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let t: PGTransform = this;\n if (n < 0) {\n t = t.inv();\n n = -n;\n }\n while ((n & 1) === 0) {\n t = t.mul(t);\n n >>= 1;\n }\n if (n === 1) {\n return t;\n }\n let s = t;\n let r = this.e();\n while (n > 0) {\n if (n & 1) {\n r = r.mul(s);\n }\n if (n > 1) {\n s = s.mul(s);\n }\n n >>= 1;\n }\n return r;\n }\n\n public inv(): PGTransform {\n return new PGTransform(this.internalInv());\n }\n\n public e(): PGTransform {\n return new PGTransform(\n this.orbits.map((_: PGOrbit) => PGOrbit.e(_.perm.length, _.orimod)),\n );\n }\n}\nexport class VisibleState extends PGTransformBase {\n constructor(orbits: PGOrbit[]) {\n super(orbits);\n }\n\n public mul(b: PGTransform): VisibleState {\n return new VisibleState(this.internalMul(b));\n }\n}\n// Disjoint set union implementation.\nclass DisjointUnion {\n private heads: number[];\n constructor(public n: number) {\n this.heads = new Array<number>(n);\n for (let i = 0; i < n; i++) {\n this.heads[i] = i;\n }\n }\n\n public find(v: number): number {\n let h = this.heads[v];\n if (this.heads[h] === h) {\n return h;\n }\n h = this.find(this.heads[h]);\n this.heads[v] = h;\n return h;\n }\n\n public union(a: number, b: number): void {\n const ah = this.find(a);\n const bh = this.find(b);\n if (ah < bh) {\n this.heads[bh] = ah;\n } else if (ah > bh) {\n this.heads[ah] = bh;\n }\n }\n}\nexport function showcanon(g: PGOrbitsDef, disp: (s: string) => void): void {\n // show information for canonical move derivation\n const n = g.moveops.length;\n if (n > 30) {\n throw new Error(\"Canon info too big for bitmask\");\n }\n const orders = [];\n const commutes = [];\n for (let i = 0; i < n; i++) {\n const permA = g.moveops[i];\n orders.push(permA.order());\n let bits = 0;\n for (let j = 0; j < n; j++) {\n if (j === i) {\n continue;\n }\n const permB = g.moveops[j];\n if (permA.mul(permB).equal(permB.mul(permA))) {\n bits |= 1 << j;\n }\n }\n commutes.push(bits);\n }\n let curlev: any = {};\n curlev[0] = 1;\n for (let d = 0; d < 100; d++) {\n let sum = 0;\n const nextlev: any = {};\n let uniq = 0;\n for (const sti in curlev) {\n const st = +sti; // string to number\n const cnt = curlev[st];\n sum += cnt;\n uniq++;\n for (let mv = 0; mv < orders.length; mv++) {\n if (\n ((st >> mv) & 1) === 0 &&\n (st & commutes[mv] & ((1 << mv) - 1)) === 0\n ) {\n const nst = (st & commutes[mv]) | (1 << mv);\n if (nextlev[nst] === undefined) {\n nextlev[nst] = 0;\n }\n nextlev[nst] += (orders[mv] - 1) * cnt;\n }\n }\n }\n disp(`${d}: canonseq ${sum} states ${uniq}`);\n curlev = nextlev;\n }\n}\n// This is a less effective canonicalization (that happens to work fine\n// for the 3x3x3). We include this only for comparison.\nexport function showcanon0(g: PGOrbitsDef, disp: (s: string) => void): void {\n // show information for canonical move derivation\n const n = g.moveops.length;\n if (n > 30) {\n throw new Error(\"Canon info too big for bitmask\");\n }\n const orders = [];\n const commutes = [];\n for (let i = 0; i < n; i++) {\n const permA = g.moveops[i];\n orders.push(permA.order());\n let bits = 0;\n for (let j = 0; j < n; j++) {\n if (j === i) {\n continue;\n }\n const permB = g.moveops[j];\n if (permA.mul(permB).equal(permB.mul(permA))) {\n bits |= 1 << j;\n }\n }\n commutes.push(bits);\n }\n let curlev: any = {};\n disp(\"0: canonseq 1\");\n for (let x = 0; x < orders.length; x++) {\n curlev[x] = orders[x] - 1;\n }\n for (let d = 1; d < 100; d++) {\n let sum = 0;\n const nextlev: any = {};\n let uniq = 0;\n for (const sti in curlev) {\n const st = +sti; // string to number\n const cnt = curlev[st];\n sum += cnt;\n uniq++;\n for (let mv = 0; mv < orders.length; mv++) {\n if (mv === st || (commutes[mv] & (1 << st) && mv < st)) {\n continue;\n }\n if (nextlev[mv] === undefined) {\n nextlev[mv] = 0;\n }\n nextlev[mv] += (orders[mv] - 1) * cnt;\n }\n }\n disp(`${d}\": canonseq ${sum} states ${uniq}`);\n curlev = nextlev;\n }\n}\n", "export type PuzzleDescriptionString = string;\n\nexport const PGPuzzles: { [name: string]: PuzzleDescriptionString } = {\n \"2x2x2\": \"c f 0\",\n \"3x3x3\": \"c f 0.333333333333333\",\n \"4x4x4\": \"c f 0.5 f 0\",\n \"5x5x5\": \"c f 0.6 f 0.2\",\n \"6x6x6\": \"c f 0.666666666666667 f 0.333333333333333 f 0\",\n \"7x7x7\": \"c f 0.714285714285714 f 0.428571428571429 f 0.142857142857143\",\n \"8x8x8\": \"c f 0.75 f 0.5 f 0.25 f 0\",\n \"9x9x9\":\n \"c f 0.777777777777778 f 0.555555555555556 f 0.333333333333333 f 0.111111111111111\",\n \"10x10x10\": \"c f 0.8 f 0.6 f 0.4 f 0.2 f 0\",\n \"11x11x11\":\n \"c f 0.818181818181818 f 0.636363636363636 f 0.454545454545455 f 0.272727272727273 f 0.0909090909090909\",\n \"12x12x12\":\n \"c f 0.833333333333333 f 0.666666666666667 f 0.5 f 0.333333333333333 f 0.166666666666667 f 0\",\n \"13x13x13\":\n \"c f 0.846153846153846 f 0.692307692307692 f 0.538461538461538 f 0.384615384615385 f 0.230769230769231 f 0.0769230769230769\",\n \"20x20x20\": \"c f 0 f .1 f .2 f .3 f .4 f .5 f .6 f .7 f .8 f .9\",\n \"30x30x30\":\n \"c f 0 f .066667 f .133333 f .2 f .266667 f .333333 f .4 f .466667 f .533333 f .6 f .666667 f .733333 f .8 f .866667 f .933333\",\n \"40x40x40\":\n \"c f 0 f .05 f .1 f .15 f .2 f .25 f .3 f .35 f .4 f .45 f .5 f .55 f .6 f .65 f .7 f .75 f .8 f .85 f .9 f .95\",\n \"skewb\": \"c v 0\",\n \"master skewb\": \"c v 0.275\",\n \"professor skewb\": \"c v 0 v 0.38\",\n \"compy cube\": \"c v 0.915641442663986\",\n \"helicopter\": \"c e 0.707106781186547\",\n \"curvy copter\": \"c e 0.83\",\n \"dino\": \"c v 0.577350269189626\",\n \"little chop\": \"c e 0\",\n \"pyramorphix\": \"t e 0\",\n \"mastermorphix\": \"t e 0.346184634065199\",\n \"pyraminx\": \"t v 0.333333333333333 v 1.66666666666667\",\n \"tetraminx\": \"t v 0.333333333333333\",\n \"master pyraminx\": \"t v 0 v 1 v 2\",\n \"master tetraminx\": \"t v 0 v 1\",\n \"professor pyraminx\": \"t v -0.2 v 0.6 v 1.4 v 2.2\",\n \"professor tetraminx\": \"t v -0.2 v 0.6 v 1.4\",\n \"Jing pyraminx\": \"t f 0\",\n \"master pyramorphix\": \"t e 0.866025403784437\",\n \"megaminx\": \"d f 0.7\",\n \"gigaminx\": \"d f 0.64 f 0.82\",\n \"teraminx\": \"d f 0.64 f 0.76 f 0.88\",\n \"petaminx\": \"d f 0.64 f 0.73 f 0.82 f 0.91\",\n \"examinx\": \"d f 0.64 f 0.712 f 0.784 f 0.856 f 0.928\",\n \"zetaminx\": \"d f 0.64 f 0.7 f 0.76 f 0.82 f 0.88 f 0.94\",\n \"yottaminx\": \"d f 0.64 f 0.6914 f 0.7429 f 0.7943 f 0.8457 f 0.8971 f 0.9486\",\n \"pentultimate\": \"d f 0\",\n \"master pentultimate\": \"d f 0.1\",\n \"elite pentultimate\": \"d f 0 f 0.145905\",\n // exact value for starminx is sqrt(5(5-2 sqrt(5))/3)\n \"starminx\": \"d v 0.937962370425399\",\n \"starminx 2\": \"d f 0.23606797749979\",\n \"pyraminx crystal\": \"d f 0.447213595499989\",\n \"chopasaurus\": \"d v 0\",\n \"big chop\": \"d e 0\",\n \"skewb diamond\": \"o f 0\",\n \"FTO\": \"o f 0.333333333333333\",\n \"master FTO\": \"o f 0.5 f 0\",\n \"Christopher's jewel\": \"o v 0.577350269189626\",\n \"octastar\": \"o e 0\",\n \"Trajber's octahedron\": \"o v 0.433012701892219\",\n \"radio chop\": \"i f 0\",\n \"icosamate\": \"i v 0\",\n \"icosahedron 2\": \"i v 0.18759247376021\",\n \"icosahedron 3\": \"i v 0.18759247376021 e 0\",\n \"icosahedron static faces\": \"i v 0.84\",\n \"icosahedron moving faces\": \"i v 0.73\",\n \"Eitan's star\": \"i f 0.61803398874989\",\n \"2x2x2 + dino\": \"c f 0 v 0.577350269189626\",\n \"2x2x2 + little chop\": \"c f 0 e 0\",\n \"dino + little chop\": \"c v 0.577350269189626 e 0\",\n \"2x2x2 + dino + little chop\": \"c f 0 v 0.577350269189626 e 0\",\n \"megaminx + chopasaurus\": \"d f 0.61803398875 v 0\",\n \"starminx combo\": \"d f 0.23606797749979 v 0.937962370425399\",\n};\n\nexport type PuzzleName = keyof typeof PGPuzzles;\n", "/* tslint:disable no-bitwise */\n/* tslint:disable prefer-for-of */ // TODO\n\n// We need a quaternion class. We use this to represent rotations,\n// planes, and points.\n\nconst eps = 1e-9; // TODO: Deduplicate with `PuzzleGeometry`?\n\nexport function centermassface(face: Quat[]): Quat {\n // calculate a center of a face by averaging points\n let s = new Quat(0, 0, 0, 0);\n for (let i = 0; i < face.length; i++) {\n s = s.sum(face[i]);\n }\n return s.smul(1.0 / face.length);\n}\n\nexport function solvethreeplanes(\n p1: number,\n p2: number,\n p3: number,\n planes: Quat[],\n): any {\n // find intersection of three planes but only if interior\n // Takes three indices into a plane array, and returns the point at the\n // intersection of all three, but only if it is internal to all planes.\n const p = planes[p1].intersect3(planes[p2], planes[p3]);\n if (!p) {\n return p;\n }\n for (let i = 0; i < planes.length; i++) {\n if (i !== p1 && i !== p2 && i !== p3) {\n const dt = planes[i].b * p.b + planes[i].c * p.c + planes[i].d * p.d;\n if (\n (planes[i].a > 0 && dt > planes[i].a) ||\n (planes[i].a < 0 && dt < planes[i].a)\n ) {\n return false;\n }\n }\n }\n return p;\n}\n\nexport class Quat {\n constructor(\n public a: number,\n public b: number,\n public c: number,\n public d: number,\n ) {}\n\n public mul(q: Quat): Quat {\n // Quaternion multiplication\n return new Quat(\n this.a * q.a - this.b * q.b - this.c * q.c - this.d * q.d,\n this.a * q.b + this.b * q.a + this.c * q.d - this.d * q.c,\n this.a * q.c - this.b * q.d + this.c * q.a + this.d * q.b,\n this.a * q.d + this.b * q.c - this.c * q.b + this.d * q.a,\n );\n }\n\n public toString(): string {\n return `Q[${this.a},${this.b},${this.c},${this.d}]`;\n }\n\n public dist(q: Quat): number {\n // Euclidean distance\n return Math.hypot(this.a - q.a, this.b - q.b, this.c - q.c, this.d - q.d);\n }\n\n public len(): number {\n // Euclidean length\n return Math.hypot(this.a, this.b, this.c, this.d);\n }\n\n public cross(q: Quat): Quat {\n // cross product\n return new Quat(\n 0,\n this.c * q.d - this.d * q.c,\n this.d * q.b - this.b * q.d,\n this.b * q.c - this.c * q.b,\n );\n }\n\n public dot(q: Quat): number {\n // dot product of two quaternions\n return this.b * q.b + this.c * q.c + this.d * q.d;\n }\n\n public normalize(): Quat {\n // make the magnitude be 1\n const d = Math.sqrt(this.dot(this));\n return new Quat(this.a / d, this.b / d, this.c / d, this.d / d);\n }\n\n public makenormal(): Quat {\n // make a normal vector from a plane or quat or point\n return new Quat(0, this.b, this.c, this.d).normalize();\n }\n\n public normalizeplane(): Quat {\n // normalize a plane\n const d = Math.hypot(this.b, this.c, this.d);\n return new Quat(this.a / d, this.b / d, this.c / d, this.d / d);\n }\n\n public smul(m: number): Quat {\n // scalar multiplication\n return new Quat(this.a * m, this.b * m, this.c * m, this.d * m);\n }\n\n public sum(q: Quat): Quat {\n // quaternion sum\n return new Quat(this.a + q.a, this.b + q.b, this.c + q.c, this.d + q.d);\n }\n\n public sub(q: Quat): Quat {\n // difference\n return new Quat(this.a - q.a, this.b - q.b, this.c - q.c, this.d - q.d);\n }\n\n public angle(): number {\n // quaternion angle\n return 2 * Math.acos(this.a);\n }\n\n public invrot(): Quat {\n // quaternion inverse rotation\n return new Quat(this.a, -this.b, -this.c, -this.d);\n }\n\n public det3x3(\n a00: number,\n a01: number,\n a02: number,\n a10: number,\n a11: number,\n a12: number,\n a20: number,\n a21: number,\n a22: number,\n ): number {\n // 3x3 determinant\n return (\n a00 * (a11 * a22 - a12 * a21) +\n a01 * (a12 * a20 - a10 * a22) +\n a02 * (a10 * a21 - a11 * a20)\n );\n }\n\n public rotateplane(q: Quat): Quat {\n // rotate a plane using a quaternion\n const t = q.mul(new Quat(0, this.b, this.c, this.d)).mul(q.invrot());\n t.a = this.a;\n return t;\n }\n\n // return any vector orthogonal to the given one. Find the smallest\n // component (in absolute value) and return the cross product of that\n // axis with the given vector.\n public orthogonal(): Quat {\n const ab = Math.abs(this.b);\n const ac = Math.abs(this.c);\n const ad = Math.abs(this.d);\n if (ab < ac && ab < ad) {\n return this.cross(new Quat(0, 1, 0, 0)).normalize();\n } else if (ac < ab && ac < ad) {\n return this.cross(new Quat(0, 0, 1, 0)).normalize();\n } else {\n return this.cross(new Quat(0, 0, 0, 1)).normalize();\n }\n }\n\n // return the Quaternion that will rotate the this vector\n // to the b vector through rotatepoint.\n public pointrotation(b: Quat): Quat {\n const a = this.normalize();\n b = b.normalize();\n if (a.sub(b).len() < eps) {\n return new Quat(1, 0, 0, 0);\n }\n let h = a.sum(b);\n if (h.len() < eps) {\n h = h.orthogonal();\n } else {\n h = h.normalize();\n }\n const r = a.cross(h);\n r.a = a.dot(h);\n return r;\n }\n\n // given two vectors, return the portion of the first that\n // is not in the direction of the second.\n public unproject(b: Quat): Quat {\n return this.sum(b.smul(-this.dot(b) / (this.len() * b.len())));\n }\n\n public rotatepoint(q: Quat): Quat {\n // rotate a point\n return q.mul(this).mul(q.invrot());\n }\n\n public rotateface(face: Quat[]): Quat[] {\n // rotate a face by this Q.\n return face.map((_: Quat) => _.rotatepoint(this));\n }\n\n public intersect3(p2: Quat, p3: Quat): Quat | false {\n // intersect three planes if there is one\n const det = this.det3x3(\n this.b,\n this.c,\n this.d,\n p2.b,\n p2.c,\n p2.d,\n p3.b,\n p3.c,\n p3.d,\n );\n if (Math.abs(det) < eps) {\n return false; // TODO: Change to `null` or `undefined`?\n }\n return new Quat(\n 0,\n this.det3x3(this.a, this.c, this.d, p2.a, p2.c, p2.d, p3.a, p3.c, p3.d) /\n det,\n this.det3x3(this.b, this.a, this.d, p2.b, p2.a, p2.d, p3.b, p3.a, p3.d) /\n det,\n this.det3x3(this.b, this.c, this.a, p2.b, p2.c, p2.a, p3.b, p3.c, p3.a) /\n det,\n );\n }\n\n public side(x: number): number {\n // is this point close to the origin, or on one or the other side?\n if (x > eps) {\n return 1;\n }\n if (x < -eps) {\n return -1;\n }\n return 0;\n }\n\n /**\n * Cuts a face by this plane, or returns null if there\n * is no intersection.\n * @param face The face to cut.\n */\n public cutface(face: Quat[]): Quat[][] | null {\n const d = this.a;\n let seen = 0;\n let r = null;\n for (let i = 0; i < face.length; i++) {\n seen |= 1 << (this.side(face[i].dot(this) - d) + 1);\n }\n if ((seen & 5) === 5) {\n r = [];\n // saw both sides\n const inout = face.map((_: Quat) => this.side(_.dot(this) - d));\n for (let s = -1; s <= 1; s += 2) {\n const nface = [];\n for (let k = 0; k < face.length; k++) {\n if (inout[k] === s || inout[k] === 0) {\n nface.push(face[k]);\n }\n const kk = (k + 1) % face.length;\n if (inout[k] + inout[kk] === 0 && inout[k] !== 0) {\n const vk = face[k].dot(this) - d;\n const vkk = face[kk].dot(this) - d;\n const r = vk / (vk - vkk);\n const pt = face[k].smul(1 - r).sum(face[kk].smul(r));\n nface.push(pt);\n }\n }\n r.push(nface);\n }\n }\n return r;\n }\n\n public cutfaces(faces: Quat[][]): Quat[][] {\n // Cut a set of faces by a plane and return new set\n const nfaces = [];\n for (let j = 0; j < faces.length; j++) {\n const face = faces[j];\n const t = this.cutface(face);\n if (t) {\n nfaces.push(t[0]);\n nfaces.push(t[1]);\n } else {\n nfaces.push(face);\n }\n }\n return nfaces;\n }\n\n public faceside(face: Quat[]): number {\n // which side of a plane is a face on?\n const d = this.a;\n for (let i = 0; i < face.length; i++) {\n const s = this.side(face[i].dot(this) - d);\n if (s !== 0) {\n return s;\n }\n }\n throw new Error(\"Could not determine side of plane in faceside\");\n }\n\n public sameplane(p: Quat): boolean {\n // are two planes the same?\n const a = this.normalize();\n const b = p.normalize();\n return a.dist(b) < eps || a.dist(b.smul(-1)) < eps;\n }\n\n public makecut(r: number): Quat {\n // make a cut from a normal vector\n return new Quat(r, this.b, this.c, this.d);\n }\n}\n", "/* tslint:disable prefer-for-of */ // TODO\n\nimport { Quat, solvethreeplanes } from \"./Quat\";\n\n// Next we define a class that yields quaternion generators for each of\n// the five platonic solids. The quaternion generators chosen are\n// chosen specifically so that the first quaternion doubles as a plane\n// description that yields the given Platonic solid (so for instance, the\n// cubical group and octahedral group are identical in math, but we\n// give distinct representations choosing the first quaternion so that\n// we get the desired figure.) Our convention is one vertex of the\n// shape points precisely down.\n\n// This class is static.\n\nconst eps = 1e-9; // TODO: Deduplicate with `PuzzleGeometry`?\n\nexport function cube(): Quat[] {\n const s5 = Math.sqrt(0.5);\n return [new Quat(s5, s5, 0, 0), new Quat(s5, 0, s5, 0)];\n}\n\nexport function tetrahedron(): Quat[] {\n return [new Quat(0.5, 0.5, 0.5, 0.5), new Quat(0.5, 0.5, 0.5, -0.5)];\n}\n\nexport function dodecahedron(): Quat[] {\n const d36 = (2 * Math.PI) / 10;\n let dx = 0.5 + 0.3 * Math.sqrt(5);\n let dy = 0.5 + 0.1 * Math.sqrt(5);\n const dd = Math.sqrt(dx * dx + dy * dy);\n dx /= dd;\n dy /= dd;\n return [\n new Quat(Math.cos(d36), dx * Math.sin(d36), dy * Math.sin(d36), 0),\n new Quat(0.5, 0.5, 0.5, 0.5),\n ];\n}\n\nexport function icosahedron(): Quat[] {\n let dx = 1 / 6 + Math.sqrt(5) / 6;\n let dy = 2 / 3 + Math.sqrt(5) / 3;\n const dd = Math.sqrt(dx * dx + dy * dy);\n dx /= dd;\n dy /= dd;\n const ang = (2 * Math.PI) / 6;\n return [\n new Quat(Math.cos(ang), dx * Math.sin(ang), dy * Math.sin(ang), 0),\n new Quat(Math.cos(ang), -dx * Math.sin(ang), dy * Math.sin(ang), 0),\n ];\n}\n\nexport function octahedron(): Quat[] {\n const s5 = Math.sqrt(0.5);\n return [new Quat(0.5, 0.5, 0.5, 0.5), new Quat(s5, 0, 0, s5)];\n}\n\nexport function closure(g: Quat[]): Quat[] {\n // compute the closure of a set of generators\n // This is quadratic in the result size. Also, it has no protection\n // against you providing a bogus set of generators that would generate\n // an infinite group.\n const q = [new Quat(1, 0, 0, 0)];\n for (let i = 0; i < q.length; i++) {\n for (let j = 0; j < g.length; j++) {\n const ns = g[j].mul(q[i]);\n const negns = ns.smul(-1);\n let wasseen = false;\n for (let k = 0; k < q.length; k++) {\n if (ns.dist(q[k]) < eps || negns.dist(q[k]) < eps) {\n wasseen = true;\n break;\n }\n }\n if (!wasseen) {\n q.push(ns);\n }\n }\n }\n return q;\n}\n\nexport function uniqueplanes(p: Quat, g: Quat[]): Quat[] {\n // compute unique plane rotations\n // given a rotation group and a plane, find the rotations that\n // generate unique planes. This is quadratic in the return size.\n const planes = [];\n const planerot = [];\n for (let i = 0; i < g.length; i++) {\n const p2 = p.rotateplane(g[i]);\n let wasseen = false;\n for (let j = 0; j < planes.length; j++) {\n if (p2.dist(planes[j]) < eps) {\n wasseen = true;\n break;\n }\n }\n if (!wasseen) {\n planes.push(p2);\n planerot.push(g[i]);\n }\n }\n return planerot;\n}\n\nexport function getface(planes: Quat[]): Quat[] {\n // compute a face given a set of planes\n // The face returned will be a set of points that lie in the first plane\n // in the given array, that are on the surface of the polytope defined\n // by all the planes, and will be returned in clockwise order.\n // This is O(planes^2 * return size + return_size^2).\n const face: Quat[] = [];\n for (let i = 1; i < planes.length; i++) {\n for (let j = i + 1; j < planes.length; j++) {\n const p = solvethreeplanes(0, i, j, planes);\n if (p) {\n let wasseen = false;\n for (let k = 0; k < face.length; k++) {\n if (p.dist(face[k]) < eps) {\n wasseen = true;\n break;\n }\n }\n if (!wasseen) {\n face.push(p);\n }\n }\n }\n }\n for (;;) {\n let changed = false;\n for (let i = 0; i < face.length; i++) {\n const j: number = (i + 1) % face.length;\n if (planes[0].dot(face[i].cross(face[j])) < 0) {\n const t: Quat = face[i];\n face[i] = face[j];\n face[j] = t;\n changed = true;\n }\n }\n if (!changed) {\n break;\n }\n }\n return face;\n}\n", "import { identity, Perm } from \"./Perm\";\n\nclass FactoredNumber {\n public mult: number[];\n constructor() {\n this.mult = [];\n }\n\n public multiply(n: number): void {\n for (let f = 2; f * f <= n; f++) {\n while (n % f === 0) {\n if (undefined !== this.mult[f]) {\n this.mult[f]++;\n } else {\n this.mult[f] = 1;\n }\n n /= f;\n }\n }\n if (n > 1) {\n if (undefined !== this.mult[n]) {\n this.mult[n]++;\n } else {\n this.mult[n] = 1;\n }\n }\n }\n\n public toString(): string {\n let r = \"\";\n for (let i = 0; i < this.mult.length; i++) {\n if (undefined !== this.mult[i]) {\n if (r !== \"\") {\n r += \"*\";\n }\n r += i;\n if (this.mult[i] > 1) {\n r += `^${this.mult[i]}`;\n }\n }\n }\n return r;\n }\n}\n\nexport function schreierSims(g: Perm[], disp: (s: string) => void): number {\n const n = g[0].p.length;\n const e = identity(n);\n let sgs: Perm[][] = [];\n let sgsi: Perm[][] = [];\n let sgslen: number[][] = [];\n let Tk: Perm[][] = [];\n let Tklen: number[][] = [];\n function resolve(p: Perm): boolean {\n for (let i = p.p.length - 1; i >= 0; i--) {\n const j = p.p[i];\n if (j !== i) {\n if (!sgs[i][j]) {\n return false;\n }\n p = p.mul(sgsi[i][j]);\n }\n }\n return true;\n }\n function knutha(k: number, p: Perm, len: number): void {\n Tk[k].push(p);\n Tklen[k].push(len);\n for (let i = 0; i < sgs[k].length; i++) {\n if (sgs[k][i]) {\n knuthb(k, sgs[k][i].mul(p), len + sgslen[k][i]);\n }\n }\n }\n function knuthb(k: number, p: Perm, len: number): void {\n const j = p.p[k];\n if (!sgs[k][j]) {\n sgs[k][j] = p;\n sgsi[k][j] = p.inv();\n sgslen[k][j] = len;\n for (let i = 0; i < Tk[k].length; i++) {\n knuthb(k, p.mul(Tk[k][i]), len + Tklen[k][i]);\n }\n return;\n }\n const p2 = p.mul(sgsi[k][j]);\n if (!resolve(p2)) {\n knutha(k - 1, p2, len + sgslen[k][j]);\n }\n }\n function getsgs(): number {\n sgs = [];\n sgsi = [];\n Tk = [];\n sgslen = [];\n Tklen = [];\n for (let i = 0; i < n; i++) {\n sgs.push([]);\n sgsi.push([]);\n sgslen.push([]);\n Tk.push([]);\n Tklen.push([]);\n sgs[i][i] = e;\n sgsi[i][i] = e;\n sgslen[i][i] = 0;\n }\n let none = 0;\n let sz = 1;\n for (let i = 0; i < g.length; i++) {\n knutha(n - 1, g[i], 1);\n sz = 1;\n let tks = 0;\n let sollen = 0;\n const avgs = [];\n const mults = new FactoredNumber();\n for (let j = 0; j < n; j++) {\n let cnt = 0;\n let lensum = 0;\n for (let k = 0; k < n; k++) {\n if (sgs[j][k]) {\n cnt++;\n lensum += sgslen[j][k];\n if (j !== k) {\n none++;\n }\n }\n }\n tks += Tk[j].length;\n sz *= cnt;\n if (cnt > 1) {\n mults.multiply(cnt);\n }\n const avg = lensum / cnt;\n avgs.push(avg);\n sollen += avg;\n }\n disp(\n `${i}: sz ${sz} T ${tks} sol ${sollen} none ${none} mults ${mults.toString()}`,\n );\n }\n return sz;\n }\n return getsgs();\n}\n", "import { Move, QuantumMove } from \"../alg\";\nimport type { KPuzzleDefinition, KTransformationData } from \"../kpuzzle\";\nimport { FaceNameSwizzler } from \"./FaceNameSwizzler\";\nimport {\n FaceRenamingMapper,\n FTONotationMapper,\n MegaminxScramblingNotationMapper,\n NotationMapper,\n NullMapper,\n NxNxNCubeMapper,\n PyraminxNotationMapper,\n SkewbNotationMapper,\n TetraminxNotationMapper,\n} from \"./notation-mapping\";\nimport {\n BaseFaceCount,\n FaceBasedOrientationDescription,\n FaceBasedOrientationDescriptionLookup,\n PuzzleGeometryFullOptions,\n PuzzleGeometryOptions,\n} from \"./Options\";\nimport { iota, Perm, zeros } from \"./Perm\";\nimport {\n externalName,\n PGOrbit,\n PGOrbitDef,\n PGOrbitsDef,\n PGTransform,\n showcanon,\n VisibleState,\n} from \"./PermOriSet\";\nimport { PGPuzzles, PuzzleDescriptionString, PuzzleName } from \"./PGPuzzles\";\nimport {\n closure,\n cube,\n dodecahedron,\n getface,\n icosahedron,\n octahedron,\n tetrahedron,\n uniqueplanes,\n} from \"./PlatonicGenerator\";\nimport { centermassface, Quat } from \"./Quat\";\nimport { schreierSims } from \"./SchreierSims\";\n\nexport interface TextureMapper {\n getuv(fn: number, threed: number[]): number[];\n}\n\nexport interface StickerDatSticker {\n coords: number[];\n color: string;\n orbit: string;\n ord: number;\n ori: number;\n face: number;\n isDup?: boolean;\n}\n\nexport interface StickerDatFace {\n coords: number[];\n name: string;\n}\n\nexport type StickerDatAxis = {\n coordinates: number[];\n quantumMove: Move;\n order: number;\n};\n\nexport interface StickerDat {\n stickers: StickerDatSticker[];\n faces: StickerDatFace[];\n axis: StickerDatAxis[];\n unswizzle(mv: Move): Move | null;\n notationMapper: NotationMapper;\n textureMapper: TextureMapper;\n}\n\n// you can fill these in to help with timing if you want\nfunction tstart(s: string): string {\n return s;\n}\n\nfunction tend(_: string): void {}\n\nclass Face {\n private coords: number[];\n public length: number;\n constructor(q: Quat[]) {\n this.coords = new Array(q.length * 3);\n for (let i = 0; i < q.length; i++) {\n this.coords[3 * i] = q[i].b;\n this.coords[3 * i + 1] = q[i].c;\n this.coords[3 * i + 2] = q[i].d;\n }\n this.length = q.length;\n }\n\n get(off: number): Quat {\n return new Quat(\n 0,\n this.coords[3 * off],\n this.coords[3 * off + 1],\n this.coords[3 * off + 2],\n );\n }\n\n centermass(): Quat {\n let sx = 0;\n let sy = 0;\n let sz = 0;\n for (let i = 0; i < this.length; i++) {\n sx += this.coords[3 * i];\n sy += this.coords[3 * i + 1];\n sz += this.coords[3 * i + 2];\n }\n return new Quat(0, sx / this.length, sy / this.length, sz / this.length);\n }\n\n rotate(q: Quat): Face {\n const a = [];\n for (let i = 0; i < this.length; i++) {\n a.push(this.get(i).rotatepoint(q));\n }\n return new Face(a);\n }\n\n rotateforward(): Face {\n const a = [];\n for (let i = 1; i < this.length; i++) {\n a.push(this.get(i));\n }\n a.push(this.get(0));\n return new Face(a);\n }\n}\n\nexport class FaceTree {\n constructor(\n private face: Quat[],\n private left?: FaceTree,\n private right?: FaceTree,\n ) {}\n\n public split(q: Quat): FaceTree {\n const t = q.cutface(this.face);\n if (t !== null) {\n if (this.left === undefined) {\n this.left = new FaceTree(t[0]);\n this.right = new FaceTree(t[1]);\n } else {\n this.left = this.left?.split(q);\n this.right = this.right?.split(q);\n }\n }\n return this;\n }\n\n public collect(arr: Face[], leftfirst: boolean): Face[] {\n if (this.left === undefined) {\n arr.push(new Face(this.face));\n } else if (leftfirst) {\n this.left?.collect(arr, false);\n this.right?.collect(arr, true);\n } else {\n this.right?.collect(arr, false);\n this.left?.collect(arr, true);\n }\n return arr;\n }\n}\n\nexport function expandfaces(rots: Quat[], faces: Face[]): Face[] {\n // given a set of faces, expand by rotation set\n const nfaces = [];\n for (const rot of rots) {\n for (const face of faces) {\n nfaces.push(face.rotate(rot));\n }\n }\n return nfaces;\n}\n\n// Now we have a geometry class that does the 3D goemetry to calculate\n// individual sticker information from a Platonic solid and a set of\n// cuts. The cuts must have the same symmetry as the Platonic solid;\n// we even restrict them further to be either vertex-normal,\n// edge-normal, or face-parallel cuts. Right now our constructor takes\n// a character solid indicator (one of c(ube), o(ctahedron), i(cosahedron),\n// t(etradron), or d(odecahedron), followed by an array of cuts.\n// Each cut is a character normal indicator that is either f(ace),\n// e(dge), or v(ertex), followed by a floating point value that gives\n// the depth of the cut where 0 is the center and 1 is the outside\n// border of the shape in that direction.\n\n// This is a heavyweight class with lots of members and construction\n// is slow. Be gentle.\n\n// Everything except a very few methods should be considered private.\n\nconst eps: number = 1e-9;\nconst copyright = \"PuzzleGeometry 0.1 Copyright 2018 Tomas Rokicki.\";\nconst permissivieMoveParsing = false;\n\n// This is a description of the nets and the external names we give each\n// face. The names should be a set of prefix-free upper-case alphabetics\n// so\n// we can easily also name and distinguish vertices and edges, but we\n// may change this in the future. The nets consist of a list of lists.\n// Each list gives the name of a face, and then the names of the\n// faces connected to that face (in the net) in clockwise order.\n// The length of each list should be one more than the number of\n// edges in the regular polygon for that face. All polygons must\n// have the same number of edges.\n// The first two faces in the first list must describe a horizontal edge\n// that is at the bottom of a regular polygon. The first two faces in\n// every subsequent list for a given polytope must describe a edge that\n// is directly connected in the net and has already been described (this\n// sets the location and orientation of the polygon for that face.\n// Any edge that is not directly connected in the net should be given\n// the empty string as the other face. All faces do not need to have\n// a list starting with that face; just enough to describe the full\n// connectivity of the net.\n//\n// TODO: change this back to a const JSON definition.\nfunction defaultnets(): any {\n return {\n // four faces: tetrahedron\n 4: [[\"F\", \"D\", \"L\", \"R\"]],\n // six faces: cube\n 6: [\n [\"F\", \"D\", \"L\", \"U\", \"R\"],\n [\"R\", \"F\", \"\", \"B\", \"\"],\n ],\n // eight faces: octahedron\n 8: [\n [\"F\", \"D\", \"L\", \"R\"],\n [\"D\", \"F\", \"BR\", \"\"],\n [\"BR\", \"D\", \"\", \"BB\"],\n [\"BB\", \"BR\", \"U\", \"BL\"],\n ],\n // twelve faces: dodecahedron; U/F/R/F/BL/BR from megaminx\n 12: [\n [\"U\", \"F\", \"\", \"\", \"\", \"\"],\n [\"F\", \"U\", \"R\", \"C\", \"A\", \"L\"],\n [\"R\", \"F\", \"\", \"\", \"E\", \"\"],\n [\"E\", \"R\", \"\", \"BF\", \"\", \"\"],\n [\"BF\", \"E\", \"BR\", \"BL\", \"I\", \"D\"],\n ],\n // twenty faces: icosahedron\n 20: [\n [\"R\", \"C\", \"F\", \"E\"],\n [\"F\", \"R\", \"L\", \"U\"],\n [\"L\", \"F\", \"A\", \"\"],\n [\"E\", \"R\", \"G\", \"I\"],\n [\"I\", \"E\", \"S\", \"H\"],\n [\"S\", \"I\", \"J\", \"B\"],\n [\"B\", \"S\", \"K\", \"D\"],\n [\"K\", \"B\", \"M\", \"O\"],\n [\"O\", \"K\", \"P\", \"N\"],\n [\"P\", \"O\", \"Q\", \"\"],\n ],\n };\n}\n\n// TODO: change this back to a const JSON definition.\nfunction defaultcolors(): any {\n return {\n // the colors should use the same naming convention as the nets, above.\n 4: { F: \"#00ff00\", D: \"#ffff00\", L: \"#ff0000\", R: \"#0000ff\" },\n 6: {\n U: \"#ffffff\",\n F: \"#00ff00\",\n R: \"#ff0000\",\n D: \"#ffff00\",\n B: \"#0000ff\",\n L: \"#ff8000\",\n },\n 8: {\n U: \"#ffffff\",\n F: \"#ff0000\",\n R: \"#00bb00\",\n D: \"#ffff00\",\n BB: \"#1122ff\",\n L: \"#9524c5\",\n BL: \"#ff8800\",\n BR: \"#aaaaaa\",\n },\n 12: {\n U: \"#ffffff\",\n F: \"#006633\",\n R: \"#ff0000\",\n C: \"#ffffd0\",\n A: \"#3399ff\",\n L: \"#660099\",\n E: \"#ff66cc\",\n BF: \"#99ff00\",\n BR: \"#0000ff\",\n BL: \"#ffff00\",\n I: \"#ff6633\",\n D: \"#999999\",\n },\n 20: {\n R: \"#db69f0\",\n C: \"#178fde\",\n F: \"#23238b\",\n E: \"#9cc726\",\n L: \"#2c212d\",\n U: \"#177fa7\",\n A: \"#e0de7f\",\n G: \"#2b57c0\",\n I: \"#41126b\",\n S: \"#4b8c28\",\n H: \"#7c098d\",\n J: \"#7fe7b4\",\n B: \"#85fb74\",\n K: \"#3f4bc3\",\n D: \"#0ff555\",\n M: \"#f1c2c8\",\n O: \"#58d340\",\n P: \"#c514f2\",\n N: \"#14494e\",\n Q: \"#8b1be1\",\n },\n };\n}\n\n// the default precedence of the faces is given here. This permits\n// the orientations to be reasonably predictable. There are tradeoffs;\n// some face precedence orders do better things to the edge orientations\n// than the corner orientations and some are the opposite.\n// TODO: change this back to a const JSON definition.\nfunction defaultfaceorders(): any {\n return {\n 4: [\"F\", \"D\", \"L\", \"R\"],\n 6: [\"U\", \"D\", \"F\", \"B\", \"L\", \"R\"],\n 8: [\"F\", \"BB\", \"D\", \"U\", \"BR\", \"L\", \"R\", \"BL\"],\n 12: [\"L\", \"E\", \"F\", \"BF\", \"R\", \"I\", \"U\", \"D\", \"BR\", \"A\", \"BL\", \"C\"],\n 20: [\n \"L\",\n \"S\",\n \"E\",\n \"O\",\n \"F\",\n \"B\",\n \"I\",\n \"P\",\n \"R\",\n \"K\",\n \"U\",\n \"D\",\n \"J\",\n \"A\",\n \"Q\",\n \"H\",\n \"G\",\n \"N\",\n \"M\",\n \"C\",\n ],\n };\n}\n\n/*\n * Default orientations for the puzzles in 3D space. Can be overridden\n * by puzzleOrientation or puzzleOrientations options.\n *\n * These are defined to have a strong intuitive vertical (y) direction\n * since 3D orbital controls need this. In comments, we list the\n * preferred initial camera orientation for each puzzle for twizzle;\n * this information is explicitly given in the twizzle app file.\n */\n// TODO: change this back to a const JSON definition.\nfunction defaultOrientations(): FaceBasedOrientationDescriptionLookup {\n return {\n 4: [\n [\"FLR\", [0, 1, 0]],\n [\"F\", [0, 0, 1]],\n ], // FLR towards viewer\n 6: [\n [\"U\", [0, 1, 0]],\n [\"F\", [0, 0, 1]],\n ], // URF towards viewer\n 8: [\n [\"U\", [0, 1, 0]],\n [\"F\", [0, 0, 1]],\n ], // FLUR towards viewer\n 12: [\n [\"U\", [0, 1, 0]],\n [\"F\", [0, 0, 1]],\n ], // F towards viewer\n 20: [\n [\"GUQMJ\", [0, 1, 0]],\n [\"F\", [0, 0, 1]],\n ], // F towards viewer\n };\n}\n\nfunction findelement(a: Quat[][], p: Quat): number {\n // find something in facenames, vertexnames, edgenames\n for (let i = 0; i < a.length; i++) {\n if (a[i][0].dist(p) < eps) {\n return i;\n }\n }\n throw new Error(\"Element not found\");\n}\n\nexport function getPG3DNamedPuzzles(): {\n [s: string]: PuzzleDescriptionString;\n} {\n // get some simple definitions of basic puzzles\n return PGPuzzles;\n}\n\nexport function getPuzzleDescriptionString(\n puzzleName: PuzzleName,\n): PuzzleDescriptionString {\n // get some simple definitions of basic puzzles\n return PGPuzzles[puzzleName];\n}\n\nexport type CutDescription = { cutType: string; distance: number };\nexport type PuzzleDescription = {\n shape: string;\n cuts: CutDescription[];\n};\n\nexport function parsePuzzleDescription(\n s: PuzzleDescriptionString,\n): PuzzleDescription | null {\n // parse a text description\n const a = s.split(/ /).filter(Boolean);\n if (a.length % 2 === 0) {\n return null;\n }\n const shape = a[0];\n if (\n shape !== \"o\" &&\n shape !== \"c\" &&\n shape !== \"i\" &&\n shape !== \"d\" &&\n shape !== \"t\"\n ) {\n return null;\n }\n const cuts: CutDescription[] = [];\n for (let i = 1; i < a.length; i += 2) {\n if (a[i] !== \"f\" && a[i] !== \"v\" && a[i] !== \"e\") {\n return null;\n }\n cuts.push({ cutType: a[i], distance: parseFloat(a[i + 1]) });\n }\n return { shape, cuts };\n}\n\nexport function getPuzzleGeometryByDesc(\n desc: string,\n options: PuzzleGeometryOptions = {},\n): PuzzleGeometry {\n const parsed = parsePuzzleDescription(desc);\n if (parsed === null) {\n throw new Error(\"Could not parse the puzzle description\");\n }\n const pg = new PuzzleGeometry(\n parsed,\n Object.assign({}, { allMoves: true } as PuzzleGeometryOptions, options),\n );\n pg.allstickers();\n pg.genperms();\n return pg;\n}\n\nexport function getPuzzleGeometryByName(\n puzzleName: PuzzleName,\n options?: PuzzleGeometryOptions,\n): PuzzleGeometry {\n return getPuzzleGeometryByDesc(PGPuzzles[puzzleName], options);\n}\n\nfunction getmovename(\n geo: any,\n bits: number[],\n slices: number,\n): [string, boolean] {\n // generate a move name based on bits, slice, and geo\n // if the move name is from the opposite face, say so.\n // find the face that's turned.\n let inverted = false;\n if (slices - bits[1] < bits[0]) {\n // flip if most of the move is on the other side\n geo = [geo[2], geo[3], geo[0], geo[1]];\n bits = [slices - bits[1], slices - bits[0]];\n inverted = true;\n }\n let movenameFamily = geo[0] as string;\n let movenamePrefix = \"\";\n if (bits[0] === 0 && bits[1] === slices) {\n movenameFamily = movenameFamily + \"v\";\n } else if (bits[0] === bits[1]) {\n if (bits[1] > 0) {\n movenamePrefix = String(bits[1] + 1);\n }\n } else if (bits[0] === 0) {\n movenameFamily = movenameFamily.toLowerCase();\n if (bits[1] > 1) {\n movenamePrefix = String(bits[1] + 1);\n }\n } else {\n throw `We only support slice and outer block moves right now. ${bits}`;\n }\n return [movenamePrefix + movenameFamily, inverted];\n}\n\n// split a geometrical element into face names. Do greedy match.\n// Permit underscores between names.\nfunction splitByFaceNames(s: string, facenames: [Quat[], string][]): string[] {\n const r: string[] = [];\n let at = 0;\n while (at < s.length) {\n if (at > 0 && at < s.length && s[at] === \"_\") {\n at++;\n }\n let currentMatch = \"\";\n for (const facename of facenames) {\n if (\n s.substr(at).startsWith(facename[1]) &&\n facename[1].length > currentMatch.length\n ) {\n currentMatch = facename[1];\n }\n }\n if (currentMatch !== \"\") {\n r.push(currentMatch);\n at += currentMatch.length;\n } else {\n throw new Error(\"Could not split \" + s + \" into face names.\");\n }\n }\n return r;\n}\n\nfunction toCoords(q: Quat, maxdist: number): number[] {\n return [q.b / maxdist, -q.c / maxdist, q.d / maxdist];\n}\n\nfunction toFaceCoords(q: Face, maxdist: number): number[] {\n const r = [];\n const n = q.length;\n for (let i = 0; i < n; i++) {\n const pt = toCoords(q.get(n - i - 1), maxdist);\n r[3 * i] = pt[0];\n r[3 * i + 1] = pt[1];\n r[3 * i + 2] = pt[2];\n }\n return r;\n}\n\nexport class PuzzleGeometry {\n private rotations: Quat[]; // all members of the rotation group\n public baseplanerot: Quat[]; // unique rotations of the baseplane\n private baseplanes: Quat[]; // planes, corresponding to faces\n private facenames: [Quat[], string][]; // face names\n private faceplanes: [Quat, string][]; // face planes\n private edgenames: [Quat, string][]; // edge names\n private vertexnames: [Quat, string][]; // vertexnames\n private geonormals: [Quat, string, string][]; // all geometric directions, with names and types\n private moveplanes: Quat[]; // the planes that split moves\n private moveplanes2: Quat[]; // the planes that split moves, filtered\n public moveplanesets: Quat[][]; // the move planes, in parallel sets\n private moveplanenormals: Quat[]; // one move plane\n public movesetorders: number[]; // the order of rotations for each move set\n public movesetgeos: [string, string, string, string, number][]; // geometric feature information for move sets\n private basefaces: Face[]; // polytope faces before cuts\n private faces: Face[]; // all the stickers\n private facecentermass: Quat[]; // center of mass of all faces\n private baseFaceCount: BaseFaceCount; // number of base faces\n public stickersperface: number; // number of stickers per face\n public shortedge: number; // number of stickers per face\n public cubies: number[][]; // the cubies\n private vertexdistance: number; // vertex distance\n private edgedistance: number; // edge distance\n private facetocubie: number[]; // map a face to a cubie index\n private facetoord: number[]; // map a face to a cubie ord\n private moverotations: Quat[][]; // move rotations\n private facelisthash: Map<string, number[]>; // face list by key\n private cubiesetnames: string[]; // cubie set names\n private cubieords: number[]; // the size of each orbit\n private cubiesetnums: number[];\n private cubieordnums: number[];\n private orbitoris: number[]; // the orientation size of each orbit\n private cubievaluemap: number[]; // the map for identical cubies\n private cubiesetcubies: number[][]; // cubies in each cubie set\n public cmovesbyslice: number[][][] = []; // cmoves as perms by slice\n public parsedmovelist: [\n string | undefined,\n number,\n number,\n number,\n boolean,\n number,\n ][]; // parsed move list\n\n private duplicatedFaces: number[] = []; // which faces are duplicated\n private duplicatedCubies: number[] = []; // which cubies are duplicated\n private fixedCubie: number = -1; // fixed cubie, if any\n private net: string[][] = [];\n private colors: any = [];\n private faceorder: string[] = [];\n private faceprecedence: number[] = [];\n private swizzler: FaceNameSwizzler;\n public notationMapper: NotationMapper = new NullMapper();\n private addNotationMapper: string = \"\";\n private setReidOrder: boolean = false;\n\n private options: PuzzleGeometryFullOptions;\n\n constructor(\n private puzzleDescription: PuzzleDescription,\n options: PuzzleGeometryOptions,\n ) {\n const t1 = tstart(\"genperms\");\n this.options = new PuzzleGeometryFullOptions(options);\n if (this.options.verbosity > 0) {\n console.log(this.header(\"# \"));\n }\n this.create(puzzleDescription);\n tend(t1);\n }\n\n public create(puzzleDescription: PuzzleDescription): void {\n const { shape, cuts } = puzzleDescription;\n\n // create the shape, doing all the essential geometry\n // create only goes far enough to figure out how many stickers per\n // face, and what the short edge is. If the short edge is too short,\n // we probably don't want to display or manipulate this one. How\n // short is too short is hard to say.\n this.moveplanes = [];\n this.moveplanes2 = [];\n this.faces = [];\n this.cubies = [];\n let g = null;\n switch (shape) {\n case \"c\":\n g = cube();\n break;\n case \"o\":\n g = octahedron();\n break;\n case \"i\":\n g = icosahedron();\n break;\n case \"t\":\n g = tetrahedron();\n break;\n case \"d\":\n g = dodecahedron();\n break;\n default:\n throw new Error(\"Bad shape argument: \" + shape);\n }\n this.rotations = closure(g);\n if (this.options.verbosity) {\n console.log(\"# Rotations: \" + this.rotations.length);\n }\n const baseplane = g[0];\n this.baseplanerot = uniqueplanes(baseplane, this.rotations);\n const baseplanes = this.baseplanerot.map((_) => baseplane.rotateplane(_));\n this.baseplanes = baseplanes;\n this.baseFaceCount = baseplanes.length as BaseFaceCount;\n const net = defaultnets()[baseplanes.length];\n this.net = net;\n this.colors = defaultcolors()[baseplanes.length];\n this.faceorder = defaultfaceorders()[baseplanes.length];\n if (this.options.verbosity > 0) {\n console.log(\"# Base planes: \" + baseplanes.length);\n }\n const baseface = getface(baseplanes);\n const zero = new Quat(0, 0, 0, 0);\n if (this.options.verbosity > 0) {\n console.log(\"# Face vertices: \" + baseface.length);\n }\n const facenormal = baseplanes[0].makenormal();\n const edgenormal = baseface[0].sum(baseface[1]).makenormal();\n const vertexnormal = baseface[0].makenormal();\n const boundary = new Quat(1, facenormal.b, facenormal.c, facenormal.d);\n if (this.options.verbosity > 0) {\n console.log(\"# Boundary is \" + boundary);\n }\n const planerot = uniqueplanes(boundary, this.rotations);\n const planes = planerot.map((_) => boundary.rotateplane(_));\n const firstface = getface(planes);\n this.edgedistance = firstface[0].sum(firstface[1]).smul(0.5).dist(zero);\n this.vertexdistance = firstface[0].dist(zero);\n const cutplanes = [];\n const intersects = [];\n let sawface = false; // what cuts did we see?\n let sawedge = false;\n let sawvertex = false;\n for (const cut of cuts) {\n let normal = null;\n let distance = 0;\n switch (cut.cutType) {\n case \"f\":\n normal = facenormal;\n distance = 1;\n sawface = true;\n break;\n case \"v\":\n normal = vertexnormal;\n distance = this.vertexdistance;\n sawvertex = true;\n break;\n case \"e\":\n normal = edgenormal;\n distance = this.edgedistance;\n sawedge = true;\n break;\n default:\n throw new Error(\"Bad cut argument: \" + cut.cutType);\n }\n cutplanes.push(normal.makecut(cut.distance));\n intersects.push(cut.distance < distance);\n }\n if (this.options.addRotations) {\n if (!sawface) {\n cutplanes.push(facenormal.makecut(10));\n }\n if (!sawvertex) {\n cutplanes.push(vertexnormal.makecut(10));\n }\n if (!sawedge) {\n cutplanes.push(edgenormal.makecut(10));\n }\n }\n this.basefaces = [];\n for (const baseplanerot of this.baseplanerot) {\n const face = baseplanerot.rotateface(firstface);\n this.basefaces.push(new Face(face));\n }\n //\n // Determine names for edges, vertices, and planes. Planes are defined\n // by the plane normal/distance; edges are defined by the midpoint;\n // vertices are defined by actual point. In each case we define a name.\n // Note that edges have two potential names, and corners have n where\n // n planes meet at a vertex. We arbitrarily choose the one that is\n // alphabetically first (and we will probably want to change this).\n //\n const facenames: [Quat[], string][] = [];\n const faceplanes: [Quat, string][] = [];\n const vertexnames: any[] = [];\n const edgenames: any[] = [];\n const edgesperface = firstface.length;\n function searchaddelement(a: any[], p: Quat, name: any): void {\n for (const el of a) {\n if (el[0].dist(p) < eps) {\n el.push(name);\n return;\n }\n }\n a.push([p, name]);\n }\n for (let i = 0; i < this.baseplanerot.length; i++) {\n const face = this.baseplanerot[i].rotateface(firstface);\n for (let j = 0; j < face.length; j++) {\n const jj = (j + 1) % face.length;\n const midpoint = face[j].sum(face[jj]).smul(0.5);\n searchaddelement(edgenames, midpoint, i);\n }\n }\n const otherfaces = [];\n for (let i = 0; i < this.baseplanerot.length; i++) {\n const face = this.baseplanerot[i].rotateface(firstface);\n const facelist = [];\n for (let j = 0; j < face.length; j++) {\n const jj = (j + 1) % face.length;\n const midpoint = face[j].sum(face[jj]).smul(0.5);\n const el = edgenames[findelement(edgenames, midpoint)];\n if (i === el[1]) {\n facelist.push(el[2]);\n } else if (i === el[2]) {\n facelist.push(el[1]);\n } else {\n throw new Error(\"Could not find edge\");\n }\n }\n otherfaces.push(facelist);\n }\n const facenametoindex: any = {};\n const faceindextoname: string[] = [];\n faceindextoname.push(net[0][0]);\n facenametoindex[net[0][0]] = 0;\n faceindextoname[otherfaces[0][0]] = net[0][1];\n facenametoindex[net[0][1]] = otherfaces[0][0];\n for (const neti of net) {\n const f0 = neti[0];\n const fi = facenametoindex[f0];\n if (fi === undefined) {\n throw new Error(\"Bad edge description; first edge not connected\");\n }\n let ii = -1;\n for (let j = 0; j < otherfaces[fi].length; j++) {\n const fn2 = faceindextoname[otherfaces[fi][j]];\n if (fn2 !== undefined && fn2 === neti[1]) {\n ii = j;\n break;\n }\n }\n if (ii < 0) {\n throw new Error(\"First element of a net not known\");\n }\n for (let j = 2; j < neti.length; j++) {\n if (neti[j] === \"\") {\n continue;\n }\n const of = otherfaces[fi][(j + ii - 1) % edgesperface];\n const fn2 = faceindextoname[of];\n if (fn2 !== undefined && fn2 !== neti[j]) {\n throw new Error(\"Face mismatch in net\");\n }\n faceindextoname[of] = neti[j];\n facenametoindex[neti[j]] = of;\n }\n }\n for (let i = 0; i < faceindextoname.length; i++) {\n let found = false;\n for (let j = 0; j < this.faceorder.length; j++) {\n if (faceindextoname[i] === this.faceorder[j]) {\n this.faceprecedence[i] = j;\n found = true;\n break;\n }\n }\n if (!found) {\n throw new Error(\n \"Could not find face \" +\n faceindextoname[i] +\n \" in face order list \" +\n this.faceorder,\n );\n }\n }\n for (let i = 0; i < this.baseplanerot.length; i++) {\n const face = this.baseplanerot[i].rotateface(firstface);\n const faceplane = boundary.rotateplane(this.baseplanerot[i]);\n const facename = faceindextoname[i];\n facenames.push([face, facename]);\n faceplanes.push([faceplane, facename]);\n }\n for (let i = 0; i < this.baseplanerot.length; i++) {\n const face = this.baseplanerot[i].rotateface(firstface);\n const facename = faceindextoname[i];\n for (let j = 0; j < face.length; j++) {\n const jj = (j + 1) % face.length;\n const midpoint = face[j].sum(face[jj]).smul(0.5);\n const jjj = (j + 2) % face.length;\n const midpoint2 = face[jj].sum(face[jjj]).smul(0.5);\n const e1 = findelement(edgenames, midpoint);\n const e2 = findelement(edgenames, midpoint2);\n searchaddelement(vertexnames, face[jj], [facename, e2, e1]);\n }\n }\n this.swizzler = new FaceNameSwizzler(facenames.map((_) => _[1]));\n const sep = this.swizzler.prefixFree ? \"\" : \"_\";\n // fix the edge names; use face precedence order\n for (let i = 0; i < edgenames.length; i++) {\n if (edgenames[i].length !== 3) {\n throw new Error(\"Bad length in edge names \" + edgenames[i]);\n }\n let c1 = faceindextoname[edgenames[i][1]];\n const c2 = faceindextoname[edgenames[i][2]];\n if (\n this.faceprecedence[edgenames[i][1]] <\n this.faceprecedence[edgenames[i][2]]\n ) {\n c1 = c1 + sep + c2;\n } else {\n c1 = c2 + sep + c1;\n }\n edgenames[i] = [edgenames[i][0], c1];\n }\n // fix the vertex names; counterclockwise rotations; low face first.\n for (let i = 0; i < vertexnames.length; i++) {\n if (vertexnames[i].length < 4) {\n throw new Error(\"Bad length in vertex names\");\n }\n let st = 1;\n for (let j = 2; j < vertexnames[i].length; j++) {\n if (\n this.faceprecedence[facenametoindex[vertexnames[i][j][0]]] <\n this.faceprecedence[facenametoindex[vertexnames[i][st][0]]]\n ) {\n st = j;\n }\n }\n let r = \"\";\n for (let j = 1; j < vertexnames[i].length; j++) {\n if (j === 1) {\n r = vertexnames[i][st][0];\n } else {\n r = r + sep + vertexnames[i][st][0];\n }\n for (let k = 1; k < vertexnames[i].length; k++) {\n if (vertexnames[i][st][1] === vertexnames[i][k][2]) {\n st = k;\n break;\n }\n }\n }\n vertexnames[i] = [vertexnames[i][0], r];\n }\n if (this.options.verbosity > 1) {\n console.log(\"# Face precedence list: \" + this.faceorder.join(\" \"));\n console.log(\"# Face names: \" + facenames.map((_) => _[1]).join(\" \"));\n // TODO\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n console.log(\"# Edge names: \" + edgenames.map((_) => _[1]).join(\" \"));\n // TODO\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n console.log(\"# Vertex names: \" + vertexnames.map((_) => _[1]).join(\" \"));\n }\n const geonormals: [Quat, string, string][] = [];\n for (const faceplane of faceplanes) {\n geonormals.push([faceplane[0].makenormal(), faceplane[1], \"f\"]);\n }\n for (const edgename of edgenames) {\n geonormals.push([edgename[0].makenormal(), edgename[1], \"e\"]);\n }\n for (const vertexname of vertexnames) {\n geonormals.push([vertexname[0].makenormal(), vertexname[1], \"v\"]);\n }\n this.facenames = facenames;\n this.faceplanes = faceplanes;\n this.edgenames = edgenames;\n this.vertexnames = vertexnames;\n this.geonormals = geonormals;\n const geonormalnames = geonormals.map((_) => _[1]);\n this.swizzler.setGripNames(geonormalnames);\n if (this.options.verbosity > 0) {\n console.log(\n \"# Distances: face \" +\n 1 +\n \" edge \" +\n this.edgedistance +\n \" vertex \" +\n this.vertexdistance,\n );\n }\n // expand cutplanes by rotations. We only work with one face here.\n for (let c = 0; c < cutplanes.length; c++) {\n for (const rotation of this.rotations) {\n const q = cutplanes[c].rotateplane(rotation);\n let wasseen = false;\n for (const moveplane of this.moveplanes) {\n if (q.sameplane(moveplane)) {\n wasseen = true;\n break;\n }\n }\n if (!wasseen) {\n this.moveplanes.push(q);\n if (intersects[c]) {\n this.moveplanes2.push(q);\n }\n }\n }\n }\n let ft = new FaceTree(firstface);\n const tar = this.moveplanes2.slice();\n // we want to use Math.random() here but we can't, because when\n // we call multiple times we'll get different orbits/layouts.\n // to resolve this, we use a very simple linear congruential\n // generator. for our purposes, the numbers don't need to be\n // very random.\n let rval = 31;\n for (let i = 0; i < tar.length; i++) {\n const j = i + Math.floor((tar.length - i) * (rval / 65536.0));\n ft = ft.split(tar[j]);\n tar[j] = tar[i];\n rval = (rval * 1657 + 101) % 65536;\n }\n const faces = ft.collect([], true);\n this.faces = faces;\n if (this.options.verbosity > 0) {\n console.log(\"# Faces is now \" + faces.length);\n }\n this.stickersperface = faces.length;\n // the faces when rotated don't preserve the vertex order at this\n // point. to improve 3d rendering speed, we would like to preserve\n // vertex order on rotation. First, let's see what rotations preserve\n // the base face; these are the ones we want to work with.\n const simplerot: Quat[] = [];\n const cm = centermassface(firstface);\n for (const rotation of this.rotations) {\n const f = rotation.rotateface(firstface);\n if (cm.dist(centermassface(f)) < eps) {\n simplerot.push(rotation);\n }\n }\n const finished = new Array<boolean>(faces.length);\n const sortme: [number, Quat, number][] = [];\n for (let i = 0; i < faces.length; i++) {\n const cm2 = faces[i].centermass();\n sortme.push([cm.dist(cm2), cm2, i]);\n }\n sortme.sort((a, b) => a[0] - b[0]);\n for (let ii = 0; ii < faces.length; ii++) {\n const i = sortme[ii][2];\n if (!finished[i]) {\n finished[i] = true;\n for (const rot of simplerot) {\n const f2 = faces[i].rotate(rot);\n const cm = f2.centermass();\n for (let kk = ii + 1; kk < faces.length; kk++) {\n if (sortme[kk][0] - sortme[ii][0] > eps) {\n break;\n }\n const k = sortme[kk][2];\n if (!finished[k] && cm.dist(sortme[kk][1]) < eps) {\n finished[k] = true;\n faces[k] = f2;\n break;\n }\n }\n }\n }\n }\n // Find and report the shortest edge in any of the faces. If this\n // is small the puzzle is probably not practical or displayable.\n this.shortedge = 1e99;\n for (const face of faces) {\n for (let j = 0; j < face.length; j++) {\n const k = (j + 1) % face.length;\n const t = face.get(j).dist(face.get(k));\n if (t < this.shortedge) {\n this.shortedge = t;\n }\n }\n }\n if (this.options.verbosity > 0) {\n console.log(\"# Short edge is \" + this.shortedge);\n }\n // add nxnxn cube notation if it has cube face moves\n if (shape === \"c\" && sawface && !sawedge && !sawvertex) {\n // In this case the mapper adding is deferred until we\n // know the number of slices.\n this.addNotationMapper = \"NxNxNCubeMapper\";\n // try to set Reid order of the cubies within an orbit\n this.setReidOrder = true;\n }\n if (shape === \"c\" && sawvertex && !sawface && !sawedge) {\n this.addNotationMapper = \"SkewbMapper\";\n }\n if (shape === \"t\" && (sawvertex || sawface) && !sawedge) {\n this.addNotationMapper = \"PyraminxOrTetraminxMapper\";\n }\n if (shape === \"o\" && sawface) {\n this.notationMapper = new FaceRenamingMapper(\n this.swizzler,\n new FaceNameSwizzler([\"F\", \"D\", \"L\", \"BL\", \"R\", \"U\", \"BR\", \"B\"]),\n );\n if (!sawedge && !sawvertex) {\n this.addNotationMapper = \"FTOMapper\";\n }\n }\n if (shape === \"d\" && sawface) {\n this.addNotationMapper = \"MegaminxMapper\";\n this.notationMapper = new FaceRenamingMapper(\n this.swizzler,\n new FaceNameSwizzler([\n \"U\",\n \"F\",\n \"L\",\n \"BL\",\n \"BR\",\n \"R\",\n \"FR\",\n \"FL\",\n \"DL\",\n \"B\",\n \"DR\",\n \"D\",\n ]),\n );\n }\n }\n\n private keyface(face: Face): string {\n return this.keyface2(face.centermass());\n }\n\n private keyface2(cm: Quat): string {\n // take a face and figure out the sides of each move plane\n let s = \"\";\n const sfcc = String.fromCharCode;\n for (const moveplaneset of this.moveplanesets) {\n if (moveplaneset.length > 0) {\n const dv = cm.dot(moveplaneset[0]);\n let t = 0;\n let b = 1;\n while (b * 2 <= moveplaneset.length) {\n b *= 2;\n }\n for (; b > 0; b >>= 1) {\n if (t + b <= moveplaneset.length && dv > moveplaneset[t + b - 1].a) {\n t += b;\n }\n }\n if (t < 47) {\n s = s + sfcc(33 + t);\n } else if (t < 47 + 47 * 47) {\n s = s + sfcc(33 + 47 + Math.floor(t / 47) - 1) + sfcc(33 + (t % 47));\n } else if (t < 47 + 47 * 47 + 47 * 47 * 47) {\n s =\n s +\n sfcc(33 + 47 + Math.floor((t - 47) / (47 * 47) - 1)) +\n sfcc(33 + 47 + (Math.floor((t - 47) / 47) % 47)) +\n sfcc(33 + (t % 47));\n } else {\n throw Error(\"Too many slices for cubie encoding\");\n }\n }\n }\n return s;\n }\n\n // same as above, but instead of returning an encoded string, return\n // an array with offsets.\n private keyface3(face: Face): number[] {\n const cm = face.centermass();\n // take a face and figure out the sides of each move plane\n const r = [];\n for (const moveplaneset of this.moveplanesets) {\n if (moveplaneset.length > 0) {\n const dv = cm.dot(moveplaneset[0]);\n let t = 0;\n let b = 1;\n while (b * 2 <= moveplaneset.length) {\n b *= 2;\n }\n for (; b > 0; b >>= 1) {\n if (t + b <= moveplaneset.length && dv > moveplaneset[t + b - 1].a) {\n t += b;\n }\n }\n r.push(t);\n }\n }\n return r;\n }\n\n private findface(cm: Quat): number {\n const key = this.keyface2(cm);\n const arr = this.facelisthash.get(key)!;\n if (arr.length === 1) {\n return arr[0];\n }\n for (let i = 0; i + 1 < arr.length; i++) {\n const face2 = this.facelisthash.get(key)![i];\n if (Math.abs(cm.dist(this.facecentermass[face2])) < eps) {\n return face2;\n }\n }\n return arr[arr.length - 1];\n }\n\n private project2d(\n facen: number,\n edgen: number,\n targvec: Quat[],\n ): [Quat, Quat, Quat] {\n // calculate geometry to map a particular edge of a particular\n // face to a given 2D vector. The face is given as an index into the\n // facenames/baseplane arrays, and the edge is given as an offset into\n // the vertices.\n const face = this.facenames[facen][0];\n const edgen2 = (edgen + 1) % face.length;\n const plane = this.baseplanes[facen];\n let x0 = face[edgen2].sub(face[edgen]);\n const olen = x0.len();\n x0 = x0.normalize();\n const y0 = x0.cross(plane).normalize();\n let delta = targvec[1].sub(targvec[0]);\n const len = delta.len() / olen;\n delta = delta.normalize();\n const cosr = delta.b;\n const sinr = delta.c;\n const x1 = x0.smul(cosr).sub(y0.smul(sinr)).smul(len);\n const y1 = y0.smul(cosr).sum(x0.smul(sinr)).smul(len);\n const off = new Quat(\n 0,\n targvec[0].b - x1.dot(face[edgen]),\n targvec[0].c - y1.dot(face[edgen]),\n 0,\n );\n return [x1, y1, off];\n }\n\n public allstickers(): void {\n const t1 = tstart(\"allstickers\");\n // next step is to calculate all the stickers and orbits\n // We do enough work here to display the cube on the screen.\n // take our newly split base face and expand it by the rotation matrix.\n // this generates our full set of \"stickers\".\n this.faces = expandfaces(this.baseplanerot, this.faces);\n if (this.options.verbosity > 0) {\n console.log(\"# Total stickers is now \" + this.faces.length);\n }\n this.facecentermass = new Array(this.faces.length);\n for (let i = 0; i < this.faces.length; i++) {\n this.facecentermass[i] = this.faces[i].centermass();\n }\n // Split moveplanes into a list of parallel planes.\n const moveplanesets: Quat[][] = [];\n const moveplanenormals: Quat[] = [];\n // get the normals, first, from unfiltered moveplanes.\n for (const q of this.moveplanes) {\n const qnormal = q.makenormal();\n let wasseen = false;\n for (const moveplanenormal of moveplanenormals) {\n if (qnormal.sameplane(moveplanenormal.makenormal())) {\n wasseen = true;\n }\n }\n if (!wasseen) {\n moveplanenormals.push(qnormal);\n moveplanesets.push([]);\n }\n }\n for (const q of this.moveplanes2) {\n const qnormal = q.makenormal();\n for (let j = 0; j < moveplanenormals.length; j++) {\n if (qnormal.sameplane(moveplanenormals[j])) {\n moveplanesets[j].push(q);\n break;\n }\n }\n }\n // make the normals all face the same way in each set.\n for (let i = 0; i < moveplanesets.length; i++) {\n const q: Quat[] = moveplanesets[i].map((_) => _.normalizeplane());\n const goodnormal = moveplanenormals[i];\n for (let j = 0; j < q.length; j++) {\n if (q[j].makenormal().dist(goodnormal) > eps) {\n q[j] = q[j].smul(-1);\n }\n }\n q.sort((a, b) => a.a - b.a);\n moveplanesets[i] = q;\n }\n this.moveplanesets = moveplanesets;\n this.moveplanenormals = moveplanenormals;\n const sizes = moveplanesets.map((_) => _.length);\n if (this.options.verbosity > 0) {\n console.log(\"# Move plane sets: \" + sizes);\n }\n // for each of the move planes, find the rotations that are relevant\n const moverotations: Quat[][] = [];\n for (let i = 0; i < moveplanesets.length; i++) {\n moverotations.push([]);\n }\n for (const q of this.rotations) {\n if (Math.abs(Math.abs(q.a) - 1) < eps) {\n continue;\n }\n const qnormal = q.makenormal();\n for (let j = 0; j < moveplanesets.length; j++) {\n if (qnormal.sameplane(moveplanenormals[j])) {\n moverotations[j].push(q);\n break;\n }\n }\n }\n this.moverotations = moverotations;\n // Sort the rotations by the angle of rotation. A bit tricky because\n // while the norms should be the same, they need not be. So we start\n // by making the norms the same, and then sorting.\n for (let i = 0; i < moverotations.length; i++) {\n const r = moverotations[i];\n const goodnormal = r[0].makenormal();\n for (let j = 0; j < r.length; j++) {\n if (goodnormal.dist(r[j].makenormal()) > eps) {\n r[j] = r[j].smul(-1);\n }\n }\n r.sort((a, b) => a.angle() - b.angle());\n if (moverotations[i][0].dot(moveplanenormals[i]) < 0) {\n r.reverse();\n }\n }\n const sizes2 = moverotations.map((_) => 1 + _.length);\n this.movesetorders = sizes2;\n const movesetgeos: [string, string, string, string, number][] = [];\n let gtype = \"?\";\n for (let i = 0; i < moveplanesets.length; i++) {\n const p0 = moveplanenormals[i];\n let neg = null;\n let pos = null;\n for (const geonormal of this.geonormals) {\n const d = p0.dot(geonormal[0]);\n if (Math.abs(d - 1) < eps) {\n pos = [geonormal[1], geonormal[2]];\n gtype = geonormal[2];\n } else if (Math.abs(d + 1) < eps) {\n neg = [geonormal[1], geonormal[2]];\n gtype = geonormal[2];\n }\n }\n if (pos === null || neg === null) {\n throw new Error(\"Saw positive or negative sides as null\");\n }\n movesetgeos.push([\n pos[0],\n pos[1],\n neg[0],\n neg[1],\n 1 + moveplanesets[i].length,\n ]);\n if (this.addNotationMapper === \"NxNxNCubeMapper\" && gtype === \"f\") {\n this.notationMapper = new NxNxNCubeMapper(1 + moveplanesets[i].length);\n this.addNotationMapper = \"\";\n }\n if (\n this.addNotationMapper === \"SkewbMapper\" &&\n moveplanesets[0].length === 1\n ) {\n this.notationMapper = new SkewbNotationMapper(this.swizzler);\n this.addNotationMapper = \"\";\n }\n if (this.addNotationMapper === \"PyraminxOrTetraminxMapper\") {\n if (\n moveplanesets[0].length === 2 &&\n moveplanesets[0][0].a === 0.333333333333333 &&\n moveplanesets[0][1].a === 1.66666666666667\n ) {\n this.notationMapper = new PyraminxNotationMapper(this.swizzler);\n this.addNotationMapper = \"\";\n } else {\n this.notationMapper = new TetraminxNotationMapper(this.swizzler);\n this.addNotationMapper = \"\";\n }\n }\n if (this.addNotationMapper === \"MegaminxMapper\" && gtype === \"f\") {\n if (1 + moveplanesets[i].length === 3) {\n this.notationMapper = new MegaminxScramblingNotationMapper(\n this.notationMapper,\n );\n }\n this.addNotationMapper = \"\";\n }\n if (this.addNotationMapper === \"FTOMapper\" && gtype === \"f\") {\n if (1 + moveplanesets[i].length === 3) {\n this.notationMapper = new FTONotationMapper(\n this.notationMapper,\n this.swizzler,\n );\n }\n this.addNotationMapper = \"\";\n }\n }\n this.movesetgeos = movesetgeos;\n // Cubies are split by move plane sets. For each cubie we can\n // average its points to find a point on the interior of that\n // cubie. We can then check that point against all the move\n // planes and from that derive a coordinate for the cubie.\n // This also works for faces; no face should ever lie on a move\n // plane. This allows us to take a set of stickers and break\n // them up into cubie sets.\n const facelisthash = new Map();\n const faces = this.faces;\n for (let i = 0; i < faces.length; i++) {\n const face = faces[i];\n const s = this.keyface(face);\n if (!facelisthash.get(s)) {\n facelisthash.set(s, [i]);\n } else {\n const arr = facelisthash.get(s)!;\n arr.push(i);\n // If we find a core cubie, split it up into multiple cubies,\n // because ksolve doesn't handle orientations that are not\n // cyclic, and the rotation group of the core is not cyclic.\n if (arr.length === this.baseFaceCount) {\n if (this.options.verbosity > 0) {\n console.log(\"# Splitting core.\");\n }\n for (let suff = 0; suff < arr.length; suff++) {\n const s2 = s + \" \" + suff;\n facelisthash.set(s2, [arr[suff]]);\n }\n }\n }\n }\n this.facelisthash = facelisthash;\n if (this.options.verbosity > 0) {\n console.log(\"# Cubies: \" + facelisthash.size);\n }\n const cubies: number[][] = [];\n const facetocubie = [];\n const facetoord = [];\n for (const facelist of facelisthash.values()) {\n if (facelist.length === this.baseFaceCount) {\n // this is the original \"cubie\" of a split core; we ignore it.\n continue;\n }\n // Sort the faces around each corner so they are counterclockwise. Only\n // relevant for cubies that actually are corners (three or more\n // faces). In general cubies might have many faces; for icosohedrons\n // there are five faces on the corner cubies.\n if (facelist.length > 1) {\n const cm = facelist.map((_: number) => faces[_].centermass());\n const cmall = centermassface(cm);\n for (let looplimit = 0; facelist.length > 2; looplimit++) {\n let changed = false;\n for (let i = 0; i < facelist.length; i++) {\n const j = (i + 1) % facelist.length;\n // var ttt = cmall.dot(cm[i].cross(cm[j])) ; // TODO\n if (cmall.dot(cm[i].cross(cm[j])) < 0) {\n const u = cm[i];\n cm[i] = cm[j];\n cm[j] = u;\n const v = facelist[i];\n facelist[i] = facelist[j];\n facelist[j] = v;\n changed = true;\n }\n }\n if (!changed) {\n break;\n }\n if (looplimit > 1000) {\n throw new Error(\"Bad epsilon math; too close to border\");\n }\n }\n let mini = 0;\n let minf = facelist[mini];\n for (let i = 1; i < facelist.length; i++) {\n const temp = facelist[i];\n if (\n this.faceprecedence[this.getfaceindex(temp)] <\n this.faceprecedence[this.getfaceindex(minf)]\n ) {\n mini = i;\n minf = temp;\n }\n }\n if (mini !== 0) {\n const ofacelist = facelist.slice();\n for (let i = 0; i < facelist.length; i++) {\n facelist[i] = ofacelist[(mini + i) % facelist.length];\n }\n }\n }\n for (let j = 0; j < facelist.length; j++) {\n const k = facelist[j];\n facetocubie[k] = cubies.length;\n facetoord[k] = j;\n }\n cubies.push(facelist);\n }\n this.cubies = cubies;\n this.facetocubie = facetocubie;\n this.facetoord = facetoord;\n // Calculate the orbits of each cubie. Assumes we do all moves.\n // Also calculates which cubies are identical.\n const typenames = [\"?\", \"CENTERS\", \"EDGES\", \"CORNERS\", \"C4RNER\", \"C5RNER\"];\n const cubiesetnames = [];\n const cubietypecounts = [0, 0, 0, 0, 0, 0];\n const orbitoris = [];\n const seen = [];\n let cubiesetnum = 0;\n const cubiesetnums = [];\n const cubieordnums = [];\n const cubieords = [];\n const cubievaluemap = [];\n // Later we will make this smarter to use a get color for face function\n // so we support puzzles with multiple faces the same color\n const getcolorkey = (cubienum: number): string => {\n return cubies[cubienum].map((_) => this.getfaceindex(_)).join(\" \");\n };\n const cubiesetcubies: any = [];\n for (let i = 0; i < cubies.length; i++) {\n if (seen[i]) {\n continue;\n }\n const cubie = cubies[i];\n if (cubie.length === 0) {\n continue;\n }\n const cubiekeymap: any = {};\n let cubievalueid = 0;\n cubieords.push(0);\n cubiesetcubies.push([]);\n const facecnt = cubie.length;\n const typectr = cubietypecounts[facecnt]++;\n let typename = typenames[facecnt];\n if (typename === undefined || facecnt === this.baseFaceCount) {\n typename = \"CORE\";\n }\n typename = typename + (typectr === 0 ? \"\" : typectr + 1);\n cubiesetnames[cubiesetnum] = typename;\n orbitoris[cubiesetnum] = facecnt;\n const queue = [i];\n let qg = 0;\n seen[i] = true;\n while (qg < queue.length) {\n const cind = queue[qg++];\n const cubiecolorkey = getcolorkey(cind);\n if (cubie.length > 1 || cubiekeymap[cubiecolorkey] === undefined) {\n cubiekeymap[cubiecolorkey] = cubievalueid++;\n }\n cubievaluemap[cind] = cubiekeymap[cubiecolorkey];\n cubiesetnums[cind] = cubiesetnum;\n cubiesetcubies[cubiesetnum].push(cind);\n cubieordnums[cind] = cubieords[cubiesetnum]++;\n if (queue.length < this.rotations.length) {\n const cm = this.facecentermass[cubies[cind][0]];\n for (const moverotation of moverotations) {\n const tq =\n this.facetocubie[this.findface(cm.rotatepoint(moverotation[0]))];\n if (!seen[tq]) {\n queue.push(tq);\n seen[tq] = true;\n }\n }\n }\n }\n cubiesetnum++;\n }\n if (\n this.setReidOrder &&\n 4 <= this.stickersperface &&\n this.stickersperface <= 9\n ) {\n const reidorder = [\n [\n \"UF\",\n \"UR\",\n \"UB\",\n \"UL\",\n \"DF\",\n \"DR\",\n \"DB\",\n \"DL\",\n \"FR\",\n \"FL\",\n \"BR\",\n \"BL\",\n ],\n [\"UFR\", \"URB\", \"UBL\", \"ULF\", \"DRF\", \"DFL\", \"DLB\", \"DBR\"],\n [\"U\", \"L\", \"F\", \"R\", \"B\", \"D\"],\n ];\n const reidmap: { [key: number]: number } = {};\n for (const cubie of reidorder) {\n for (let j = 0; j < cubie.length; j++) {\n let mask = 0;\n for (let k = 0; k < cubie[j].length; k++) {\n mask |= 1 << (cubie[j].charCodeAt(k) - 65);\n }\n reidmap[mask] = j;\n }\n }\n for (const cubieset of cubiesetcubies) {\n for (const cubienum of cubieset) {\n let mask = 0;\n for (const cubie of cubies[cubienum]) {\n mask |=\n 1 <<\n (this.facenames[this.getfaceindex(cubie)][1].charCodeAt(0) - 65);\n }\n cubieordnums[cubienum] = reidmap[mask];\n }\n }\n }\n this.cubiesetnums = cubiesetnums;\n this.cubieordnums = cubieordnums;\n this.cubiesetnames = cubiesetnames;\n this.cubieords = cubieords;\n this.orbitoris = orbitoris;\n this.cubievaluemap = cubievaluemap;\n this.cubiesetcubies = cubiesetcubies;\n // if we fix a cubie, find a cubie to fix\n if (this.options.fixedPieceType !== null) {\n for (let i = 0; i < cubies.length; i++) {\n if (\n (this.options.fixedPieceType === \"v\" && cubies[i].length > 2) ||\n (this.options.fixedPieceType === \"e\" && cubies[i].length === 2) ||\n (this.options.fixedPieceType === \"f\" && cubies[i].length === 1)\n ) {\n this.fixedCubie = i;\n break;\n }\n }\n if (this.fixedCubie < 0) {\n throw new Error(\n \"Could not find a cubie of type \" +\n this.options.fixedPieceType +\n \" to fix.\",\n );\n }\n }\n // show the orbits\n if (this.options.verbosity > 0) {\n console.log(\"# Cubie orbit sizes \" + cubieords);\n }\n tend(t1);\n }\n\n public unswizzle(mv: Move): Move | null {\n const newmv = this.notationMapper.notationToInternal(mv);\n if (newmv === null) {\n return null;\n }\n return newmv.modified({ family: this.swizzler.unswizzle(newmv.family) });\n }\n\n // We use an extremely permissive parse here; any character but\n // digits are allowed in a family name.\n private stringToBlockMove(mv: string): Move {\n // parse a move from the command line\n const re = RegExp(\"^(([0-9]+)-)?([0-9]+)?([^0-9]+)([0-9]+'?)?$\");\n const p = mv.match(re);\n if (p === null) {\n throw new Error(\"Bad move passed \" + mv);\n }\n const grip = p[4];\n let loslice = undefined;\n let hislice = undefined;\n if (p[2] !== undefined) {\n if (p[3] === undefined) {\n throw new Error(\"Missing second number in range\");\n }\n loslice = parseInt(p[2], 10);\n }\n if (p[3] !== undefined) {\n hislice = parseInt(p[3], 10);\n }\n let amountstr = \"1\";\n let amount = 1;\n if (p[5] !== undefined) {\n amountstr = p[5];\n if (amountstr[0] === \"'\") {\n amountstr = \"-\" + amountstr.substring(1);\n }\n amount = parseInt(amountstr, 10);\n }\n return new Move(new QuantumMove(grip, hislice, loslice), amount);\n }\n\n public parseMove(\n move: Move,\n ): [string | undefined, number, number, number, boolean, number] {\n const bm = this.notationMapper.notationToInternal(move); // pluggable notation\n if (bm === null) {\n throw new Error(\"Bad move \" + move.family);\n }\n move = bm;\n let grip = move.family;\n let fullrotation = false;\n if (grip.endsWith(\"v\") && grip[0] <= \"Z\") {\n if (move.innerLayer !== undefined || move.outerLayer !== undefined) {\n throw new Error(\"Cannot use a prefix with full cube rotations\");\n }\n grip = grip.slice(0, -1);\n fullrotation = true;\n }\n if (grip.endsWith(\"w\") && grip[0] <= \"Z\") {\n grip = grip.slice(0, -1).toLowerCase();\n }\n let geo;\n let msi = -1;\n const geoname = this.swizzler.unswizzle(grip);\n let firstgrip = false;\n for (let i = 0; i < this.movesetgeos.length; i++) {\n const g = this.movesetgeos[i];\n if (geoname === g[0]) {\n firstgrip = true;\n geo = g;\n msi = i;\n }\n if (geoname === g[2]) {\n firstgrip = false;\n geo = g;\n msi = i;\n }\n }\n let loslice = 1;\n let hislice = 1;\n if (grip.toUpperCase() !== grip) {\n hislice = 2;\n }\n if (geo === undefined) {\n throw new Error(\"Bad grip in move \" + move.family);\n }\n if (move.outerLayer !== undefined) {\n loslice = move.outerLayer;\n }\n if (move.innerLayer !== undefined) {\n if (move.outerLayer === undefined) {\n hislice = move.innerLayer;\n // big assumption here! if outerlayer not specified, but inner\n // layer is (like 2U), we use the case of the family (upper vs\n // lower) to decide if it should be a slice turn or a wide turn.\n if (grip <= \"Z\") {\n // uppercase; slice move\n loslice = hislice;\n } else {\n // lowercase; wide move\n loslice = 1;\n }\n } else {\n hislice = move.innerLayer;\n }\n }\n loslice--;\n hislice--;\n if (fullrotation) {\n loslice = 0;\n hislice = this.moveplanesets[msi].length;\n }\n if (\n loslice < 0 ||\n loslice > this.moveplanesets[msi].length ||\n hislice < 0 ||\n hislice > this.moveplanesets[msi].length\n ) {\n throw new Error(\n \"Bad slice spec \" +\n loslice +\n \" \" +\n hislice +\n \" vs \" +\n this.moveplanesets[msi].length,\n );\n }\n if (\n !permissivieMoveParsing &&\n loslice === 0 &&\n hislice === this.moveplanesets[msi].length &&\n !fullrotation\n ) {\n throw new Error(\n \"! full puzzle rotations must be specified with v suffix.\",\n );\n }\n return [undefined, msi, loslice, hislice, firstgrip, move.amount];\n }\n\n private parsemove(\n mv: string,\n ): [string | undefined, number, number, number, boolean, number] {\n const r = this.parseMove(this.stringToBlockMove(mv));\n r[0] = mv;\n return r;\n }\n\n public genperms(): void {\n const t1 = tstart(\"genperms\");\n // generate permutations for moves\n if (this.cmovesbyslice.length > 0) {\n // did this already?\n return;\n }\n const cmovesbyslice = [];\n // if orientCenters is set, we find all cubies that have only one\n // sticker and that sticker is in the center of a face, and we\n // introduce duplicate stickers so we can orient them properly.\n if (this.options.orientCenters) {\n for (let k = 0; k < this.cubies.length; k++) {\n if (this.cubies[k].length === 1) {\n const kk = this.cubies[k][0];\n const i = this.getfaceindex(kk);\n if (\n this.basefaces[i].centermass().dist(this.facecentermass[kk]) < eps\n ) {\n const o = this.basefaces[i].length;\n for (let m = 1; m < o; m++) {\n this.cubies[k].push(this.cubies[k][m - 1]);\n }\n this.duplicatedFaces[kk] = o;\n this.duplicatedCubies[k] = o;\n this.orbitoris[this.cubiesetnums[k]] = o;\n }\n }\n }\n }\n for (let k = 0; k < this.moveplanesets.length; k++) {\n const moveplaneset = this.moveplanesets[k];\n const slicenum = [];\n const slicecnts = [moveplaneset.length + 1, 0];\n let bhi = 1;\n while (bhi * 2 <= moveplaneset.length) {\n bhi *= 2;\n }\n for (let i = 0; i < this.faces.length; i++) {\n let t = 0;\n if (moveplaneset.length > 0) {\n const dv = this.facecentermass[i].dot(moveplaneset[0]);\n for (let b = bhi; b > 0; b >>= 1) {\n if (\n t + b <= moveplaneset.length &&\n dv > moveplaneset[t + b - 1].a\n ) {\n t += b;\n }\n }\n t = moveplaneset.length - t;\n }\n slicenum.push(t);\n while (slicecnts.length <= t) {\n slicecnts.push(0);\n }\n slicecnts[t]++;\n }\n const axiscmoves = new Array(slicecnts.length);\n for (let sc = 0; sc < slicecnts.length; sc++) {\n axiscmoves[sc] = [];\n }\n const cubiedone = [];\n for (let i = 0; i < this.faces.length; i++) {\n if (slicenum[i] < 0) {\n continue;\n }\n const b = [this.facetocubie[i], this.facetoord[i]];\n let cm = this.facecentermass[i];\n const ocm = cm;\n let fi2 = i;\n const sc = slicenum[fi2];\n for (;;) {\n slicenum[fi2] = -1;\n const cm2 = cm.rotatepoint(this.moverotations[k][0]);\n if (cm2.dist(ocm) < eps) {\n break;\n }\n fi2 = this.findface(cm2);\n b.push(this.facetocubie[fi2], this.facetoord[fi2]);\n cm = cm2;\n }\n // If an oriented center is moving, we need to figure out\n // the appropriate new orientation. Normally we use the cubie\n // sticker identity to locate, but this doesn't work here.\n // Instead we need to redo the geometry of the sticker itself\n // rotating and figure out how that maps to the destination\n // sticker.\n //\n // We only need to do this for central center stickers: those\n // where the face vertex goes through the center. The others\n // don't actually need orientation because they can only be\n // in one orientation by physical constraints. (You can't spin\n // a point or cross sticker on the 5x5x5, for example.)\n //\n // This also simplifies things because it means the actual\n // remapping has the same order as the moves themselves.\n //\n // The center may or may not have been duplicated at this point.\n //\n // The move moving the center might not be the same modulo as the\n // center itself.\n if (\n b.length > 2 &&\n this.options.orientCenters &&\n (this.cubies[b[0]].length === 1 || this.duplicatedCubies[b[0]] > 1)\n ) {\n // is this a real center cubie, around an axis?\n if (\n this.facecentermass[i].dist(\n this.basefaces[this.getfaceindex(i)].centermass(),\n ) < eps\n ) {\n // how does remapping of the face/point set map to the original?\n let face1 = this.faces[this.cubies[b[0]][0]];\n for (let ii = 0; ii < b.length; ii += 2) {\n const face0 = this.faces[this.cubies[b[ii]][0]];\n let o = -1;\n for (let jj = 0; jj < face1.length; jj++) {\n if (face0.get(jj).dist(face1.get(0)) < eps) {\n o = jj;\n break;\n }\n }\n if (o < 0) {\n throw new Error(\n \"Couldn't find rotation of center faces; ignoring for now.\",\n );\n } else {\n b[ii + 1] = o;\n face1 = face1.rotate(this.moverotations[k][0]);\n }\n }\n }\n }\n // b.length == 2 means a sticker is spinning in place.\n // in this case we add duplicate stickers\n // so that we can make it animate properly in a 3D world.\n if (b.length === 2 && this.options.orientCenters) {\n for (let ii = 1; ii < this.movesetorders[k]; ii++) {\n if (sc === 0) {\n b.push(b[0], ii);\n } else {\n b.push(\n b[0],\n (this.movesetorders[k] - ii) % this.movesetorders[k],\n );\n }\n }\n }\n if (b.length > 2 && !cubiedone[b[0]]) {\n if (b.length !== 2 * this.movesetorders[k]) {\n throw new Error(\"Bad length in perm gen\");\n }\n for (const v of b) {\n axiscmoves[sc].push(v);\n }\n }\n for (let j = 0; j < b.length; j += 2) {\n cubiedone[b[j]] = true;\n }\n }\n for (let kk = 0; kk < axiscmoves.length; kk++) {\n axiscmoves[kk] = axiscmoves[kk].slice();\n }\n cmovesbyslice.push(axiscmoves);\n }\n this.cmovesbyslice = cmovesbyslice;\n if (this.options.moveList) {\n const parsedmovelist: [\n string | undefined,\n number,\n number,\n number,\n boolean,\n number,\n ][] = [];\n // make sure the movelist makes sense based on the geos.\n for (const moveString of this.options.moveList) {\n parsedmovelist.push(this.parsemove(moveString));\n }\n this.parsedmovelist = parsedmovelist;\n }\n this.facelisthash.clear();\n this.facecentermass = [];\n tend(t1);\n }\n\n private getboundarygeometry(): any {\n // get the boundary geometry\n return {\n baseplanes: this.baseplanes,\n facenames: this.facenames,\n faceplanes: this.faceplanes,\n vertexnames: this.vertexnames,\n edgenames: this.edgenames,\n geonormals: this.geonormals,\n };\n }\n\n private getmovesets(k: number): any {\n // get the move sets we support based on slices\n // for even values we omit the middle \"slice\". This isn't perfect\n // but it is what we do for now.\n // if there was a move list specified, pull values from that\n const slices = this.moveplanesets[k].length;\n let r: any[] = [];\n if (this.parsedmovelist !== undefined) {\n for (const parsedmove of this.parsedmovelist) {\n if (parsedmove[1] !== k) {\n continue;\n }\n if (parsedmove[4]) {\n r.push([parsedmove[2], parsedmove[3]]);\n } else {\n r.push([slices - parsedmove[3], slices - parsedmove[2]]);\n }\n r.push(parsedmove[5]);\n }\n } else if (this.options.vertexMoves && !this.options.allMoves) {\n const msg = this.movesetgeos[k];\n if (msg[1] !== msg[3]) {\n for (let i = 0; i < slices; i++) {\n if (msg[1] !== \"v\") {\n if (this.options.outerBlockMoves) {\n r.push([i + 1, slices]);\n } else {\n r.push([i + 1]);\n }\n r.push(1);\n } else {\n if (this.options.outerBlockMoves) {\n r.push([0, i]);\n } else {\n r.push([i, i]);\n }\n r.push(1);\n }\n }\n }\n } else {\n for (let i = 0; i <= slices; i++) {\n if (!this.options.allMoves && i + i === slices) {\n continue;\n }\n if (this.options.outerBlockMoves) {\n if (i + i > slices) {\n r.push([i, slices]);\n } else {\n r.push([0, i]);\n }\n } else {\n r.push([i, i]);\n }\n r.push(1);\n }\n }\n if (this.fixedCubie >= 0) {\n const dep = this.keyface3(this.faces[this.cubies[this.fixedCubie][0]])[k];\n const newr = [];\n for (let i = 0; i < r.length; i += 2) {\n let o = r[i];\n if (dep >= o[0] && dep <= o[1]) {\n if (o[0] === 0) {\n o = [o[1] + 1, slices];\n } else if (slices === o[1]) {\n o = [0, o[0] - 1];\n } else {\n throw Error(\"fixed cubie option would disconnect move\");\n }\n }\n let found = false;\n for (let j = 0; j < newr.length; j += 2) {\n if (\n newr[j][0] === o[0] &&\n newr[j][1] === o[1] &&\n newr[j + 1] === r[i + 1]\n ) {\n found = true;\n break;\n }\n }\n if (!found) {\n newr.push(o);\n newr.push(r[i + 1]);\n }\n }\n r = newr;\n }\n // TODO\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return r;\n }\n\n private graybyori(cubie: number): boolean {\n let ori = this.cubies[cubie].length;\n if (this.duplicatedCubies[cubie]) {\n ori = 1;\n }\n return (\n (ori === 1 &&\n (this.options.grayCenters || !this.options.includeCenterOrbits)) ||\n (ori === 2 &&\n (this.options.grayEdges || !this.options.includeEdgeOrbits)) ||\n (ori > 2 &&\n (this.options.grayCorners || !this.options.includeCornerOrbits))\n );\n }\n\n private skipbyori(cubie: number): boolean {\n let ori = this.cubies[cubie].length;\n if (this.duplicatedCubies[cubie]) {\n ori = 1;\n }\n return (\n (ori === 1 && !this.options.includeCenterOrbits) ||\n (ori === 2 && !this.options.includeEdgeOrbits) ||\n (ori > 2 && !this.options.includeCornerOrbits)\n );\n }\n\n private skipcubie(fi: number): boolean {\n return this.skipbyori(fi);\n }\n\n private header(comment: string): string {\n return comment + copyright + \"\\n\" + comment + \"\\n\";\n }\n\n public writegap(): string {\n // write out a gap set of generators\n const os = this.getOrbitsDef(false);\n const r = [];\n const mvs = [];\n for (let i = 0; i < os.moveops.length; i++) {\n let movename = \"M_\" + externalName(this.notationMapper, os.movenames[i]);\n let doinv = false;\n if (movename[movename.length - 1] === \"'\") {\n movename = movename.substring(0, movename.length - 1);\n doinv = true;\n }\n // gap doesn't like angle brackets in IDs\n mvs.push(movename);\n if (doinv) {\n r.push(movename + \":=\" + os.moveops[i].toPerm().inv().toGap() + \";\");\n } else {\n r.push(movename + \":=\" + os.moveops[i].toPerm().toGap() + \";\");\n }\n }\n r.push(\"Gen:=[\");\n r.push(mvs.join(\",\"));\n r.push(\"];\");\n const ip = os.solved.identicalPieces();\n r.push(\n \"ip:=[\" +\n ip.map((_) => \"[\" + _.map((__) => __ + 1).join(\",\") + \"]\").join(\",\") +\n \"];\",\n );\n r.push(\"# Size(Group(Gen));\");\n r.push(\"# Size(Stabilizer(Group(Gen), ip, OnTuplesSets));\");\n r.push(\"\");\n return this.header(\"# \") + r.join(\"\\n\");\n }\n\n public writeksolve(name: string = \"PuzzleGeometryPuzzle\"): string {\n const od = this.getOrbitsDef(false);\n return (\n this.header(\"# \") + od.toKsolve(name, this.notationMapper).join(\"\\n\")\n );\n }\n\n public getKPuzzleDefinition(\n fortwisty: boolean = true,\n includemoves: boolean = true,\n ): KPuzzleDefinition {\n const od = this.getOrbitsDef(fortwisty, includemoves);\n const internalDefinition = od.toKPuzzleDefinition(includemoves);\n (internalDefinition as any).experimentalPuzzleDescription =\n this.puzzleDescription;\n if (!internalDefinition) {\n throw new Error(\"Missing definition!\");\n }\n return internalDefinition;\n }\n\n public getMoveFromBits(\n moverange: number[],\n amount: number,\n inverted: boolean,\n axiscmoves: number[][],\n setmoves: number[] | undefined,\n movesetorder: number,\n ): PGTransform {\n const moveorbits: PGOrbit[] = [];\n const perms = [];\n const oris = [];\n for (const len of this.cubieords) {\n perms.push(iota(len));\n oris.push(zeros(len));\n }\n for (let m = moverange[0]; m <= moverange[1]; m++) {\n const slicecmoves = axiscmoves[m];\n for (let j = 0; j < slicecmoves.length; j += 2 * movesetorder) {\n const mperm = slicecmoves.slice(j, j + 2 * movesetorder);\n const setnum = this.cubiesetnums[mperm[0]];\n for (let ii = 0; ii < mperm.length; ii += 2) {\n mperm[ii] = this.cubieordnums[mperm[ii]];\n }\n let inc = 2;\n let oinc = 3;\n if (inverted) {\n inc = mperm.length - 2;\n oinc = mperm.length - 1;\n }\n if (perms[setnum] === iota(this.cubieords[setnum])) {\n perms[setnum] = perms[setnum].slice();\n if (this.orbitoris[setnum] > 1 && !this.options.fixedOrientation) {\n oris[setnum] = oris[setnum].slice();\n }\n }\n for (let ii = 0; ii < mperm.length; ii += 2) {\n perms[setnum][mperm[(ii + inc) % mperm.length]] = mperm[ii];\n if (this.orbitoris[setnum] > 1 && !this.options.fixedOrientation) {\n oris[setnum][mperm[ii]] =\n (mperm[(ii + oinc) % mperm.length] -\n mperm[(ii + 1) % mperm.length] +\n 2 * this.orbitoris[setnum]) %\n this.orbitoris[setnum];\n }\n }\n }\n }\n let lastId = new PGOrbit(iota(24), zeros(24), 1);\n for (let ii = 0; ii < this.cubiesetnames.length; ii++) {\n if (setmoves && !setmoves[ii]) {\n continue;\n }\n if (this.orbitoris[ii] === 1 || this.options.fixedOrientation) {\n if (perms[ii] === iota(lastId.perm.length)) {\n if (perms[ii] !== lastId.perm) {\n lastId = new PGOrbit(perms[ii], oris[ii], 1);\n }\n moveorbits.push(lastId);\n } else {\n moveorbits.push(new PGOrbit(perms[ii], oris[ii], 1));\n }\n } else {\n const no = new Array<number>(oris[ii].length);\n // convert ksolve oris to our internal ori rep\n for (let jj = 0; jj < perms[ii].length; jj++) {\n no[jj] = oris[ii][perms[ii][jj]];\n }\n moveorbits.push(new PGOrbit(perms[ii], no, this.orbitoris[ii]));\n }\n }\n let mv = new PGTransform(moveorbits);\n if (amount !== 1) {\n mv = mv.mulScalar(amount);\n }\n return mv;\n }\n\n private omitSet(name: string): boolean {\n for (const excludedSet of this.options.excludeOrbits) {\n if (excludedSet === name) {\n return true;\n }\n }\n return false;\n }\n\n private diffmvsets(a: any[], b: any[], slices: number, neg: boolean) {\n for (let i = 0; i < a.length; i += 2) {\n let found = false;\n for (let j = 0; !found && j < b.length; j += 2) {\n if (neg) {\n if (\n a[i][0] + b[j][1] === slices &&\n a[i][1] + b[j][0] === slices &&\n a[i + 1] === b[j + 1]\n ) {\n found = true;\n }\n } else {\n if (\n a[i][0] === b[j][0] &&\n a[i][1] === b[j][1] &&\n a[i + 1] === b[j + 1]\n ) {\n found = true;\n }\n }\n }\n if (!found) {\n return true;\n }\n }\n return false;\n }\n\n // TODO: This is only public for testing; can we make it private again?\n public getOrbitsDef(\n fortwisty: boolean,\n includemoves: boolean = true,\n ): PGOrbitsDef {\n // generate a representation of the puzzle\n const setmoves = [];\n if (fortwisty) {\n for (let i = 0; i < this.cubiesetnames.length; i++) {\n setmoves.push(1);\n }\n }\n const setnames: string[] = [];\n const setdefs: PGOrbitDef[] = [];\n // if both a movelist and rotations are needed, eliminate rotations\n // that do not preserve the movelist.\n const mps = [];\n const addrot = [];\n for (let k = 0; k < this.moveplanesets.length; k++) {\n const moveset = this.getmovesets(k);\n mps.push(moveset);\n if (this.options.addRotations) {\n addrot.push(1);\n } else {\n addrot.push(0);\n }\n }\n if (this.options.moveList && this.options.addRotations) {\n for (let i = 0; i < this.moverotations.length; i++) {\n addrot[i] = 0;\n }\n for (let k = 0; k < this.moveplanesets.length; k++) {\n // does a rotation around k preserve the move set?\n for (let i = 0; i < this.moverotations.length; i++) {\n let nn = this.moveplanenormals[k];\n for (let ii = 1; ii * 2 <= this.movesetorders[i]; ii++) {\n nn = nn.rotatepoint(this.moverotations[i][0]);\n if (addrot[i] & ii) {\n continue;\n }\n let found = -1;\n let neg = false;\n for (let j = 0; j < this.moveplanenormals.length; j++) {\n if (nn.dist(this.moveplanenormals[j]) < eps) {\n found = j;\n break;\n } else if (nn.dist(this.moveplanenormals[j].smul(-1)) < eps) {\n found = j;\n neg = true;\n break;\n }\n }\n if (found < 0) {\n throw new Error(\"Could not find rotation\");\n }\n const cmp = mps[found];\n if (\n cmp.length !== mps[k].length ||\n this.moveplanesets[k].length !==\n this.moveplanesets[found].length ||\n this.diffmvsets(\n cmp,\n mps[k],\n this.moveplanesets[found].length,\n neg,\n )\n ) {\n addrot[i] |= ii;\n }\n }\n }\n }\n for (let i = 0; i < this.moverotations.length; i++) {\n if (addrot[i] === 0) {\n addrot[i] = 1;\n } else if (addrot[i] === 1) {\n if (this.movesetorders[i] > 3) {\n addrot[i] = 2;\n } else {\n addrot[i] = 0;\n }\n } else if (addrot[i] === 3) {\n addrot[i] = 0;\n } else {\n throw new Error(\"Impossible addrot val\");\n }\n }\n }\n for (let k = 0; k < this.moveplanesets.length; k++) {\n if (addrot[k] !== 0) {\n mps[k].push([0, this.moveplanesets[k].length]);\n mps[k].push(addrot[k]);\n }\n }\n for (let k = 0; k < this.moveplanesets.length; k++) {\n const moveset = mps[k];\n const movesetorder = this.movesetorders[k];\n // check there's no redundancy in moveset.\n for (let i = 0; i < moveset.length; i += 2) {\n for (let j = 0; j < i; j += 2) {\n if (moveset[i] === moveset[j] && moveset[i + 1] === moveset[j + 1]) {\n throw new Error(\"Redundant moves in moveset.\");\n }\n }\n }\n const allbits = [];\n for (let i = 0; i < moveset.length; i += 2) {\n for (let j = moveset[i][0]; j <= moveset[i][1]; j++) {\n allbits[j] = 1;\n }\n }\n const axiscmoves = this.cmovesbyslice[k];\n for (let i = 0; i < axiscmoves.length; i++) {\n if (allbits[i] !== 1) {\n continue;\n }\n const slicecmoves = axiscmoves[i];\n for (let j = 0; j < slicecmoves.length; j += 2 * movesetorder) {\n if (this.skipcubie(slicecmoves[j])) {\n continue;\n }\n const ind = this.cubiesetnums[slicecmoves[j]];\n setmoves[ind] = 1;\n }\n }\n }\n for (let i = 0; i < this.cubiesetnames.length; i++) {\n if (!setmoves[i]) {\n continue;\n }\n if (this.omitSet(this.cubiesetnames[i])) {\n setmoves[i] = 0;\n continue;\n }\n setnames.push(this.cubiesetnames[i]);\n setdefs.push(\n new PGOrbitDef(\n this.cubieords[i],\n this.options.fixedOrientation ? 1 : this.orbitoris[i],\n ),\n );\n }\n const solved: PGOrbit[] = [];\n for (let i = 0; i < this.cubiesetnames.length; i++) {\n if (!setmoves[i]) {\n continue;\n }\n if (this.omitSet(this.cubiesetnames[i])) {\n continue;\n }\n const p = [];\n const o = [];\n for (let j = 0; j < this.cubieords[i]; j++) {\n if (fortwisty) {\n p.push(j);\n } else {\n const cubie = this.cubiesetcubies[i][j];\n p.push(this.cubievaluemap[cubie]);\n }\n o.push(0);\n }\n solved.push(\n new PGOrbit(\n p,\n o,\n this.options.fixedOrientation ? 1 : this.orbitoris[i],\n ),\n );\n }\n const movenames: string[] = [];\n const moves: PGTransform[] = [];\n if (includemoves) {\n for (let k = 0; k < this.moveplanesets.length; k++) {\n const moveplaneset = this.moveplanesets[k];\n const slices = moveplaneset.length;\n const moveset = mps[k];\n const movesetgeo = this.movesetgeos[k];\n for (let i = 0; i < moveset.length; i += 2) {\n const movebits = moveset[i];\n const mna = getmovename(movesetgeo, movebits, slices);\n const movename = mna[0];\n const inverted = mna[1];\n if (moveset[i + 1] === 1) {\n movenames.push(movename);\n } else {\n movenames.push(movename + moveset[i + 1]);\n }\n const mv = this.getMoveFromBits(\n movebits,\n moveset[i + 1],\n inverted,\n this.cmovesbyslice[k],\n setmoves,\n this.movesetorders[k],\n );\n moves.push(mv);\n }\n }\n }\n let r = new PGOrbitsDef(\n setnames,\n setdefs,\n new VisibleState(solved),\n movenames,\n moves,\n );\n if (this.options.optimizeOrbits) {\n r = r.optimize();\n }\n if (this.options.scrambleAmount !== 0) {\n r.scramble(this.options.scrambleAmount);\n }\n return r;\n }\n\n public getScramble(n: number = 0): KTransformationData {\n const od = this.getOrbitsDef(false);\n return od.transformToKTransformationData(od.getScrambleTransformation(n));\n }\n\n public getMovesAsPerms(): Perm[] {\n return this.getOrbitsDef(false).moveops.map((_) => _.toPerm());\n }\n\n public showcanon(disp: (s: string) => void): void {\n // show information for canonical move derivation\n showcanon(this.getOrbitsDef(false), disp);\n }\n\n public getsolved(): Perm {\n // get a solved position\n const r = [];\n for (let i = 0; i < this.baseFaceCount; i++) {\n for (let j = 0; j < this.stickersperface; j++) {\n r.push(i);\n }\n }\n return new Perm(r);\n }\n\n // Given a rotation description that says to align feature1\n // with a given vector, and then as much as possible feature2\n // with another given vector, return a Quaternion that\n // performs this rotation.\n private getOrientationRotation(desiredRotation: any[]): Quat {\n const [feature1name, [x1, y1, z1]] = desiredRotation[0];\n const direction1 = new Quat(0, x1, -y1, z1);\n\n const [feature2name, [x2, y2, z2]] = desiredRotation[1];\n const direction2 = new Quat(0, x2, -y2, z2);\n let feature1: Quat | null = null;\n let feature2: Quat | null = null;\n const feature1geoname = this.swizzler.unswizzle(feature1name);\n const feature2geoname = this.swizzler.unswizzle(feature2name);\n for (const gn of this.geonormals) {\n if (feature1geoname === gn[1]) {\n feature1 = gn[0];\n }\n if (feature2geoname === gn[1]) {\n feature2 = gn[0];\n }\n }\n if (!feature1) {\n throw new Error(\"Could not find feature \" + feature1name);\n }\n if (!feature2) {\n throw new Error(\"Could not find feature \" + feature2name);\n }\n const r1 = feature1.pointrotation(direction1);\n const feature2rot = feature2.rotatepoint(r1);\n const r2 = feature2rot\n .unproject(direction1)\n .pointrotation(direction2.unproject(direction1));\n return r2.mul(r1);\n }\n\n private getInitial3DRotation(): Quat {\n const basefacecount = this.baseFaceCount;\n let orientationDescription: FaceBasedOrientationDescription | null = null;\n if (this.options.puzzleOrientation) {\n orientationDescription = this.options.puzzleOrientation;\n } else if (this.options.puzzleOrientations) {\n orientationDescription = this.options.puzzleOrientations[basefacecount];\n }\n // either no option specified or no matching key in\n // puzzleOrientations.\n if (!orientationDescription) {\n orientationDescription = defaultOrientations()[basefacecount];\n }\n if (!orientationDescription) {\n throw new Error(\"No default orientation?\");\n }\n return this.getOrientationRotation(orientationDescription);\n }\n\n private generate2dmapping(\n w: number = 800,\n h: number = 500,\n trim: number = 10,\n threed: boolean = false,\n twodshrink: number = 0.92,\n ): (fn: number, q: Quat) => number[] {\n // generate a mapping to use for 2D for textures, svg\n w -= 2 * trim;\n h -= 2 * trim;\n function extendedges(a: number[][], n: number): void {\n let dx = a[1][0] - a[0][0];\n let dy = a[1][1] - a[0][1];\n const ang = (2 * Math.PI) / n;\n const cosa = Math.cos(ang);\n const sina = Math.sin(ang);\n for (let i = 2; i < n; i++) {\n const ndx = dx * cosa + dy * sina;\n dy = dy * cosa - dx * sina;\n dx = ndx;\n a.push([a[i - 1][0] + dx, a[i - 1][1] + dy]);\n }\n }\n // Find a net from a given face count. Walk it, assuming we locate\n // the first edge from (0,0) to (1,1) and compute the minimum and\n // maximum vertex locations from this. Then do a second walk, and\n // assign the actual geometry.\n this.genperms();\n const boundarygeo = this.getboundarygeometry();\n const face0 = boundarygeo.facenames[0][0];\n const polyn = face0.length; // number of vertices; 3, 4, or 5\n const net = this.net;\n if (net === null) {\n throw new Error(\"No net?\");\n }\n const edges: any = {};\n let minx = 0;\n let miny = 0;\n let maxx = 1;\n let maxy = 0;\n edges[net[0][0]] = [\n [1, 0],\n [0, 0],\n ];\n extendedges(edges[net[0][0]], polyn);\n for (const neti of net) {\n const f0 = neti[0];\n if (!edges[f0]) {\n throw new Error(\"Bad edge description; first edge not connected.\");\n }\n for (let j = 1; j < neti.length; j++) {\n const f1 = neti[j];\n if (f1 === \"\" || edges[f1]) {\n continue;\n }\n edges[f1] = [edges[f0][j % polyn], edges[f0][(j + polyn - 1) % polyn]];\n extendedges(edges[f1], polyn);\n }\n }\n for (const f in edges) {\n const es = edges[f];\n for (const esi of es) {\n minx = Math.min(minx, esi[0]);\n maxx = Math.max(maxx, esi[0]);\n miny = Math.min(miny, esi[1]);\n maxy = Math.max(maxy, esi[1]);\n }\n }\n const sc = Math.min(w / (maxx - minx), h / (maxy - miny));\n const xoff = 0.5 * (w - sc * (maxx + minx));\n const yoff = 0.5 * (h - sc * (maxy + miny));\n const geos: Record<string, Quat[]> = {};\n const bg = this.getboundarygeometry();\n const edges2: any = {};\n const initv = [\n [sc + xoff, yoff],\n [xoff, yoff],\n ];\n edges2[net[0][0]] = initv;\n extendedges(edges2[net[0][0]], polyn);\n geos[this.facenames[0][1]] = this.project2d(0, 0, [\n new Quat(0, initv[0][0], initv[0][1], 0),\n new Quat(0, initv[1][0], initv[1][1], 0),\n ]);\n const connectat = [];\n connectat[0] = 0;\n for (const neti of net) {\n const f0 = neti[0];\n if (!edges2[f0]) {\n throw new Error(\"Bad edge description; first edge not connected.\");\n }\n let gfi = -1;\n for (let j = 0; j < bg.facenames.length; j++) {\n if (f0 === bg.facenames[j][1]) {\n gfi = j;\n break;\n }\n }\n if (gfi < 0) {\n throw new Error(\"Could not find first face name \" + f0);\n }\n const thisface = bg.facenames[gfi][0];\n for (let j = 1; j < neti.length; j++) {\n const f1 = neti[j];\n if (f1 === \"\" || edges2[f1]) {\n continue;\n }\n edges2[f1] = [\n edges2[f0][j % polyn],\n edges2[f0][(j + polyn - 1) % polyn],\n ];\n extendedges(edges2[f1], polyn);\n // what edge are we at?\n const caf0 = connectat[gfi];\n const mp = thisface[(caf0 + j) % polyn]\n .sum(thisface[(caf0 + j + polyn - 1) % polyn])\n .smul(0.5);\n const epi = findelement(bg.edgenames, mp);\n const edgename = bg.edgenames[epi][1];\n const el = splitByFaceNames(edgename, this.facenames);\n const gf1 = el[f0 === el[0] ? 1 : 0];\n let gf1i = -1;\n for (let k = 0; k < bg.facenames.length; k++) {\n if (gf1 === bg.facenames[k][1]) {\n gf1i = k;\n break;\n }\n }\n if (gf1i < 0) {\n throw new Error(\"Could not find second face name\");\n }\n const otherface = bg.facenames[gf1i][0];\n for (let k = 0; k < otherface.length; k++) {\n const mp2 = otherface[k].sum(otherface[(k + 1) % polyn]).smul(0.5);\n if (mp2.dist(mp) <= eps) {\n const p1 = edges2[f0][(j + polyn - 1) % polyn];\n const p2 = edges2[f0][j % polyn];\n connectat[gf1i] = k;\n geos[gf1] = this.project2d(gf1i, k, [\n new Quat(0, p2[0], p2[1], 0),\n new Quat(0, p1[0], p1[1], 0),\n ]);\n break;\n }\n }\n }\n }\n let hix = 0;\n let hiy = 0;\n const rot = this.getInitial3DRotation();\n for (let face of this.faces) {\n if (threed) {\n face = face.rotate(rot);\n }\n for (let j = 0; j < face.length; j++) {\n hix = Math.max(hix, Math.abs(face.get(j).b));\n hiy = Math.max(hiy, Math.abs(face.get(j).c));\n }\n }\n const sc2 = Math.min(h / hiy / 2, (w - trim) / hix / 4);\n const mappt2d = (fn: number, q: Quat): number[] => {\n if (threed) {\n q = q.rotatepoint(rot);\n const xoff2 = 0.5 * trim + 0.25 * w;\n const xmul = this.baseplanes[fn].rotateplane(rot).d < 0 ? 1 : -1;\n return [\n trim + w * 0.5 + xmul * (xoff2 - q.b * sc2),\n trim + h * 0.5 + q.c * sc2,\n ];\n } else {\n const g = geos[this.facenames[fn][1]];\n return [\n trim + twodshrink * q.dot(g[0]) + g[2].b,\n trim + h - twodshrink * q.dot(g[1]) - g[2].c,\n ];\n }\n };\n return mappt2d;\n }\n\n public generatesvg(\n w: number = 800,\n h: number = 500,\n trim: number = 10,\n threed: boolean = false,\n ): string {\n const mappt2d = this.generate2dmapping(w, h, trim, threed);\n function drawedges(id: string, pts: number[][], color: string): string {\n return (\n '<polygon id=\"' +\n id +\n '\" class=\"sticker\" style=\"fill: ' +\n color +\n '\" points=\"' +\n pts.map((p) => p[0] + \" \" + p[1]).join(\" \") +\n '\"/>\\n'\n );\n }\n // Let's build arrays for faster rendering. We want to map from geo\n // base face number to color, and we want to map from geo face number\n // to 2D geometry. These can be reused as long as the puzzle overall\n // orientation and canvas size remains unchanged.\n const pos = this.getsolved();\n const colormap = [];\n const facegeo = [];\n for (let i = 0; i < this.baseFaceCount; i++) {\n colormap[i] = this.colors[this.facenames[i][1]];\n }\n for (let i = 0; i < this.faces.length; i++) {\n const face = this.faces[i];\n const facenum = Math.floor(i / this.stickersperface);\n const fg = [];\n for (let j = 0; j < face.length; j++) {\n fg.push(mappt2d(facenum, face.get(j)));\n }\n facegeo.push(fg);\n }\n const svg = [];\n // group each base face so we can add a hover element\n for (let j = 0; j < this.baseFaceCount; j++) {\n svg.push(\"<g>\");\n svg.push(\"<title>\" + this.facenames[j][1] + \"</title>\\n\");\n for (let ii = 0; ii < this.stickersperface; ii++) {\n const i = j * this.stickersperface + ii;\n const cubie = this.facetocubie[i];\n const cubieori = this.facetoord[i];\n const cubiesetnum = this.cubiesetnums[cubie];\n const cubieord = this.cubieordnums[cubie];\n const color = this.graybyori(cubie) ? \"#808080\" : colormap[pos.p[i]];\n let id =\n this.cubiesetnames[cubiesetnum] + \"-l\" + cubieord + \"-o\" + cubieori;\n svg.push(drawedges(id, facegeo[i], color));\n if (this.duplicatedFaces[i]) {\n for (let jj = 1; jj < this.duplicatedFaces[i]; jj++) {\n id = this.cubiesetnames[cubiesetnum] + \"-l\" + cubieord + \"-o\" + jj;\n svg.push(drawedges(id, facegeo[i], color));\n }\n }\n }\n svg.push(\"</g>\");\n }\n const html =\n '<svg id=\"svg\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 800 500\">\\n' +\n '<style type=\"text/css\"><![CDATA[' +\n \".sticker { stroke: #000000; stroke-width: 1px; }\" +\n \"]]></style>\\n\" +\n svg.join(\"\") +\n \"</svg>\";\n return html;\n }\n\n // The colorfrac parameter says how much of the face should be\n // colored (vs dividing lines); we default to 0.77 which seems\n // to work pretty well. It should be a number between probably\n // 0.4 and 0.9.\n public get3d(options?: { stickerColors?: string[] }): StickerDat {\n const stickers = [];\n const rot = this.getInitial3DRotation();\n const faces = [];\n const maxdist: number = 0.52 * this.basefaces[0].get(0).len();\n for (let i = 0; i < this.basefaces.length; i++) {\n const coords = this.basefaces[i].rotate(rot);\n const name = this.facenames[i][1];\n faces.push({ coords: toFaceCoords(coords, maxdist), name });\n }\n for (let i = 0; i < this.faces.length; i++) {\n const facenum = Math.floor(i / this.stickersperface);\n const cubie = this.facetocubie[i];\n const cubieori = this.facetoord[i];\n const cubiesetnum = this.cubiesetnums[cubie];\n const cubieord = this.cubieordnums[cubie];\n let color = this.graybyori(cubie)\n ? \"#808080\"\n : this.colors[this.facenames[facenum][1]];\n if (options?.stickerColors) {\n color = options.stickerColors[i];\n }\n const coords = this.faces[i].rotate(rot);\n stickers.push({\n coords: toFaceCoords(coords, maxdist),\n color,\n orbit: this.cubiesetnames[cubiesetnum],\n ord: cubieord,\n ori: cubieori,\n face: facenum,\n });\n let fcoords = coords;\n if (this.duplicatedFaces[i]) {\n const rotdist = fcoords.length / this.duplicatedFaces[i];\n for (let jj = 1; jj < this.duplicatedFaces[i]; jj++) {\n for (let k = 0; k < rotdist; k++) {\n fcoords = fcoords.rotateforward();\n }\n stickers.push({\n coords: toFaceCoords(fcoords, maxdist),\n color,\n orbit: this.cubiesetnames[cubiesetnum],\n ord: cubieord,\n ori: jj,\n face: facenum,\n isDup: true,\n });\n }\n }\n }\n const grips: StickerDatAxis[] = [];\n for (let i = 0; i < this.movesetgeos.length; i++) {\n const msg = this.movesetgeos[i];\n const order = this.movesetorders[i];\n for (const gn of this.geonormals) {\n if (msg[0] === gn[1] && msg[1] === gn[2]) {\n grips.push({\n coordinates: toCoords(gn[0].rotatepoint(rot), 1),\n quantumMove: new Move(msg[0]),\n order,\n });\n grips.push({\n coordinates: toCoords(gn[0].rotatepoint(rot).smul(-1), 1),\n quantumMove: new Move(msg[2]),\n order,\n });\n }\n }\n }\n const twodmapper = this.generate2dmapping(2880, 2160, 0, false, 1.0);\n const g = (function () {\n const irot = rot.invrot();\n return function (facenum: number, coords: number[]): number[] {\n let q = new Quat(\n 0,\n coords[0] * maxdist,\n -coords[1] * maxdist,\n coords[2] * maxdist,\n );\n q = q.rotatepoint(irot);\n const x = twodmapper(facenum, q);\n x[0] /= 2880;\n x[1] = 1 - x[1] / 2160;\n return x;\n };\n })().bind(this);\n return {\n stickers,\n faces,\n axis: grips,\n unswizzle: this.unswizzle.bind(this),\n notationMapper: this.notationMapper,\n textureMapper: { getuv: g },\n };\n }\n\n // From the name of a geometric element (face, vertex, edge), get a\n // normal vector respecting the default orientation. This is useful\n // to define the initial position of the camera in a 3D scene. The\n // return value is normalized, so multiply it by the camera distance.\n // Returns undefined if no such geometric element.\n public getGeoNormal(geoname: string): number[] | undefined {\n const rot = this.getInitial3DRotation();\n const grip = this.swizzler.unswizzle(geoname);\n for (const gn of this.geonormals) {\n if (grip === gn[1]) {\n const r = toCoords(gn[0].rotatepoint(rot), 1);\n // This routine is intended to use for the camera location.\n // If the camera location is vertical, and we give some\n // near-zero values for x and z, then the rotation in the\n // X/Z plane will be somewhat arbitrary. So we clean up the\n // returned vector here. We give a very slight positive\n // z value.\n if (Math.abs(r[0]) < eps && Math.abs(r[2]) < eps) {\n r[0] = 0.0;\n r[2] = 1e-6;\n }\n return r;\n }\n }\n return undefined;\n }\n\n private getfaceindex(facenum: number): number {\n const divid = this.stickersperface;\n return Math.floor(facenum / divid);\n }\n\n public textForTwizzleExplorer(): string {\n return `Faces ${this.baseplanerot.length}\nStickers per face ${this.stickersperface}\nShort edge ${this.shortedge}\nCubies ${this.cubies.length}\nEdge distance ${this.edgedistance}\nVertex distance ${this.vertexdistance}`;\n }\n\n writeSchreierSims(tw: (s: string) => void) {\n const os = this.getOrbitsDef(false);\n const as = os.reassemblySize();\n tw(`Reassembly size is ${as}`);\n const ss = schreierSims(this.getMovesAsPerms(), tw);\n const r = as / ss;\n tw(`Ratio is ${r}`);\n }\n}\n\nexport class PGNotation {\n private orbitNames: string[];\n constructor(private pg: PuzzleGeometry, od: PGOrbitsDef) {\n this.orbitNames = od.orbitnames;\n }\n\n public lookupMove(move: Move): KTransformationData | null {\n const mv = this.pg.parseMove(move);\n // if a move list subset is defined, don't return moves outside the subset.\n if (this.pg.parsedmovelist) {\n let found = false;\n for (const parsedmove of this.pg.parsedmovelist) {\n if (\n parsedmove[1] === mv[1] &&\n parsedmove[2] === mv[2] &&\n parsedmove[3] === mv[3] &&\n parsedmove[4] === mv[4]\n ) {\n found = true;\n }\n }\n if (!found) {\n return null;\n }\n }\n let bits = [mv[2], mv[3]];\n if (!mv[4]) {\n const slices = this.pg.moveplanesets[mv[1]].length;\n bits = [slices - mv[3], slices - mv[2]];\n }\n const pgmv = this.pg.getMoveFromBits(\n bits,\n mv[5],\n !mv[4],\n this.pg.cmovesbyslice[mv[1]],\n undefined,\n this.pg.movesetorders[mv[1]],\n );\n const r = PGOrbitsDef.transformToKTransformationData(this.orbitNames, pgmv);\n return r;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|