zcw-shared 1.31.0 → 1.32.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/functions/algorithm/lcsVisual.d.ts +6 -0
- package/dist/functions/algorithm/lcsVisual.js +88 -0
- package/dist/functions/algorithm/lcsVisual.js.map +1 -0
- package/dist/functions/algorithm/mergeSortVisual.d.ts +5 -0
- package/dist/functions/algorithm/mergeSortVisual.js +103 -0
- package/dist/functions/algorithm/mergeSortVisual.js.map +1 -0
- package/dist/functions/algorithm/nQueensVisual.d.ts +14 -0
- package/dist/functions/algorithm/nQueensVisual.js +94 -0
- package/dist/functions/algorithm/nQueensVisual.js.map +1 -0
- package/dist/functions/algorithm/numIslandsVisual.d.ts +17 -0
- package/dist/functions/algorithm/numIslandsVisual.js +102 -0
- package/dist/functions/algorithm/numIslandsVisual.js.map +1 -0
- package/dist/functions/algorithm/quickSortVisual.d.ts +18 -0
- package/dist/functions/algorithm/quickSortVisual.js +104 -0
- package/dist/functions/algorithm/quickSortVisual.js.map +1 -0
- package/dist/functions/browser/detectDevice.d.ts +10 -0
- package/dist/functions/browser/detectDevice.js +49 -0
- package/dist/functions/browser/detectDevice.js.map +1 -0
- package/dist/functions/cookie/getCookie.d.ts +5 -0
- package/dist/functions/cookie/getCookie.js +14 -0
- package/dist/functions/cookie/getCookie.js.map +1 -0
- package/dist/functions/cookie/removeCookie.d.ts +8 -0
- package/dist/functions/cookie/removeCookie.js +12 -0
- package/dist/functions/cookie/removeCookie.js.map +1 -0
- package/dist/functions/cookie/setCookie.d.ts +11 -0
- package/dist/functions/cookie/setCookie.js +23 -0
- package/dist/functions/cookie/setCookie.js.map +1 -0
- package/dist/functions/data-structures/EventEmitter.d.ts +32 -0
- package/dist/functions/data-structures/EventEmitter.js +108 -0
- package/dist/functions/data-structures/EventEmitter.js.map +1 -0
- package/dist/functions/data-structures/MyPromise.d.ts +32 -0
- package/dist/functions/data-structures/MyPromise.js +254 -0
- package/dist/functions/data-structures/MyPromise.js.map +1 -0
- package/dist/functions/reactive/useReactiveCookie.d.ts +19 -0
- package/dist/functions/reactive/useReactiveCookie.js +84 -0
- package/dist/functions/reactive/useReactiveCookie.js.map +1 -0
- package/dist/hooks/useClickOutside.d.ts +12 -0
- package/dist/hooks/useClickOutside.js +16 -0
- package/dist/hooks/useClickOutside.js.map +1 -0
- package/dist/hooks/useClipboard.d.ts +20 -0
- package/dist/hooks/useClipboard.js +33 -0
- package/dist/hooks/useClipboard.js.map +1 -0
- package/dist/hooks/useCounter.d.ts +19 -0
- package/dist/hooks/useCounter.js +44 -0
- package/dist/hooks/useCounter.js.map +1 -0
- package/dist/hooks/useEventListener.d.ts +14 -0
- package/dist/hooks/useEventListener.js +18 -0
- package/dist/hooks/useEventListener.js.map +1 -0
- package/dist/hooks/useInterval.d.ts +19 -0
- package/dist/hooks/useInterval.js +33 -0
- package/dist/hooks/useInterval.js.map +1 -0
- package/dist/hooks/useTimeout.d.ts +20 -0
- package/dist/hooks/useTimeout.js +40 -0
- package/dist/hooks/useTimeout.js.map +1 -0
- package/dist/hooks/useToggle.d.ts +15 -0
- package/dist/hooks/useToggle.js +23 -0
- package/dist/hooks/useToggle.js.map +1 -0
- package/dist/reactive/createGlobalState.d.ts +2 -0
- package/dist/reactive/createGlobalState.js +11 -0
- package/dist/reactive/createGlobalState.js.map +1 -0
- package/dist/reactive/createSharedComposable.d.ts +2 -0
- package/dist/reactive/createSharedComposable.js +13 -0
- package/dist/reactive/createSharedComposable.js.map +1 -0
- package/dist/reactive/errorManager.d.ts +63 -0
- package/dist/reactive/errorManager.js +199 -0
- package/dist/reactive/errorManager.js.map +1 -0
- package/dist/reactive/i18n.d.ts +27 -0
- package/dist/reactive/i18n.js +119 -0
- package/dist/reactive/i18n.js.map +1 -0
- package/dist/reactive/permission.d.ts +40 -0
- package/dist/reactive/permission.js +189 -0
- package/dist/reactive/permission.js.map +1 -0
- package/dist/reactive/pinia.d.ts +52 -0
- package/dist/reactive/pinia.js +183 -0
- package/dist/reactive/pinia.js.map +1 -0
- package/dist/reactive/useAltool.d.ts +39 -0
- package/dist/reactive/useAltool.js +350 -0
- package/dist/reactive/useAltool.js.map +1 -0
- package/dist/reactive/useCache.d.ts +18 -0
- package/dist/reactive/useCache.js +82 -0
- package/dist/reactive/useCache.js.map +1 -0
- package/dist/reactive/useLocalStorage.d.ts +8 -0
- package/dist/reactive/useLocalStorage.js +101 -0
- package/dist/reactive/useLocalStorage.js.map +1 -0
- package/dist/reactive/usePluginSystem.d.ts +11 -0
- package/dist/reactive/usePluginSystem.js +34 -0
- package/dist/reactive/usePluginSystem.js.map +1 -0
- package/dist/reactive/useSessionStorage.d.ts +8 -0
- package/dist/reactive/useSessionStorage.js +101 -0
- package/dist/reactive/useSessionStorage.js.map +1 -0
- package/dist/reactive/useStorage.d.ts +13 -0
- package/dist/reactive/useStorage.js +62 -0
- package/dist/reactive/useStorage.js.map +1 -0
- package/dist/reactive/useStorageWithIndexedDB.d.ts +8 -0
- package/dist/reactive/useStorageWithIndexedDB.js +132 -0
- package/dist/reactive/useStorageWithIndexedDB.js.map +1 -0
- package/dist/vue-hooks/browser/useFileUpload.d.ts +1 -1
- package/dist/vue-hooks/browser/useFileUpload.js +10 -5
- package/dist/vue-hooks/browser/useFileUpload.js.map +1 -1
- package/dist/vue-hooks/state/handleUserInvalid.d.ts +10 -0
- package/dist/vue-hooks/state/handleUserInvalid.js +7 -0
- package/dist/vue-hooks/state/handleUserInvalid.js.map +1 -0
- package/dist/vue-hooks/state/useGlobalSettingsManager.d.ts +50 -0
- package/dist/vue-hooks/state/useGlobalSettingsManager.js +129 -0
- package/dist/vue-hooks/state/useGlobalSettingsManager.js.map +1 -0
- package/dist/vue-hooks/state/useSystemSettingsManager.d.ts +45 -0
- package/dist/vue-hooks/state/useSystemSettingsManager.js +102 -0
- package/dist/vue-hooks/state/useSystemSettingsManager.js.map +1 -0
- package/dist/vue-hooks/state/useToken.d.ts +36 -0
- package/dist/vue-hooks/state/useToken.js +121 -0
- package/dist/vue-hooks/state/useToken.js.map +1 -0
- package/dist/vue-hooks/state/useTokenManager.d.ts +55 -0
- package/dist/vue-hooks/state/useTokenManager.js +146 -0
- package/dist/vue-hooks/state/useTokenManager.js.map +1 -0
- package/dist/vue-hooks/state/useUserManager.d.ts +41 -0
- package/dist/vue-hooks/state/useUserManager.js +77 -0
- package/dist/vue-hooks/state/useUserManager.js.map +1 -0
- package/package.json +6 -1
- package/dist/functions/platform/tencent-cloud/deploy.tcb.d.ts +0 -13
- package/dist/functions/platform/tencent-cloud/deploy.tcb.js +0 -46
- package/dist/functions/platform/tencent-cloud/deploy.tcb.js.map +0 -1
- package/dist/functions/platform/tencent-cloud/getSecret.d.ts +0 -4
- package/dist/functions/platform/tencent-cloud/getSecret.js +0 -19
- package/dist/functions/platform/tencent-cloud/getSecret.js.map +0 -1
- package/dist/functions/platform/uniapp/app-plus/buildAndroidApp.d.ts +0 -27
- package/dist/functions/platform/uniapp/app-plus/buildAndroidApp.js +0 -287
- package/dist/functions/platform/uniapp/app-plus/buildAndroidApp.js.map +0 -1
- package/dist/functions/platform/uniapp/build.d.ts +0 -21
- package/dist/functions/platform/uniapp/build.js +0 -83
- package/dist/functions/platform/uniapp/build.js.map +0 -1
- package/dist/functions/platform/uniapp/detectAndroidProjectStructure.d.ts +0 -11
- package/dist/functions/platform/uniapp/detectAndroidProjectStructure.js +0 -30
- package/dist/functions/platform/uniapp/detectAndroidProjectStructure.js.map +0 -1
- package/dist/functions/platform/uniapp/detectProjectType.d.ts +0 -20
- package/dist/functions/platform/uniapp/detectProjectType.js +0 -68
- package/dist/functions/platform/uniapp/detectProjectType.js.map +0 -1
- package/dist/functions/platform/uniapp/parseManifest.d.ts +0 -18
- package/dist/functions/platform/uniapp/parseManifest.js +0 -49
- package/dist/functions/platform/uniapp/parseManifest.js.map +0 -1
- package/dist/functions/platform/uniapp/waitForPages.d.ts +0 -7
- package/dist/functions/platform/uniapp/waitForPages.js +0 -20
- package/dist/functions/platform/uniapp/waitForPages.js.map +0 -1
- package/dist/functions/string/visualizeRegexSteps.d.ts +0 -39
- package/dist/functions/string/visualizeRegexSteps.js +0 -446
- package/dist/functions/string/visualizeRegexSteps.js.map +0 -1
- package/dist/functions/utils/createI18n.d.ts +0 -2
- package/dist/functions/utils/createI18n.js +0 -97
- package/dist/functions/utils/createI18n.js.map +0 -1
- package/dist/functions/utils/formatString.d.ts +0 -5
- package/dist/functions/utils/formatString.js +0 -9
- package/dist/functions/utils/formatString.js.map +0 -1
- package/dist/hooks/usePermission.d.ts +0 -7
- package/dist/hooks/usePermission.js +0 -123
- package/dist/hooks/usePermission.js.map +0 -1
- package/dist/vue-hooks/dom/useKeyboard.d.ts +0 -29
- package/dist/vue-hooks/dom/useKeyboard.js +0 -129
- package/dist/vue-hooks/dom/useKeyboard.js.map +0 -1
- package/dist/vue-hooks/state/useFileUpload.d.ts +0 -23
- package/dist/vue-hooks/state/useFileUpload.js +0 -93
- package/dist/vue-hooks/state/useFileUpload.js.map +0 -1
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
export function lcsVisual(str1, str2) {
|
|
2
|
+
const steps = [];
|
|
3
|
+
let stepNumber = 0;
|
|
4
|
+
const m = str1.length;
|
|
5
|
+
const n = str2.length;
|
|
6
|
+
const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
|
|
7
|
+
steps.push({
|
|
8
|
+
stepNumber: stepNumber++,
|
|
9
|
+
description: '初始化DP表',
|
|
10
|
+
dpTable: dp.map(row => [...row])
|
|
11
|
+
});
|
|
12
|
+
for (let i = 1; i <= m; i++) {
|
|
13
|
+
for (let j = 1; j <= n; j++) {
|
|
14
|
+
steps.push({
|
|
15
|
+
stepNumber: stepNumber++,
|
|
16
|
+
description: `处理 str1[${i - 1}]='${str1[i - 1]}' 和 str2[${j - 1}]='${str2[j - 1]}'`,
|
|
17
|
+
dpTable: dp.map(row => [...row]),
|
|
18
|
+
currentCell: { row: i, col: j }
|
|
19
|
+
});
|
|
20
|
+
if (str1[i - 1] === str2[j - 1]) {
|
|
21
|
+
dp[i][j] = dp[i - 1][j - 1] + 1;
|
|
22
|
+
steps.push({
|
|
23
|
+
stepNumber: stepNumber++,
|
|
24
|
+
description: `字符相同!dp[${i}][${j}] = dp[${i - 1}][${j - 1}] + 1 = ${dp[i][j]}`,
|
|
25
|
+
dpTable: dp.map(row => [...row]),
|
|
26
|
+
currentCell: { row: i, col: j },
|
|
27
|
+
dependencies: [{ row: i - 1, col: j - 1 }],
|
|
28
|
+
currentValue: dp[i][j]
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
|
|
33
|
+
steps.push({
|
|
34
|
+
stepNumber: stepNumber++,
|
|
35
|
+
description: `字符不同,取最大值: dp[${i}][${j}] = max(${dp[i - 1][j]}, ${dp[i][j - 1]}) = ${dp[i][j]}`,
|
|
36
|
+
dpTable: dp.map(row => [...row]),
|
|
37
|
+
currentCell: { row: i, col: j },
|
|
38
|
+
dependencies: [{ row: i - 1, col: j }, { row: i, col: j - 1 }],
|
|
39
|
+
currentValue: dp[i][j]
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
let i = m, j = n;
|
|
45
|
+
const lcs = [];
|
|
46
|
+
while (i > 0 && j > 0) {
|
|
47
|
+
if (str1[i - 1] === str2[j - 1]) {
|
|
48
|
+
lcs.unshift(str1[i - 1]);
|
|
49
|
+
steps.push({
|
|
50
|
+
stepNumber: stepNumber++,
|
|
51
|
+
description: `回溯: 字符'${str1[i - 1]}'是LCS的一部分`,
|
|
52
|
+
dpTable: dp.map(row => [...row]),
|
|
53
|
+
currentCell: { row: i, col: j }
|
|
54
|
+
});
|
|
55
|
+
i--;
|
|
56
|
+
j--;
|
|
57
|
+
}
|
|
58
|
+
else if (dp[i - 1][j] > dp[i][j - 1]) {
|
|
59
|
+
steps.push({
|
|
60
|
+
stepNumber: stepNumber++,
|
|
61
|
+
description: `回溯: 向上移动`,
|
|
62
|
+
dpTable: dp.map(row => [...row]),
|
|
63
|
+
currentCell: { row: i, col: j }
|
|
64
|
+
});
|
|
65
|
+
i--;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
steps.push({
|
|
69
|
+
stepNumber: stepNumber++,
|
|
70
|
+
description: `回溯: 向左移动`,
|
|
71
|
+
dpTable: dp.map(row => [...row]),
|
|
72
|
+
currentCell: { row: i, col: j }
|
|
73
|
+
});
|
|
74
|
+
j--;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
steps.push({
|
|
78
|
+
stepNumber: stepNumber++,
|
|
79
|
+
description: `LCS构建完成: "${lcs.join('')}", 长度 ${dp[m][n]}`,
|
|
80
|
+
dpTable: dp.map(row => [...row])
|
|
81
|
+
});
|
|
82
|
+
return {
|
|
83
|
+
steps,
|
|
84
|
+
length: dp[m][n],
|
|
85
|
+
sequence: lcs.join('')
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=lcsVisual.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lcsVisual.js","sourceRoot":"","sources":["../../../src/functions/algorithm/lcsVisual.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
export function mergeSortVisual(arr) {
|
|
2
|
+
const steps = [];
|
|
3
|
+
let stepNumber = 0;
|
|
4
|
+
const result = [...arr];
|
|
5
|
+
steps.push({
|
|
6
|
+
stepNumber: stepNumber++,
|
|
7
|
+
description: '开始归并排序',
|
|
8
|
+
array: [...result],
|
|
9
|
+
highlights: {}
|
|
10
|
+
});
|
|
11
|
+
function merge(arr, left, mid, right) {
|
|
12
|
+
const leftArr = arr.slice(left, mid + 1);
|
|
13
|
+
const rightArr = arr.slice(mid + 1, right + 1);
|
|
14
|
+
steps.push({
|
|
15
|
+
stepNumber: stepNumber++,
|
|
16
|
+
description: `合并两个已排序数组: [${left}..${mid}] 和 [${mid + 1}..${right}]`,
|
|
17
|
+
array: [...arr],
|
|
18
|
+
highlights: { primary: [mid], secondary: Array.from({ length: right - left + 1 }, (_, i) => left + i) },
|
|
19
|
+
range: { left, right }
|
|
20
|
+
});
|
|
21
|
+
let i = 0, j = 0, k = left;
|
|
22
|
+
while (i < leftArr.length && j < rightArr.length) {
|
|
23
|
+
steps.push({
|
|
24
|
+
stepNumber: stepNumber++,
|
|
25
|
+
description: `比较 ${leftArr[i]} 和 ${rightArr[j]}`,
|
|
26
|
+
array: [...arr],
|
|
27
|
+
highlights: { comparing: [left + i, mid + 1 + j] },
|
|
28
|
+
range: { left, right }
|
|
29
|
+
});
|
|
30
|
+
if (leftArr[i] <= rightArr[j]) {
|
|
31
|
+
arr[k] = leftArr[i];
|
|
32
|
+
steps.push({
|
|
33
|
+
stepNumber: stepNumber++,
|
|
34
|
+
description: `选择 ${leftArr[i]},放入位置 ${k}`,
|
|
35
|
+
array: [...arr],
|
|
36
|
+
highlights: { completed: [k] },
|
|
37
|
+
range: { left, right }
|
|
38
|
+
});
|
|
39
|
+
i++;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
arr[k] = rightArr[j];
|
|
43
|
+
steps.push({
|
|
44
|
+
stepNumber: stepNumber++,
|
|
45
|
+
description: `选择 ${rightArr[j]},放入位置 ${k}`,
|
|
46
|
+
array: [...arr],
|
|
47
|
+
highlights: { completed: [k] },
|
|
48
|
+
range: { left, right }
|
|
49
|
+
});
|
|
50
|
+
j++;
|
|
51
|
+
}
|
|
52
|
+
k++;
|
|
53
|
+
}
|
|
54
|
+
while (i < leftArr.length) {
|
|
55
|
+
arr[k] = leftArr[i];
|
|
56
|
+
steps.push({
|
|
57
|
+
stepNumber: stepNumber++,
|
|
58
|
+
description: `复制剩余元素 ${leftArr[i]} 到位置 ${k}`,
|
|
59
|
+
array: [...arr],
|
|
60
|
+
highlights: { completed: [k] },
|
|
61
|
+
range: { left, right }
|
|
62
|
+
});
|
|
63
|
+
i++;
|
|
64
|
+
k++;
|
|
65
|
+
}
|
|
66
|
+
while (j < rightArr.length) {
|
|
67
|
+
arr[k] = rightArr[j];
|
|
68
|
+
steps.push({
|
|
69
|
+
stepNumber: stepNumber++,
|
|
70
|
+
description: `复制剩余元素 ${rightArr[j]} 到位置 ${k}`,
|
|
71
|
+
array: [...arr],
|
|
72
|
+
highlights: { completed: [k] },
|
|
73
|
+
range: { left, right }
|
|
74
|
+
});
|
|
75
|
+
j++;
|
|
76
|
+
k++;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function mergeSortHelper(arr, left, right) {
|
|
80
|
+
if (left >= right)
|
|
81
|
+
return;
|
|
82
|
+
const mid = Math.floor((left + right) / 2);
|
|
83
|
+
steps.push({
|
|
84
|
+
stepNumber: stepNumber++,
|
|
85
|
+
description: `分割数组 [${left}..${right}] 为 [${left}..${mid}] 和 [${mid + 1}..${right}]`,
|
|
86
|
+
array: [...arr],
|
|
87
|
+
highlights: { primary: [mid] },
|
|
88
|
+
range: { left, right }
|
|
89
|
+
});
|
|
90
|
+
mergeSortHelper(arr, left, mid);
|
|
91
|
+
mergeSortHelper(arr, mid + 1, right);
|
|
92
|
+
merge(arr, left, mid, right);
|
|
93
|
+
}
|
|
94
|
+
mergeSortHelper(result, 0, result.length - 1);
|
|
95
|
+
steps.push({
|
|
96
|
+
stepNumber: stepNumber++,
|
|
97
|
+
description: '归并排序完成!',
|
|
98
|
+
array: [...result],
|
|
99
|
+
highlights: { completed: result.map((_, i) => i) }
|
|
100
|
+
});
|
|
101
|
+
return { steps, result };
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=mergeSortVisual.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mergeSortVisual.js","sourceRoot":"","sources":["../../../src/functions/algorithm/mergeSortVisual.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { BacktrackVisualStep } from '../../../types/algorithm-visual';
|
|
2
|
+
export interface NQueensVisualStep extends BacktrackVisualStep {
|
|
3
|
+
board: string[][];
|
|
4
|
+
currentRow: number;
|
|
5
|
+
tryingCol?: number;
|
|
6
|
+
conflicts?: Array<{
|
|
7
|
+
row: number;
|
|
8
|
+
col: number;
|
|
9
|
+
}>;
|
|
10
|
+
}
|
|
11
|
+
export declare function nQueensVisual(n: number): {
|
|
12
|
+
steps: NQueensVisualStep[];
|
|
13
|
+
solutions: string[][];
|
|
14
|
+
};
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
export function nQueensVisual(n) {
|
|
2
|
+
const steps = [];
|
|
3
|
+
let stepNumber = 0;
|
|
4
|
+
const solutions = [];
|
|
5
|
+
const board = Array.from({ length: n }, () => Array(n).fill('.'));
|
|
6
|
+
const cols = new Set();
|
|
7
|
+
const diag1 = new Set();
|
|
8
|
+
const diag2 = new Set();
|
|
9
|
+
steps.push({
|
|
10
|
+
stepNumber: stepNumber++,
|
|
11
|
+
description: `开始解决${n}皇后问题`,
|
|
12
|
+
path: [],
|
|
13
|
+
board: board.map(r => [...r]),
|
|
14
|
+
currentRow: 0
|
|
15
|
+
});
|
|
16
|
+
function backtrack(row) {
|
|
17
|
+
if (row === n) {
|
|
18
|
+
solutions.push(board.map(r => r.join('')));
|
|
19
|
+
steps.push({
|
|
20
|
+
stepNumber: stepNumber++,
|
|
21
|
+
description: `找到一个解决方案!(第${solutions.length}个)`,
|
|
22
|
+
path: Array.from({ length: n }, (_, i) => board[i].indexOf('Q')),
|
|
23
|
+
board: board.map(r => [...r]),
|
|
24
|
+
currentRow: row,
|
|
25
|
+
isBacktracking: false
|
|
26
|
+
});
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
for (let col = 0; col < n; col++) {
|
|
30
|
+
steps.push({
|
|
31
|
+
stepNumber: stepNumber++,
|
|
32
|
+
description: `第${row}行: 尝试在第${col}列放置皇后`,
|
|
33
|
+
path: Array.from({ length: row }, (_, i) => board[i].indexOf('Q')),
|
|
34
|
+
board: board.map(r => [...r]),
|
|
35
|
+
currentRow: row,
|
|
36
|
+
tryingCol: col
|
|
37
|
+
});
|
|
38
|
+
const hasConflict = cols.has(col) || diag1.has(row - col) || diag2.has(row + col);
|
|
39
|
+
if (hasConflict) {
|
|
40
|
+
const conflicts = [];
|
|
41
|
+
for (let i = 0; i < row; i++) {
|
|
42
|
+
const queenCol = board[i].indexOf('Q');
|
|
43
|
+
if (queenCol === col || i - queenCol === row - col || i + queenCol === row + col) {
|
|
44
|
+
conflicts.push({ row: i, col: queenCol });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
steps.push({
|
|
48
|
+
stepNumber: stepNumber++,
|
|
49
|
+
description: `冲突!该位置会与已放置的皇后冲突`,
|
|
50
|
+
path: [],
|
|
51
|
+
board: board.map(r => [...r]),
|
|
52
|
+
currentRow: row,
|
|
53
|
+
tryingCol: col,
|
|
54
|
+
conflicts
|
|
55
|
+
});
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
board[row][col] = 'Q';
|
|
59
|
+
cols.add(col);
|
|
60
|
+
diag1.add(row - col);
|
|
61
|
+
diag2.add(row + col);
|
|
62
|
+
steps.push({
|
|
63
|
+
stepNumber: stepNumber++,
|
|
64
|
+
description: `在(${row}, ${col})放置皇后,继续下一行`,
|
|
65
|
+
path: Array.from({ length: row + 1 }, (_, i) => board[i].indexOf('Q')),
|
|
66
|
+
board: board.map(r => [...r]),
|
|
67
|
+
currentRow: row
|
|
68
|
+
});
|
|
69
|
+
backtrack(row + 1);
|
|
70
|
+
board[row][col] = '.';
|
|
71
|
+
cols.delete(col);
|
|
72
|
+
diag1.delete(row - col);
|
|
73
|
+
diag2.delete(row + col);
|
|
74
|
+
steps.push({
|
|
75
|
+
stepNumber: stepNumber++,
|
|
76
|
+
description: `回溯:移除(${row}, ${col})的皇后`,
|
|
77
|
+
path: Array.from({ length: row }, (_, i) => board[i].indexOf('Q')),
|
|
78
|
+
board: board.map(r => [...r]),
|
|
79
|
+
currentRow: row,
|
|
80
|
+
isBacktracking: true
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
backtrack(0);
|
|
85
|
+
steps.push({
|
|
86
|
+
stepNumber: stepNumber++,
|
|
87
|
+
description: `完成!共找到${solutions.length}个解决方案`,
|
|
88
|
+
path: [],
|
|
89
|
+
board: board.map(r => [...r]),
|
|
90
|
+
currentRow: n
|
|
91
|
+
});
|
|
92
|
+
return { steps, solutions };
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=nQueensVisual.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nQueensVisual.js","sourceRoot":"","sources":["../../../src/functions/algorithm/nQueensVisual.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { GraphVisualStep } from '../../../types/algorithm-visual';
|
|
2
|
+
export interface IslandVisualStep extends GraphVisualStep {
|
|
3
|
+
grid: string[][];
|
|
4
|
+
currentPos?: {
|
|
5
|
+
row: number;
|
|
6
|
+
col: number;
|
|
7
|
+
};
|
|
8
|
+
islandCount: number;
|
|
9
|
+
stack?: Array<{
|
|
10
|
+
row: number;
|
|
11
|
+
col: number;
|
|
12
|
+
}>;
|
|
13
|
+
}
|
|
14
|
+
export declare function numIslandsVisual(grid: string[][]): {
|
|
15
|
+
steps: IslandVisualStep[];
|
|
16
|
+
count: number;
|
|
17
|
+
};
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
export function numIslandsVisual(grid) {
|
|
2
|
+
const steps = [];
|
|
3
|
+
let stepNumber = 0;
|
|
4
|
+
const gridCopy = grid.map(row => [...row]);
|
|
5
|
+
const m = gridCopy.length;
|
|
6
|
+
const n = gridCopy[0].length;
|
|
7
|
+
let count = 0;
|
|
8
|
+
steps.push({
|
|
9
|
+
stepNumber: stepNumber++,
|
|
10
|
+
description: '开始搜索岛屿',
|
|
11
|
+
graph: [],
|
|
12
|
+
visited: [],
|
|
13
|
+
grid: gridCopy.map(r => [...r]),
|
|
14
|
+
islandCount: 0
|
|
15
|
+
});
|
|
16
|
+
function dfs(i, j, islandId) {
|
|
17
|
+
if (i < 0 || i >= m || j < 0 || j >= n || gridCopy[i][j] === '0') {
|
|
18
|
+
steps.push({
|
|
19
|
+
stepNumber: stepNumber++,
|
|
20
|
+
description: `位置(${i},${j})越界或是水域,返回`,
|
|
21
|
+
graph: [],
|
|
22
|
+
visited: [],
|
|
23
|
+
grid: gridCopy.map(r => [...r]),
|
|
24
|
+
currentPos: { row: i, col: j },
|
|
25
|
+
islandCount: count
|
|
26
|
+
});
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
steps.push({
|
|
30
|
+
stepNumber: stepNumber++,
|
|
31
|
+
description: `访问陆地(${i},${j}),标记为岛屿${islandId}的一部分`,
|
|
32
|
+
graph: [],
|
|
33
|
+
visited: [],
|
|
34
|
+
grid: gridCopy.map(r => [...r]),
|
|
35
|
+
currentPos: { row: i, col: j },
|
|
36
|
+
islandCount: count
|
|
37
|
+
});
|
|
38
|
+
gridCopy[i][j] = '0';
|
|
39
|
+
steps.push({
|
|
40
|
+
stepNumber: stepNumber++,
|
|
41
|
+
description: `标记(${i},${j})为已访问`,
|
|
42
|
+
graph: [],
|
|
43
|
+
visited: [],
|
|
44
|
+
grid: gridCopy.map(r => [...r]),
|
|
45
|
+
currentPos: { row: i, col: j },
|
|
46
|
+
islandCount: count
|
|
47
|
+
});
|
|
48
|
+
const directions = [
|
|
49
|
+
{ name: '下', dr: 1, dc: 0 },
|
|
50
|
+
{ name: '上', dr: -1, dc: 0 },
|
|
51
|
+
{ name: '右', dr: 0, dc: 1 },
|
|
52
|
+
{ name: '左', dr: 0, dc: -1 }
|
|
53
|
+
];
|
|
54
|
+
for (const dir of directions) {
|
|
55
|
+
steps.push({
|
|
56
|
+
stepNumber: stepNumber++,
|
|
57
|
+
description: `从(${i},${j})向${dir.name}搜索`,
|
|
58
|
+
graph: [],
|
|
59
|
+
visited: [],
|
|
60
|
+
grid: gridCopy.map(r => [...r]),
|
|
61
|
+
currentPos: { row: i, col: j },
|
|
62
|
+
islandCount: count
|
|
63
|
+
});
|
|
64
|
+
dfs(i + dir.dr, j + dir.dc, islandId);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
for (let i = 0; i < m; i++) {
|
|
68
|
+
for (let j = 0; j < n; j++) {
|
|
69
|
+
if (gridCopy[i][j] === '1') {
|
|
70
|
+
count++;
|
|
71
|
+
steps.push({
|
|
72
|
+
stepNumber: stepNumber++,
|
|
73
|
+
description: `发现新岛屿${count}!起点(${i},${j})`,
|
|
74
|
+
graph: [],
|
|
75
|
+
visited: [],
|
|
76
|
+
grid: gridCopy.map(r => [...r]),
|
|
77
|
+
currentPos: { row: i, col: j },
|
|
78
|
+
islandCount: count
|
|
79
|
+
});
|
|
80
|
+
dfs(i, j, count);
|
|
81
|
+
steps.push({
|
|
82
|
+
stepNumber: stepNumber++,
|
|
83
|
+
description: `岛屿${count}搜索完成`,
|
|
84
|
+
graph: [],
|
|
85
|
+
visited: [],
|
|
86
|
+
grid: gridCopy.map(r => [...r]),
|
|
87
|
+
islandCount: count
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
steps.push({
|
|
93
|
+
stepNumber: stepNumber++,
|
|
94
|
+
description: `搜索完成!共找到${count}个岛屿`,
|
|
95
|
+
graph: [],
|
|
96
|
+
visited: [],
|
|
97
|
+
grid: gridCopy.map(r => [...r]),
|
|
98
|
+
islandCount: count
|
|
99
|
+
});
|
|
100
|
+
return { steps, count };
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=numIslandsVisual.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numIslandsVisual.js","sourceRoot":"","sources":["../../../src/functions/algorithm/numIslandsVisual.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface SortStep {
|
|
2
|
+
description: string;
|
|
3
|
+
array: number[];
|
|
4
|
+
highlights: {
|
|
5
|
+
pivot?: number;
|
|
6
|
+
comparing?: number[];
|
|
7
|
+
swapping?: number[];
|
|
8
|
+
sorted?: number[];
|
|
9
|
+
};
|
|
10
|
+
range?: {
|
|
11
|
+
left: number;
|
|
12
|
+
right: number;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export declare function quickSortVisual(arr: number[]): {
|
|
16
|
+
steps: SortStep[];
|
|
17
|
+
result: number[];
|
|
18
|
+
};
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
export function quickSortVisual(arr) {
|
|
2
|
+
const steps = [];
|
|
3
|
+
const result = [...arr];
|
|
4
|
+
steps.push({
|
|
5
|
+
description: '开始排序',
|
|
6
|
+
array: [...result],
|
|
7
|
+
highlights: {}
|
|
8
|
+
});
|
|
9
|
+
function partition(arr, left, right) {
|
|
10
|
+
const pivot = arr[right];
|
|
11
|
+
const pivotIndex = right;
|
|
12
|
+
steps.push({
|
|
13
|
+
description: `选择基准值 arr[${right}] = ${pivot}`,
|
|
14
|
+
array: [...arr],
|
|
15
|
+
highlights: { pivot: right },
|
|
16
|
+
range: { left, right }
|
|
17
|
+
});
|
|
18
|
+
let i = left - 1;
|
|
19
|
+
for (let j = left; j < right; j++) {
|
|
20
|
+
steps.push({
|
|
21
|
+
description: `比较 arr[${j}] = ${arr[j]} 与基准值 ${pivot}`,
|
|
22
|
+
array: [...arr],
|
|
23
|
+
highlights: { pivot: pivotIndex, comparing: [j] },
|
|
24
|
+
range: { left, right }
|
|
25
|
+
});
|
|
26
|
+
if (arr[j] <= pivot) {
|
|
27
|
+
i++;
|
|
28
|
+
if (i !== j) {
|
|
29
|
+
steps.push({
|
|
30
|
+
description: `交换 arr[${i}] = ${arr[i]} 与 arr[${j}] = ${arr[j]}`,
|
|
31
|
+
array: [...arr],
|
|
32
|
+
highlights: { pivot: pivotIndex, swapping: [i, j] },
|
|
33
|
+
range: { left, right }
|
|
34
|
+
});
|
|
35
|
+
[arr[i], arr[j]] = [arr[j], arr[i]];
|
|
36
|
+
steps.push({
|
|
37
|
+
description: `交换后: arr[${i}] = ${arr[i]}, arr[${j}] = ${arr[j]}`,
|
|
38
|
+
array: [...arr],
|
|
39
|
+
highlights: { pivot: pivotIndex },
|
|
40
|
+
range: { left, right }
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const newPivotIndex = i + 1;
|
|
46
|
+
if (newPivotIndex !== right) {
|
|
47
|
+
steps.push({
|
|
48
|
+
description: `将基准值放到正确位置: 交换 arr[${newPivotIndex}] 与 arr[${right}]`,
|
|
49
|
+
array: [...arr],
|
|
50
|
+
highlights: { swapping: [newPivotIndex, right] },
|
|
51
|
+
range: { left, right }
|
|
52
|
+
});
|
|
53
|
+
[arr[newPivotIndex], arr[right]] = [arr[right], arr[newPivotIndex]];
|
|
54
|
+
steps.push({
|
|
55
|
+
description: `基准值 ${pivot} 已就位于索引 ${newPivotIndex}`,
|
|
56
|
+
array: [...arr],
|
|
57
|
+
highlights: { sorted: [newPivotIndex] },
|
|
58
|
+
range: { left, right }
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return newPivotIndex;
|
|
62
|
+
}
|
|
63
|
+
function quickSortHelper(arr, left, right) {
|
|
64
|
+
if (left >= right) {
|
|
65
|
+
if (left === right) {
|
|
66
|
+
steps.push({
|
|
67
|
+
description: `单个元素 arr[${left}] = ${arr[left]} 已有序`,
|
|
68
|
+
array: [...arr],
|
|
69
|
+
highlights: { sorted: [left] }
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
steps.push({
|
|
75
|
+
description: `处理子数组 [${left}..${right}]`,
|
|
76
|
+
array: [...arr],
|
|
77
|
+
highlights: {},
|
|
78
|
+
range: { left, right }
|
|
79
|
+
});
|
|
80
|
+
const pivotIndex = partition(arr, left, right);
|
|
81
|
+
steps.push({
|
|
82
|
+
description: `递归处理左半部分 [${left}..${pivotIndex - 1}]`,
|
|
83
|
+
array: [...arr],
|
|
84
|
+
highlights: {},
|
|
85
|
+
range: { left, right: pivotIndex - 1 }
|
|
86
|
+
});
|
|
87
|
+
quickSortHelper(arr, left, pivotIndex - 1);
|
|
88
|
+
steps.push({
|
|
89
|
+
description: `递归处理右半部分 [${pivotIndex + 1}..${right}]`,
|
|
90
|
+
array: [...arr],
|
|
91
|
+
highlights: {},
|
|
92
|
+
range: { left: pivotIndex + 1, right }
|
|
93
|
+
});
|
|
94
|
+
quickSortHelper(arr, pivotIndex + 1, right);
|
|
95
|
+
}
|
|
96
|
+
quickSortHelper(result, 0, result.length - 1);
|
|
97
|
+
steps.push({
|
|
98
|
+
description: '排序完成!',
|
|
99
|
+
array: [...result],
|
|
100
|
+
highlights: { sorted: result.map((_, i) => i) }
|
|
101
|
+
});
|
|
102
|
+
return { steps, result };
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=quickSortVisual.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quickSortVisual.js","sourceRoot":"","sources":["../../../src/functions/algorithm/quickSortVisual.ts"],"names":[],"mappings":"AA0BA,MAAM,UAAU,eAAe,CAAC,GAAa;IAC3C,MAAM,KAAK,GAAe,EAAE,CAAA;IAC5B,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,CAAA;IAEvB,KAAK,CAAC,IAAI,CAAC;QACT,WAAW,EAAE,MAAM;QACnB,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC;QAClB,UAAU,EAAE,EAAE;KACf,CAAC,CAAA;IAEF,SAAS,SAAS,CAAC,GAAa,EAAE,IAAY,EAAE,KAAa;QAC3D,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAA;QACxB,MAAM,UAAU,GAAG,KAAK,CAAA;QAExB,KAAK,CAAC,IAAI,CAAC;YACT,WAAW,EAAE,aAAa,KAAK,OAAO,KAAK,EAAE;YAC7C,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC;YACf,UAAU,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;YAC5B,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;SACvB,CAAC,CAAA;QAEF,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAA;QAEhB,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC;gBACT,WAAW,EAAE,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,KAAK,EAAE;gBACrD,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC;gBACf,UAAU,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE;gBACjD,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;aACvB,CAAC,CAAA;YAEF,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;gBACpB,CAAC,EAAE,CAAA;gBACH,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACZ,KAAK,CAAC,IAAI,CAAC;wBACT,WAAW,EAAE,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE;wBAC/D,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC;wBACf,UAAU,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;wBACnD,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;qBACvB,CAAC,CAED;oBAAA,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;oBAEpC,KAAK,CAAC,IAAI,CAAC;wBACT,WAAW,EAAE,YAAY,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE;wBAChE,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC;wBACf,UAAU,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE;wBACjC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;qBACvB,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,aAAa,GAAG,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC;gBACT,WAAW,EAAE,sBAAsB,aAAa,WAAW,KAAK,GAAG;gBACnE,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC;gBACf,UAAU,EAAE,EAAE,QAAQ,EAAE,CAAC,aAAa,EAAE,KAAK,CAAC,EAAE;gBAChD,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;aACvB,CAAC,CAED;YAAA,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,CAAA;YAEpE,KAAK,CAAC,IAAI,CAAC;gBACT,WAAW,EAAE,OAAO,KAAK,WAAW,aAAa,EAAE;gBACnD,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC;gBACf,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC,aAAa,CAAC,EAAE;gBACvC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;aACvB,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,aAAa,CAAA;IACtB,CAAC;IAED,SAAS,eAAe,CAAC,GAAa,EAAE,IAAY,EAAE,KAAa;QACjE,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;YAClB,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;gBACnB,KAAK,CAAC,IAAI,CAAC;oBACT,WAAW,EAAE,YAAY,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM;oBACnD,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC;oBACf,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;iBAC/B,CAAC,CAAA;YACJ,CAAC;YACD,OAAM;QACR,CAAC;QAED,KAAK,CAAC,IAAI,CAAC;YACT,WAAW,EAAE,UAAU,IAAI,KAAK,KAAK,GAAG;YACxC,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC;YACf,UAAU,EAAE,EAAE;YACd,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;SACvB,CAAC,CAAA;QAEF,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;QAE9C,KAAK,CAAC,IAAI,CAAC;YACT,WAAW,EAAE,aAAa,IAAI,KAAK,UAAU,GAAG,CAAC,GAAG;YACpD,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC;YACf,UAAU,EAAE,EAAE;YACd,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,GAAG,CAAC,EAAE;SACvC,CAAC,CAAA;QACF,eAAe,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,GAAG,CAAC,CAAC,CAAA;QAE1C,KAAK,CAAC,IAAI,CAAC;YACT,WAAW,EAAE,aAAa,UAAU,GAAG,CAAC,KAAK,KAAK,GAAG;YACrD,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC;YACf,UAAU,EAAE,EAAE;YACd,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,GAAG,CAAC,EAAE,KAAK,EAAE;SACvC,CAAC,CAAA;QACF,eAAe,CAAC,GAAG,EAAE,UAAU,GAAG,CAAC,EAAE,KAAK,CAAC,CAAA;IAC7C,CAAC;IAED,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAE7C,KAAK,CAAC,IAAI,CAAC;QACT,WAAW,EAAE,OAAO;QACpB,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC;QAClB,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;KAChD,CAAC,CAAA;IAEF,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AAC1B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Navigator } from '../../../references/browser.d';
|
|
2
|
+
export interface DetectDeviceDeps {
|
|
3
|
+
userAgent: Navigator['userAgent'];
|
|
4
|
+
}
|
|
5
|
+
export interface DeviceInfo {
|
|
6
|
+
type: 'mobile' | 'tablet' | 'desktop';
|
|
7
|
+
vendor: string;
|
|
8
|
+
model: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function detectDevice(deps: DetectDeviceDeps): DeviceInfo;
|