@classytic/labs 0.1.0 → 0.2.0
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/_virtual/_rolldown/runtime.mjs +18 -0
- package/dist/biology/enzyme-rate/preset.mjs +5 -5
- package/dist/biology/genetic-cross/core.d.mts +7 -7
- package/dist/biology/genetic-cross/core.mjs +4 -4
- package/dist/biology/genetic-cross/grid.mjs +132 -123
- package/dist/biology/genetic-cross/preset.mjs +4 -4
- package/dist/biology/genetic-cross/sex-linked.mjs +7 -7
- package/dist/biology/photosynthesis-factors/preset.mjs +8 -8
- package/dist/biology/respiration/preset.mjs +4 -4
- package/dist/biology/sequence/central-dogma.mjs +5 -5
- package/dist/biology/sequence/core.d.mts +6 -6
- package/dist/biology/sequence/core.mjs +1 -1
- package/dist/biology/sequence/preset.mjs +6 -6
- package/dist/blocks/authoring.mjs +5 -5
- package/dist/blocks/biology.d.mts +2 -2
- package/dist/blocks/biology.mjs +5 -5
- package/dist/blocks/chem.d.mts +2 -2
- package/dist/blocks/chem.mjs +13 -13
- package/dist/blocks/circuits.d.mts +293 -4
- package/dist/blocks/circuits.mjs +874 -9
- package/dist/blocks/discrete.d.mts +30 -2
- package/dist/blocks/discrete.mjs +74 -4
- package/dist/blocks/economics.mjs +1 -1
- package/dist/blocks/geography.mjs +1 -1
- package/dist/blocks/geometry.mjs +3 -3
- package/dist/blocks/ict.d.mts +90 -1
- package/dist/blocks/ict.mjs +217 -7
- package/dist/blocks/index.d.mts +3064 -657
- package/dist/blocks/index.mjs +9 -9
- package/dist/blocks/lab-block.mjs +5 -5
- package/dist/blocks/lab-config.d.mts +1 -1
- package/dist/blocks/lab-config.mjs +4 -4
- package/dist/blocks/lab-gallery.d.mts +1 -1
- package/dist/blocks/lab-gallery.mjs +2 -2
- package/dist/blocks/language.d.mts +6 -6
- package/dist/blocks/language.mjs +12 -12
- package/dist/blocks/lesson.mjs +4 -4
- package/dist/blocks/math.d.mts +577 -11
- package/dist/blocks/math.mjs +1648 -14
- package/dist/blocks/ml.d.mts +45 -1
- package/dist/blocks/ml.mjs +80 -6
- package/dist/blocks/physics.d.mts +9 -4
- package/dist/blocks/physics.mjs +75 -28
- package/dist/blocks/statistics.mjs +1 -1
- package/dist/build/CircuitEditor.d.mts +14 -0
- package/dist/build/CircuitEditor.mjs +787 -0
- package/dist/build/CircuitPlayer.d.mts +19 -0
- package/dist/build/CircuitPlayer.mjs +53 -0
- package/dist/build/CircuitScene.d.mts +61 -0
- package/dist/build/CircuitScene.mjs +383 -0
- package/dist/build/contract.d.mts +116 -0
- package/dist/build/editor-ops.d.mts +65 -0
- package/dist/build/editor-ops.mjs +306 -0
- package/dist/build/editor-ui.mjs +121 -0
- package/dist/build/flow.d.mts +14 -0
- package/dist/build/flow.mjs +119 -0
- package/dist/build/index.d.mts +10 -0
- package/dist/build/index.mjs +10 -0
- package/dist/build/parts/ammeter.d.mts +1 -0
- package/dist/build/parts/ammeter.mjs +32 -0
- package/dist/build/parts/bulb.d.mts +1 -0
- package/dist/build/parts/bulb.mjs +50 -0
- package/dist/build/parts/capacitor.d.mts +1 -0
- package/dist/build/parts/capacitor.mjs +26 -0
- package/dist/build/parts/cell.d.mts +1 -0
- package/dist/build/parts/cell.mjs +40 -0
- package/dist/build/parts/diode.d.mts +1 -0
- package/dist/build/parts/diode.mjs +33 -0
- package/dist/build/parts/index.d.mts +5 -0
- package/dist/build/parts/index.mjs +43 -0
- package/dist/build/parts/mosfet.d.mts +1 -0
- package/dist/build/parts/mosfet.mjs +95 -0
- package/dist/build/parts/node.d.mts +1 -0
- package/dist/build/parts/node.mjs +32 -0
- package/dist/build/parts/resistor.d.mts +1 -0
- package/dist/build/parts/resistor.mjs +49 -0
- package/dist/build/parts/shared.mjs +42 -0
- package/dist/build/parts/switch.d.mts +1 -0
- package/dist/build/parts/switch.mjs +34 -0
- package/dist/build/parts.d.mts +1 -0
- package/dist/build/registry.d.mts +9 -0
- package/dist/build/registry.mjs +15 -0
- package/dist/build/solve.d.mts +8 -0
- package/dist/build/solve.mjs +0 -0
- package/dist/catalog/registry.d.mts +2 -2
- package/dist/catalog/templates.d.mts +1 -1
- package/dist/catalog/templates.mjs +6 -6
- package/dist/chem/battery.mjs +1 -1
- package/dist/chem/bohr-atom.mjs +4 -4
- package/dist/chem/diffusion/preset.mjs +4 -4
- package/dist/chem/electrochem/preset.mjs +5 -5
- package/dist/chem/equilibrium/preset.d.mts +1 -1
- package/dist/chem/equilibrium/preset.mjs +6 -6
- package/dist/chem/gas-box/preset.mjs +6 -6
- package/dist/chem/kinetics/preset.mjs +6 -6
- package/dist/chem/periodic-trends/preset.mjs +7 -7
- package/dist/chem/reaction-lab.mjs +3 -3
- package/dist/chem/reaction-profile.mjs +4 -4
- package/dist/chem/solution/dilution.mjs +6 -6
- package/dist/chem/solution/field.d.mts +2 -2
- package/dist/chem/solution/field.mjs +2 -2
- package/dist/chem/solution/solution-box.mjs +7 -7
- package/dist/chem/stoichiometry/preset.mjs +5 -5
- package/dist/chem/titration/preset.mjs +5 -5
- package/dist/circuits/ac-dc/asset.mjs +1 -1
- package/dist/circuits/ac-dc/preset.mjs +2 -2
- package/dist/circuits/brownout/index.d.mts +1 -0
- package/dist/circuits/brownout/preset.d.mts +22 -0
- package/dist/circuits/brownout/preset.mjs +399 -0
- package/dist/circuits/capacitor-leak/preset.mjs +13 -8
- package/dist/circuits/circuit/asset.mjs +71 -14
- package/dist/circuits/circuit/preset.mjs +23 -5
- package/dist/circuits/circuit-builder.mjs +60 -132
- package/dist/circuits/circuit-lab.mjs +60 -40
- package/dist/circuits/cmos-gate/index.d.mts +1 -0
- package/dist/circuits/cmos-gate/preset.d.mts +75 -0
- package/dist/circuits/cmos-gate/preset.mjs +1491 -0
- package/dist/circuits/diode/index.d.mts +1 -0
- package/dist/circuits/diode/preset.d.mts +25 -0
- package/dist/circuits/diode/preset.mjs +266 -0
- package/dist/circuits/index.d.mts +7 -1
- package/dist/circuits/index.mjs +7 -1
- package/dist/circuits/rc-charging/index.d.mts +1 -0
- package/dist/circuits/rc-charging/preset.d.mts +27 -0
- package/dist/circuits/rc-charging/preset.mjs +329 -0
- package/dist/circuits/semiconductor/index.d.mts +1 -0
- package/dist/circuits/semiconductor/preset.d.mts +102 -0
- package/dist/circuits/semiconductor/preset.mjs +1855 -0
- package/dist/circuits/transistor/index.d.mts +1 -0
- package/dist/circuits/transistor/preset.d.mts +27 -0
- package/dist/circuits/transistor/preset.mjs +329 -0
- package/dist/commerce/accounting/core.d.mts +1 -1
- package/dist/commerce/accounting/equation-balance.mjs +5 -5
- package/dist/commerce/accounting/journal-poster.mjs +8 -8
- package/dist/commerce/accounting/statement-sorter.mjs +4 -4
- package/dist/commerce/economics/core.d.mts +2 -2
- package/dist/commerce/economics/core.mjs +1 -1
- package/dist/commerce/economics/demand-shift-vs-move.mjs +6 -6
- package/dist/commerce/economics/elasticity-revenue.mjs +6 -6
- package/dist/commerce/economics/market-equilibrium.mjs +5 -5
- package/dist/core/easing.d.mts +3 -3
- package/dist/core/easing.mjs +2 -2
- package/dist/core/numeric.d.mts +3 -3
- package/dist/core/numeric.mjs +2 -2
- package/dist/core/reactive.d.mts +1 -1
- package/dist/core/reactive.mjs +1 -1
- package/dist/core/rng.d.mts +2 -2
- package/dist/core/rng.mjs +1 -1
- package/dist/core/tex.mjs +2 -2
- package/dist/core/timeline.d.mts +1 -1
- package/dist/core/timeline.mjs +1 -1
- package/dist/core/util.mjs +11 -1
- package/dist/discrete/arrangements/preset.mjs +6 -14
- package/dist/discrete/bayes/preset.mjs +43 -35
- package/dist/discrete/binomial/preset.mjs +2 -2
- package/dist/discrete/combination-studio/figure.d.mts +6 -0
- package/dist/discrete/combination-studio/figure.mjs +159 -0
- package/dist/discrete/combination-studio/index.d.mts +2 -0
- package/dist/discrete/combination-studio/preset.d.mts +44 -0
- package/dist/discrete/combination-studio/preset.mjs +440 -0
- package/dist/discrete/core/combinatorics.d.mts +23 -3
- package/dist/discrete/core/combinatorics.mjs +38 -3
- package/dist/discrete/core/pigeonhole.d.mts +1 -1
- package/dist/discrete/core/pigeonhole.mjs +1 -1
- package/dist/discrete/core/probability.d.mts +3 -3
- package/dist/discrete/core/probability.mjs +3 -3
- package/dist/discrete/core/sets.d.mts +1 -1
- package/dist/discrete/counting-slots/preset.mjs +8 -8
- package/dist/discrete/counting-tree/preset.mjs +65 -8
- package/dist/discrete/expected-value/preset.mjs +13 -13
- package/dist/discrete/hypergeometric/preset.mjs +48 -15
- package/dist/discrete/index.d.mts +4 -2
- package/dist/discrete/index.mjs +4 -2
- package/dist/discrete/karnaugh/preset.mjs +26 -20
- package/dist/discrete/lln/preset.mjs +44 -3
- package/dist/discrete/logic-circuit/preset.mjs +2 -2
- package/dist/discrete/monte-carlo/preset.d.mts +1 -1
- package/dist/discrete/monte-carlo/preset.mjs +14 -14
- package/dist/discrete/monty-hall/preset.mjs +6 -6
- package/dist/discrete/outcome-builder/preset.mjs +3 -3
- package/dist/discrete/pascal/preset.mjs +37 -7
- package/dist/discrete/rules.d.mts +20 -0
- package/dist/discrete/rules.mjs +264 -0
- package/dist/discrete/sample-space/preset.mjs +4 -4
- package/dist/discrete/selection/preset.mjs +7 -13
- package/dist/discrete/truth-table/preset.mjs +32 -9
- package/dist/discrete/venn/preset.mjs +71 -48
- package/dist/geography/cycle-lab/preset.mjs +17 -10
- package/dist/geography/cycles.d.mts +3 -3
- package/dist/geography/cycles.mjs +3 -3
- package/dist/geometry/board/preset.d.mts +2 -0
- package/dist/geometry/board/preset.mjs +11 -15
- package/dist/geometry/builder.mjs +3 -3
- package/dist/ict/number-systems/base-odometer.mjs +4 -4
- package/dist/ict/number-systems/bit-grouper.d.mts +1 -1
- package/dist/ict/number-systems/bit-grouper.mjs +4 -4
- package/dist/ict/number-systems/place-value-dial.d.mts +1 -1
- package/dist/ict/number-systems/place-value-dial.mjs +3 -3
- package/dist/ict/number-systems/wheel.d.mts +3 -3
- package/dist/ict/number-systems/wheel.mjs +4 -4
- package/dist/kit/annotate.mjs +3 -3
- package/dist/kit/answer-check.d.mts +2 -2
- package/dist/kit/answer-check.mjs +34 -6
- package/dist/kit/ask.d.mts +19 -0
- package/dist/kit/ask.mjs +46 -0
- package/dist/kit/bar-strip.mjs +53 -0
- package/dist/kit/calc.d.mts +33 -0
- package/dist/kit/calc.mjs +27 -0
- package/dist/kit/carrier-engine.mjs +147 -0
- package/dist/kit/clue-scene.d.mts +86 -0
- package/dist/kit/clue-scene.mjs +424 -0
- package/dist/kit/cluster.d.mts +30 -0
- package/dist/kit/cluster.mjs +81 -0
- package/dist/kit/controls.mjs +11 -5
- package/dist/kit/coords.d.mts +88 -0
- package/dist/kit/coords.mjs +192 -0
- package/dist/kit/data-scene.d.mts +27 -0
- package/dist/kit/data-scene.mjs +199 -0
- package/dist/kit/diagram.mjs +111 -50
- package/dist/kit/electronics.mjs +552 -60
- package/dist/kit/expr-analysis.d.mts +18 -6
- package/dist/kit/expr-analysis.mjs +82 -28
- package/dist/kit/frame.d.mts +3 -3
- package/dist/kit/frame.mjs +25 -6
- package/dist/kit/gameshow.mjs +2 -2
- package/dist/kit/index.d.mts +14 -2
- package/dist/kit/index.mjs +13 -1
- package/dist/kit/logic-gates.mjs +246 -47
- package/dist/kit/palette.mjs +26 -0
- package/dist/kit/pedagogy.d.mts +4 -4
- package/dist/kit/pedagogy.mjs +21 -17
- package/dist/kit/play.d.mts +1 -1
- package/dist/kit/play.mjs +3 -3
- package/dist/kit/predict.d.mts +55 -0
- package/dist/kit/predict.mjs +146 -0
- package/dist/kit/receipt.d.mts +29 -0
- package/dist/kit/receipt.mjs +94 -0
- package/dist/kit/rich.mjs +2 -2
- package/dist/kit/rule.d.mts +59 -0
- package/dist/kit/rule.mjs +215 -0
- package/dist/kit/scale.mjs +1 -1
- package/dist/kit/scene-library.d.mts +22 -0
- package/dist/kit/scene-library.mjs +311 -0
- package/dist/kit/scene-studio.d.mts +14 -0
- package/dist/kit/scene-studio.mjs +338 -0
- package/dist/kit/scenes.d.mts +31 -0
- package/dist/kit/scenes.mjs +569 -0
- package/dist/kit/slot-fill.d.mts +61 -0
- package/dist/kit/slot-fill.mjs +207 -0
- package/dist/kit/solve.d.mts +21 -0
- package/dist/kit/solve.mjs +75 -0
- package/dist/kit/space.mjs +5 -5
- package/dist/kit/steps.mjs +2 -2
- package/dist/kit/vessel.d.mts +69 -0
- package/dist/kit/vessel.mjs +191 -0
- package/dist/language/agreement/preset.mjs +2 -2
- package/dist/language/article-lens/preset.d.mts +1 -1
- package/dist/language/article-lens/preset.mjs +8 -8
- package/dist/language/deck.d.mts +3 -3
- package/dist/language/deck.mjs +1 -1
- package/dist/language/preposition-scene/preset.d.mts +2 -2
- package/dist/language/preposition-scene/preset.mjs +5 -5
- package/dist/language/sentence-builder/preset.mjs +5 -5
- package/dist/language/transform/preset.d.mts +2 -2
- package/dist/language/transform/preset.mjs +5 -5
- package/dist/language/ui.d.mts +3 -3
- package/dist/language/ui.mjs +4 -4
- package/dist/language/word-match/preset.mjs +3 -3
- package/dist/logic/LogicBuildLab.d.mts +22 -0
- package/dist/logic/LogicBuildLab.mjs +170 -0
- package/dist/logic/LogicEditScene.d.mts +31 -0
- package/dist/logic/LogicEditScene.mjs +276 -0
- package/dist/logic/LogicEditor.d.mts +14 -0
- package/dist/logic/LogicEditor.mjs +413 -0
- package/dist/logic/LogicScene.d.mts +32 -0
- package/dist/logic/LogicScene.mjs +277 -0
- package/dist/logic/contract.d.mts +72 -0
- package/dist/logic/display.d.mts +24 -0
- package/dist/logic/display.mjs +127 -0
- package/dist/logic/edit-ops.d.mts +44 -0
- package/dist/logic/edit-ops.mjs +177 -0
- package/dist/logic/evaluate.d.mts +11 -0
- package/dist/logic/evaluate.mjs +93 -0
- package/dist/logic/gates.d.mts +10 -0
- package/dist/logic/gates.mjs +73 -0
- package/dist/logic/index.d.mts +14 -0
- package/dist/logic/index.mjs +13 -0
- package/dist/logic/lab.d.mts +32 -0
- package/dist/logic/lab.mjs +160 -0
- package/dist/logic/presets.d.mts +12 -0
- package/dist/logic/presets.mjs +241 -0
- package/dist/logic/registry.d.mts +9 -0
- package/dist/logic/registry.mjs +15 -0
- package/dist/math/area-model/preset.mjs +70 -44
- package/dist/math/balance-algebra/preset.mjs +14 -5
- package/dist/math/broken-tree/index.d.mts +1 -0
- package/dist/math/broken-tree/preset.d.mts +26 -0
- package/dist/math/broken-tree/preset.mjs +435 -0
- package/dist/math/circle/index.d.mts +1 -0
- package/dist/math/circle/preset.d.mts +44 -0
- package/dist/math/circle/preset.mjs +198 -0
- package/dist/math/complex/core.d.mts +93 -0
- package/dist/math/complex/core.mjs +239 -0
- package/dist/math/complex/index.d.mts +3 -0
- package/dist/math/complex/preset.d.mts +31 -0
- package/dist/math/complex/preset.mjs +377 -0
- package/dist/math/complex/rules.d.mts +6 -0
- package/dist/math/complex/rules.mjs +121 -0
- package/dist/math/conic/index.d.mts +1 -0
- package/dist/math/conic/preset.d.mts +30 -0
- package/dist/math/conic/preset.mjs +334 -0
- package/dist/math/derivation.mjs +5 -5
- package/dist/math/derivative-explorer/preset.mjs +5 -5
- package/dist/math/domain-range/index.d.mts +1 -0
- package/dist/math/domain-range/preset.d.mts +33 -0
- package/dist/math/domain-range/preset.mjs +313 -0
- package/dist/math/fraction-bar/index.d.mts +1 -0
- package/dist/math/fraction-bar/preset.d.mts +27 -0
- package/dist/math/fraction-bar/preset.mjs +197 -0
- package/dist/math/function-machine/preset.mjs +2 -2
- package/dist/math/gradient-descent.mjs +6 -6
- package/dist/math/grapher/preset.d.mts +1 -1
- package/dist/math/grapher/preset.mjs +4 -4
- package/dist/math/harmonic-form/preset.mjs +6 -6
- package/dist/math/index.d.mts +27 -2
- package/dist/math/index.mjs +27 -2
- package/dist/math/integral-explorer/preset.mjs +2 -2
- package/dist/math/interactive/preset.mjs +3 -3
- package/dist/math/limit-explorer/preset.mjs +4 -4
- package/dist/math/linear-model/index.d.mts +1 -0
- package/dist/math/linear-model/preset.d.mts +53 -0
- package/dist/math/linear-model/preset.mjs +164 -0
- package/dist/math/linear-system/preset.mjs +4 -4
- package/dist/math/mystery-bucket/preset.mjs +6 -6
- package/dist/math/number-line/preset.mjs +3 -2
- package/dist/math/parabola/preset.mjs +4 -3
- package/dist/math/pattern/preset.mjs +7 -13
- package/dist/math/percent-bar/index.d.mts +1 -0
- package/dist/math/percent-bar/preset.d.mts +37 -0
- package/dist/math/percent-bar/preset.mjs +275 -0
- package/dist/math/poly/core.d.mts +50 -0
- package/dist/math/poly/core.mjs +268 -0
- package/dist/math/poly/index.d.mts +3 -0
- package/dist/math/poly/preset.d.mts +23 -0
- package/dist/math/poly/preset.mjs +141 -0
- package/dist/math/poly/steps.d.mts +10 -0
- package/dist/math/poly/steps.mjs +99 -0
- package/dist/math/rate-machine/index.d.mts +1 -0
- package/dist/math/rate-machine/preset.d.mts +35 -0
- package/dist/math/rate-machine/preset.mjs +281 -0
- package/dist/math/ratio-share/index.d.mts +1 -0
- package/dist/math/ratio-share/preset.d.mts +24 -0
- package/dist/math/ratio-share/preset.mjs +204 -0
- package/dist/math/receipt/index.d.mts +1 -0
- package/dist/math/receipt/preset.d.mts +22 -0
- package/dist/math/receipt/preset.mjs +137 -0
- package/dist/math/sequence-predict/index.d.mts +1 -0
- package/dist/math/sequence-predict/preset.d.mts +34 -0
- package/dist/math/sequence-predict/preset.mjs +130 -0
- package/dist/math/straight-line/index.d.mts +1 -0
- package/dist/math/straight-line/preset.d.mts +37 -0
- package/dist/math/straight-line/preset.mjs +374 -0
- package/dist/math/system-solve/index.d.mts +1 -0
- package/dist/math/system-solve/preset.d.mts +21 -0
- package/dist/math/system-solve/preset.mjs +227 -0
- package/dist/math/transform/index.d.mts +1 -0
- package/dist/math/transform/preset.d.mts +41 -0
- package/dist/math/transform/preset.mjs +343 -0
- package/dist/math/triangle-trig/preset.mjs +12 -9
- package/dist/math/trig/core.d.mts +37 -0
- package/dist/math/trig/core.mjs +150 -0
- package/dist/math/trig/diagrams.d.mts +1 -0
- package/dist/math/trig/diagrams.mjs +321 -0
- package/dist/math/trig/index.d.mts +3 -0
- package/dist/math/trig/preset.d.mts +25 -0
- package/dist/math/trig/preset.mjs +260 -0
- package/dist/math/trig/rules.d.mts +6 -0
- package/dist/math/trig/rules.mjs +159 -0
- package/dist/math/trig-explorer.mjs +4 -4
- package/dist/ml/boundary/preset.mjs +8 -3
- package/dist/ml/classifier/preset.mjs +31 -6
- package/dist/ml/kmeans/preset.mjs +4 -4
- package/dist/ml/knn/preset.mjs +47 -12
- package/dist/ml/regression/preset.mjs +36 -7
- package/dist/physics/atwood/preset.mjs +4 -4
- package/dist/physics/bullet-walls/preset.d.mts +1 -1
- package/dist/physics/bullet-walls/preset.mjs +7 -7
- package/dist/physics/carnot/preset.mjs +6 -6
- package/dist/physics/circular-motion/preset.mjs +36 -5
- package/dist/physics/collision-track/preset.mjs +35 -5
- package/dist/physics/efficiency/preset.d.mts +2 -2
- package/dist/physics/efficiency/preset.mjs +5 -5
- package/dist/physics/electric-field/preset.mjs +32 -23
- package/dist/physics/electric-flux/index.d.mts +1 -0
- package/dist/physics/electric-flux/preset.d.mts +29 -0
- package/dist/physics/electric-flux/preset.mjs +264 -0
- package/dist/physics/energy-skate/preset.mjs +5 -5
- package/dist/physics/entropy/preset.mjs +7 -7
- package/dist/physics/expansion/preset.mjs +13 -13
- package/dist/physics/exponential/asset.mjs +1 -1
- package/dist/physics/exponential/preset.mjs +4 -4
- package/dist/physics/gas-process/preset.mjs +3 -3
- package/dist/physics/gauss-law/index.d.mts +1 -0
- package/dist/physics/gauss-law/preset.d.mts +20 -0
- package/dist/physics/gauss-law/preset.mjs +286 -0
- package/dist/physics/gravitation/preset.mjs +7 -7
- package/dist/physics/gravity-drop.mjs +4 -4
- package/dist/physics/heat-transfer/preset.d.mts +1 -1
- package/dist/physics/heat-transfer/preset.mjs +10 -10
- package/dist/physics/impulse/preset.mjs +5 -5
- package/dist/physics/index.d.mts +4 -1
- package/dist/physics/index.mjs +4 -1
- package/dist/physics/kepler/preset.mjs +4 -4
- package/dist/physics/lever/preset.mjs +3 -3
- package/dist/physics/lorentz/preset.mjs +11 -11
- package/dist/physics/magnetism/preset.mjs +3 -3
- package/dist/physics/optics/preset.mjs +2 -2
- package/dist/physics/orbit-lab.mjs +5 -5
- package/dist/physics/projectile-lab.mjs +4 -4
- package/dist/physics/rain-relative/preset.mjs +5 -5
- package/dist/physics/ramp-forces/preset.mjs +5 -5
- package/dist/physics/river-boat.mjs +6 -6
- package/dist/physics/shm/preset.mjs +9 -9
- package/dist/physics/stopping-distance/preset.mjs +3 -3
- package/dist/physics/temperature-scales/preset.mjs +105 -116
- package/dist/physics/terminal-velocity/preset.mjs +5 -5
- package/dist/physics/thermal/preset.mjs +5 -5
- package/dist/physics/vector-board/preset.mjs +7 -6
- package/dist/physics/vector-scene.mjs +2 -2
- package/dist/physics/vector-types/preset.mjs +37 -3
- package/dist/physics/water-density/preset.mjs +12 -12
- package/dist/physics/waves/doppler.mjs +2 -2
- package/dist/physics/waves/preset.mjs +4 -4
- package/dist/physics/waves/ripple.mjs +6 -6
- package/dist/physics/waves/string.mjs +5 -5
- package/dist/physics/work-energy/preset.mjs +4 -4
- package/dist/physics/work-potential/index.d.mts +1 -0
- package/dist/physics/work-potential/preset.d.mts +20 -0
- package/dist/physics/work-potential/preset.mjs +276 -0
- package/dist/schemas/index.d.mts +6 -6
- package/dist/schemas/index.mjs +3 -3
- package/dist/statistics/center-spread/preset.mjs +3 -3
- package/dist/statistics/core/descriptive.d.mts +2 -2
- package/dist/statistics/core/descriptive.mjs +2 -2
- package/dist/statistics/core/normal.d.mts +3 -3
- package/dist/statistics/core/normal.mjs +3 -3
- package/dist/statistics/core/sequences.d.mts +1 -1
- package/dist/statistics/galton/preset.mjs +2 -2
- package/dist/statistics/histogram/preset.mjs +6 -6
- package/dist/statistics/normal/preset.mjs +2 -2
- package/dist/statistics/sampling/preset.mjs +4 -4
- package/dist/statistics/sequence/preset.mjs +58 -15
- package/dist/statistics/z-table/preset.mjs +17 -4
- package/package.json +11 -3
- package/styles.css +4 -1
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { Chip } from "../../kit/controls.mjs";
|
|
4
|
+
import { Callout, ControlBar, LabFrame } from "../../kit/frame.mjs";
|
|
5
|
+
import { ChallengeCard, HintLadder, useChallenge, useCheckpoint, useHints } from "../../kit/pedagogy.mjs";
|
|
6
|
+
import { ruleOfProduct } from "../core/combinatorics.mjs";
|
|
7
|
+
import { CharacterFigure, ComboCard, OptionSwatch } from "./figure.mjs";
|
|
8
|
+
import { useMemo, useState } from "react";
|
|
9
|
+
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
10
|
+
|
|
11
|
+
//#region src/discrete/combination-studio/preset.tsx
|
|
12
|
+
/**
|
|
13
|
+
* CombinationStudioLab, the rule of product you can FEEL. Instead of reading
|
|
14
|
+
* "3 × 2 = 6", the learner:
|
|
15
|
+
* 1. picks one option from each rack (a shirt, some trousers) and watches a
|
|
16
|
+
* little character assemble live, so every outcome is a thing, not a label;
|
|
17
|
+
* 2. PREDICTS how many different ones exist before exploring (predict-first);
|
|
18
|
+
* 3. fills a discovery wall by making each combination, the wall is literally a
|
|
19
|
+
* rows × columns grid, so the product IS an area they complete;
|
|
20
|
+
* 4. adds a third variable (a hat) and watches 3 × 2 = 6 become 3 × 2 × 2 = 12,
|
|
21
|
+
* feeling why a new choice MULTIPLIES.
|
|
22
|
+
*
|
|
23
|
+
* Fully authorable: a creator supplies any scenario (outfits, sundaes, number
|
|
24
|
+
* plates, routes) as categories of options. Pure cartesian-product enumeration;
|
|
25
|
+
* the count uses ruleOfProduct from the discrete kernel.
|
|
26
|
+
*/
|
|
27
|
+
const DEFAULT_CATS = [
|
|
28
|
+
{
|
|
29
|
+
id: "shirt",
|
|
30
|
+
label: "Shirt",
|
|
31
|
+
slot: "top",
|
|
32
|
+
options: [
|
|
33
|
+
{
|
|
34
|
+
id: "r",
|
|
35
|
+
label: "red",
|
|
36
|
+
color: "#e5484d"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: "b",
|
|
40
|
+
label: "blue",
|
|
41
|
+
color: "#3e63dd"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
id: "g",
|
|
45
|
+
label: "green",
|
|
46
|
+
color: "#30a46c"
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
id: "trousers",
|
|
52
|
+
label: "Trousers",
|
|
53
|
+
slot: "bottom",
|
|
54
|
+
options: [{
|
|
55
|
+
id: "d",
|
|
56
|
+
label: "denim",
|
|
57
|
+
color: "#2b4a8b"
|
|
58
|
+
}, {
|
|
59
|
+
id: "k",
|
|
60
|
+
label: "khaki",
|
|
61
|
+
color: "#a18249"
|
|
62
|
+
}]
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
id: "hat",
|
|
66
|
+
label: "Hat",
|
|
67
|
+
slot: "hat",
|
|
68
|
+
options: [{
|
|
69
|
+
id: "o",
|
|
70
|
+
label: "orange",
|
|
71
|
+
color: "#f76808"
|
|
72
|
+
}, {
|
|
73
|
+
id: "p",
|
|
74
|
+
label: "purple",
|
|
75
|
+
color: "#8e4ec6"
|
|
76
|
+
}]
|
|
77
|
+
}
|
|
78
|
+
];
|
|
79
|
+
/** cartesian product of the active categories' option lists. */
|
|
80
|
+
function enumerate(cats) {
|
|
81
|
+
let acc = [[]];
|
|
82
|
+
for (const c of cats) acc = acc.flatMap((row) => c.options.map((o) => [...row, o]));
|
|
83
|
+
return acc.map((picks) => ({
|
|
84
|
+
key: picks.map((o) => o.id).join("|"),
|
|
85
|
+
picks
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
function partsOf(cats, picks) {
|
|
89
|
+
const p = {};
|
|
90
|
+
cats.forEach((c, i) => {
|
|
91
|
+
const o = picks[i];
|
|
92
|
+
if (!o) return;
|
|
93
|
+
if (c.slot === "top") p.top = o.color;
|
|
94
|
+
else if (c.slot === "bottom") p.bottom = o.color;
|
|
95
|
+
else if (c.slot === "hat") p.hat = o.color;
|
|
96
|
+
else if (c.slot === "hold") p.hold = o.emoji;
|
|
97
|
+
});
|
|
98
|
+
return p;
|
|
99
|
+
}
|
|
100
|
+
function CombinationStudioLab({ scenario = "outfit", categories = DEFAULT_CATS, figure = "character", startActive, maxWall = 60, title = `How many ${scenario}s can you make?`, prompt = "Pick one from each rack, make it, and fill the wall. Each new choice multiplies the total.", objectives, hints: hintList } = {}) {
|
|
101
|
+
const minActive = Math.min(2, categories.length);
|
|
102
|
+
const [active, setActive] = useState(Math.max(1, Math.min(startActive ?? minActive, categories.length)));
|
|
103
|
+
const cats = categories.slice(0, active);
|
|
104
|
+
const [picks, setPicks] = useState(() => Object.fromEntries(categories.map((c) => [c.id, c.options[0].id])));
|
|
105
|
+
const [found, setFound] = useState(/* @__PURE__ */ new Set());
|
|
106
|
+
const hints = useHints(hintList);
|
|
107
|
+
const combos = useMemo(() => enumerate(cats), [cats]);
|
|
108
|
+
const sizes = cats.map((c) => c.options.length);
|
|
109
|
+
const total = ruleOfProduct(...sizes);
|
|
110
|
+
const tooMany = total > maxWall;
|
|
111
|
+
const currentPicks = cats.map((c) => c.options.find((o) => o.id === picks[c.id]) ?? c.options[0]);
|
|
112
|
+
const currentKey = currentPicks.map((o) => o.id).join("|");
|
|
113
|
+
const madeCurrent = found.has(currentKey);
|
|
114
|
+
const choices = [total, ...[
|
|
115
|
+
total + sizes[active - 1],
|
|
116
|
+
sizes.reduce((a, b) => a + b, 0),
|
|
117
|
+
Math.max(1, total - 2)
|
|
118
|
+
].filter((d) => d !== total).slice(0, 2)].sort((a, b) => a - b).map((n) => ({
|
|
119
|
+
value: String(n),
|
|
120
|
+
label: String(n)
|
|
121
|
+
}));
|
|
122
|
+
const questions = useMemo(() => [{
|
|
123
|
+
id: `q-${active}-${total}`,
|
|
124
|
+
prompt: `With ${cats.map((c, i) => `${sizes[i]} ${c.label.toLowerCase()}${sizes[i] > 1 ? "s" : ""}`).join(" and ")}, how many different ${scenario}s?`,
|
|
125
|
+
choices,
|
|
126
|
+
answer: String(total),
|
|
127
|
+
explain: `Yes: ${sizes.join(" × ")} = ${total}. Each independent choice multiplies.`
|
|
128
|
+
}], [active, total]);
|
|
129
|
+
const challenge = useChallenge(questions);
|
|
130
|
+
const allFound = found.size >= total && total > 0;
|
|
131
|
+
useCheckpoint({
|
|
132
|
+
solved: allFound,
|
|
133
|
+
activity: `combination-studio:${scenario}`,
|
|
134
|
+
hintsUsed: hints.count
|
|
135
|
+
});
|
|
136
|
+
const make = () => setFound((f) => new Set(f).add(currentKey));
|
|
137
|
+
const pickOpt = (catId, optId) => setPicks((p) => ({
|
|
138
|
+
...p,
|
|
139
|
+
[catId]: optId
|
|
140
|
+
}));
|
|
141
|
+
const addVar = () => {
|
|
142
|
+
setActive((a) => Math.min(categories.length, a + 1));
|
|
143
|
+
setFound(/* @__PURE__ */ new Set());
|
|
144
|
+
};
|
|
145
|
+
const dropVar = () => {
|
|
146
|
+
setActive((a) => Math.max(1, a - 1));
|
|
147
|
+
setFound(/* @__PURE__ */ new Set());
|
|
148
|
+
};
|
|
149
|
+
const reset = () => setFound(/* @__PURE__ */ new Set());
|
|
150
|
+
const FoundFig = ({ combo, size }) => figure === "character" ? /* @__PURE__ */ jsx(CharacterFigure, {
|
|
151
|
+
parts: partsOf(cats, combo.picks),
|
|
152
|
+
size,
|
|
153
|
+
dim: !found.has(combo.key)
|
|
154
|
+
}) : /* @__PURE__ */ jsx(ComboCard, {
|
|
155
|
+
cells: cats.map((c, i) => ({
|
|
156
|
+
emoji: combo.picks[i].emoji,
|
|
157
|
+
color: combo.picks[i].color
|
|
158
|
+
})),
|
|
159
|
+
size,
|
|
160
|
+
dim: !found.has(combo.key)
|
|
161
|
+
});
|
|
162
|
+
const grid2d = active === 2 && !tooMany;
|
|
163
|
+
const rows = grid2d ? cats[0].options : [];
|
|
164
|
+
const cols = grid2d ? cats[1].options : [];
|
|
165
|
+
const figureEl = /* @__PURE__ */ jsxs("div", {
|
|
166
|
+
style: {
|
|
167
|
+
display: "grid",
|
|
168
|
+
gap: 16
|
|
169
|
+
},
|
|
170
|
+
children: [
|
|
171
|
+
/* @__PURE__ */ jsxs("div", {
|
|
172
|
+
style: {
|
|
173
|
+
display: "flex",
|
|
174
|
+
alignItems: "center",
|
|
175
|
+
justifyContent: "center",
|
|
176
|
+
gap: 8,
|
|
177
|
+
flexWrap: "wrap",
|
|
178
|
+
fontSize: 20,
|
|
179
|
+
fontWeight: 800
|
|
180
|
+
},
|
|
181
|
+
children: [
|
|
182
|
+
cats.map((c, i) => /* @__PURE__ */ jsxs("span", {
|
|
183
|
+
style: {
|
|
184
|
+
display: "inline-flex",
|
|
185
|
+
alignItems: "baseline",
|
|
186
|
+
gap: 5
|
|
187
|
+
},
|
|
188
|
+
children: [
|
|
189
|
+
i > 0 && /* @__PURE__ */ jsx("span", {
|
|
190
|
+
style: { color: "var(--stage-muted)" },
|
|
191
|
+
children: "×"
|
|
192
|
+
}),
|
|
193
|
+
/* @__PURE__ */ jsx("span", {
|
|
194
|
+
style: { color: "var(--stage-accent)" },
|
|
195
|
+
children: sizes[i]
|
|
196
|
+
}),
|
|
197
|
+
/* @__PURE__ */ jsxs("span", {
|
|
198
|
+
style: {
|
|
199
|
+
fontSize: 12,
|
|
200
|
+
color: "var(--stage-muted)",
|
|
201
|
+
fontWeight: 600
|
|
202
|
+
},
|
|
203
|
+
children: [c.label.toLowerCase(), sizes[i] > 1 ? "s" : ""]
|
|
204
|
+
})
|
|
205
|
+
]
|
|
206
|
+
}, c.id)),
|
|
207
|
+
/* @__PURE__ */ jsx("span", {
|
|
208
|
+
style: { color: "var(--stage-muted)" },
|
|
209
|
+
children: "="
|
|
210
|
+
}),
|
|
211
|
+
/* @__PURE__ */ jsx("span", {
|
|
212
|
+
style: { color: "var(--stage-good)" },
|
|
213
|
+
children: total
|
|
214
|
+
}),
|
|
215
|
+
/* @__PURE__ */ jsxs("span", {
|
|
216
|
+
style: {
|
|
217
|
+
fontSize: 13,
|
|
218
|
+
color: "var(--stage-muted)",
|
|
219
|
+
fontWeight: 600
|
|
220
|
+
},
|
|
221
|
+
children: [
|
|
222
|
+
found.size,
|
|
223
|
+
"/",
|
|
224
|
+
total,
|
|
225
|
+
" found"
|
|
226
|
+
]
|
|
227
|
+
})
|
|
228
|
+
]
|
|
229
|
+
}),
|
|
230
|
+
/* @__PURE__ */ jsxs("div", {
|
|
231
|
+
style: {
|
|
232
|
+
display: "flex",
|
|
233
|
+
gap: 18,
|
|
234
|
+
alignItems: "center",
|
|
235
|
+
justifyContent: "center",
|
|
236
|
+
flexWrap: "wrap",
|
|
237
|
+
padding: "10px 6px",
|
|
238
|
+
borderRadius: 14,
|
|
239
|
+
background: "var(--stage-bg)",
|
|
240
|
+
border: "1px solid var(--stage-grid)"
|
|
241
|
+
},
|
|
242
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
243
|
+
style: {
|
|
244
|
+
display: "grid",
|
|
245
|
+
gap: 8
|
|
246
|
+
},
|
|
247
|
+
children: cats.map((c) => /* @__PURE__ */ jsxs("div", {
|
|
248
|
+
style: {
|
|
249
|
+
display: "flex",
|
|
250
|
+
alignItems: "center",
|
|
251
|
+
gap: 8,
|
|
252
|
+
flexWrap: "wrap"
|
|
253
|
+
},
|
|
254
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
255
|
+
style: {
|
|
256
|
+
width: 64,
|
|
257
|
+
fontSize: 12,
|
|
258
|
+
fontWeight: 700,
|
|
259
|
+
color: "var(--stage-muted)",
|
|
260
|
+
textAlign: "right"
|
|
261
|
+
},
|
|
262
|
+
children: c.label
|
|
263
|
+
}), c.options.map((o) => /* @__PURE__ */ jsx(OptionSwatch, {
|
|
264
|
+
emoji: o.emoji,
|
|
265
|
+
color: o.color,
|
|
266
|
+
label: o.label,
|
|
267
|
+
selected: picks[c.id] === o.id,
|
|
268
|
+
onClick: () => pickOpt(c.id, o.id)
|
|
269
|
+
}, o.id))]
|
|
270
|
+
}, c.id))
|
|
271
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
272
|
+
style: {
|
|
273
|
+
display: "grid",
|
|
274
|
+
justifyItems: "center",
|
|
275
|
+
gap: 6
|
|
276
|
+
},
|
|
277
|
+
children: [figure === "character" ? /* @__PURE__ */ jsx(CharacterFigure, {
|
|
278
|
+
parts: partsOf(cats, currentPicks),
|
|
279
|
+
size: 96
|
|
280
|
+
}) : /* @__PURE__ */ jsx(ComboCard, {
|
|
281
|
+
cells: cats.map((c, i) => ({
|
|
282
|
+
emoji: currentPicks[i].emoji,
|
|
283
|
+
color: currentPicks[i].color
|
|
284
|
+
})),
|
|
285
|
+
size: 84
|
|
286
|
+
}), /* @__PURE__ */ jsx("button", {
|
|
287
|
+
type: "button",
|
|
288
|
+
onClick: make,
|
|
289
|
+
disabled: madeCurrent,
|
|
290
|
+
className: "lab-btn",
|
|
291
|
+
style: { opacity: madeCurrent ? .5 : 1 },
|
|
292
|
+
children: madeCurrent ? "✓ already made" : "+ make this one"
|
|
293
|
+
})]
|
|
294
|
+
})]
|
|
295
|
+
}),
|
|
296
|
+
tooMany ? /* @__PURE__ */ jsxs("p", {
|
|
297
|
+
style: {
|
|
298
|
+
margin: 0,
|
|
299
|
+
padding: 12,
|
|
300
|
+
borderRadius: 10,
|
|
301
|
+
border: "1px dashed var(--stage-grid)",
|
|
302
|
+
color: "var(--stage-muted)"
|
|
303
|
+
},
|
|
304
|
+
children: [
|
|
305
|
+
"That is ",
|
|
306
|
+
/* @__PURE__ */ jsx("b", { children: total }),
|
|
307
|
+
" combinations, too many to draw, but the rule of product still gives the count without listing them. Drop a variable to see them all."
|
|
308
|
+
]
|
|
309
|
+
}) : grid2d ? /* @__PURE__ */ jsxs("div", {
|
|
310
|
+
style: {
|
|
311
|
+
display: "grid",
|
|
312
|
+
gridTemplateColumns: `auto repeat(${cols.length}, 1fr)`,
|
|
313
|
+
gap: 6,
|
|
314
|
+
alignItems: "center",
|
|
315
|
+
justifyItems: "center"
|
|
316
|
+
},
|
|
317
|
+
children: [
|
|
318
|
+
/* @__PURE__ */ jsx("span", {}),
|
|
319
|
+
cols.map((o) => /* @__PURE__ */ jsx("span", {
|
|
320
|
+
style: {
|
|
321
|
+
fontSize: 11,
|
|
322
|
+
fontWeight: 700,
|
|
323
|
+
color: "var(--stage-muted)"
|
|
324
|
+
},
|
|
325
|
+
children: o.label
|
|
326
|
+
}, o.id)),
|
|
327
|
+
rows.map((r, ri) => /* @__PURE__ */ jsx(FragmentRow, {
|
|
328
|
+
label: r.label,
|
|
329
|
+
children: cols.map((cOpt, ci) => {
|
|
330
|
+
const combo = combos[ri * cols.length + ci];
|
|
331
|
+
const isFound = found.has(combo.key);
|
|
332
|
+
return /* @__PURE__ */ jsx("div", {
|
|
333
|
+
style: {
|
|
334
|
+
padding: 4,
|
|
335
|
+
borderRadius: 10,
|
|
336
|
+
border: `1.5px solid ${isFound ? "var(--stage-good)" : "var(--stage-grid)"}`,
|
|
337
|
+
background: isFound ? "color-mix(in oklab, var(--stage-good) 12%, transparent)" : "transparent"
|
|
338
|
+
},
|
|
339
|
+
children: /* @__PURE__ */ jsx(FoundFig, {
|
|
340
|
+
combo,
|
|
341
|
+
size: 48
|
|
342
|
+
})
|
|
343
|
+
}, cOpt.id);
|
|
344
|
+
})
|
|
345
|
+
}, r.id))
|
|
346
|
+
]
|
|
347
|
+
}) : /* @__PURE__ */ jsx("div", {
|
|
348
|
+
style: {
|
|
349
|
+
display: "flex",
|
|
350
|
+
flexWrap: "wrap",
|
|
351
|
+
gap: 6,
|
|
352
|
+
justifyContent: "center"
|
|
353
|
+
},
|
|
354
|
+
children: combos.map((combo) => {
|
|
355
|
+
const isFound = found.has(combo.key);
|
|
356
|
+
return /* @__PURE__ */ jsx("div", {
|
|
357
|
+
style: {
|
|
358
|
+
padding: 4,
|
|
359
|
+
borderRadius: 10,
|
|
360
|
+
border: `1.5px solid ${isFound ? "var(--stage-good)" : "var(--stage-grid)"}`,
|
|
361
|
+
background: isFound ? "color-mix(in oklab, var(--stage-good) 12%, transparent)" : "transparent"
|
|
362
|
+
},
|
|
363
|
+
children: /* @__PURE__ */ jsx(FoundFig, {
|
|
364
|
+
combo,
|
|
365
|
+
size: 46
|
|
366
|
+
})
|
|
367
|
+
}, combo.key);
|
|
368
|
+
})
|
|
369
|
+
})
|
|
370
|
+
]
|
|
371
|
+
});
|
|
372
|
+
return /* @__PURE__ */ jsx(LabFrame, {
|
|
373
|
+
title,
|
|
374
|
+
prompt,
|
|
375
|
+
objectives,
|
|
376
|
+
aside: /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(ChallengeCard, {
|
|
377
|
+
questions,
|
|
378
|
+
state: challenge,
|
|
379
|
+
title: "Predict first"
|
|
380
|
+
}), /* @__PURE__ */ jsx(Callout, {
|
|
381
|
+
tone: allFound ? "result" : "info",
|
|
382
|
+
children: allFound ? /* @__PURE__ */ jsxs("span", {
|
|
383
|
+
style: {
|
|
384
|
+
color: "var(--stage-good)",
|
|
385
|
+
fontWeight: 700
|
|
386
|
+
},
|
|
387
|
+
children: [
|
|
388
|
+
"You made all ",
|
|
389
|
+
total,
|
|
390
|
+
". That is exactly ",
|
|
391
|
+
sizes.join(" × "),
|
|
392
|
+
" = ",
|
|
393
|
+
total,
|
|
394
|
+
": every choice multiplied."
|
|
395
|
+
]
|
|
396
|
+
}) : /* @__PURE__ */ jsxs("span", {
|
|
397
|
+
style: { color: "var(--stage-muted)" },
|
|
398
|
+
children: [
|
|
399
|
+
"Make every ",
|
|
400
|
+
scenario,
|
|
401
|
+
" to fill the wall. Then add a variable and watch the total multiply."
|
|
402
|
+
]
|
|
403
|
+
})
|
|
404
|
+
})] }),
|
|
405
|
+
controls: /* @__PURE__ */ jsxs(ControlBar, { children: [
|
|
406
|
+
/* @__PURE__ */ jsx(Chip, {
|
|
407
|
+
selected: false,
|
|
408
|
+
onClick: addVar,
|
|
409
|
+
children: "+ add a variable"
|
|
410
|
+
}),
|
|
411
|
+
/* @__PURE__ */ jsx(Chip, {
|
|
412
|
+
selected: false,
|
|
413
|
+
onClick: dropVar,
|
|
414
|
+
children: "− drop a variable"
|
|
415
|
+
}),
|
|
416
|
+
/* @__PURE__ */ jsx(Chip, {
|
|
417
|
+
selected: false,
|
|
418
|
+
onClick: reset,
|
|
419
|
+
children: "clear wall"
|
|
420
|
+
})
|
|
421
|
+
] }),
|
|
422
|
+
footer: /* @__PURE__ */ jsx(HintLadder, { hints }),
|
|
423
|
+
children: figureEl
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
/** A grid row: the row label cell + its children cells (keeps JSX flat above). */
|
|
427
|
+
function FragmentRow({ label, children }) {
|
|
428
|
+
return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("span", {
|
|
429
|
+
style: {
|
|
430
|
+
fontSize: 11,
|
|
431
|
+
fontWeight: 700,
|
|
432
|
+
color: "var(--stage-muted)",
|
|
433
|
+
justifySelf: "end"
|
|
434
|
+
},
|
|
435
|
+
children: label
|
|
436
|
+
}), children] });
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
//#endregion
|
|
440
|
+
export { CombinationStudioLab };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region src/discrete/core/combinatorics.d.ts
|
|
2
2
|
/**
|
|
3
|
-
* Combinatorics kernel
|
|
3
|
+
* Combinatorics kernel, the counting source-of-truth every discrete-math lab
|
|
4
4
|
* trusts (so an agent narrates these, never computes its own). Pure, integer,
|
|
5
5
|
* dependency-free. The headline identity the Counting lab is built on:
|
|
6
6
|
* nCr(n,k) = nPr(n,k) / k! ("overcount by order, then divide it out").
|
|
@@ -10,14 +10,34 @@ declare function factorial(n: number): number;
|
|
|
10
10
|
declare function nPr(n: number, r: number): number;
|
|
11
11
|
/** Unordered selections: nPr/k!, via the exact step-wise multiplicative form. */
|
|
12
12
|
declare function nCr(n: number, r: number): number;
|
|
13
|
-
/** Binomial coefficient
|
|
13
|
+
/** Binomial coefficient, alias of nCr (the "n choose k"). */
|
|
14
14
|
declare const binomial: typeof nCr;
|
|
15
15
|
/** Arrangements of a multiset: n! / (k1! k2! …), where Σki = n. */
|
|
16
16
|
declare function multinomial(...counts: number[]): number;
|
|
17
17
|
/** Stars and bars: ways to place n identical items into k distinct bins =
|
|
18
18
|
* C(n+k−1, k−1). */
|
|
19
19
|
declare function starsAndBars(n: number, k: number): number;
|
|
20
|
+
/** Rule of PRODUCT (multiplication principle): a task done as a SEQUENCE of
|
|
21
|
+
* independent stages — do stage 1 AND stage 2 AND … — multiplies the choice
|
|
22
|
+
* counts. ruleOfProduct(4, 3, 2) = 24. The spine under nPr / nʳ / factorial. */
|
|
23
|
+
declare function ruleOfProduct(...stages: number[]): number;
|
|
24
|
+
/** Rule of SUM (addition principle): MUTUALLY EXCLUSIVE cases — do this OR that,
|
|
25
|
+
* with no overlap — add their counts. ruleOfSum(3, 5) = 8. If the cases can
|
|
26
|
+
* overlap, use {@link inclusionExclusion} (sum, then subtract the double-count). */
|
|
27
|
+
declare function ruleOfSum(...cases: number[]): number;
|
|
28
|
+
/** Permutations WITH repetition: r positions, each independently filled from n
|
|
29
|
+
* options = nʳ. PIN codes, license plates, binary strings, functions A→B. */
|
|
30
|
+
declare function permutationsWithRepetition(n: number, r: number): number;
|
|
31
|
+
/** Circular permutations: distinct arrangements of n around a round table where
|
|
32
|
+
* only RELATIVE order matters = (n−1)!. (1 for n ≤ 1.) */
|
|
33
|
+
declare function circularPermutations(n: number): number;
|
|
34
|
+
/** Combinations WITH repetition ("n multichoose k"): choose k from n types,
|
|
35
|
+
* repetition allowed, order irrelevant = C(n+k−1, k). Same stars-and-bars
|
|
36
|
+
* family as {@link starsAndBars}, re-parameterized for selection (e.g. k scoops
|
|
37
|
+
* from n ice-cream flavours). */
|
|
38
|
+
declare function multichoose(n: number, k: number): number;
|
|
39
|
+
declare const combinationsWithRepetition: typeof multichoose;
|
|
20
40
|
declare function gcd(a: number, b: number): number;
|
|
21
41
|
declare function lcm(a: number, b: number): number;
|
|
22
42
|
//#endregion
|
|
23
|
-
export { binomial, factorial, gcd, lcm, multinomial, nCr, nPr, starsAndBars };
|
|
43
|
+
export { binomial, circularPermutations, combinationsWithRepetition, factorial, gcd, lcm, multichoose, multinomial, nCr, nPr, permutationsWithRepetition, ruleOfProduct, ruleOfSum, starsAndBars };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region src/discrete/core/combinatorics.ts
|
|
2
2
|
/**
|
|
3
|
-
* Combinatorics kernel
|
|
3
|
+
* Combinatorics kernel, the counting source-of-truth every discrete-math lab
|
|
4
4
|
* trusts (so an agent narrates these, never computes its own). Pure, integer,
|
|
5
5
|
* dependency-free. The headline identity the Counting lab is built on:
|
|
6
6
|
* nCr(n,k) = nPr(n,k) / k! ("overcount by order, then divide it out").
|
|
@@ -28,7 +28,7 @@ function nCr(n, r) {
|
|
|
28
28
|
for (let i = 1; i <= k; i++) res = res * (n - k + i) / i;
|
|
29
29
|
return Math.round(res);
|
|
30
30
|
}
|
|
31
|
-
/** Binomial coefficient
|
|
31
|
+
/** Binomial coefficient, alias of nCr (the "n choose k"). */
|
|
32
32
|
const binomial = nCr;
|
|
33
33
|
/** Arrangements of a multiset: n! / (k1! k2! …), where Σki = n. */
|
|
34
34
|
function multinomial(...counts) {
|
|
@@ -42,6 +42,41 @@ function starsAndBars(n, k) {
|
|
|
42
42
|
if (!isCount(n) || !isCount(k) || k < 1) return NaN;
|
|
43
43
|
return nCr(n + k - 1, k - 1);
|
|
44
44
|
}
|
|
45
|
+
/** Rule of PRODUCT (multiplication principle): a task done as a SEQUENCE of
|
|
46
|
+
* independent stages — do stage 1 AND stage 2 AND … — multiplies the choice
|
|
47
|
+
* counts. ruleOfProduct(4, 3, 2) = 24. The spine under nPr / nʳ / factorial. */
|
|
48
|
+
function ruleOfProduct(...stages) {
|
|
49
|
+
if (!stages.length || stages.some((c) => !Number.isFinite(c))) return NaN;
|
|
50
|
+
return stages.reduce((p, c) => p * c, 1);
|
|
51
|
+
}
|
|
52
|
+
/** Rule of SUM (addition principle): MUTUALLY EXCLUSIVE cases — do this OR that,
|
|
53
|
+
* with no overlap — add their counts. ruleOfSum(3, 5) = 8. If the cases can
|
|
54
|
+
* overlap, use {@link inclusionExclusion} (sum, then subtract the double-count). */
|
|
55
|
+
function ruleOfSum(...cases) {
|
|
56
|
+
if (!cases.length || cases.some((c) => !Number.isFinite(c))) return NaN;
|
|
57
|
+
return cases.reduce((s, c) => s + c, 0);
|
|
58
|
+
}
|
|
59
|
+
/** Permutations WITH repetition: r positions, each independently filled from n
|
|
60
|
+
* options = nʳ. PIN codes, license plates, binary strings, functions A→B. */
|
|
61
|
+
function permutationsWithRepetition(n, r) {
|
|
62
|
+
if (!isCount(n) || !isCount(r)) return NaN;
|
|
63
|
+
return n ** r;
|
|
64
|
+
}
|
|
65
|
+
/** Circular permutations: distinct arrangements of n around a round table where
|
|
66
|
+
* only RELATIVE order matters = (n−1)!. (1 for n ≤ 1.) */
|
|
67
|
+
function circularPermutations(n) {
|
|
68
|
+
if (!isCount(n)) return NaN;
|
|
69
|
+
return n <= 1 ? 1 : factorial(n - 1);
|
|
70
|
+
}
|
|
71
|
+
/** Combinations WITH repetition ("n multichoose k"): choose k from n types,
|
|
72
|
+
* repetition allowed, order irrelevant = C(n+k−1, k). Same stars-and-bars
|
|
73
|
+
* family as {@link starsAndBars}, re-parameterized for selection (e.g. k scoops
|
|
74
|
+
* from n ice-cream flavours). */
|
|
75
|
+
function multichoose(n, k) {
|
|
76
|
+
if (!isCount(n) || !isCount(k)) return NaN;
|
|
77
|
+
return nCr(n + k - 1, k);
|
|
78
|
+
}
|
|
79
|
+
const combinationsWithRepetition = multichoose;
|
|
45
80
|
function gcd(a, b) {
|
|
46
81
|
a = Math.abs(a);
|
|
47
82
|
b = Math.abs(b);
|
|
@@ -54,4 +89,4 @@ function lcm(a, b) {
|
|
|
54
89
|
}
|
|
55
90
|
|
|
56
91
|
//#endregion
|
|
57
|
-
export { binomial, factorial, gcd, lcm, multinomial, nCr, nPr, starsAndBars };
|
|
92
|
+
export { binomial, circularPermutations, combinationsWithRepetition, factorial, gcd, lcm, multichoose, multinomial, nCr, nPr, permutationsWithRepetition, ruleOfProduct, ruleOfSum, starsAndBars };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region src/discrete/core/pigeonhole.d.ts
|
|
2
2
|
/**
|
|
3
|
-
* Pigeonhole kernel
|
|
3
|
+
* Pigeonhole kernel, the certainty math behind "guarantee ≠ likely". With more
|
|
4
4
|
* pigeons than holes some hole holds ≥ ⌈n/k⌉. The lab's adversary deals the
|
|
5
5
|
* worst case; these functions say exactly when a collision is FORCED.
|
|
6
6
|
*/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region src/discrete/core/pigeonhole.ts
|
|
2
2
|
/**
|
|
3
|
-
* Pigeonhole kernel
|
|
3
|
+
* Pigeonhole kernel, the certainty math behind "guarantee ≠ likely". With more
|
|
4
4
|
* pigeons than holes some hole holds ≥ ⌈n/k⌉. The lab's adversary deals the
|
|
5
5
|
* worst case; these functions say exactly when a collision is FORCED.
|
|
6
6
|
*/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region src/discrete/core/probability.d.ts
|
|
2
2
|
/**
|
|
3
|
-
* Probability kernel
|
|
3
|
+
* Probability kernel, equally-likely sample spaces, conditioning, Bayes,
|
|
4
4
|
* independence, expectation. This is the "truth" the base-rate / Monty labs read
|
|
5
5
|
* (the agent narrates these numbers; it never invents them). Conditioning =
|
|
6
6
|
* shrink the sample space: P(A|B) = |A∩B| / |B|.
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
/** Favourable / total over an equally-likely space. */
|
|
9
9
|
declare function probability(favorable: number, total: number): number;
|
|
10
10
|
declare function complement(p: number): number;
|
|
11
|
-
/** P(A|B) = P(A∩B) / P(B)
|
|
11
|
+
/** P(A|B) = P(A∩B) / P(B), restrict the world to B, then re-count. */
|
|
12
12
|
declare function conditional(pAandB: number, pB: number): number;
|
|
13
13
|
/**
|
|
14
14
|
* P(A|B) from the natural inputs: the true-positive rate P(B|A), the prior P(A),
|
|
@@ -16,7 +16,7 @@ declare function conditional(pAandB: number, pB: number): number;
|
|
|
16
16
|
*/
|
|
17
17
|
declare function bayes(pBgivenA: number, pA: number, pBgivenNotA: number): number;
|
|
18
18
|
/** A and B are independent iff P(A∩B) = P(A)·P(B) (within eps). NOT the same as
|
|
19
|
-
* disjoint
|
|
19
|
+
* disjoint, disjoint events are maximally DEPENDENT. */
|
|
20
20
|
declare function independent(pA: number, pB: number, pAandB: number, eps?: number): boolean;
|
|
21
21
|
/** Expected value Σ p·value (probabilities should sum to 1). */
|
|
22
22
|
declare function expectedValue(outcomes: ReadonlyArray<{
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region src/discrete/core/probability.ts
|
|
2
2
|
/**
|
|
3
|
-
* Probability kernel
|
|
3
|
+
* Probability kernel, equally-likely sample spaces, conditioning, Bayes,
|
|
4
4
|
* independence, expectation. This is the "truth" the base-rate / Monty labs read
|
|
5
5
|
* (the agent narrates these numbers; it never invents them). Conditioning =
|
|
6
6
|
* shrink the sample space: P(A|B) = |A∩B| / |B|.
|
|
@@ -12,7 +12,7 @@ function probability(favorable, total) {
|
|
|
12
12
|
function complement(p) {
|
|
13
13
|
return 1 - p;
|
|
14
14
|
}
|
|
15
|
-
/** P(A|B) = P(A∩B) / P(B)
|
|
15
|
+
/** P(A|B) = P(A∩B) / P(B), restrict the world to B, then re-count. */
|
|
16
16
|
function conditional(pAandB, pB) {
|
|
17
17
|
return pB > 0 ? pAandB / pB : NaN;
|
|
18
18
|
}
|
|
@@ -26,7 +26,7 @@ function bayes(pBgivenA, pA, pBgivenNotA) {
|
|
|
26
26
|
return den > 0 ? num / den : NaN;
|
|
27
27
|
}
|
|
28
28
|
/** A and B are independent iff P(A∩B) = P(A)·P(B) (within eps). NOT the same as
|
|
29
|
-
* disjoint
|
|
29
|
+
* disjoint, disjoint events are maximally DEPENDENT. */
|
|
30
30
|
function independent(pA, pB, pAandB, eps = 1e-9) {
|
|
31
31
|
return Math.abs(pAandB - pA * pB) <= eps;
|
|
32
32
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region src/discrete/core/sets.d.ts
|
|
2
2
|
/**
|
|
3
|
-
* Finite-set kernel
|
|
3
|
+
* Finite-set kernel, set algebra over arrays of primitives (the Venn /
|
|
4
4
|
* inclusion–exclusion labs run on these). De Morgan here mirrors the logic
|
|
5
5
|
* kernel's De Morgan: ∩↔∧, ∪↔∨, complement↔¬ (the "trinity" spine). Order is
|
|
6
6
|
* first-seen (insertion) and duplicates are collapsed, so results are clean sets.
|