Tags¶
Hyperspeedcube uses a tag-based system to organize puzzles (as opposed to the hierarchical organization used by many other puzzle programs). Tags are organized in a hierarchy, where one tag may have several subtags. For example, shape/3d/platonic/cube
is a subtag of shape/3d/platonic
, which is a subtag of shape/3d
, which is a subtag of shape
. For each tagged object (including puzzles and puzzle generators), a tag may have an associated value of one of the following types:
- Boolean (
true
orfalse
) - Integer
- String
- String list
- Puzzle name
Most tags have the boolean value, so the tables on this page only indicate a tag's type if it is not boolean. A tag is present if it is assigned any value other than false
, or if any of its subtags are present. The value false
is valid for all tags, regardless of type.
Some tags (such as colors/system
) are automatically added when generating the puzzle and so do not need to be specified in the puzzle definition. Most tags are not automatically added, so the tables on this page only indicate if they are.
List of tags¶
hyperpuzzle/src/tags.kdl
is the most up-to-date list of tags. If you're doing puzzle development, it's a good idea to skim that list. Note that leading underscores are removed, so _120cell
becomes 120cell
.
Type¶
The type
tag indicates whether an object is a shape, puzzle, or generator.
Tag | Description |
---|---|
type/shape |
Shape only (cannot be scrambled) |
type/puzzle |
Puzzle (can be scrambled) |
type/generator (auto) |
Puzzle/shape generator |
type/shape
should be included on generators that only generate shapes. type/puzzle
is not necessary on puzzles that only generate puzzles.
Shapes¶
The shape
tags indicate the physical shape of the puzzle. A puzzle will typically only have one shape
tag (plus its parent tags). If a puzzle has a unique shape that is not listed here, it should have a dimension tag (such as shape/3d
).
Shape tags are always boolean (true
or false
).
Here are a few of the most common shape tags:
Tag | Description |
---|---|
shape/3d/platonic/cube |
Cube |
shape/3d/platonic/tetrahedron |
Tetrahedron |
shape/3d/platonic/dodecahedron |
Dodecahedron |
shape/3d/platonic/octahedron |
Octahedron |
shape/3d/platonic/icosahedron |
Icosahedron |
shape/3d/prism |
Polygonal prism |
shape/3d/compound |
Polyhedral compound |
shape/4d/platonic/hypercube |
Hypercube (4D) |
shape/4d/platonic/simplex |
4-simplex |
shape/4d/platonic/120cell |
120-cell |
shape/4d/platonic/prism/dodecahedron |
Dodecahedral prism |
shape/4d/platonic/duoprism |
Polygon-polygon duoprism |
shape/5d/platonic/simplex |
5-simplex |
shape/5d/platonic/hypercube |
Hypercube (5D) |
There are many more shape tags (including Archimedian and Catalan solids) defined in tags.kdl
. More will be added as they are used in puzzles.
Colors¶
The colors
tags relate to the color system of the puzzle.
Tag | Type | Description |
---|---|---|
colors/system (auto) |
string | Color system name |
colors/multi_per_facet |
Present if there is a facet with multiple colors | |
colors/multi_facet_per |
Preset if multiple facets have the same color |
Shapeshifting¶
Shapeshifting is a unique emergent property from the shape and the axis system.
Tag | Description |
---|---|
shapeshifting |
Present if any puzzle states have different shapes |
Axes¶
The axes
tags indicate the axis system(s) of the puzzle. A puzzle may have multiple independent axis systems, although most will only have one. If a puzzle has a unique axis system that is not listed here, it should have a dimension tag (such as axes/3d
).
Here are a few of the most common axis system tags:
Tag | Description |
---|---|
axes/3d/elementary/cubic |
Cubic axes |
axes/3d/elementary/tetrahedral |
Tetrahedral axes |
axes/3d/elementary/dodecahedral |
Dodecahedral axes |
axes/3d/elementary/octahedral |
Octahedral axes |
axes/3d/elementary/icosahedral |
Icosahedral axes |
axes/3d/prism |
Polygonal prism axes |
axes/3d/compound |
Polyhedral compound axes |
axes/4d/elementary/hypercube |
Hypercubic axes (4D) |
axes/4d/elementary/simplex |
4-simplex axes |
axes/4d/elementary/120cell |
120-cell axes |
axes/4d/elementary/prism/dodecahedron |
Dodecahedral prism axes |
axes/4d/elementary/duoprism |
Polygon-polygon duoprism axes |
axes/5d/elementary/simplex |
5-simplex axes |
axes/5d/elementary/hypercube |
Hypercubic axes (5D) |
Turning element¶
The turns_by
tags indicate which element(s) of the shape correspond to the twisting axes. Since these can be synonyms in low dimensions (for instance, in 3 dimensions, face and facet are the same), most puzzles will have more than one of these tags.
Tag | Description |
---|---|
turns_by/facet |
Facet-turning |
turns_by/ridge |
Ridge-turning |
turns_by/peak |
Peak-turning |
turns_by/cell |
Cell-turning |
turns_by/face |
Face-turning |
turns_by/edge |
Edge-turning |
turns_by/vertex |
Vertex-turning |
turns_by/other |
Turns by some other element of the polytope |
Completeness¶
Tag | Description |
---|---|
completeness/super |
Each piece has only one solved attitude |
completeness/real |
All non-core internal pieces are present and each can be unsolved |
completeness/complex |
The puzzle is complex |
completeness/laminated |
The puzzle is laminated |
Algebraic properties¶
Tag | Description |
---|---|
algebraic/bandaged |
Bandaged |
algebraic/doctrinaire |
Doctrinaire |
algebraic/jumbling |
Jumbling |
algebraic/pseudo/bandaged |
Pseduobandaged |
algebraic/pseudo/doctrinaire |
Pseudodoctrinaire |
algebraic/pseudo/jumbling |
Pseudojumbling |
algebraic/abelian |
The puzzle's state space is abelian (commutative) |
algebraic/fused |
Fused |
algebraic/orientations/non_abelian |
At least one piece has a non-abelian orientation group |
algebraic/trivial |
Trivial |
algebraic/weird_orbits |
The permutation group of at least one orbit of one piece type is a group other than an alternating or symmetric group |
Definitions
- Unbandaging is the process of splitting pieces into smaller ones
- A finite puzzle is one with finitely many pieces
- A doctrinaire puzzle is one whose moves are all always accessible (never blocked)
- A bandaged puzzle is one that is not doctrinaire, but can be unbandaged into a finite doctrinaire puzzle
- A jumbling puzzle is one that cannot be unbandaged into a finite doctrinaire puzzle
- A pseudodoctrinaire puzzle is one where the set of accessible moves of a state can be determined only from the orientations of the 1-grip pieces
- A pseudojumbling puzzle is one that cannot be unbandaged into a finite pseudodoctrinaire puzzle
- A pseudobandaged puzzle is one that is not pseudodoctrinaire, but can be unbandaged into a finite pseudodoctrinaire puzzle
- A fused puzzle is one that can be decomposed into several non-interacting puzzles, i.e. the puzzle's state space is a direct product and each generator is only from one factor
- A trivial puzzle is one whose state space can be expressed as a direct product of "line puzzles," where a "line puzzle" is a puzzle with at most two moves available from any position
Derived facts
- A finite puzzle is always either doctrinaire, bandaged, or jumbling
- A finite puzzle is always either pseudodoctrinaire, pseudobandaged, or pseudojumbling
- All doctrinaire puzzles are pseudodoctrinaire
- All pseudojumbling puzzles are jumbling
- Trivial puzzles are not necessarily abelian
- Trivial puzzles are not necessarily doctrinaire
Cuts¶
The cuts
tags indicate properties of the cuts of the puzzle. A puzzle may have any number of these tags.
Tag | Description |
---|---|
cuts/depth/shallow |
Shallow-cut |
cuts/depth/deep |
Deep-cut (deeper than shallow-cut, but not half-cut) |
cuts/depth/deep/to_adjacent |
Cut to the adjacent axis |
cuts/depth/deep/past_adjacent |
Cut past the adjacent axis |
cuts/depth/deep/past_origin |
Cut past the origin |
cuts/depth/half |
Half-cut (cut through the center of the puzzle) |
cuts/stored |
At least one stored cut |
cuts/wedge |
At least one wedge cut |
Definitions
- A stored cut is a division between pieces that cannot be split by a move accessible from the solved state of the puzzle
- A wedge cut is a cut constructed piecewise from multiple (hyper)planes
Categories¶
Tag | Description |
---|---|
canonical |
The puzzle is widely accepted as the "canonical" example for its shape and turning element (e.g., the Rubik's cube is the canonical face-turning cube) |
meme |
The puzzle is included as a joke and is not intended to be studied or solved |
Families¶
See tags.kdl
for a full list of families.
Tag | Description |
---|---|
family/gap/sliding |
Sliding gap puzzle (e.g., 15-puzzle) |
family/gap/rotating |
Rotating gap puzzle |
family/multicore |
Puzzle with multiple turning centers |
Variants¶
Variant tags are only used for puzzles that were originally invented as variations on existing puzzles.
Tag | Type | Description |
---|---|---|
variant/stickermod |
puzzle | Puzzle that this is a stickermod of |
variant/shapemod |
puzzle | Puzzle that this is a shapemod of |
variant/bump |
Bump puzzle (e.g., Mirror Blocks) | |
variant/bandaging |
The puzzle is a bandaging of another puzzle |
TODO: should variant/bump
and variant/bandaging
also have type Puzzle
?
Attribution¶
Tag | Type | Description |
---|---|---|
author |
string list | Author(s) of the puzzle definition file |
inventor |
string list | Inventor(s)/designer(s) of the original physical puzzle |
Miscellaneous tags¶
Tag | Type | Description |
---|---|---|
solved (auto) |
Whether the user has solved this puzzle | |
generated (auto) |
Whether the puzzle was generated from a generator | |
builtin |
string | Version of Hyperspeedcube that the puzzle was added, if it is a built-in puzzle |
external/gelatinbrain |
string | ID in Gelatinbrain Puzzle Simulator |
external/hof |
string | Hall Of Fame URL |
external/mc4d |
Whether the puzzle exists in Magic Cube 4D | |
external/museum |
integer | ID in the TwistyPuzzles.com Museum |
external/wca |
string | ID in the World Cube Association rankings |
experimental |
Whether the puzzle is experimental and so is likely to change in future versions | |
big |
Whether the puzzle may take a long time to load |
Specification¶
A Lua tag specification is a table specifying a set of tags for a puzzle or other tagged object.
The sequence values of the table must be strings. If a string does not start with !
, then that tag is assigned the value true
. If a string starts with !
, then it is a negated tag: the !
is removed and the tag specified in the rest of the string is assigned the value false
.
Non-sequence keys must be strings containing tag names. The value of each entry may be a tag value of the appropriate type, or table containing a specification for subtags.
Tag names may contain multiple /
-separated components, which is used to specify subtags.
Generated puzzles inherit tags from their generators, unless explicitly overridden with a negated tag.
Types¶
Booleans, integers, and strings are all specified using the corresponding Lua types.
A string list may be specified as a single string (such as "Andrew Farkas"
) table containing a sequence of strings (such as {"Andrew Farkas", "Milo Jacquet"}
).
A puzzle name is specified using a string containing its ID.
Expected tags¶
Many tags are expected to be specified on all puzzles, to ensure that nothing is forgotten and that new tags are added to existing puzzles. Hyperspeedcube will emit a warning when loading a puzzle definition that leaves certain tags unspecified. See tags_template.lua
.
Examples¶
local tags = {
builtin = '1.0.0',
external = {
gelatinbrain = '3.1.2', -- external/gelatinbrain
'!hof', -- external/hof = false
museum = 7629, -- external/museum
wca = '333', -- external/wca
},
author = { "Andrew Farkas", "Milo Jacquet" }, -- string list (2)
inventor = "Ernő Rubik", -- string list (1)
'shape/3d/platonic/cube',
algebraic = {
'doctrinaire', 'pseudo/doctrinaire',
'!fused', '!orientations/non_abelian', '!trivial', '!weird_orbits',
},
axes = { '3d/elementary/cubic', '!hybrid', '!multicore' },
colors = { '!multi_facet_per', '!multi_per_facet' },
cuts = { depth = { 'shallow' }, '!stored', '!wedge' },
turns_by = { 'face', 'facet' },
'!experimental',
'!family',
'!variant',
'!meme',
'!shapeshifting',
}