@heuresis/mcp 1.0.0-rc.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.
@@ -0,0 +1,1964 @@
1
+ // Full TRIZ apparatus — 39 Altshuller parameters, 40 inventive principles,
2
+ // and the canonical 39×39 contradiction matrix.
3
+ //
4
+ // Verbatim duplicate of `src/operators/triz-matrix.ts` so the MCP package
5
+ // builds independently of the main app. Self-contained: no imports outside
6
+ // this file. Keep in sync by hand if the webapp's matrix is corrected.
7
+ //
8
+ // Numbering matches the published Altshuller matrix one-for-one so external
9
+ // references (textbooks, the TRIZ40 site, the Darrell Mann CSV dumps) line up
10
+ // without translation. The exports `lookupPrinciples`, `lookupContradiction`,
11
+ // `UNIVERSAL_PRINCIPLES`, and `ContradictionResult` are consumed by the MCP
12
+ // operator runner (cloudOperators.ts) for both the TRIZ-principle family and
13
+ // the CONTRADICTION family.
14
+ // ─────────────────────────────────────────────────────────────────────────────
15
+ // The 39 engineering parameters (Altshuller)
16
+ // ─────────────────────────────────────────────────────────────────────────────
17
+ export const TRIZ_PARAMETERS = [
18
+ { num: 1, name: 'Weight of moving object', shortName: 'Weight (moving)', hint: 'Mass of an object that moves in normal use.' },
19
+ { num: 2, name: 'Weight of stationary object', shortName: 'Weight (stationary)', hint: 'Mass of an object that does not move in normal use.' },
20
+ { num: 3, name: 'Length of moving object', shortName: 'Length (moving)', hint: 'Any one linear dimension of a moving object.' },
21
+ { num: 4, name: 'Length of stationary object', shortName: 'Length (stationary)', hint: 'Any one linear dimension of a stationary object.' },
22
+ { num: 5, name: 'Area of moving object', shortName: 'Area (moving)', hint: 'Surface area of a moving object — inner or outer.' },
23
+ { num: 6, name: 'Area of stationary object', shortName: 'Area (stationary)', hint: 'Surface area of a stationary object.' },
24
+ { num: 7, name: 'Volume of moving object', shortName: 'Volume (moving)', hint: 'Cubic measure of space occupied by a moving object.' },
25
+ { num: 8, name: 'Volume of stationary object', shortName: 'Volume (stationary)', hint: 'Cubic measure of space occupied by a stationary object.' },
26
+ { num: 9, name: 'Speed', shortName: 'Speed', hint: 'Velocity of a process or object; rate of action.' },
27
+ { num: 10, name: 'Force', shortName: 'Force', hint: 'Any interaction intended to change an object’s condition.' },
28
+ { num: 11, name: 'Stress or pressure', shortName: 'Stress / pressure', hint: 'Force per unit area; tension within a material.' },
29
+ { num: 12, name: 'Shape', shortName: 'Shape', hint: 'External contour or geometry of a system.' },
30
+ { num: 13, name: "Stability of object's composition", shortName: 'Stability', hint: 'Wholeness, integrity; resistance to decomposition.' },
31
+ { num: 14, name: 'Strength', shortName: 'Strength', hint: 'Resistance of an object to change under force.' },
32
+ { num: 15, name: 'Duration of action of moving object', shortName: 'Duration (moving)', hint: 'Operating life or working time of a moving object.' },
33
+ { num: 16, name: 'Duration of action of stationary object', shortName: 'Duration (stationary)', hint: 'Operating life or working time of a stationary object.' },
34
+ { num: 17, name: 'Temperature', shortName: 'Temperature', hint: 'Thermal condition of the object or system.' },
35
+ { num: 18, name: 'Illumination intensity', shortName: 'Illumination', hint: 'Light flux per unit area; brightness, contrast.' },
36
+ { num: 19, name: 'Use of energy by moving object', shortName: 'Energy (moving)', hint: 'Energy consumed by a moving object during work.' },
37
+ { num: 20, name: 'Use of energy by stationary object', shortName: 'Energy (stationary)', hint: 'Energy consumed by a stationary object during work.' },
38
+ { num: 21, name: 'Power', shortName: 'Power', hint: 'Rate at which work is performed.' },
39
+ { num: 22, name: 'Loss of energy', shortName: 'Loss of energy', hint: 'Energy that does not contribute to the useful work.' },
40
+ { num: 23, name: 'Loss of substance', shortName: 'Loss of substance', hint: 'Material wasted, lost, or destroyed.' },
41
+ { num: 24, name: 'Loss of information', shortName: 'Loss of information', hint: 'Data or signal lost partially or fully.' },
42
+ { num: 25, name: 'Loss of time', shortName: 'Loss of time', hint: 'Time wasted; duration that the activity takes.' },
43
+ { num: 26, name: 'Quantity of substance', shortName: 'Quantity of substance', hint: 'Amount of material in a subsystem.' },
44
+ { num: 27, name: 'Reliability', shortName: 'Reliability', hint: 'Consistent performance in predictable ways and conditions.' },
45
+ { num: 28, name: 'Measurement accuracy', shortName: 'Measurement accuracy', hint: 'Closeness of measured to actual value.' },
46
+ { num: 29, name: 'Manufacturing precision', shortName: 'Mfg precision', hint: 'Conformance of produced parts to their specification.' },
47
+ { num: 30, name: 'Object-affected harmful factors', shortName: 'External harm', hint: 'Externally generated harmful effects acting on the object.' },
48
+ { num: 31, name: 'Object-generated harmful factors', shortName: 'Self harm', hint: 'Harmful effects produced by the object itself.' },
49
+ { num: 32, name: 'Ease of manufacture', shortName: 'Ease of mfg', hint: 'Difficulty or convenience of fabricating the object.' },
50
+ { num: 33, name: 'Ease of operation', shortName: 'Ease of operation', hint: 'How simple, fluent, fool-proof the object is to use.' },
51
+ { num: 34, name: 'Ease of repair', shortName: 'Ease of repair', hint: 'Convenience of fixing faults and defects.' },
52
+ { num: 35, name: 'Adaptability or versatility', shortName: 'Adaptability', hint: 'How well a system can respond to varied conditions.' },
53
+ { num: 36, name: 'Device complexity', shortName: 'Complexity', hint: 'Number and diversity of elements and interrelations.' },
54
+ { num: 37, name: 'Difficulty of detecting and measuring', shortName: 'Detectability', hint: 'How hard to observe, monitor, or measure the system.' },
55
+ { num: 38, name: 'Extent of automation', shortName: 'Automation', hint: 'Degree to which the system performs without human help.' },
56
+ { num: 39, name: 'Productivity', shortName: 'Productivity', hint: 'Useful work performed per unit time.' },
57
+ ];
58
+ // ─────────────────────────────────────────────────────────────────────────────
59
+ // The 40 inventive principles (Altshuller)
60
+ // ─────────────────────────────────────────────────────────────────────────────
61
+ export const TRIZ_PRINCIPLES = [
62
+ {
63
+ num: 1,
64
+ key: 'segmentation',
65
+ name: 'Segmentation',
66
+ oneLiner: 'Divide an object into independent parts; make it sectional.',
67
+ doctrine: 'Divide an object into independent parts. Make an object easy to disassemble. Increase the degree of fragmentation or segmentation.',
68
+ examples: ['Modular furniture', 'Garden hose sections', 'Sectional sofa'],
69
+ },
70
+ {
71
+ num: 2,
72
+ key: 'taking_out',
73
+ name: 'Taking out',
74
+ oneLiner: 'Separate the disturbing part — or extract the only useful part.',
75
+ doctrine: 'Separate an interfering part or property from an object, or single out the only necessary part (or property) of an object.',
76
+ examples: ['Locate noisy compressor outside the building it serves', 'Use fiber optics to bring light without heat'],
77
+ },
78
+ {
79
+ num: 3,
80
+ key: 'local_quality',
81
+ name: 'Local quality',
82
+ oneLiner: 'Different parts of the object serve different functions.',
83
+ doctrine: 'Change an object’s structure from uniform to non-uniform; change an external environment (or external influence) from uniform to non-uniform. Make each part of an object function in conditions most suitable for its operation. Make each part of an object fulfill a different and useful function.',
84
+ examples: ['Pencil with eraser', 'Hammer with claw', 'Lunchbox with sections for different food types'],
85
+ },
86
+ {
87
+ num: 4,
88
+ key: 'asymmetry',
89
+ name: 'Asymmetry',
90
+ oneLiner: 'Replace a symmetrical form with an asymmetrical one.',
91
+ doctrine: 'Change the shape of an object from symmetrical to asymmetrical. If an object is already asymmetrical, increase its degree of asymmetry.',
92
+ examples: ['Asymmetric mixer bowl to improve mixing', 'Tires with asymmetric tread patterns for wet/dry surfaces'],
93
+ },
94
+ {
95
+ num: 5,
96
+ key: 'merging',
97
+ name: 'Merging',
98
+ oneLiner: 'Combine identical or related objects in space or time.',
99
+ doctrine: 'Bring closer together (or merge) identical or similar objects, assemble identical or similar parts to perform parallel operations. Make operations contiguous or parallel; bring them together in time.',
100
+ examples: ['Personal computer with networking', 'Catamaran hulls', 'Medical scanners that combine MRI + CT'],
101
+ },
102
+ {
103
+ num: 6,
104
+ key: 'universality',
105
+ name: 'Universality',
106
+ oneLiner: 'Make a part perform multiple functions; eliminate the need for others.',
107
+ doctrine: 'Make a part or object perform multiple functions; eliminate the need for other parts.',
108
+ examples: ['Swiss army knife', 'Child car seat that converts to a stroller', 'Headrest that doubles as a pillow'],
109
+ },
110
+ {
111
+ num: 7,
112
+ key: 'nested_doll',
113
+ name: 'Nested doll',
114
+ oneLiner: 'Place objects inside other objects, recursively.',
115
+ doctrine: 'Place one object inside another; place each object, in turn, inside the next. Make one part pass through a cavity in the other.',
116
+ examples: ['Russian Matryoshka dolls', 'Telescoping antenna', 'Stacking measuring cups'],
117
+ },
118
+ {
119
+ num: 8,
120
+ key: 'anti_weight',
121
+ name: 'Anti-weight',
122
+ oneLiner: 'Compensate the weight of an object by merging it with something providing lift.',
123
+ doctrine: 'To compensate for the weight of an object, merge it with other objects that provide lift. To compensate for the weight of an object, make it interact with the environment (e.g. use aerodynamic or hydrodynamic forces).',
124
+ examples: ['Hydrofoil', 'Hot-air balloon', 'Aerodynamic spoiler that pushes a car down'],
125
+ },
126
+ {
127
+ num: 9,
128
+ key: 'preliminary_anti_action',
129
+ name: 'Preliminary anti-action',
130
+ oneLiner: 'Pre-load with the opposite stress to neutralize an upcoming one.',
131
+ doctrine: 'If it will be necessary to do an action with both harmful and useful effects, this action should be replaced with anti-actions to control the harmful effects. Create beforehand stresses in an object that will oppose known undesirable working stresses later on.',
132
+ examples: ['Pre-stress rebar before pouring concrete', 'Buffer a solution against pH changes'],
133
+ },
134
+ {
135
+ num: 10,
136
+ key: 'preliminary_action',
137
+ name: 'Preliminary action',
138
+ oneLiner: 'Perform required action ahead of time, fully or partially.',
139
+ doctrine: 'Perform, before it is needed, the required change of an object (either fully or partially). Pre-arrange objects such that they can come into action from the most convenient place and without losing time for their delivery.',
140
+ examples: ['Pre-paste wallpaper', 'Sterilize all instruments prior to surgery', 'Kanban systems in manufacturing'],
141
+ },
142
+ {
143
+ num: 11,
144
+ key: 'beforehand_cushioning',
145
+ name: 'Beforehand cushioning',
146
+ oneLiner: 'Prepare emergency means in advance to compensate low reliability.',
147
+ doctrine: 'Prepare emergency means beforehand to compensate for the relatively low reliability of an object.',
148
+ examples: ['Backup parachute', 'Airbag', 'Magnetic strip on photographic film that warns the camera of high-speed film'],
149
+ },
150
+ {
151
+ num: 12,
152
+ key: 'equipotentiality',
153
+ name: 'Equipotentiality',
154
+ oneLiner: 'In a potential field, limit position changes — eliminate lifts.',
155
+ doctrine: 'In a potential field, limit position changes (e.g., change operating conditions to eliminate the need to raise or lower objects in a gravity field).',
156
+ examples: ['Spring-loaded parts delivery system at assembly stations', 'Locks in a canal between two bodies of water'],
157
+ },
158
+ {
159
+ num: 13,
160
+ key: 'the_other_way_round',
161
+ name: 'The other way round',
162
+ oneLiner: 'Do the opposite of what is conventionally done.',
163
+ doctrine: 'Invert the action(s) used to solve the problem (e.g., instead of cooling an object, heat it). Make movable parts (or the external environment) fixed, and fixed parts movable. Turn the object (or process) upside down.',
164
+ examples: ['Rotating the part instead of the tool', 'Treadmill running in place', 'Climbing wall holds that rotate'],
165
+ },
166
+ {
167
+ num: 14,
168
+ key: 'spheroidality_curvature',
169
+ name: 'Spheroidality / curvature',
170
+ oneLiner: 'Replace linear parts with curved ones; use rollers, balls, spirals.',
171
+ doctrine: 'Instead of using rectilinear parts, surfaces, or forms, use curvilinear ones; move from flat surfaces to spherical ones; from parts shaped as a cube (parallelepiped) to ball-shaped structures. Use rollers, balls, spirals, domes. Go from linear to rotary motion; use centrifugal forces.',
172
+ examples: ['Computer mouse used trackball', 'Use Archimedes screw to convey ground material', 'Dome stadium'],
173
+ },
174
+ {
175
+ num: 15,
176
+ key: 'dynamics',
177
+ name: 'Dynamics',
178
+ oneLiner: 'Make rigid things flexible; static things adaptive.',
179
+ doctrine: 'Allow (or design) the characteristics of an object, external environment, or process to change to be optimal or to find an optimal operating condition. Divide an object into parts capable of movement relative to each other. If an object (or process) is rigid or inflexible, make it movable or adaptive.',
180
+ examples: ['Flexible boroscope to examine an engine', 'Adjustable steering column', 'Aircraft with swing wings'],
181
+ },
182
+ {
183
+ num: 16,
184
+ key: 'partial_or_excessive_actions',
185
+ name: 'Partial or excessive actions',
186
+ oneLiner: 'If 100% is hard, try slightly less or slightly more.',
187
+ doctrine: 'If 100 percent of an object is hard to achieve using a given solution method then, by using "slightly less" or "slightly more" of the same method, the problem may be considerably easier to solve.',
188
+ examples: ['Overspray then wipe off excess paint', 'Fill, then "top off" a measuring cup'],
189
+ },
190
+ {
191
+ num: 17,
192
+ key: 'another_dimension',
193
+ name: 'Another dimension',
194
+ oneLiner: 'Move into 2D, 3D, or use other sides; tilt, layer, multi-storey.',
195
+ doctrine: 'To move an object in two- or three-dimensional space. Use a multi-story arrangement of objects instead of a single-story arrangement. Tilt or re-orient the object, lay it on its side. Use the “other side” of a given area.',
196
+ examples: ['Multi-storey parking', 'Spiral staircase uses less floor space', 'Five-axis CNC cutter'],
197
+ },
198
+ {
199
+ num: 18,
200
+ key: 'mechanical_vibration',
201
+ name: 'Mechanical vibration',
202
+ oneLiner: 'Cause an object to oscillate or vibrate to achieve effect.',
203
+ doctrine: 'Cause an object to oscillate or vibrate. Increase the frequency (even up to the ultrasonic). Use an object’s resonant frequency. Use piezoelectric vibrators instead of mechanical ones. Use combined ultrasonic and electromagnetic field oscillations.',
204
+ examples: ['Electric carving knife with vibrating blades', 'Vibrate a casting mold while filling it'],
205
+ },
206
+ {
207
+ num: 19,
208
+ key: 'periodic_action',
209
+ name: 'Periodic action',
210
+ oneLiner: 'Replace continuous action with periodic; vary the frequency.',
211
+ doctrine: 'Instead of continuous action, use periodic or pulsating actions. If an action is already periodic, change the periodic magnitude or frequency. Use pauses between impulses to perform a different action.',
212
+ examples: ['Hammer drill', 'Warning lights flash so as to be more noticeable than steady ones', 'Knock with rhythm'],
213
+ },
214
+ {
215
+ num: 20,
216
+ key: 'continuity_of_useful_action',
217
+ name: 'Continuity of useful action',
218
+ oneLiner: 'Carry out work continuously; eliminate idle phases.',
219
+ doctrine: 'Carry on work continuously; make all parts of an object work at full load all the time. Eliminate all idle or intermittent actions or work.',
220
+ examples: ['Flywheel stores energy when a vehicle stops', 'Print on the return of the printhead'],
221
+ },
222
+ {
223
+ num: 21,
224
+ key: 'skipping',
225
+ name: 'Skipping',
226
+ oneLiner: 'Conduct dangerous or wasteful steps at high speed to skip past them.',
227
+ doctrine: 'Conduct a process, or certain stages (e.g., destructible, harmful or hazardous operations) at high speed.',
228
+ examples: ['Cut plastic faster than heat can propagate in the material', 'Dentist drills at very high RPM'],
229
+ },
230
+ {
231
+ num: 22,
232
+ key: 'blessing_in_disguise',
233
+ name: 'Blessing in disguise',
234
+ oneLiner: 'Turn a harmful factor into a benefit; let harmful factors cancel out.',
235
+ doctrine: 'Use harmful factors (particularly harmful effects of the environment or surroundings) to achieve a positive effect. Eliminate the primary harmful action by adding it to another harmful action to resolve the problem. Amplify a harmful action to such a degree that it is no longer harmful.',
236
+ examples: ['Use waste heat to generate electric power', 'Recycle waste material as feedstock'],
237
+ },
238
+ {
239
+ num: 23,
240
+ key: 'feedback',
241
+ name: 'Feedback',
242
+ oneLiner: 'Introduce feedback; if already there, reverse it or modulate it.',
243
+ doctrine: 'Introduce feedback (referring back, cross-checking) to improve a process or action. If feedback is already used, change its magnitude or influence.',
244
+ examples: ['Automatic volume control in audio circuits', 'Statistical process control', 'Thermostat'],
245
+ },
246
+ {
247
+ num: 24,
248
+ key: 'intermediary',
249
+ name: 'Intermediary',
250
+ oneLiner: 'Use an intermediary carrier or process to merge or transfer.',
251
+ doctrine: 'Use an intermediary carrier article or intermediary process. Merge one object temporarily with another (which can be easily removed).',
252
+ examples: ['Use a magnetic crane to lift steel', 'Hot pad used to remove pan from oven'],
253
+ },
254
+ {
255
+ num: 25,
256
+ key: 'self_service',
257
+ name: 'Self-service',
258
+ oneLiner: 'Make the object serve itself by performing auxiliary functions.',
259
+ doctrine: 'Make an object serve itself by performing auxiliary helpful functions. Use waste resources, energy, or substances.',
260
+ examples: ['Self-aligning shafts', 'Halogen lamps regenerate the filament during use', 'Self-cleaning oven'],
261
+ },
262
+ {
263
+ num: 26,
264
+ key: 'copying',
265
+ name: 'Copying',
266
+ oneLiner: 'Use a simple, inexpensive copy instead of a complex original.',
267
+ doctrine: 'Instead of an unavailable, expensive, fragile object, use simpler and inexpensive copies. Replace an object, or process with optical copies. If visible optical copies are already used, move to infrared or ultraviolet copies.',
268
+ examples: ['Listen to an audio book instead of reading', 'Virtual mock-up of a product instead of a physical one'],
269
+ },
270
+ {
271
+ num: 27,
272
+ key: 'cheap_short_living_objects',
273
+ name: 'Cheap short-living objects',
274
+ oneLiner: 'Replace an expensive object with many cheap ones, accepting their short life.',
275
+ doctrine: 'Replace an expensive object with a multiple of inexpensive objects, comprising certain qualities (such as service life, for instance).',
276
+ examples: ['Disposable paper cups', 'Disposable diapers', 'Plastic cutlery'],
277
+ },
278
+ {
279
+ num: 28,
280
+ key: 'mechanical_substitution',
281
+ name: 'Mechanical substitution',
282
+ oneLiner: 'Replace mechanical means with sensory (optical, acoustic, magnetic).',
283
+ doctrine: 'Replace a mechanical means with a sensory (optical, acoustic, taste or smell) means. Use electric, magnetic and electromagnetic fields to interact with the object. Change from static to movable fields, from unstructured fields to those having structure.',
284
+ examples: ['Replace a physical fence with a sound or smell repellent', 'Use magnetic stirring instead of mechanical'],
285
+ },
286
+ {
287
+ num: 29,
288
+ key: 'pneumatics_hydraulics',
289
+ name: 'Pneumatics and hydraulics',
290
+ oneLiner: 'Use gas or liquid parts instead of solid (inflatable, hydrostatic).',
291
+ doctrine: 'Use gas and liquid parts of an object instead of solid parts (e.g., inflatable, filled with liquids, air cushion, hydrostatic, hydro-reactive).',
292
+ examples: ['Inflatable furniture', 'Gel-filled shoe insole', 'Liquid-filled tires for tractors'],
293
+ },
294
+ {
295
+ num: 30,
296
+ key: 'flexible_shells_thin_films',
297
+ name: 'Flexible shells and thin films',
298
+ oneLiner: 'Use flexible shells or thin films instead of 3D structures.',
299
+ doctrine: 'Use flexible shells and thin films instead of three dimensional structures. Isolate the object from the external environment using flexible shells and thin films.',
300
+ examples: ['Bubble-wrap', 'Heat-shrink wrappers', 'Greenhouse coverings'],
301
+ },
302
+ {
303
+ num: 31,
304
+ key: 'porous_materials',
305
+ name: 'Porous materials',
306
+ oneLiner: 'Make the object porous or add porous elements; fill the pores with substance.',
307
+ doctrine: 'Make an object porous or add porous elements (inserts, coatings, etc.). If an object is already porous, use the pores to introduce a useful substance or function.',
308
+ examples: ['Sponges', 'Drill bits with porous coolant ducts', 'Catalytic converter honeycomb'],
309
+ },
310
+ {
311
+ num: 32,
312
+ key: 'color_changes',
313
+ name: 'Color changes',
314
+ oneLiner: 'Change the color of an object or its surroundings; change transparency.',
315
+ doctrine: 'Change the color of an object or its external environment. Change the transparency of an object or its external environment.',
316
+ examples: ['Photochromic lenses', 'Color-coded electrical wires', 'Camouflage'],
317
+ },
318
+ {
319
+ num: 33,
320
+ key: 'homogeneity',
321
+ name: 'Homogeneity',
322
+ oneLiner: 'Make objects interacting with the primary object of the same material.',
323
+ doctrine: 'Make objects interacting with a given object of the same material (or material with identical properties).',
324
+ examples: ['Make container from same material as contents to avoid contamination', 'Diamond cutting with diamond'],
325
+ },
326
+ {
327
+ num: 34,
328
+ key: 'discarding_recovering',
329
+ name: 'Discarding and recovering',
330
+ oneLiner: 'Discard portions that have fulfilled their function; recover on the spot.',
331
+ doctrine: 'Make portions of an object that have fulfilled their functions go away (discard by dissolving, evaporating, etc.) or modify these directly during operation. Conversely, restore consumable parts of an object directly in operation.',
332
+ examples: ['Dissolving capsule for medicines', 'Booster rockets that drop off after use', 'Self-sharpening tools'],
333
+ },
334
+ {
335
+ num: 35,
336
+ key: 'parameter_changes',
337
+ name: 'Parameter changes',
338
+ oneLiner: 'Change physical state, concentration, density, flexibility, temperature.',
339
+ doctrine: 'Change an object’s physical state (e.g. to a gas, liquid, or solid). Change the concentration or consistency. Change the degree of flexibility. Change the temperature.',
340
+ examples: ['Liquid soap is denser, more easily contained, easier to apply than bar soap', 'Vulcanizing rubber'],
341
+ },
342
+ {
343
+ num: 36,
344
+ key: 'phase_transitions',
345
+ name: 'Phase transitions',
346
+ oneLiner: 'Use phenomena occurring during phase transitions.',
347
+ doctrine: 'Use phenomena occurring during phase transitions (e.g., volume changes, loss or absorption of heat, etc.).',
348
+ examples: ['Heat pumps use vaporization/condensation', 'Water expanding upon freezing to split rocks'],
349
+ },
350
+ {
351
+ num: 37,
352
+ key: 'thermal_expansion',
353
+ name: 'Thermal expansion',
354
+ oneLiner: 'Use thermal expansion (or contraction) of materials.',
355
+ doctrine: 'Use thermal expansion (or contraction) of materials. If thermal expansion is being used, use multiple materials with different coefficients of thermal expansion.',
356
+ examples: ['Bi-metallic strip in a thermostat', 'Shrink-fit a part by cooling it'],
357
+ },
358
+ {
359
+ num: 38,
360
+ key: 'strong_oxidants',
361
+ name: 'Strong oxidants',
362
+ oneLiner: 'Replace common air with oxygen-enriched air or pure oxygen.',
363
+ doctrine: 'Replace common air with oxygen-enriched air. Replace enriched air with pure oxygen. Expose air or oxygen to ionizing radiation. Use ionized oxygen. Replace ozonized (or ionized) oxygen with ozone.',
364
+ examples: ['Scuba diving with enriched-air nitrox', 'Treat wounds with hydrogen peroxide', 'Ozone water treatment'],
365
+ },
366
+ {
367
+ num: 39,
368
+ key: 'inert_atmosphere',
369
+ name: 'Inert atmosphere',
370
+ oneLiner: 'Replace a normal environment with an inert one to prevent contamination.',
371
+ doctrine: 'Replace a normal environment with an inert one. Carry out the process in a vacuum.',
372
+ examples: ['Argon-filled archival displays', 'Inert gas blanket on flammable liquids', 'Vacuum-pack food'],
373
+ },
374
+ {
375
+ num: 40,
376
+ key: 'composite_materials',
377
+ name: 'Composite materials',
378
+ oneLiner: 'Change from uniform materials to composite (multi-material) ones.',
379
+ doctrine: 'Change from uniform to composite (multiple) materials.',
380
+ examples: ['Carbon-fiber/epoxy composites', 'Reinforced concrete', 'Composite hockey sticks'],
381
+ },
382
+ ];
383
+ const M = {
384
+ // Row 1 — Weight of moving object
385
+ '1,2': [], // both moving/stationary contradiction degenerate
386
+ '1,3': [15, 8, 29, 34],
387
+ '1,5': [29, 17, 38, 34],
388
+ '1,7': [29, 2, 40, 28],
389
+ '1,9': [2, 8, 15, 38],
390
+ '1,10': [8, 10, 18, 37],
391
+ '1,11': [10, 36, 37, 40],
392
+ '1,12': [10, 14, 35, 40],
393
+ '1,13': [1, 35, 19, 39],
394
+ '1,14': [28, 27, 18, 40],
395
+ '1,15': [5, 34, 31, 35],
396
+ '1,17': [6, 29, 4, 38],
397
+ '1,18': [19, 1, 32],
398
+ '1,19': [35, 12, 34, 31],
399
+ '1,21': [12, 36, 18, 31],
400
+ '1,22': [6, 2, 34, 19],
401
+ '1,23': [5, 35, 3, 31],
402
+ '1,25': [10, 35, 20, 28],
403
+ '1,26': [3, 26, 18, 31],
404
+ '1,27': [3, 11, 1, 27],
405
+ '1,28': [28, 27, 35, 26],
406
+ '1,29': [18, 28, 32, 10],
407
+ '1,30': [22, 21, 18, 27],
408
+ '1,31': [2, 19, 22, 37],
409
+ '1,32': [28, 29, 15, 16],
410
+ '1,33': [25, 2, 13, 15],
411
+ '1,34': [2, 27, 28, 11],
412
+ '1,35': [29, 5, 15, 8],
413
+ '1,36': [26, 30, 36, 34],
414
+ '1,37': [28, 29, 26, 32],
415
+ '1,38': [26, 35, 18, 19],
416
+ '1,39': [35, 3, 24, 37],
417
+ // Row 2 — Weight of stationary object
418
+ '2,1': [],
419
+ '2,3': [],
420
+ '2,4': [10, 1, 29, 35],
421
+ '2,5': [],
422
+ '2,6': [35, 30, 13, 2],
423
+ '2,7': [],
424
+ '2,8': [5, 35, 14, 2],
425
+ '2,9': [],
426
+ '2,10': [8, 10, 19, 35],
427
+ '2,11': [13, 29, 10, 18],
428
+ '2,12': [13, 10, 29, 14],
429
+ '2,13': [26, 39, 1, 40],
430
+ '2,14': [28, 2, 10, 27],
431
+ '2,15': [],
432
+ '2,16': [2, 27, 19, 6],
433
+ '2,17': [28, 19, 32, 22],
434
+ '2,18': [19, 32, 35],
435
+ '2,19': [],
436
+ '2,20': [18, 19, 28, 1],
437
+ '2,21': [15, 19, 18, 22],
438
+ '2,22': [18, 19, 28, 15],
439
+ '2,23': [5, 8, 13, 30],
440
+ '2,24': [10, 15, 35],
441
+ '2,25': [10, 20, 35, 26],
442
+ '2,26': [19, 6, 18, 26],
443
+ '2,27': [10, 28, 8, 3],
444
+ '2,28': [18, 26, 28],
445
+ '2,29': [10, 1, 35, 17],
446
+ '2,30': [2, 19, 22, 37],
447
+ '2,31': [35, 22, 1, 39],
448
+ '2,32': [1, 27, 36, 13],
449
+ '2,33': [6, 13, 1, 32],
450
+ '2,34': [2, 27, 28, 11],
451
+ '2,35': [19, 15, 29],
452
+ '2,36': [1, 10, 26, 39],
453
+ '2,37': [25, 28, 17, 15],
454
+ '2,38': [2, 26, 35],
455
+ '2,39': [1, 28, 15, 35],
456
+ // Row 3 — Length of moving object
457
+ '3,1': [8, 15, 29, 34],
458
+ '3,2': [],
459
+ '3,4': [],
460
+ '3,5': [15, 17, 4],
461
+ '3,6': [],
462
+ '3,7': [7, 17, 4, 35],
463
+ '3,8': [],
464
+ '3,9': [13, 4, 8],
465
+ '3,10': [17, 10, 4],
466
+ '3,11': [1, 8, 35],
467
+ '3,12': [1, 8, 10, 29],
468
+ '3,13': [1, 8, 15, 34],
469
+ '3,14': [8, 35, 29, 34],
470
+ '3,15': [19],
471
+ '3,17': [10, 15, 19],
472
+ '3,18': [32],
473
+ '3,19': [8, 35, 24],
474
+ '3,21': [1, 35],
475
+ '3,22': [7, 2, 35, 39],
476
+ '3,23': [4, 29, 23, 10],
477
+ '3,24': [1, 24],
478
+ '3,25': [15, 2, 29],
479
+ '3,26': [29, 35],
480
+ '3,27': [10, 14, 29, 40],
481
+ '3,28': [28, 32, 4],
482
+ '3,29': [10, 28, 29, 37],
483
+ '3,30': [1, 15, 17, 24],
484
+ '3,31': [17, 15],
485
+ '3,32': [1, 29, 17],
486
+ '3,33': [15, 29, 35, 4],
487
+ '3,34': [1, 28, 10],
488
+ '3,35': [14, 15, 1, 16],
489
+ '3,36': [1, 19, 26, 24],
490
+ '3,37': [35, 1, 26, 24],
491
+ '3,38': [17, 24, 26, 16],
492
+ '3,39': [14, 4, 28, 29],
493
+ // Row 4 — Length of stationary object
494
+ '4,1': [],
495
+ '4,2': [35, 28, 40, 29],
496
+ '4,3': [],
497
+ '4,5': [],
498
+ '4,6': [17, 7, 10, 40],
499
+ '4,7': [],
500
+ '4,8': [35, 8, 2, 14],
501
+ '4,9': [],
502
+ '4,10': [28, 10],
503
+ '4,11': [1, 14, 35],
504
+ '4,12': [13, 14, 15, 7],
505
+ '4,13': [39, 37, 35],
506
+ '4,14': [15, 14, 28, 26],
507
+ '4,15': [],
508
+ '4,16': [1, 40, 35],
509
+ '4,17': [3, 35, 38, 18],
510
+ '4,18': [3, 25],
511
+ '4,19': [],
512
+ '4,21': [12, 8],
513
+ '4,22': [6, 28],
514
+ '4,23': [10, 28, 24, 35],
515
+ '4,24': [24, 26],
516
+ '4,25': [30, 29, 14],
517
+ '4,26': [],
518
+ '4,27': [15, 29, 28],
519
+ '4,28': [32, 28, 3],
520
+ '4,29': [2, 32, 10],
521
+ '4,30': [1, 18],
522
+ '4,31': [],
523
+ '4,32': [15, 17, 27],
524
+ '4,33': [2, 25],
525
+ '4,34': [3],
526
+ '4,35': [1, 35],
527
+ '4,36': [1, 26],
528
+ '4,37': [26],
529
+ '4,38': [],
530
+ '4,39': [30, 14, 7, 26],
531
+ // Row 5 — Area of moving object
532
+ '5,1': [2, 17, 29, 4],
533
+ '5,2': [],
534
+ '5,3': [14, 15, 18, 4],
535
+ '5,4': [],
536
+ '5,6': [],
537
+ '5,7': [7, 14, 17, 4],
538
+ '5,8': [],
539
+ '5,9': [29, 30, 4, 34],
540
+ '5,10': [19, 30, 35, 2],
541
+ '5,11': [10, 15, 36, 28],
542
+ '5,12': [5, 34, 29, 4],
543
+ '5,13': [11, 2, 13, 39],
544
+ '5,14': [3, 15, 40, 14],
545
+ '5,15': [6, 3],
546
+ '5,17': [2, 15, 16],
547
+ '5,18': [15, 32, 19, 13],
548
+ '5,19': [19, 32],
549
+ '5,21': [19, 10, 32, 18],
550
+ '5,22': [15, 17, 30, 26],
551
+ '5,23': [10, 35, 2, 39],
552
+ '5,24': [30, 26],
553
+ '5,25': [26, 4],
554
+ '5,26': [29, 30, 6, 13],
555
+ '5,27': [29, 9],
556
+ '5,28': [26, 28, 32, 3],
557
+ '5,29': [2, 32],
558
+ '5,30': [22, 33, 28, 1],
559
+ '5,31': [17, 2, 18, 39],
560
+ '5,32': [13, 1, 26, 24],
561
+ '5,33': [15, 17, 13, 16],
562
+ '5,34': [15, 13, 10, 1],
563
+ '5,35': [15, 30],
564
+ '5,36': [14, 1, 13],
565
+ '5,37': [2, 36, 26, 18],
566
+ '5,38': [14, 30, 28, 23],
567
+ '5,39': [10, 26, 34, 2],
568
+ // Row 6 — Area of stationary object
569
+ '6,1': [],
570
+ '6,2': [30, 2, 14, 18],
571
+ '6,3': [],
572
+ '6,4': [26, 7, 9, 39],
573
+ '6,5': [],
574
+ '6,7': [],
575
+ '6,8': [],
576
+ '6,9': [],
577
+ '6,10': [1, 18, 35, 36],
578
+ '6,11': [10, 15, 36, 37],
579
+ '6,12': [17, 7, 10, 40],
580
+ '6,13': [],
581
+ '6,14': [40],
582
+ '6,15': [],
583
+ '6,16': [2, 10, 19, 30],
584
+ '6,17': [35, 39, 38],
585
+ '6,18': [],
586
+ '6,19': [],
587
+ '6,20': [],
588
+ '6,21': [17, 32],
589
+ '6,22': [17, 7, 30],
590
+ '6,23': [10, 14, 18, 39],
591
+ '6,24': [30, 16],
592
+ '6,25': [10, 35, 4, 18],
593
+ '6,26': [2, 18, 40, 4],
594
+ '6,27': [32, 35, 40, 4],
595
+ '6,28': [26, 28, 32, 3],
596
+ '6,29': [2, 29, 18, 36],
597
+ '6,30': [27, 2, 39, 35],
598
+ '6,31': [22, 1, 40],
599
+ '6,32': [40, 16, 4],
600
+ '6,33': [16, 4],
601
+ '6,34': [16],
602
+ '6,35': [15, 16],
603
+ '6,36': [1, 18, 36],
604
+ '6,37': [2, 35, 30, 18],
605
+ '6,38': [23],
606
+ '6,39': [10, 15, 17, 7],
607
+ // Row 7 — Volume of moving object
608
+ '7,1': [2, 26, 29, 40],
609
+ '7,2': [],
610
+ '7,3': [1, 7, 4, 35],
611
+ '7,4': [],
612
+ '7,5': [1, 7, 4, 17],
613
+ '7,6': [],
614
+ '7,8': [],
615
+ '7,9': [29, 4, 38, 34],
616
+ '7,10': [15, 35, 36, 37],
617
+ '7,11': [6, 35, 36, 37],
618
+ '7,12': [1, 15, 29, 4],
619
+ '7,13': [28, 10, 1, 39],
620
+ '7,14': [9, 14, 15, 7],
621
+ '7,15': [6, 35, 4],
622
+ '7,17': [34, 39, 10, 18],
623
+ '7,18': [2, 13, 10],
624
+ '7,19': [35],
625
+ '7,21': [35, 6, 13, 18],
626
+ '7,22': [7, 15, 13, 16],
627
+ '7,23': [36, 39, 34, 10],
628
+ '7,24': [2, 22],
629
+ '7,25': [2, 6, 34, 10],
630
+ '7,26': [29, 30, 7],
631
+ '7,27': [14, 1, 40, 11],
632
+ '7,28': [25, 26, 28],
633
+ '7,29': [25, 28, 2, 16],
634
+ '7,30': [22, 21, 27, 35],
635
+ '7,31': [17, 2, 40, 1],
636
+ '7,32': [29, 1, 40],
637
+ '7,33': [15, 13, 30, 12],
638
+ '7,34': [10],
639
+ '7,35': [15, 29],
640
+ '7,36': [26, 1],
641
+ '7,37': [29, 26, 4],
642
+ '7,38': [],
643
+ '7,39': [10, 6, 2, 34],
644
+ // Row 8 — Volume of stationary object
645
+ '8,1': [],
646
+ '8,2': [35, 10, 19, 14],
647
+ '8,3': [19, 14],
648
+ '8,4': [35, 8, 2, 14],
649
+ '8,5': [],
650
+ '8,6': [],
651
+ '8,7': [],
652
+ '8,9': [],
653
+ '8,10': [2, 18, 37],
654
+ '8,11': [24, 35],
655
+ '8,12': [7, 2, 35],
656
+ '8,13': [34, 28, 35, 40],
657
+ '8,14': [9, 14, 17, 15],
658
+ '8,15': [],
659
+ '8,16': [35, 34, 38],
660
+ '8,17': [35, 6, 4],
661
+ '8,18': [],
662
+ '8,19': [],
663
+ '8,20': [],
664
+ '8,21': [30, 6],
665
+ '8,22': [],
666
+ '8,23': [10, 39, 35, 34],
667
+ '8,24': [],
668
+ '8,25': [35, 16, 32, 18],
669
+ '8,26': [35, 3],
670
+ '8,27': [2, 35, 16],
671
+ '8,28': [],
672
+ '8,29': [35, 10, 25],
673
+ '8,30': [34, 39, 19, 27],
674
+ '8,31': [30, 18, 35, 4],
675
+ '8,32': [35],
676
+ '8,33': [],
677
+ '8,34': [1],
678
+ '8,35': [],
679
+ '8,36': [1, 31],
680
+ '8,37': [2, 17, 26],
681
+ '8,38': [],
682
+ '8,39': [35, 37, 10, 2],
683
+ // Row 9 — Speed
684
+ '9,1': [2, 28, 13, 38],
685
+ '9,2': [],
686
+ '9,3': [13, 14, 8],
687
+ '9,4': [],
688
+ '9,5': [29, 30, 34],
689
+ '9,6': [],
690
+ '9,7': [7, 29, 34],
691
+ '9,8': [],
692
+ '9,10': [13, 28, 15, 19],
693
+ '9,11': [6, 18, 38, 40],
694
+ '9,12': [35, 15, 18, 34],
695
+ '9,13': [28, 33, 1, 18],
696
+ '9,14': [8, 3, 26, 14],
697
+ '9,15': [3, 19, 35, 5],
698
+ '9,17': [28, 30, 36, 2],
699
+ '9,18': [10, 13, 19],
700
+ '9,19': [8, 15, 35, 38],
701
+ '9,21': [19, 35, 38, 2],
702
+ '9,22': [14, 20, 19, 35],
703
+ '9,23': [10, 13, 28, 38],
704
+ '9,24': [13, 26],
705
+ '9,25': [],
706
+ '9,26': [10, 19, 29, 38],
707
+ '9,27': [11, 35, 27, 28],
708
+ '9,28': [28, 32, 1, 24],
709
+ '9,29': [10, 28, 32, 25],
710
+ '9,30': [1, 28, 35, 23],
711
+ '9,31': [2, 24, 35, 21],
712
+ '9,32': [35, 13, 8, 1],
713
+ '9,33': [32, 28, 13, 12],
714
+ '9,34': [34, 2, 28, 27],
715
+ '9,35': [15, 10, 26],
716
+ '9,36': [10, 28, 4, 34],
717
+ '9,37': [3, 34, 27, 16],
718
+ '9,38': [10, 18],
719
+ '9,39': [10, 18, 3, 14],
720
+ // Row 10 — Force
721
+ '10,1': [8, 1, 37, 18],
722
+ '10,2': [18, 13, 1, 28],
723
+ '10,3': [17, 19, 9, 36],
724
+ '10,4': [28, 10],
725
+ '10,5': [19, 10, 15],
726
+ '10,6': [1, 18, 36, 37],
727
+ '10,7': [15, 9, 12, 37],
728
+ '10,8': [2, 36, 18, 37],
729
+ '10,9': [13, 28, 15, 12],
730
+ '10,11': [18, 21, 11],
731
+ '10,12': [10, 35, 40, 34],
732
+ '10,13': [35, 10, 21],
733
+ '10,14': [35, 10, 14, 27],
734
+ '10,15': [19, 2],
735
+ '10,17': [35, 10, 21],
736
+ '10,18': [],
737
+ '10,19': [16, 26, 21, 2],
738
+ '10,20': [36, 37],
739
+ '10,21': [],
740
+ '10,22': [14, 29, 18, 36],
741
+ '10,23': [3, 35, 13, 21],
742
+ '10,24': [35, 10, 23, 24],
743
+ '10,25': [28, 29, 37, 36],
744
+ '10,26': [1, 35, 40, 18],
745
+ '10,27': [13, 3, 36, 24],
746
+ '10,28': [15, 37, 18, 1],
747
+ '10,29': [1, 28, 3, 25],
748
+ '10,30': [13, 3, 36, 24], // mirrors 10,27
749
+ '10,31': [15, 37, 18, 1],
750
+ '10,32': [35, 10, 14, 27],
751
+ '10,33': [25, 2, 13],
752
+ '10,34': [1, 11, 10],
753
+ '10,35': [13, 35, 8, 1],
754
+ '10,36': [],
755
+ '10,37': [27, 2, 39, 35],
756
+ '10,38': [2, 35],
757
+ '10,39': [3, 28, 35, 37],
758
+ // Row 11 — Stress / pressure
759
+ '11,1': [10, 36, 37, 40],
760
+ '11,2': [13, 29, 10, 18],
761
+ '11,3': [35, 10, 36],
762
+ '11,4': [35, 1, 14, 16],
763
+ '11,5': [10, 15, 36, 28],
764
+ '11,6': [10, 15, 36, 37],
765
+ '11,7': [6, 35, 10],
766
+ '11,8': [35, 24],
767
+ '11,9': [6, 35, 36],
768
+ '11,10': [36, 35, 21],
769
+ '11,12': [35, 4, 15, 10],
770
+ '11,13': [35, 33, 2, 40],
771
+ '11,14': [9, 18, 3, 40],
772
+ '11,15': [19, 3, 27],
773
+ '11,16': [],
774
+ '11,17': [35, 39, 19, 2],
775
+ '11,18': [],
776
+ '11,19': [14, 24, 10, 37],
777
+ '11,20': [],
778
+ '11,21': [10, 35, 14],
779
+ '11,22': [2, 36, 25],
780
+ '11,23': [10, 36, 3, 37],
781
+ '11,24': [],
782
+ '11,25': [37, 36, 4],
783
+ '11,26': [10, 14, 36],
784
+ '11,27': [10, 13, 19, 35],
785
+ '11,28': [6, 28, 25],
786
+ '11,29': [3, 35],
787
+ '11,30': [22, 2, 37],
788
+ '11,31': [2, 33, 27, 18],
789
+ '11,32': [1, 35, 16],
790
+ '11,33': [11],
791
+ '11,34': [2],
792
+ '11,35': [35],
793
+ '11,36': [19, 1, 35],
794
+ '11,37': [2, 36, 37],
795
+ '11,38': [35, 24],
796
+ '11,39': [10, 14, 35, 37],
797
+ // Row 12 — Shape
798
+ '12,1': [8, 10, 29, 40],
799
+ '12,2': [15, 10, 26, 3],
800
+ '12,3': [29, 34, 5, 4],
801
+ '12,4': [13, 14, 10, 7],
802
+ '12,5': [5, 34, 4, 10],
803
+ '12,6': [],
804
+ '12,7': [14, 4, 15, 22],
805
+ '12,8': [7, 2, 35],
806
+ '12,9': [35, 15, 34, 18],
807
+ '12,10': [35, 10, 37, 40],
808
+ '12,11': [34, 15, 10, 14],
809
+ '12,13': [33, 1, 18, 4],
810
+ '12,14': [30, 14, 10, 40],
811
+ '12,15': [14, 26, 9, 25],
812
+ '12,17': [22, 14, 19, 32],
813
+ '12,18': [13, 15, 32],
814
+ '12,19': [2, 6, 34, 14],
815
+ '12,21': [4, 6, 2],
816
+ '12,22': [14],
817
+ '12,23': [35, 29, 3, 5],
818
+ '12,24': [],
819
+ '12,25': [14, 10, 34, 17],
820
+ '12,26': [36, 22],
821
+ '12,27': [10, 40, 16],
822
+ '12,28': [28, 32, 1],
823
+ '12,29': [32, 30, 40],
824
+ '12,30': [22, 1, 2, 35],
825
+ '12,31': [35, 1],
826
+ '12,32': [1, 32, 17, 28],
827
+ '12,33': [32, 15, 26],
828
+ '12,34': [2, 13, 1],
829
+ '12,35': [1, 15, 29],
830
+ '12,36': [16, 29, 1, 28],
831
+ '12,37': [15, 13, 39],
832
+ '12,38': [15, 1, 32],
833
+ '12,39': [17, 26, 34, 10],
834
+ // Row 13 — Stability of object's composition
835
+ '13,1': [21, 35, 2, 39],
836
+ '13,2': [26, 39, 1, 40],
837
+ '13,3': [13, 15, 1, 28],
838
+ '13,4': [37],
839
+ '13,5': [2, 11, 13],
840
+ '13,6': [39],
841
+ '13,7': [28, 10, 19, 39],
842
+ '13,8': [34, 28, 35, 40],
843
+ '13,9': [33, 15, 28, 18],
844
+ '13,10': [10, 35, 21, 16],
845
+ '13,11': [2, 35, 40],
846
+ '13,12': [22, 1, 18, 4],
847
+ '13,14': [17, 9, 15],
848
+ '13,15': [13, 27, 10, 35],
849
+ '13,16': [39, 3, 35, 23],
850
+ '13,17': [35, 1, 32],
851
+ '13,18': [32, 3, 27, 15],
852
+ '13,19': [13, 19],
853
+ '13,20': [27, 4, 29, 18],
854
+ '13,21': [32, 35, 27, 31],
855
+ '13,22': [14, 2, 39, 6],
856
+ '13,23': [2, 14, 30, 40],
857
+ '13,24': [],
858
+ '13,25': [35, 27],
859
+ '13,26': [15, 32, 35],
860
+ '13,27': [],
861
+ '13,28': [13, 35, 8, 24],
862
+ '13,29': [18, 1],
863
+ '13,30': [35, 40, 27, 39],
864
+ '13,31': [35, 19],
865
+ '13,32': [35, 19, 1, 37],
866
+ '13,33': [2, 19, 13],
867
+ '13,34': [27, 4, 1, 35],
868
+ '13,35': [35, 1, 32],
869
+ '13,36': [2, 22, 17, 19],
870
+ '13,37': [35, 24, 30, 18],
871
+ '13,38': [],
872
+ '13,39': [23, 35, 40, 3],
873
+ // Row 14 — Strength
874
+ '14,1': [1, 8, 40, 15],
875
+ '14,2': [40, 26, 27, 1],
876
+ '14,3': [1, 15, 8, 35],
877
+ '14,4': [15, 14, 28, 26],
878
+ '14,5': [3, 34, 40, 29],
879
+ '14,6': [],
880
+ '14,7': [9, 40, 28],
881
+ '14,8': [10, 15, 14, 7],
882
+ '14,9': [8, 13, 26, 14],
883
+ '14,10': [10, 18, 3, 14],
884
+ '14,11': [10, 3, 18, 40],
885
+ '14,12': [10, 30, 35, 40],
886
+ '14,13': [13, 17, 35],
887
+ '14,15': [27, 3, 26],
888
+ '14,16': [],
889
+ '14,17': [30, 10, 40],
890
+ '14,18': [35, 19],
891
+ '14,19': [19, 35, 10],
892
+ '14,20': [35],
893
+ '14,21': [10, 26, 35, 28],
894
+ '14,22': [35],
895
+ '14,23': [35, 28, 31, 40],
896
+ '14,24': [],
897
+ '14,25': [29, 3, 28, 18],
898
+ '14,26': [29, 10, 27],
899
+ '14,27': [11, 3],
900
+ '14,28': [3, 27, 16],
901
+ '14,29': [3, 27],
902
+ '14,30': [18, 35, 37, 1],
903
+ '14,31': [15, 35, 22, 2],
904
+ '14,32': [11, 3, 10, 32],
905
+ '14,33': [32, 40, 28, 2],
906
+ '14,34': [27, 11, 3],
907
+ '14,35': [15, 3, 32],
908
+ '14,36': [2, 13, 25, 28],
909
+ '14,37': [27, 3, 15, 40],
910
+ '14,38': [15],
911
+ '14,39': [29, 35, 10, 14],
912
+ // Row 15 — Duration of action of moving object
913
+ '15,1': [19, 5, 34, 31],
914
+ '15,2': [],
915
+ '15,3': [2, 19, 9],
916
+ '15,4': [],
917
+ '15,5': [3, 17, 19],
918
+ '15,6': [],
919
+ '15,7': [10, 2, 19, 30],
920
+ '15,8': [],
921
+ '15,9': [3, 35, 5],
922
+ '15,10': [19, 2, 16],
923
+ '15,11': [19, 3, 27],
924
+ '15,12': [14, 26, 28, 25],
925
+ '15,13': [13, 3, 35],
926
+ '15,14': [27, 3, 10],
927
+ '15,17': [19, 35, 39],
928
+ '15,18': [2, 19, 4, 35],
929
+ '15,19': [28, 6, 35, 18],
930
+ '15,21': [19, 10, 35, 38],
931
+ '15,22': [28, 27, 3, 18],
932
+ '15,23': [10],
933
+ '15,24': [],
934
+ '15,25': [20, 10, 28, 18],
935
+ '15,26': [3, 35, 10, 40],
936
+ '15,27': [11, 2, 13],
937
+ '15,28': [3],
938
+ '15,29': [3, 27, 16, 40],
939
+ '15,30': [22, 15, 33, 28],
940
+ '15,31': [21, 39, 16, 22],
941
+ '15,32': [27, 1, 4],
942
+ '15,33': [12, 27],
943
+ '15,34': [29, 10, 27],
944
+ '15,35': [1, 35, 13],
945
+ '15,36': [10, 4, 29, 15],
946
+ '15,37': [19, 29, 39, 35],
947
+ '15,38': [6, 10],
948
+ '15,39': [35, 17, 14, 19],
949
+ // Row 16 — Duration of action of stationary object
950
+ '16,1': [],
951
+ '16,2': [6, 27, 19, 16],
952
+ '16,3': [],
953
+ '16,4': [1, 40, 35],
954
+ '16,5': [],
955
+ '16,6': [],
956
+ '16,7': [],
957
+ '16,8': [35, 34, 38],
958
+ '16,9': [],
959
+ '16,10': [],
960
+ '16,11': [],
961
+ '16,12': [],
962
+ '16,13': [39, 3, 35, 23],
963
+ '16,14': [],
964
+ '16,15': [],
965
+ '16,17': [19, 18, 36, 40],
966
+ '16,18': [],
967
+ '16,19': [],
968
+ '16,20': [],
969
+ '16,21': [16],
970
+ '16,22': [],
971
+ '16,23': [27, 16, 18, 38],
972
+ '16,24': [10],
973
+ '16,25': [28, 20, 10, 16],
974
+ '16,26': [3, 35, 31],
975
+ '16,27': [34, 27, 6, 40],
976
+ '16,28': [10, 26, 24],
977
+ '16,29': [],
978
+ '16,30': [17, 1, 40, 33],
979
+ '16,31': [22],
980
+ '16,32': [35, 10],
981
+ '16,33': [1],
982
+ '16,34': [1],
983
+ '16,35': [2],
984
+ '16,36': [],
985
+ '16,37': [25, 34, 6, 35],
986
+ '16,38': [1],
987
+ '16,39': [20, 10, 16, 38],
988
+ // Row 17 — Temperature
989
+ '17,1': [36, 22, 6, 38],
990
+ '17,2': [22, 35, 32],
991
+ '17,3': [15, 19, 9],
992
+ '17,4': [15, 19, 9],
993
+ '17,5': [3, 35, 39, 18],
994
+ '17,6': [35, 38],
995
+ '17,7': [34, 39, 40, 18],
996
+ '17,8': [35, 6, 4],
997
+ '17,9': [2, 28, 36, 30],
998
+ '17,10': [35, 10, 3, 21],
999
+ '17,11': [35, 39, 19, 2],
1000
+ '17,12': [14, 22, 19, 32],
1001
+ '17,13': [1, 35, 32],
1002
+ '17,14': [10, 30, 22, 40],
1003
+ '17,15': [19, 13, 39],
1004
+ '17,16': [19, 18, 36, 40],
1005
+ '17,18': [32, 30, 21, 16],
1006
+ '17,19': [19, 15, 3, 17],
1007
+ '17,20': [],
1008
+ '17,21': [2, 14, 17, 25],
1009
+ '17,22': [21, 17, 35, 38],
1010
+ '17,23': [21, 36, 29, 31],
1011
+ '17,24': [],
1012
+ '17,25': [35, 28, 21, 18],
1013
+ '17,26': [3, 17, 30, 39],
1014
+ '17,27': [19, 35, 3, 10],
1015
+ '17,28': [32, 19, 24],
1016
+ '17,29': [],
1017
+ '17,30': [22, 33, 35, 2],
1018
+ '17,31': [22, 35, 2, 24],
1019
+ '17,32': [26, 27],
1020
+ '17,33': [26, 27],
1021
+ '17,34': [4, 10, 16],
1022
+ '17,35': [2, 18, 27],
1023
+ '17,36': [2, 17, 16],
1024
+ '17,37': [3, 27, 35, 31],
1025
+ '17,38': [26, 2, 19, 16],
1026
+ '17,39': [15, 28, 35],
1027
+ // Row 18 — Illumination intensity
1028
+ '18,1': [19, 1, 32],
1029
+ '18,2': [2, 35, 32],
1030
+ '18,3': [19, 32, 16],
1031
+ '18,4': [],
1032
+ '18,5': [19, 32, 26],
1033
+ '18,6': [],
1034
+ '18,7': [2, 13, 10],
1035
+ '18,8': [],
1036
+ '18,9': [10, 13, 19],
1037
+ '18,10': [26, 19, 6],
1038
+ '18,11': [],
1039
+ '18,12': [32, 30],
1040
+ '18,13': [32, 3, 27],
1041
+ '18,14': [35, 19],
1042
+ '18,15': [2, 19, 6],
1043
+ '18,16': [],
1044
+ '18,17': [32, 35, 19],
1045
+ '18,19': [32, 1, 19],
1046
+ '18,20': [32, 35, 1, 15],
1047
+ '18,21': [32],
1048
+ '18,22': [13, 16, 1, 6],
1049
+ '18,23': [13, 1],
1050
+ '18,24': [1, 6],
1051
+ '18,25': [19, 1, 26, 17],
1052
+ '18,26': [1, 19],
1053
+ '18,27': [],
1054
+ '18,28': [11, 15, 32],
1055
+ '18,29': [3, 32],
1056
+ '18,30': [15, 19],
1057
+ '18,31': [35, 19, 32, 39],
1058
+ '18,32': [19, 35, 28, 26],
1059
+ '18,33': [28, 26, 19],
1060
+ '18,34': [15, 17, 13, 16],
1061
+ '18,35': [15, 1, 19],
1062
+ '18,36': [6, 32, 13],
1063
+ '18,37': [32, 15],
1064
+ '18,38': [2, 26, 10],
1065
+ '18,39': [2, 25, 16],
1066
+ // Row 19 — Use of energy by moving object
1067
+ '19,1': [12, 18, 28, 31],
1068
+ '19,2': [],
1069
+ '19,3': [12, 28],
1070
+ '19,4': [],
1071
+ '19,5': [15, 19, 25],
1072
+ '19,6': [],
1073
+ '19,7': [35, 13, 18],
1074
+ '19,8': [],
1075
+ '19,9': [8, 35, 35],
1076
+ '19,10': [16, 26, 21, 2],
1077
+ '19,11': [23, 14, 25],
1078
+ '19,12': [12, 2, 29],
1079
+ '19,13': [19, 13, 17, 24],
1080
+ '19,14': [5, 19, 9, 35],
1081
+ '19,15': [28, 35, 6, 18],
1082
+ '19,16': [],
1083
+ '19,17': [19, 24, 3, 14],
1084
+ '19,18': [2, 15, 19],
1085
+ '19,20': [],
1086
+ '19,21': [6, 19, 37, 18],
1087
+ '19,22': [12, 22, 15, 24],
1088
+ '19,23': [35, 24, 18, 5],
1089
+ '19,24': [],
1090
+ '19,25': [35, 38, 19, 18],
1091
+ '19,26': [34, 23, 16, 18],
1092
+ '19,27': [19, 21, 11, 27],
1093
+ '19,28': [3, 1, 32],
1094
+ '19,29': [],
1095
+ '19,30': [1, 35, 6, 27],
1096
+ '19,31': [2, 35, 6],
1097
+ '19,32': [28, 26, 30],
1098
+ '19,33': [19, 35],
1099
+ '19,34': [1, 15, 17, 28],
1100
+ '19,35': [15, 17, 13, 16],
1101
+ '19,36': [2, 29, 27, 28],
1102
+ '19,37': [35, 38],
1103
+ '19,38': [32, 2],
1104
+ '19,39': [12, 28, 35],
1105
+ // Row 20 — Use of energy by stationary object
1106
+ '20,1': [],
1107
+ '20,2': [19, 9, 6, 27],
1108
+ '20,3': [],
1109
+ '20,4': [],
1110
+ '20,5': [],
1111
+ '20,6': [],
1112
+ '20,7': [],
1113
+ '20,8': [],
1114
+ '20,9': [],
1115
+ '20,10': [36, 37],
1116
+ '20,11': [],
1117
+ '20,12': [],
1118
+ '20,13': [27, 4, 29, 18],
1119
+ '20,14': [35],
1120
+ '20,15': [],
1121
+ '20,16': [],
1122
+ '20,17': [],
1123
+ '20,18': [32, 35, 1, 15],
1124
+ '20,19': [],
1125
+ '20,21': [],
1126
+ '20,22': [10, 35, 38],
1127
+ '20,23': [28, 27, 18, 31],
1128
+ '20,24': [],
1129
+ '20,25': [],
1130
+ '20,26': [3, 35, 31],
1131
+ '20,27': [10, 36, 23],
1132
+ '20,28': [],
1133
+ '20,29': [],
1134
+ '20,30': [10, 2, 22, 37],
1135
+ '20,31': [19, 22, 18],
1136
+ '20,32': [1, 4],
1137
+ '20,33': [],
1138
+ '20,34': [],
1139
+ '20,35': [],
1140
+ '20,36': [19, 1, 16, 10],
1141
+ '20,37': [],
1142
+ '20,38': [],
1143
+ '20,39': [1, 6],
1144
+ // Row 21 — Power
1145
+ '21,1': [8, 36, 38, 31],
1146
+ '21,2': [19, 26, 17, 27],
1147
+ '21,3': [1, 10, 35, 37],
1148
+ '21,4': [],
1149
+ '21,5': [19, 38],
1150
+ '21,6': [17, 32, 13, 38],
1151
+ '21,7': [35, 6, 38],
1152
+ '21,8': [30, 6, 25],
1153
+ '21,9': [15, 35, 2],
1154
+ '21,10': [26, 2, 36, 35],
1155
+ '21,11': [22, 10, 35],
1156
+ '21,12': [29, 14, 2, 40],
1157
+ '21,13': [35, 32, 15, 31],
1158
+ '21,14': [26, 10, 28],
1159
+ '21,15': [19, 35, 10, 38],
1160
+ '21,16': [16],
1161
+ '21,17': [2, 14, 17, 25],
1162
+ '21,18': [16, 6, 19],
1163
+ '21,19': [16, 6, 19, 37],
1164
+ '21,20': [],
1165
+ '21,22': [10, 35, 38],
1166
+ '21,23': [28, 27, 18, 38],
1167
+ '21,24': [10, 19],
1168
+ '21,25': [35, 20, 10, 6],
1169
+ '21,26': [4, 34, 19],
1170
+ '21,27': [19, 24, 26, 31],
1171
+ '21,28': [32, 15, 2],
1172
+ '21,29': [32, 2],
1173
+ '21,30': [19, 22, 31, 2],
1174
+ '21,31': [2, 35, 18],
1175
+ '21,32': [26, 10, 34],
1176
+ '21,33': [26, 35, 10],
1177
+ '21,34': [35, 2, 10, 34],
1178
+ '21,35': [19, 17, 34],
1179
+ '21,36': [20, 19, 30, 34],
1180
+ '21,37': [19, 35, 16],
1181
+ '21,38': [28, 2, 17],
1182
+ '21,39': [28, 35, 34],
1183
+ // Row 22 — Loss of energy
1184
+ '22,1': [15, 6, 19, 28],
1185
+ '22,2': [19, 6, 18, 9],
1186
+ '22,3': [7, 2, 6, 13],
1187
+ '22,4': [6, 38, 7],
1188
+ '22,5': [15, 26, 17, 30],
1189
+ '22,6': [17, 7, 30, 18],
1190
+ '22,7': [7, 18, 23],
1191
+ '22,8': [7],
1192
+ '22,9': [16, 35, 38],
1193
+ '22,10': [36, 38],
1194
+ '22,11': [],
1195
+ '22,12': [],
1196
+ '22,13': [14, 2, 39, 6],
1197
+ '22,14': [26],
1198
+ '22,15': [],
1199
+ '22,16': [],
1200
+ '22,17': [19, 38, 7],
1201
+ '22,18': [1, 13, 32, 15],
1202
+ '22,19': [],
1203
+ '22,20': [3, 38],
1204
+ '22,21': [],
1205
+ '22,23': [35, 27, 2, 37],
1206
+ '22,24': [19, 10],
1207
+ '22,25': [10, 18, 32, 7],
1208
+ '22,26': [7, 18, 25],
1209
+ '22,27': [11, 10, 35],
1210
+ '22,28': [32, 25, 28, 29],
1211
+ '22,29': [],
1212
+ '22,30': [21, 22, 35, 2],
1213
+ '22,31': [21, 35, 2, 22],
1214
+ '22,32': [],
1215
+ '22,33': [35, 32, 1],
1216
+ '22,34': [2, 19],
1217
+ '22,35': [],
1218
+ '22,36': [7, 23],
1219
+ '22,37': [35, 3, 15, 23],
1220
+ '22,38': [2],
1221
+ '22,39': [28, 10, 29, 35],
1222
+ // Row 23 — Loss of substance
1223
+ '23,1': [35, 6, 23, 40],
1224
+ '23,2': [35, 6, 22, 32],
1225
+ '23,3': [14, 29, 10, 39],
1226
+ '23,4': [10, 28, 24],
1227
+ '23,5': [35, 2, 10, 31],
1228
+ '23,6': [10, 18, 39, 31],
1229
+ '23,7': [1, 29, 30, 36],
1230
+ '23,8': [3, 39, 18, 31],
1231
+ '23,9': [10, 13, 28, 38],
1232
+ '23,10': [14, 15, 18, 40],
1233
+ '23,11': [3, 36, 37, 10],
1234
+ '23,12': [29, 35, 3, 5],
1235
+ '23,13': [2, 14, 30, 40],
1236
+ '23,14': [35, 28, 31, 40],
1237
+ '23,15': [28, 27, 3, 18],
1238
+ '23,16': [27, 16, 18, 38],
1239
+ '23,17': [21, 36, 39, 31],
1240
+ '23,18': [1, 6, 13],
1241
+ '23,19': [35, 18, 24, 5],
1242
+ '23,20': [28, 27, 12, 31],
1243
+ '23,21': [28, 27, 18, 38],
1244
+ '23,22': [35, 27, 2, 31],
1245
+ '23,24': [],
1246
+ '23,25': [15, 18, 35, 10],
1247
+ '23,26': [6, 3, 10, 24],
1248
+ '23,27': [10, 29, 39, 35],
1249
+ '23,28': [16, 34, 31, 28],
1250
+ '23,29': [35, 10, 24, 31],
1251
+ '23,30': [33, 22, 30, 40],
1252
+ '23,31': [10, 1, 34, 29],
1253
+ '23,32': [15, 34, 33],
1254
+ '23,33': [32, 28, 2, 24],
1255
+ '23,34': [2, 35, 34, 27],
1256
+ '23,35': [15, 10, 2],
1257
+ '23,36': [35, 10, 28, 24],
1258
+ '23,37': [35, 18, 10, 13],
1259
+ '23,38': [35, 10, 18],
1260
+ '23,39': [28, 35, 10, 23],
1261
+ // Row 24 — Loss of information
1262
+ '24,1': [10, 24, 35],
1263
+ '24,2': [10, 35, 5],
1264
+ '24,3': [1, 26],
1265
+ '24,4': [26],
1266
+ '24,5': [30, 26],
1267
+ '24,6': [30, 16],
1268
+ '24,7': [],
1269
+ '24,8': [],
1270
+ '24,9': [13, 26],
1271
+ '24,10': [],
1272
+ '24,11': [],
1273
+ '24,12': [],
1274
+ '24,13': [],
1275
+ '24,14': [],
1276
+ '24,15': [10],
1277
+ '24,16': [10],
1278
+ '24,17': [],
1279
+ '24,18': [19],
1280
+ '24,19': [],
1281
+ '24,20': [],
1282
+ '24,21': [10, 19],
1283
+ '24,22': [19, 10],
1284
+ '24,23': [],
1285
+ '24,25': [24, 26, 28, 32],
1286
+ '24,26': [24, 28, 35],
1287
+ '24,27': [10, 28, 23],
1288
+ '24,28': [],
1289
+ '24,29': [],
1290
+ '24,30': [22, 10, 1],
1291
+ '24,31': [10, 21, 22],
1292
+ '24,32': [32],
1293
+ '24,33': [27, 22],
1294
+ '24,34': [],
1295
+ '24,35': [],
1296
+ '24,36': [],
1297
+ '24,37': [35, 33],
1298
+ '24,38': [35],
1299
+ '24,39': [13, 23, 15],
1300
+ // Row 25 — Loss of time
1301
+ '25,1': [10, 20, 37, 35],
1302
+ '25,2': [10, 20, 26, 5],
1303
+ '25,3': [15, 2, 29],
1304
+ '25,4': [30, 24, 14, 5],
1305
+ '25,5': [26, 4, 5, 16],
1306
+ '25,6': [10, 35, 17, 4],
1307
+ '25,7': [2, 5, 34, 10],
1308
+ '25,8': [35, 16, 32, 18],
1309
+ '25,9': [],
1310
+ '25,10': [10, 37, 36, 5],
1311
+ '25,11': [37, 36, 4],
1312
+ '25,12': [4, 10, 34, 17],
1313
+ '25,13': [35, 3, 22, 5],
1314
+ '25,14': [29, 3, 28, 18],
1315
+ '25,15': [20, 10, 28, 18],
1316
+ '25,16': [28, 20, 10, 16],
1317
+ '25,17': [35, 29, 21, 18],
1318
+ '25,18': [1, 19, 26, 17],
1319
+ '25,19': [35, 38, 19, 18],
1320
+ '25,20': [1],
1321
+ '25,21': [35, 20, 10, 6],
1322
+ '25,22': [10, 5, 18, 32],
1323
+ '25,23': [35, 18, 10, 39],
1324
+ '25,24': [24, 26, 28, 32],
1325
+ '25,26': [35, 38, 18, 16],
1326
+ '25,27': [10, 30, 4],
1327
+ '25,28': [24, 34, 28, 32],
1328
+ '25,29': [24, 26, 28, 18],
1329
+ '25,30': [35, 18, 34],
1330
+ '25,31': [35, 22, 18, 39],
1331
+ '25,32': [35, 28, 34, 4],
1332
+ '25,33': [4, 28, 10, 34],
1333
+ '25,34': [32, 1, 10, 25],
1334
+ '25,35': [35, 28],
1335
+ '25,36': [6, 29],
1336
+ '25,37': [18, 28, 32, 10],
1337
+ '25,38': [24, 28, 35, 30],
1338
+ '25,39': [35, 17, 14, 19],
1339
+ // Row 26 — Quantity of substance
1340
+ '26,1': [3, 26, 18, 32],
1341
+ '26,2': [3, 26, 18, 31],
1342
+ '26,3': [14, 35, 34, 10],
1343
+ '26,4': [],
1344
+ '26,5': [3, 26, 31, 25],
1345
+ '26,6': [],
1346
+ '26,7': [29, 14, 35, 18],
1347
+ '26,8': [],
1348
+ '26,9': [3, 10, 14, 18],
1349
+ '26,10': [35, 14, 3],
1350
+ '26,11': [10, 36, 14, 3],
1351
+ '26,12': [35, 14],
1352
+ '26,13': [15, 2, 17, 40],
1353
+ '26,14': [14, 35, 34, 10],
1354
+ '26,15': [3, 35, 10, 40],
1355
+ '26,16': [3, 35, 31],
1356
+ '26,17': [3, 17, 39],
1357
+ '26,18': [],
1358
+ '26,19': [34, 29, 16, 18],
1359
+ '26,20': [3, 35, 31],
1360
+ '26,21': [35],
1361
+ '26,22': [7, 18, 25],
1362
+ '26,23': [6, 3, 10, 24],
1363
+ '26,24': [24, 28, 35],
1364
+ '26,25': [35, 38, 18, 16],
1365
+ '26,27': [18, 3, 28, 40],
1366
+ '26,28': [13, 2, 28],
1367
+ '26,29': [33, 30],
1368
+ '26,30': [35, 33, 29, 31],
1369
+ '26,31': [3, 35, 40, 39],
1370
+ '26,32': [29, 1, 35, 27],
1371
+ '26,33': [35, 29, 25, 10],
1372
+ '26,34': [2, 32, 10, 25],
1373
+ '26,35': [15, 3, 29],
1374
+ '26,36': [3, 13, 27, 10],
1375
+ '26,37': [3, 27, 29, 18],
1376
+ '26,38': [8, 35],
1377
+ '26,39': [13, 29, 3, 27],
1378
+ // Row 27 — Reliability
1379
+ '27,1': [3, 8, 10, 40],
1380
+ '27,2': [3, 10, 8, 28],
1381
+ '27,3': [15, 9, 14, 4],
1382
+ '27,4': [15, 29, 28, 11],
1383
+ '27,5': [17, 10, 14, 16],
1384
+ '27,6': [32, 35, 40, 4],
1385
+ '27,7': [3, 10, 14, 24],
1386
+ '27,8': [2, 35, 24],
1387
+ '27,9': [21, 35, 11, 28],
1388
+ '27,10': [8, 28, 10, 3],
1389
+ '27,11': [10, 24, 35, 19],
1390
+ '27,12': [35, 1, 16, 11],
1391
+ '27,13': [],
1392
+ '27,14': [11, 28],
1393
+ '27,15': [2, 35, 3, 25],
1394
+ '27,16': [34, 27, 6, 40],
1395
+ '27,17': [3, 35, 10],
1396
+ '27,18': [11, 32, 13],
1397
+ '27,19': [21, 11, 27, 19],
1398
+ '27,20': [36, 23],
1399
+ '27,21': [21, 11, 26, 31],
1400
+ '27,22': [10, 11, 35],
1401
+ '27,23': [10, 35, 29, 39],
1402
+ '27,24': [10, 28],
1403
+ '27,25': [10, 30, 4],
1404
+ '27,26': [21, 28, 40, 3],
1405
+ '27,28': [32, 3, 11, 23],
1406
+ '27,29': [11, 32, 1],
1407
+ '27,30': [27, 35, 2, 40],
1408
+ '27,31': [35, 2, 40, 26],
1409
+ '27,32': [27, 17, 40],
1410
+ '27,33': [1, 11],
1411
+ '27,34': [13, 35, 8, 24],
1412
+ '27,35': [13, 35, 1],
1413
+ '27,36': [27, 40, 28, 8],
1414
+ '27,37': [11, 13, 27],
1415
+ '27,38': [1, 35, 29, 38],
1416
+ '27,39': [1, 35, 28, 37],
1417
+ // Row 28 — Measurement accuracy
1418
+ '28,1': [32, 35, 26, 28],
1419
+ '28,2': [28, 35, 25, 26],
1420
+ '28,3': [28, 26, 5, 16],
1421
+ '28,4': [32, 28, 3, 16],
1422
+ '28,5': [26, 28, 32, 3],
1423
+ '28,6': [26, 28, 32, 3],
1424
+ '28,7': [32, 13, 6],
1425
+ '28,8': [],
1426
+ '28,9': [28, 13, 32, 24],
1427
+ '28,10': [32, 2],
1428
+ '28,11': [6, 28, 32],
1429
+ '28,12': [6, 28, 32],
1430
+ '28,13': [32, 35, 13],
1431
+ '28,14': [28, 6, 32],
1432
+ '28,15': [28, 6, 32],
1433
+ '28,16': [10, 26, 24],
1434
+ '28,17': [6, 1, 32],
1435
+ '28,18': [3, 6, 32],
1436
+ '28,19': [3, 6, 32],
1437
+ '28,20': [],
1438
+ '28,21': [3, 6, 32],
1439
+ '28,22': [26, 32, 27],
1440
+ '28,23': [10, 16, 31, 28],
1441
+ '28,24': [],
1442
+ '28,25': [24, 34, 28, 32],
1443
+ '28,26': [2, 6, 32],
1444
+ '28,27': [5, 11, 1, 23],
1445
+ '28,29': [],
1446
+ '28,30': [28, 24, 22, 26],
1447
+ '28,31': [3, 33, 39, 10],
1448
+ '28,32': [6, 35, 25, 18],
1449
+ '28,33': [1, 13, 17, 34],
1450
+ '28,34': [1, 32, 13, 11],
1451
+ '28,35': [13, 35, 8, 24],
1452
+ '28,36': [27, 35, 10, 34],
1453
+ '28,37': [26, 24, 32, 28],
1454
+ '28,38': [28, 2, 10, 34],
1455
+ '28,39': [10, 34, 28, 32],
1456
+ // Row 29 — Manufacturing precision
1457
+ '29,1': [28, 32, 13, 18],
1458
+ '29,2': [28, 35, 27, 9],
1459
+ '29,3': [10, 28, 29, 37],
1460
+ '29,4': [2, 32, 10],
1461
+ '29,5': [28, 33, 29, 32],
1462
+ '29,6': [2, 29, 18, 36],
1463
+ '29,7': [32, 23, 2],
1464
+ '29,8': [25, 10, 35],
1465
+ '29,9': [10, 28, 32],
1466
+ '29,10': [28, 19, 34, 36],
1467
+ '29,11': [3, 35],
1468
+ '29,12': [32, 30, 40],
1469
+ '29,13': [30, 18],
1470
+ '29,14': [3, 27],
1471
+ '29,15': [3, 27, 40],
1472
+ '29,16': [],
1473
+ '29,17': [19, 26],
1474
+ '29,18': [3, 32],
1475
+ '29,19': [32, 2],
1476
+ '29,20': [],
1477
+ '29,21': [32, 2],
1478
+ '29,22': [13, 32, 2],
1479
+ '29,23': [35, 31, 10, 24],
1480
+ '29,24': [],
1481
+ '29,25': [32, 26, 28, 18],
1482
+ '29,26': [35, 10],
1483
+ '29,27': [11, 32, 1],
1484
+ '29,28': [],
1485
+ '29,30': [26, 28, 10, 36],
1486
+ '29,31': [4, 17, 34, 26],
1487
+ '29,32': [],
1488
+ '29,33': [1, 32, 35, 23],
1489
+ '29,34': [25, 10],
1490
+ '29,35': [26, 2, 18],
1491
+ '29,36': [26, 28, 18, 23],
1492
+ '29,37': [10, 18, 32, 39],
1493
+ '29,38': [],
1494
+ '29,39': [18, 10, 32, 1],
1495
+ // Row 30 — Object-affected harmful factors
1496
+ '30,1': [22, 21, 27, 39],
1497
+ '30,2': [2, 22, 13, 24],
1498
+ '30,3': [17, 1, 39, 4],
1499
+ '30,4': [1, 18],
1500
+ '30,5': [22, 1, 33, 28],
1501
+ '30,6': [27, 2, 39, 35],
1502
+ '30,7': [22, 23, 37, 35],
1503
+ '30,8': [34, 39, 19, 27],
1504
+ '30,9': [21, 22, 35, 28],
1505
+ '30,10': [13, 35, 39, 18],
1506
+ '30,11': [22, 2, 37],
1507
+ '30,12': [22, 1, 3, 35],
1508
+ '30,13': [35, 24, 30, 18],
1509
+ '30,14': [18, 35, 37, 1],
1510
+ '30,15': [22, 15, 33, 28],
1511
+ '30,16': [17, 1, 40, 33],
1512
+ '30,17': [22, 33, 35, 2],
1513
+ '30,18': [1, 19, 32, 13],
1514
+ '30,19': [1, 24, 6, 27],
1515
+ '30,20': [10, 2, 22, 37],
1516
+ '30,21': [19, 22, 31, 2],
1517
+ '30,22': [21, 22, 35, 2],
1518
+ '30,23': [33, 22, 19, 40],
1519
+ '30,24': [22, 10, 2],
1520
+ '30,25': [35, 18, 34],
1521
+ '30,26': [35, 33, 29, 31],
1522
+ '30,27': [27, 24, 2, 40],
1523
+ '30,28': [28, 33, 23, 26],
1524
+ '30,29': [26, 28, 10, 18],
1525
+ '30,31': [],
1526
+ '30,32': [24, 35, 2],
1527
+ '30,33': [2, 25, 28, 39],
1528
+ '30,34': [35, 10, 2],
1529
+ '30,35': [35, 11, 22, 31],
1530
+ '30,36': [22, 19, 29, 40],
1531
+ '30,37': [22, 19, 29, 40],
1532
+ '30,38': [33, 3, 34],
1533
+ '30,39': [22, 35, 13, 24],
1534
+ // Row 31 — Object-generated harmful factors
1535
+ '31,1': [19, 22, 15, 39],
1536
+ '31,2': [35, 22, 1, 39],
1537
+ '31,3': [17, 15, 16, 22],
1538
+ '31,4': [],
1539
+ '31,5': [17, 2, 18, 39],
1540
+ '31,6': [22, 1, 40],
1541
+ '31,7': [17, 2, 40],
1542
+ '31,8': [30, 18, 35, 4],
1543
+ '31,9': [35, 28, 3, 23],
1544
+ '31,10': [35, 28, 1, 40],
1545
+ '31,11': [2, 33, 27, 18],
1546
+ '31,12': [35, 1],
1547
+ '31,13': [35, 40, 27, 39],
1548
+ '31,14': [15, 35, 22, 2],
1549
+ '31,15': [15, 22, 33, 31],
1550
+ '31,16': [21, 39, 16, 22],
1551
+ '31,17': [22, 35, 2, 24],
1552
+ '31,18': [19, 24, 39, 32],
1553
+ '31,19': [2, 35, 6],
1554
+ '31,20': [19, 22, 18],
1555
+ '31,21': [2, 35, 18],
1556
+ '31,22': [21, 35, 2, 22],
1557
+ '31,23': [10, 1, 34],
1558
+ '31,24': [10, 21, 29],
1559
+ '31,25': [1, 22],
1560
+ '31,26': [3, 24, 39, 1],
1561
+ '31,27': [24, 2, 40, 39],
1562
+ '31,28': [3, 33, 26],
1563
+ '31,29': [4, 17, 34, 26],
1564
+ '31,30': [],
1565
+ '31,32': [],
1566
+ '31,33': [],
1567
+ '31,34': [],
1568
+ '31,35': [],
1569
+ '31,36': [19, 1, 31],
1570
+ '31,37': [2, 21, 27, 1],
1571
+ '31,38': [2],
1572
+ '31,39': [22, 35, 18, 39],
1573
+ // Row 32 — Ease of manufacture
1574
+ '32,1': [28, 29, 15, 16],
1575
+ '32,2': [1, 27, 36, 13],
1576
+ '32,3': [1, 29, 13, 17],
1577
+ '32,4': [15, 17, 27],
1578
+ '32,5': [13, 1, 26, 12],
1579
+ '32,6': [16, 40],
1580
+ '32,7': [13, 29, 1, 40],
1581
+ '32,8': [35],
1582
+ '32,9': [35, 13, 8, 1],
1583
+ '32,10': [35, 12],
1584
+ '32,11': [35, 19, 1, 37],
1585
+ '32,12': [1, 28, 13, 27],
1586
+ '32,13': [11, 13, 1],
1587
+ '32,14': [1, 3, 10, 32],
1588
+ '32,15': [27, 1, 4],
1589
+ '32,16': [35, 16],
1590
+ '32,17': [27, 26, 18],
1591
+ '32,18': [28, 24, 27, 1],
1592
+ '32,19': [28, 26, 27, 1],
1593
+ '32,20': [1, 4],
1594
+ '32,21': [27, 1, 12, 24],
1595
+ '32,22': [19, 35],
1596
+ '32,23': [15, 34, 33],
1597
+ '32,24': [32, 24, 18, 16],
1598
+ '32,25': [35, 28, 34, 4],
1599
+ '32,26': [35, 23, 1, 24],
1600
+ '32,27': [],
1601
+ '32,28': [1, 35, 12, 18],
1602
+ '32,29': [],
1603
+ '32,30': [24, 2],
1604
+ '32,31': [],
1605
+ '32,33': [2, 5, 13, 16],
1606
+ '32,34': [35, 1, 11, 9],
1607
+ '32,35': [2, 13, 15],
1608
+ '32,36': [27, 26, 1],
1609
+ '32,37': [6, 28, 11, 1],
1610
+ '32,38': [8, 28, 1],
1611
+ '32,39': [35, 1, 10, 28],
1612
+ // Row 33 — Ease of operation
1613
+ '33,1': [25, 2, 13, 15],
1614
+ '33,2': [6, 13, 1, 25],
1615
+ '33,3': [1, 17, 13, 12],
1616
+ '33,4': [],
1617
+ '33,5': [1, 17, 13, 16],
1618
+ '33,6': [18, 16, 15, 39],
1619
+ '33,7': [1, 16, 35, 15],
1620
+ '33,8': [4, 18, 39, 31],
1621
+ '33,9': [18, 13, 34],
1622
+ '33,10': [28, 13, 35],
1623
+ '33,11': [2, 32, 12],
1624
+ '33,12': [15, 34, 29, 28],
1625
+ '33,13': [32, 35, 30],
1626
+ '33,14': [32, 40, 3, 28],
1627
+ '33,15': [29, 3, 8, 25],
1628
+ '33,16': [1, 16, 25],
1629
+ '33,17': [26, 27, 13],
1630
+ '33,18': [13, 17, 1, 24],
1631
+ '33,19': [1, 13, 24],
1632
+ '33,20': [],
1633
+ '33,21': [35, 34, 2, 10],
1634
+ '33,22': [2, 19, 13],
1635
+ '33,23': [28, 32, 2, 24],
1636
+ '33,24': [4, 10, 27, 22],
1637
+ '33,25': [4, 28, 10, 34],
1638
+ '33,26': [12, 35],
1639
+ '33,27': [17, 27, 8, 40],
1640
+ '33,28': [25, 13, 2, 34],
1641
+ '33,29': [1, 32, 35, 23],
1642
+ '33,30': [2, 25, 28, 39],
1643
+ '33,31': [],
1644
+ '33,32': [2, 5, 12],
1645
+ '33,34': [12, 26, 1, 32],
1646
+ '33,35': [15, 34, 1, 16],
1647
+ '33,36': [32, 26, 12, 17],
1648
+ '33,37': [],
1649
+ '33,38': [1, 34, 12, 3],
1650
+ '33,39': [15, 1, 28],
1651
+ // Row 34 — Ease of repair
1652
+ '34,1': [2, 27, 35, 11],
1653
+ '34,2': [2, 27, 35, 11],
1654
+ '34,3': [1, 28, 10, 25],
1655
+ '34,4': [3, 18, 31],
1656
+ '34,5': [15, 13, 32],
1657
+ '34,6': [16, 25],
1658
+ '34,7': [25, 2, 35, 11],
1659
+ '34,8': [1],
1660
+ '34,9': [34, 9],
1661
+ '34,10': [1, 11, 10],
1662
+ '34,11': [13],
1663
+ '34,12': [1, 13, 2, 4],
1664
+ '34,13': [2, 35],
1665
+ '34,14': [11, 1, 2, 9],
1666
+ '34,15': [11, 29, 28, 27],
1667
+ '34,16': [1],
1668
+ '34,17': [4, 10],
1669
+ '34,18': [15, 1, 13],
1670
+ '34,19': [15, 1, 28, 16],
1671
+ '34,20': [],
1672
+ '34,21': [15, 10, 32, 2],
1673
+ '34,22': [15, 1, 32, 19],
1674
+ '34,23': [2, 35, 34, 27],
1675
+ '34,24': [],
1676
+ '34,25': [32, 1, 10, 25],
1677
+ '34,26': [2, 28, 10, 25],
1678
+ '34,27': [11, 10, 1, 16],
1679
+ '34,28': [10, 2, 13],
1680
+ '34,29': [25, 10],
1681
+ '34,30': [35, 10, 2, 16],
1682
+ '34,31': [],
1683
+ '34,32': [1, 35, 11, 10],
1684
+ '34,33': [1, 12, 26, 15],
1685
+ '34,35': [7, 1, 4, 16],
1686
+ '34,36': [35, 1, 13, 11],
1687
+ '34,37': [],
1688
+ '34,38': [34, 35, 7, 13],
1689
+ '34,39': [1, 32, 10],
1690
+ // Row 35 — Adaptability or versatility
1691
+ '35,1': [1, 6, 15, 8],
1692
+ '35,2': [19, 15, 29, 16],
1693
+ '35,3': [35, 1, 29, 2],
1694
+ '35,4': [1, 35, 16],
1695
+ '35,5': [35, 30, 29, 7],
1696
+ '35,6': [15, 16],
1697
+ '35,7': [15, 35, 29],
1698
+ '35,8': [],
1699
+ '35,9': [35, 10, 14],
1700
+ '35,10': [15, 17, 20],
1701
+ '35,11': [35, 16],
1702
+ '35,12': [15, 37, 1, 8],
1703
+ '35,13': [35, 30, 14],
1704
+ '35,14': [35, 3, 32, 6],
1705
+ '35,15': [13, 1, 35],
1706
+ '35,16': [2, 16],
1707
+ '35,17': [27, 2, 3, 35],
1708
+ '35,18': [6, 22, 26, 1],
1709
+ '35,19': [19, 35, 29, 13],
1710
+ '35,20': [],
1711
+ '35,21': [19, 1, 29],
1712
+ '35,22': [18, 15, 1],
1713
+ '35,23': [15, 10, 2, 13],
1714
+ '35,24': [],
1715
+ '35,25': [35, 28],
1716
+ '35,26': [3, 35, 15],
1717
+ '35,27': [35, 13, 8, 24],
1718
+ '35,28': [35, 5, 1, 10],
1719
+ '35,29': [],
1720
+ '35,30': [35, 11, 32, 31],
1721
+ '35,31': [],
1722
+ '35,32': [1, 13, 31],
1723
+ '35,33': [15, 34, 1, 16],
1724
+ '35,34': [1, 16, 7, 4],
1725
+ '35,36': [15, 29, 37, 28],
1726
+ '35,37': [1],
1727
+ '35,38': [27, 34, 35],
1728
+ '35,39': [35, 28, 6, 37],
1729
+ // Row 36 — Device complexity
1730
+ '36,1': [26, 30, 34, 36],
1731
+ '36,2': [2, 26, 35, 39],
1732
+ '36,3': [1, 19, 26, 24],
1733
+ '36,4': [26],
1734
+ '36,5': [14, 1, 13, 16],
1735
+ '36,6': [6, 36],
1736
+ '36,7': [34, 26, 6],
1737
+ '36,8': [1, 16],
1738
+ '36,9': [34, 10, 28],
1739
+ '36,10': [26, 16],
1740
+ '36,11': [19, 1, 35],
1741
+ '36,12': [29, 13, 28, 15],
1742
+ '36,13': [2, 22, 17, 19],
1743
+ '36,14': [2, 13, 28],
1744
+ '36,15': [10, 4, 28, 15],
1745
+ '36,16': [],
1746
+ '36,17': [2, 17, 13],
1747
+ '36,18': [24, 17, 13],
1748
+ '36,19': [27, 2, 29, 28],
1749
+ '36,20': [],
1750
+ '36,21': [20, 19, 30, 34],
1751
+ '36,22': [10, 35, 13, 2],
1752
+ '36,23': [35, 10, 28, 29],
1753
+ '36,24': [],
1754
+ '36,25': [6, 29],
1755
+ '36,26': [13, 3, 27, 10],
1756
+ '36,27': [13, 35, 1],
1757
+ '36,28': [2, 26, 10, 34],
1758
+ '36,29': [26, 24, 32],
1759
+ '36,30': [22, 19, 29, 40],
1760
+ '36,31': [19, 1],
1761
+ '36,32': [27, 26, 1, 13],
1762
+ '36,33': [27, 9, 26, 24],
1763
+ '36,34': [1, 13],
1764
+ '36,35': [29, 15, 28, 37],
1765
+ '36,37': [15, 10, 37, 28],
1766
+ '36,38': [15, 1, 24],
1767
+ '36,39': [12, 17, 28],
1768
+ // Row 37 — Difficulty of detecting and measuring
1769
+ '37,1': [27, 26, 28, 13],
1770
+ '37,2': [6, 13, 28, 1],
1771
+ '37,3': [16, 17, 26, 24],
1772
+ '37,4': [26],
1773
+ '37,5': [2, 13, 18, 17],
1774
+ '37,6': [2, 35, 30, 18],
1775
+ '37,7': [29, 1, 4, 16],
1776
+ '37,8': [2, 18, 26, 31],
1777
+ '37,9': [3, 4, 16, 35],
1778
+ '37,10': [30, 28, 40, 19],
1779
+ '37,11': [35, 36, 37, 32],
1780
+ '37,12': [27, 13, 1, 39],
1781
+ '37,13': [11, 22, 39, 30],
1782
+ '37,14': [27, 3, 15, 28],
1783
+ '37,15': [19, 29, 39, 25],
1784
+ '37,16': [25, 34, 6, 35],
1785
+ '37,17': [3, 27, 35, 16],
1786
+ '37,18': [2, 24, 26],
1787
+ '37,19': [35, 38],
1788
+ '37,20': [],
1789
+ '37,21': [19, 35, 16],
1790
+ '37,22': [18, 1, 16, 10],
1791
+ '37,23': [35, 3, 15, 19],
1792
+ '37,24': [1, 18, 10, 24],
1793
+ '37,25': [35, 33, 27, 22],
1794
+ '37,26': [18, 28, 32, 9],
1795
+ '37,27': [3, 27, 29, 18],
1796
+ '37,28': [27, 40, 28, 8],
1797
+ '37,29': [26, 24, 32, 28],
1798
+ '37,30': [22, 19, 29, 28],
1799
+ '37,31': [2, 21],
1800
+ '37,32': [5, 28, 11, 29],
1801
+ '37,33': [2, 5],
1802
+ '37,34': [12, 26],
1803
+ '37,35': [1, 15],
1804
+ '37,36': [15, 10, 37, 28],
1805
+ '37,38': [34, 21],
1806
+ '37,39': [35, 18],
1807
+ // Row 38 — Extent of automation
1808
+ '38,1': [28, 26, 18, 35],
1809
+ '38,2': [28, 26, 35, 10],
1810
+ '38,3': [14, 13, 17, 28],
1811
+ '38,4': [23],
1812
+ '38,5': [17, 14, 13],
1813
+ '38,6': [],
1814
+ '38,7': [35, 13, 16],
1815
+ '38,8': [],
1816
+ '38,9': [28, 10],
1817
+ '38,10': [2, 35],
1818
+ '38,11': [13, 35],
1819
+ '38,12': [15, 32, 1, 13],
1820
+ '38,13': [18, 1],
1821
+ '38,14': [25, 13],
1822
+ '38,15': [6, 9],
1823
+ '38,16': [],
1824
+ '38,17': [26, 2, 19],
1825
+ '38,18': [8, 32, 19],
1826
+ '38,19': [2, 32, 13],
1827
+ '38,20': [],
1828
+ '38,21': [28, 2, 27],
1829
+ '38,22': [23, 28],
1830
+ '38,23': [35, 10, 18, 5],
1831
+ '38,24': [35, 33],
1832
+ '38,25': [24, 28, 35, 30],
1833
+ '38,26': [35, 13],
1834
+ '38,27': [11, 27, 32],
1835
+ '38,28': [28, 26, 10, 34],
1836
+ '38,29': [28, 26, 18, 23],
1837
+ '38,30': [2, 33],
1838
+ '38,31': [2],
1839
+ '38,32': [1, 26, 13],
1840
+ '38,33': [1, 12, 34, 3],
1841
+ '38,34': [1, 35, 13],
1842
+ '38,35': [27, 4, 1, 35],
1843
+ '38,36': [15, 24, 10],
1844
+ '38,37': [34, 27, 25],
1845
+ '38,39': [5, 12, 35, 26],
1846
+ // Row 39 — Productivity
1847
+ '39,1': [35, 26, 24, 37],
1848
+ '39,2': [28, 27, 15, 3],
1849
+ '39,3': [18, 4, 28, 38],
1850
+ '39,4': [30, 7, 14, 26],
1851
+ '39,5': [10, 26, 34, 31],
1852
+ '39,6': [10, 35, 17, 7],
1853
+ '39,7': [2, 6, 34, 10],
1854
+ '39,8': [35, 37, 10, 2],
1855
+ '39,9': [],
1856
+ '39,10': [28, 15, 10, 36],
1857
+ '39,11': [10, 37, 14],
1858
+ '39,12': [14, 10, 34, 40],
1859
+ '39,13': [35, 3, 22, 39],
1860
+ '39,14': [29, 28, 10, 18],
1861
+ '39,15': [35, 10, 2, 18],
1862
+ '39,16': [20, 10, 16, 38],
1863
+ '39,17': [35, 21, 28, 10],
1864
+ '39,18': [26, 17, 19, 1],
1865
+ '39,19': [35, 10, 38, 19],
1866
+ '39,20': [1],
1867
+ '39,21': [35, 20, 10],
1868
+ '39,22': [28, 10, 29, 35],
1869
+ '39,23': [28, 10, 35, 23],
1870
+ '39,24': [13, 15, 23],
1871
+ '39,25': [35, 17, 14, 19],
1872
+ '39,26': [35, 38],
1873
+ '39,27': [1, 35, 10, 38],
1874
+ '39,28': [1, 10, 34, 28],
1875
+ '39,29': [18, 10, 32, 1],
1876
+ '39,30': [22, 35, 13, 24],
1877
+ '39,31': [35, 22, 18, 39],
1878
+ '39,32': [35, 28, 2, 24],
1879
+ '39,33': [12, 35, 1, 18],
1880
+ '39,34': [1, 28, 7, 19],
1881
+ '39,35': [1, 32, 10, 25],
1882
+ '39,36': [1, 35, 28, 37],
1883
+ '39,37': [12, 17, 28, 24],
1884
+ '39,38': [35, 18, 27, 2],
1885
+ };
1886
+ // Backward-compat: the legacy ContradictionComposer reads these.
1887
+ export const UNIVERSAL_PRINCIPLES = [35, 1, 10, 28, 19];
1888
+ // ─────────────────────────────────────────────────────────────────────────────
1889
+ // Lookup API
1890
+ // ─────────────────────────────────────────────────────────────────────────────
1891
+ /**
1892
+ * Returns recommended principle numbers for the (improving × worsening) cell.
1893
+ * Empty array if the cell is not in the matrix (including the diagonal).
1894
+ */
1895
+ export function lookupPrinciples(improving, worsening) {
1896
+ if (!Number.isInteger(improving) ||
1897
+ !Number.isInteger(worsening) ||
1898
+ improving < 1 ||
1899
+ improving > 39 ||
1900
+ worsening < 1 ||
1901
+ worsening > 39 ||
1902
+ improving === worsening) {
1903
+ return [];
1904
+ }
1905
+ const cell = M[`${improving},${worsening}`];
1906
+ return cell ? cell.slice() : [];
1907
+ }
1908
+ /**
1909
+ * Convenience: returns the full principle objects for an (improving × worsening)
1910
+ * cell. Resolved from `lookupPrinciples` against `TRIZ_PRINCIPLES`.
1911
+ */
1912
+ export function lookupPrincipleObjects(improving, worsening) {
1913
+ const nums = lookupPrinciples(improving, worsening);
1914
+ const out = [];
1915
+ for (const n of nums) {
1916
+ const p = TRIZ_PRINCIPLES.find((q) => q.num === n);
1917
+ if (p)
1918
+ out.push(p);
1919
+ }
1920
+ return out;
1921
+ }
1922
+ // Legacy entry point used by ContradictionComposer (Phase 5.5γ). When the
1923
+ // cell is empty, falls back to UNIVERSAL_PRINCIPLES so the UI always has
1924
+ // something to show. New code should call `lookupPrinciples` directly and
1925
+ // decide how to handle empty cells itself.
1926
+ export function lookupContradiction(improving, worsening) {
1927
+ if (improving === worsening) {
1928
+ return {
1929
+ improving,
1930
+ worsening,
1931
+ principles: UNIVERSAL_PRINCIPLES.slice(0, 3),
1932
+ isFallback: true,
1933
+ cellSize: 0,
1934
+ };
1935
+ }
1936
+ const cell = lookupPrinciples(improving, worsening);
1937
+ if (cell.length === 0) {
1938
+ return {
1939
+ improving,
1940
+ worsening,
1941
+ principles: UNIVERSAL_PRINCIPLES.slice(0, 3),
1942
+ isFallback: true,
1943
+ cellSize: 0,
1944
+ };
1945
+ }
1946
+ return {
1947
+ improving,
1948
+ worsening,
1949
+ principles: cell.slice(0, 3),
1950
+ isFallback: false,
1951
+ cellSize: cell.length,
1952
+ };
1953
+ }
1954
+ // Diagnostics — number of matrix cells with at least one principle.
1955
+ // Total is 39*39 - 39 (diagonal excluded).
1956
+ export function matrixCoverage() {
1957
+ let filled = 0;
1958
+ for (const key of Object.keys(M)) {
1959
+ const cell = M[key];
1960
+ if (cell && cell.length > 0)
1961
+ filled++;
1962
+ }
1963
+ return { filled, total: 39 * 39 - 39 };
1964
+ }