scrabble-solver 2.8.8 → 2.8.10
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/.eslintrc.js +3 -1
- package/.eslintrc.prettier-only.js +1 -1
- package/.prettierignore +3 -0
- package/.prettierrc +3 -3
- package/babel.config.js +1 -1
- package/lerna.json +1 -1
- package/package.json +17 -17
- package/packages/configs/package.json +3 -3
- package/packages/constants/package.json +1 -1
- package/packages/dictionaries/package-lock.json +9 -9
- package/packages/dictionaries/package.json +5 -5
- package/packages/logger/package-lock.json +2 -2
- package/packages/logger/package.json +1 -1
- package/packages/scrabble-solver/.next/BUILD_ID +1 -1
- package/packages/scrabble-solver/.next/build-manifest.json +12 -12
- package/packages/scrabble-solver/.next/cache/.tsbuildinfo +1 -1
- package/packages/scrabble-solver/.next/cache/eslint/.cache_8dgz12 +1 -1
- package/packages/scrabble-solver/.next/cache/next-server.js.nft.json +1 -1
- package/packages/scrabble-solver/.next/cache/webpack/client-production/0.pack +0 -0
- package/packages/scrabble-solver/.next/cache/webpack/client-production/index.pack +0 -0
- package/packages/scrabble-solver/.next/cache/webpack/server-production/0.pack +0 -0
- package/packages/scrabble-solver/.next/cache/webpack/server-production/index.pack +0 -0
- package/packages/scrabble-solver/.next/next-server.js.nft.json +1 -1
- package/packages/scrabble-solver/.next/prerender-manifest.json +1 -1
- package/packages/scrabble-solver/.next/routes-manifest.json +1 -1
- package/packages/scrabble-solver/.next/server/chunks/413.js +350 -73
- package/packages/scrabble-solver/.next/server/chunks/429.js +2 -13
- package/packages/scrabble-solver/.next/server/chunks/44.js +802 -0
- package/packages/scrabble-solver/.next/server/chunks/515.js +767 -322
- package/packages/scrabble-solver/.next/server/chunks/911.js +77 -25
- package/packages/scrabble-solver/.next/server/middleware-build-manifest.js +1 -1
- package/packages/scrabble-solver/.next/server/pages/404.html +2 -2
- package/packages/scrabble-solver/.next/server/pages/404.js.nft.json +1 -1
- package/packages/scrabble-solver/.next/server/pages/500.html +2 -2
- package/packages/scrabble-solver/.next/server/pages/_app.js.nft.json +1 -1
- package/packages/scrabble-solver/.next/server/pages/_document.js.nft.json +1 -1
- package/packages/scrabble-solver/.next/server/pages/_error.js.nft.json +1 -1
- package/packages/scrabble-solver/.next/server/pages/api/solve.js +226 -927
- package/packages/scrabble-solver/.next/server/pages/api/solve.js.nft.json +1 -1
- package/packages/scrabble-solver/.next/server/pages/api/verify.js +217 -0
- package/packages/scrabble-solver/.next/server/pages/api/verify.js.nft.json +1 -0
- package/packages/scrabble-solver/.next/server/pages/index.html +3 -3
- package/packages/scrabble-solver/.next/server/pages/index.js +8 -2
- package/packages/scrabble-solver/.next/server/pages/index.js.nft.json +1 -1
- package/packages/scrabble-solver/.next/server/pages/index.json +1 -1
- package/packages/scrabble-solver/.next/server/pages-manifest.json +1 -0
- package/packages/scrabble-solver/.next/static/A8A_Lmg8cM-Bkf-Jo1CLh/_buildManifest.js +1 -0
- package/packages/scrabble-solver/.next/static/{z3J3qmq1nazbDv_ENIkCo → A8A_Lmg8cM-Bkf-Jo1CLh}/_ssgManifest.js +0 -0
- package/packages/scrabble-solver/.next/static/chunks/317-95ab9051449362fa.js +1 -0
- package/packages/scrabble-solver/.next/static/chunks/758-eff80059a1365d5d.js +1 -0
- package/packages/scrabble-solver/.next/static/chunks/pages/{404-8eb3ba4f0ba17e08.js → 404-90c624da3c83fd17.js} +1 -1
- package/packages/scrabble-solver/.next/static/chunks/pages/_app-0e358b5622cf9e66.js +1 -0
- package/packages/scrabble-solver/.next/static/chunks/pages/index-0cc5e6eda5adac73.js +1 -0
- package/packages/scrabble-solver/.next/static/css/9ac903004135f4b1.css +1 -0
- package/packages/scrabble-solver/.next/static/css/{cdbc9e0afcff5473.css → ad2a08918868cad8.css} +1 -1
- package/packages/scrabble-solver/.next/trace +42 -41
- package/packages/scrabble-solver/package-lock.json +298 -298
- package/packages/scrabble-solver/package.json +11 -11
- package/packages/scrabble-solver/src/components/Badge/Badge.module.scss +13 -0
- package/packages/scrabble-solver/src/components/Badge/Badge.tsx +15 -0
- package/packages/scrabble-solver/src/components/Badge/index.ts +1 -0
- package/packages/scrabble-solver/src/components/Board/Board.tsx +4 -2
- package/packages/scrabble-solver/src/components/Board/BoardPure.tsx +25 -5
- package/packages/scrabble-solver/src/components/Board/hooks/useGrid.ts +212 -91
- package/packages/scrabble-solver/src/components/Dictionary/Dictionary.tsx +8 -1
- package/packages/scrabble-solver/src/components/NavButtons/NavButtons.tsx +33 -14
- package/packages/scrabble-solver/src/components/Rack/Rack.tsx +51 -11
- package/packages/scrabble-solver/src/components/Rack/RackTile.tsx +33 -16
- package/packages/scrabble-solver/src/components/RemainingTiles/RemainingTiles.module.scss +8 -7
- package/packages/scrabble-solver/src/components/RemainingTiles/RemainingTiles.tsx +13 -4
- package/packages/scrabble-solver/src/components/Results/Results.tsx +19 -3
- package/packages/scrabble-solver/src/components/Sidebar/Sidebar.tsx +2 -2
- package/packages/scrabble-solver/src/components/Sidebar/components/Section/Section.module.scss +0 -1
- package/packages/scrabble-solver/src/components/Sidebar/components/Section/Section.tsx +1 -1
- package/packages/scrabble-solver/src/components/SquareButton/Link.tsx +1 -1
- package/packages/scrabble-solver/src/components/SquareButton/SquareButton.module.scss +5 -0
- package/packages/scrabble-solver/src/components/Tile/Tile.module.scss +4 -0
- package/packages/scrabble-solver/src/components/Tile/Tile.tsx +13 -4
- package/packages/scrabble-solver/src/components/Tile/TilePure.tsx +3 -4
- package/packages/scrabble-solver/src/components/Words/Words.module.scss +35 -0
- package/packages/scrabble-solver/src/components/Words/Words.tsx +57 -0
- package/packages/scrabble-solver/src/components/Words/index.ts +1 -0
- package/packages/scrabble-solver/src/components/index.ts +2 -0
- package/packages/scrabble-solver/src/i18n/de.json +4 -1
- package/packages/scrabble-solver/src/i18n/en.json +4 -1
- package/packages/scrabble-solver/src/i18n/es.json +4 -1
- package/packages/scrabble-solver/src/i18n/fr.json +4 -1
- package/packages/scrabble-solver/src/i18n/pl.json +4 -1
- package/packages/scrabble-solver/src/icons/BookHalf.svg +4 -0
- package/packages/scrabble-solver/src/icons/Check.svg +4 -0
- package/packages/scrabble-solver/src/icons/Cross.svg +2 -2
- package/packages/scrabble-solver/src/icons/CrossFill.svg +4 -0
- package/packages/scrabble-solver/src/icons/index.ts +3 -0
- package/packages/scrabble-solver/src/lib/extractCharacters.ts +26 -0
- package/packages/scrabble-solver/src/lib/extractInputValue.ts +17 -0
- package/packages/scrabble-solver/src/lib/index.ts +2 -0
- package/packages/scrabble-solver/src/lib/isCtrl.ts +1 -1
- package/packages/scrabble-solver/src/lib/memoize.ts +15 -1
- package/packages/scrabble-solver/src/pages/api/solve.ts +3 -4
- package/packages/scrabble-solver/src/pages/api/verify.ts +71 -0
- package/packages/scrabble-solver/src/pages/index.tsx +5 -0
- package/packages/scrabble-solver/src/sdk/fetchJson.ts +36 -0
- package/packages/scrabble-solver/src/sdk/findWordDefinitions.ts +4 -3
- package/packages/scrabble-solver/src/sdk/index.ts +1 -0
- package/packages/scrabble-solver/src/sdk/solve.ts +8 -7
- package/packages/scrabble-solver/src/sdk/verify.ts +23 -0
- package/packages/scrabble-solver/src/state/rootReducer.ts +2 -0
- package/packages/scrabble-solver/src/state/sagas.ts +35 -8
- package/packages/scrabble-solver/src/state/selectors.ts +17 -1
- package/packages/scrabble-solver/src/state/slices/dictionaryInitialState.ts +10 -2
- package/packages/scrabble-solver/src/state/slices/dictionarySlice.ts +10 -16
- package/packages/scrabble-solver/src/state/slices/index.ts +2 -0
- package/packages/scrabble-solver/src/state/slices/rackSlice.ts +7 -0
- package/packages/scrabble-solver/src/state/slices/solveInitialState.ts +14 -2
- package/packages/scrabble-solver/src/state/slices/solveSlice.ts +7 -4
- package/packages/scrabble-solver/src/state/slices/verifyInitialState.ts +12 -0
- package/packages/scrabble-solver/src/state/slices/verifySlice.ts +31 -0
- package/packages/scrabble-solver/src/styles/variables.scss +2 -1
- package/packages/scrabble-solver/src/types/index.ts +6 -1
- package/packages/solver/build/fillPattern.d.ts +5 -0
- package/packages/solver/build/fillPattern.js +52 -0
- package/packages/solver/build/generateEndIndices.d.ts +3 -0
- package/packages/solver/build/generateEndIndices.js +16 -0
- package/packages/solver/build/generateHorizontalPatterns.d.ts +3 -0
- package/packages/solver/build/generateHorizontalPatterns.js +18 -0
- package/packages/solver/build/generatePattern.d.ts +8 -0
- package/packages/solver/build/generatePattern.js +22 -0
- package/packages/solver/build/generatePatterns.d.ts +3 -0
- package/packages/solver/build/generatePatterns.js +13 -0
- package/packages/solver/build/generateStartIndices.d.ts +3 -0
- package/packages/solver/build/generateStartIndices.js +15 -0
- package/packages/solver/build/generateVectors.d.ts +7 -0
- package/packages/solver/build/generateVectors.js +6 -0
- package/packages/solver/build/generateVerticalPatterns.d.ts +3 -0
- package/packages/solver/build/generateVerticalPatterns.js +18 -0
- package/packages/solver/build/getCellsScore.d.ts +3 -0
- package/packages/solver/build/getCellsScore.js +16 -0
- package/packages/solver/build/getPatternHash.d.ts +3 -0
- package/packages/solver/build/getPatternHash.js +13 -0
- package/packages/solver/build/getPatternScore.d.ts +3 -0
- package/packages/solver/build/getPatternScore.js +15 -0
- package/packages/solver/build/getUniquePatterns.js +5 -11
- package/packages/solver/build/index.d.ts +1 -1
- package/packages/solver/build/index.js +3 -3
- package/packages/solver/build/solve.d.ts +4 -0
- package/packages/solver/build/solve.js +22 -0
- package/packages/solver/package-lock.json +9 -9
- package/packages/solver/package.json +6 -6
- package/packages/solver/src/fillPattern.test.ts +107 -0
- package/packages/solver/src/fillPattern.ts +70 -0
- package/packages/solver/src/generateEndIndices.test.ts +23 -0
- package/packages/solver/src/generateEndIndices.ts +21 -0
- package/packages/solver/src/generateHorizontalPatterns.test.ts +31 -0
- package/packages/solver/src/generateHorizontalPatterns.ts +17 -0
- package/packages/solver/src/generatePattern.ts +35 -0
- package/packages/solver/src/generatePatterns.ts +13 -0
- package/packages/solver/src/generateStartIndices.test.ts +19 -0
- package/packages/solver/src/generateStartIndices.ts +19 -0
- package/packages/solver/src/generateVectors.test.ts +12 -0
- package/packages/solver/src/generateVectors.ts +12 -0
- package/packages/solver/src/generateVerticalPatterns.test.ts +32 -0
- package/packages/solver/src/generateVerticalPatterns.ts +17 -0
- package/packages/solver/src/getCellsScore.ts +22 -0
- package/packages/solver/src/getPatternHash.test.ts +17 -0
- package/packages/solver/src/getPatternHash.ts +14 -0
- package/packages/solver/src/getPatternScore.test.ts +60 -0
- package/packages/solver/src/getPatternScore.ts +15 -0
- package/packages/solver/src/getUniquePatterns.ts +1 -10
- package/packages/solver/src/index.ts +1 -1
- package/packages/solver/src/{Solver.test.ts → solve.test.ts} +17 -16
- package/packages/solver/src/solve.ts +23 -0
- package/packages/types/build/Board.d.ts +1 -0
- package/packages/types/build/Board.js +19 -3
- package/packages/types/build/Config.js +1 -1
- package/packages/types/build/FinalPattern.d.ts +7 -0
- package/packages/types/build/FinalPattern.js +16 -0
- package/packages/types/build/HorizontalPattern.js +2 -5
- package/packages/types/build/Pattern.d.ts +1 -4
- package/packages/types/build/Pattern.js +2 -5
- package/packages/types/build/Result.js +3 -5
- package/packages/types/build/Tile.d.ts +2 -2
- package/packages/types/build/VerticalPattern.js +2 -5
- package/packages/types/build/index.d.ts +2 -0
- package/packages/types/build/index.js +5 -1
- package/packages/types/build/isError.d.ts +2 -0
- package/packages/types/build/isError.js +13 -0
- package/packages/types/package.json +2 -2
- package/packages/types/src/Board.ts +25 -3
- package/packages/types/src/Config.ts +1 -1
- package/packages/types/src/FinalPattern.ts +16 -0
- package/packages/types/src/HorizontalPattern.ts +5 -5
- package/packages/types/src/Pattern.ts +5 -5
- package/packages/types/src/Result.ts +3 -5
- package/packages/types/src/Tile.ts +2 -2
- package/packages/types/src/VerticalPattern.ts +5 -5
- package/packages/types/src/index.ts +2 -0
- package/packages/types/src/isError.ts +11 -0
- package/packages/word-definitions/package-lock.json +8 -8
- package/packages/word-definitions/package.json +2 -2
- package/packages/word-lists/package-lock.json +2 -2
- package/packages/word-lists/package.json +2 -2
- package/packages/scrabble-solver/.next/static/chunks/615-d258f6c528c18622.js +0 -1
- package/packages/scrabble-solver/.next/static/chunks/758-f333b1dcdb941547.js +0 -1
- package/packages/scrabble-solver/.next/static/chunks/pages/_app-4a663fd3d5ca4524.js +0 -1
- package/packages/scrabble-solver/.next/static/chunks/pages/index-1a9826d740cc8830.js +0 -1
- package/packages/scrabble-solver/.next/static/css/180c6c26317ac90f.css +0 -1
- package/packages/scrabble-solver/.next/static/z3J3qmq1nazbDv_ENIkCo/_buildManifest.js +0 -1
- package/packages/solver/build/PatternsFiller.d.ts +0 -12
- package/packages/solver/build/PatternsFiller.js +0 -70
- package/packages/solver/build/PatternsGenerator.d.ts +0 -32
- package/packages/solver/build/PatternsGenerator.js +0 -66
- package/packages/solver/build/ScoresCalculator.d.ts +0 -17
- package/packages/solver/build/ScoresCalculator.js +0 -37
- package/packages/solver/build/Solver.d.ts +0 -10
- package/packages/solver/build/Solver.js +0 -30
- package/packages/solver/src/PatternsFiller.test.ts +0 -92
- package/packages/solver/src/PatternsFiller.ts +0 -91
- package/packages/solver/src/PatternsGenerator.test.ts +0 -89
- package/packages/solver/src/PatternsGenerator.ts +0 -103
- package/packages/solver/src/ScoresCalculator.test.ts +0 -70
- package/packages/solver/src/ScoresCalculator.ts +0 -52
- package/packages/solver/src/Solver.ts +0 -39
|
@@ -14,27 +14,21 @@ const dictionarySlice = createSlice({
|
|
|
14
14
|
reset: () => dictionaryInitialState,
|
|
15
15
|
|
|
16
16
|
submit: (state) => {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
results: dictionaryInitialState.results,
|
|
21
|
-
};
|
|
17
|
+
const error = dictionaryInitialState.error;
|
|
18
|
+
const results = dictionaryInitialState.results;
|
|
19
|
+
return { ...state, error, isLoading: true, results };
|
|
22
20
|
},
|
|
23
21
|
|
|
24
|
-
submitFailure: (state) => {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
results: dictionaryInitialState.results,
|
|
29
|
-
};
|
|
22
|
+
submitFailure: (state, action: PayloadAction<unknown>) => {
|
|
23
|
+
const error = action.payload;
|
|
24
|
+
const results = dictionaryInitialState.results;
|
|
25
|
+
return { ...state, error, isLoading: false, results };
|
|
30
26
|
},
|
|
31
27
|
|
|
32
28
|
submitSuccess: (state, action: PayloadAction<WordDefinition[]>) => {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
results: action.payload,
|
|
37
|
-
};
|
|
29
|
+
const error = dictionaryInitialState.error;
|
|
30
|
+
const results = action.payload;
|
|
31
|
+
return { ...state, error, isLoading: false, results };
|
|
38
32
|
},
|
|
39
33
|
},
|
|
40
34
|
});
|
|
@@ -12,3 +12,5 @@ export { default as settingsInitialState } from './settingsInitialState';
|
|
|
12
12
|
export { default as settingsSlice } from './settingsSlice';
|
|
13
13
|
export { default as solveInitialState } from './solveInitialState';
|
|
14
14
|
export { default as solveSlice } from './solveSlice';
|
|
15
|
+
export { default as verifyInitialState } from './verifyInitialState';
|
|
16
|
+
export { default as verifySlice } from './verifySlice';
|
|
@@ -19,6 +19,13 @@ const rackSlice = createSlice({
|
|
|
19
19
|
return [...state.slice(0, index), character, ...state.slice(index + 1)];
|
|
20
20
|
},
|
|
21
21
|
|
|
22
|
+
changeCharacters: (state, action: PayloadAction<{ characters: (string | null)[]; index: number }>) => {
|
|
23
|
+
const { characters, index } = action.payload;
|
|
24
|
+
const expectedRackLength = state.length;
|
|
25
|
+
const rack = [...state.slice(0, index), ...characters, ...state.slice(index + characters.length)];
|
|
26
|
+
return rack.slice(0, expectedRackLength);
|
|
27
|
+
},
|
|
28
|
+
|
|
22
29
|
groupTiles: (state, action: PayloadAction<'left' | 'right' | null>) => {
|
|
23
30
|
const direction = action.payload;
|
|
24
31
|
|
|
@@ -1,10 +1,22 @@
|
|
|
1
|
+
import { Board } from '@scrabble-solver/types';
|
|
2
|
+
|
|
1
3
|
import boardInitialState from './boardInitialState';
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
interface SolveInitialState {
|
|
6
|
+
error: unknown | undefined;
|
|
7
|
+
isLoading: boolean;
|
|
8
|
+
lastSolvedParameters: {
|
|
9
|
+
board: Board;
|
|
10
|
+
characters: string[];
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const solveInitialState: SolveInitialState = {
|
|
15
|
+
error: undefined,
|
|
4
16
|
isLoading: false,
|
|
5
17
|
lastSolvedParameters: {
|
|
6
18
|
board: boardInitialState,
|
|
7
|
-
characters: []
|
|
19
|
+
characters: [],
|
|
8
20
|
},
|
|
9
21
|
};
|
|
10
22
|
|
|
@@ -13,16 +13,19 @@ const solveSlice = createSlice({
|
|
|
13
13
|
name: 'solve',
|
|
14
14
|
reducers: {
|
|
15
15
|
submit: (state) => {
|
|
16
|
-
|
|
16
|
+
const error = solveInitialState.error;
|
|
17
|
+
return { ...state, error, isLoading: true };
|
|
17
18
|
},
|
|
18
19
|
|
|
19
|
-
submitFailure: (state) => {
|
|
20
|
-
|
|
20
|
+
submitFailure: (state, action: PayloadAction<unknown>) => {
|
|
21
|
+
const error = action.payload;
|
|
22
|
+
return { ...state, error, isLoading: false };
|
|
21
23
|
},
|
|
22
24
|
|
|
23
25
|
submitSuccess: (state, action: PayloadAction<SolveParameters>) => {
|
|
26
|
+
const error = solveInitialState.error;
|
|
24
27
|
const lastSolvedParameters = action.payload;
|
|
25
|
-
return { ...state, isLoading: false, lastSolvedParameters };
|
|
28
|
+
return { ...state, error, isLoading: false, lastSolvedParameters };
|
|
26
29
|
},
|
|
27
30
|
},
|
|
28
31
|
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import boardInitialState from './boardInitialState';
|
|
2
|
+
|
|
3
|
+
const verifyInitialState = {
|
|
4
|
+
isLoading: false,
|
|
5
|
+
lastSolvedParameters: {
|
|
6
|
+
board: boardInitialState,
|
|
7
|
+
},
|
|
8
|
+
invalidWords: [] as string[],
|
|
9
|
+
validWords: [] as string[],
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export default verifyInitialState;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
|
|
2
|
+
import { Board } from '@scrabble-solver/types';
|
|
3
|
+
|
|
4
|
+
import verifyInitialState from './verifyInitialState';
|
|
5
|
+
|
|
6
|
+
interface VerifyParameters {
|
|
7
|
+
board: Board;
|
|
8
|
+
invalidWords: string[];
|
|
9
|
+
validWords: string[];
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const verifySlice = createSlice({
|
|
13
|
+
initialState: verifyInitialState,
|
|
14
|
+
name: 'verify',
|
|
15
|
+
reducers: {
|
|
16
|
+
submit: (state) => {
|
|
17
|
+
return { ...state, isLoading: true };
|
|
18
|
+
},
|
|
19
|
+
|
|
20
|
+
submitFailure: (state) => {
|
|
21
|
+
return { ...state, isLoading: false };
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
submitSuccess: (state, action: PayloadAction<VerifyParameters>) => {
|
|
25
|
+
const { board, invalidWords, validWords } = action.payload;
|
|
26
|
+
return { ...state, isLoading: false, lastSolvedParameters: { board }, invalidWords, validWords };
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
export default verifySlice;
|
|
@@ -26,7 +26,8 @@ $easeOutSine: cubic-bezier(0.61, 1, 0.88, 1);
|
|
|
26
26
|
--color--background: #f4f4f4;
|
|
27
27
|
--color--background--secondary: #111;
|
|
28
28
|
--color--background--overlay: rgba(255, 255, 255, 0.65);
|
|
29
|
-
--color--error:
|
|
29
|
+
--color--error: #fc3d3d;
|
|
30
|
+
--color--success: #00a900;
|
|
30
31
|
--color--focus: #{rgba(#268fff, 0.5)};
|
|
31
32
|
--color--foreground: black;
|
|
32
33
|
--color--foreground--secondary: #444;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export type Comparator<T> = (a: T, B: T) => number;
|
|
2
2
|
|
|
3
|
+
export type Direction = 'horizontal' | 'vertical';
|
|
4
|
+
|
|
3
5
|
export enum SortDirection {
|
|
4
6
|
Ascending = 'ascending',
|
|
5
7
|
Descending = 'descending',
|
|
@@ -80,7 +82,10 @@ export type TranslationKey =
|
|
|
80
82
|
| 'settings.autoGroupTiles.right'
|
|
81
83
|
| 'settings.autoGroupTiles.null'
|
|
82
84
|
| 'settings.game'
|
|
83
|
-
| 'settings.language'
|
|
85
|
+
| 'settings.language'
|
|
86
|
+
| 'words'
|
|
87
|
+
| 'words.invalid'
|
|
88
|
+
| 'words.valid';
|
|
84
89
|
|
|
85
90
|
export type Translate = (key: TranslationKey) => string;
|
|
86
91
|
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Trie } from '@kamilmielnik/trie';
|
|
2
|
+
import { Config, Pattern, Tile } from '@scrabble-solver/types';
|
|
3
|
+
declare const fillPattern: (trie: Trie, config: Config, pattern: Pattern, tiles: Tile[]) => Pattern[];
|
|
4
|
+
export declare const fillPatternRecursive: (results: Pattern[], trie: Trie, config: Config, pattern: Pattern, word: string, tiles: Tile[]) => void;
|
|
5
|
+
export default fillPattern;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fillPatternRecursive = void 0;
|
|
4
|
+
const constants_1 = require("@scrabble-solver/constants");
|
|
5
|
+
const types_1 = require("@scrabble-solver/types");
|
|
6
|
+
const fillPattern = (trie, config, pattern, tiles) => {
|
|
7
|
+
if (pattern.getEmptyCellsCount() > tiles.length) {
|
|
8
|
+
return [];
|
|
9
|
+
}
|
|
10
|
+
const results = [];
|
|
11
|
+
(0, exports.fillPatternRecursive)(results, trie, config, pattern, pattern.toString(), tiles);
|
|
12
|
+
return results;
|
|
13
|
+
};
|
|
14
|
+
const fillPatternRecursive = (
|
|
15
|
+
/** gets mutated when this function is called */
|
|
16
|
+
results, trie, config, pattern, word, tiles) => {
|
|
17
|
+
const indexOfFirstCellWithoutTile = pattern.getIndexOfFirstCellWithoutTile();
|
|
18
|
+
if (indexOfFirstCellWithoutTile === -1) {
|
|
19
|
+
if (trie.has(word) && pattern.getCollisions().every((collision) => trie.has(collision.toString()))) {
|
|
20
|
+
results.push(new types_1.FinalPattern(pattern.clone()));
|
|
21
|
+
}
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
for (let index = 0; index < tiles.length; ++index) {
|
|
25
|
+
const tile = tiles[index];
|
|
26
|
+
const previousTile = pattern.cells[indexOfFirstCellWithoutTile].tile;
|
|
27
|
+
pattern.cells[indexOfFirstCellWithoutTile].tile = tile;
|
|
28
|
+
const indexOfNextCellWithoutTile = pattern.getIndexOfFirstCellWithoutTile();
|
|
29
|
+
const indexOfFirstEmptyLetter = word.indexOf(constants_1.EMPTY_CELL);
|
|
30
|
+
const prefix = word.substring(0, indexOfFirstEmptyLetter);
|
|
31
|
+
const suffix = word.substring(indexOfFirstEmptyLetter + 1);
|
|
32
|
+
const characters = tile.isBlank ? config.alphabet : [tile.character];
|
|
33
|
+
for (const character of characters) {
|
|
34
|
+
const newWordPrefix = prefix + character;
|
|
35
|
+
const newWord = newWordPrefix + suffix;
|
|
36
|
+
tile.character = character;
|
|
37
|
+
if (indexOfNextCellWithoutTile === -1) {
|
|
38
|
+
if (trie.has(newWord) && pattern.getCollisions().every((collision) => trie.has(collision.toString()))) {
|
|
39
|
+
results.push(new types_1.FinalPattern(pattern.clone()));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else if (trie.hasPrefix(newWordPrefix)) {
|
|
43
|
+
tiles.splice(index, 1);
|
|
44
|
+
(0, exports.fillPatternRecursive)(results, trie, config, pattern, newWord, tiles);
|
|
45
|
+
tiles.splice(index, 0, tile);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
pattern.cells[indexOfFirstCellWithoutTile].tile = previousTile;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
exports.fillPatternRecursive = fillPatternRecursive;
|
|
52
|
+
exports.default = fillPattern;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const generateEndIndices = (cells, startIndex) => {
|
|
4
|
+
if (cells.length === 0) {
|
|
5
|
+
return [];
|
|
6
|
+
}
|
|
7
|
+
const endIndices = [];
|
|
8
|
+
for (let endIndex = startIndex + 1; endIndex < cells.length - 1; ++endIndex) {
|
|
9
|
+
if (!cells[endIndex + 1].hasTile()) {
|
|
10
|
+
endIndices.push(endIndex);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
endIndices.push(cells.length - 1);
|
|
14
|
+
return endIndices;
|
|
15
|
+
};
|
|
16
|
+
exports.default = generateEndIndices;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const types_1 = require("@scrabble-solver/types");
|
|
7
|
+
const generatePattern_1 = __importDefault(require("./generatePattern"));
|
|
8
|
+
const generateVectors_1 = __importDefault(require("./generateVectors"));
|
|
9
|
+
const generateHorizontalPatterns = (config, board) => {
|
|
10
|
+
const getNthVector = (index) => board.getRow(index);
|
|
11
|
+
const vectorsCount = config.boardHeight;
|
|
12
|
+
const horizontalVectors = (0, generateVectors_1.default)({ getNthVector, vectorsCount });
|
|
13
|
+
const horizontalPatterns = horizontalVectors.flatMap((cells) => {
|
|
14
|
+
return (0, generatePattern_1.default)({ board, config, PatternModel: types_1.HorizontalPattern, cells });
|
|
15
|
+
});
|
|
16
|
+
return horizontalPatterns;
|
|
17
|
+
};
|
|
18
|
+
exports.default = generateHorizontalPatterns;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Board, Cell, Config, Pattern } from '@scrabble-solver/types';
|
|
2
|
+
declare const generatePattern: <P extends Pattern>({ board, cells, config, PatternModel, }: {
|
|
3
|
+
board: Board;
|
|
4
|
+
cells: Cell[];
|
|
5
|
+
config: Config;
|
|
6
|
+
PatternModel: new (board: Board, cells: Cell[]) => P;
|
|
7
|
+
}) => P[];
|
|
8
|
+
export default generatePattern;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const generateEndIndices_1 = __importDefault(require("./generateEndIndices"));
|
|
7
|
+
const generateStartIndices_1 = __importDefault(require("./generateStartIndices"));
|
|
8
|
+
const generatePattern = ({ board, cells, config, PatternModel, }) => {
|
|
9
|
+
const startIndices = (0, generateStartIndices_1.default)(cells);
|
|
10
|
+
return startIndices.flatMap((startIndex) => {
|
|
11
|
+
const endIndices = (0, generateEndIndices_1.default)(cells, startIndex);
|
|
12
|
+
const patterns = [];
|
|
13
|
+
for (const endIndex of endIndices) {
|
|
14
|
+
const pattern = new PatternModel(board, cells.slice(startIndex, endIndex + 1));
|
|
15
|
+
if (pattern.canBePlaced(config)) {
|
|
16
|
+
patterns.push(pattern);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return patterns;
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
exports.default = generatePattern;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const generateHorizontalPatterns_1 = __importDefault(require("./generateHorizontalPatterns"));
|
|
7
|
+
const generateVerticalPatterns_1 = __importDefault(require("./generateVerticalPatterns"));
|
|
8
|
+
const generatePatterns = (config, board) => {
|
|
9
|
+
const horizontalPatterns = (0, generateHorizontalPatterns_1.default)(config, board);
|
|
10
|
+
const verticalPatterns = (0, generateVerticalPatterns_1.default)(config, board);
|
|
11
|
+
return horizontalPatterns.concat(verticalPatterns);
|
|
12
|
+
};
|
|
13
|
+
exports.default = generatePatterns;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const generateStartIndices = (cells) => {
|
|
4
|
+
if (cells.length === 0) {
|
|
5
|
+
return [];
|
|
6
|
+
}
|
|
7
|
+
const startIndices = [0];
|
|
8
|
+
for (let startIndex = 1; startIndex < cells.length - 1; ++startIndex) {
|
|
9
|
+
if (!cells[startIndex - 1].hasTile()) {
|
|
10
|
+
startIndices.push(startIndex);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return startIndices;
|
|
14
|
+
};
|
|
15
|
+
exports.default = generateStartIndices;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const types_1 = require("@scrabble-solver/types");
|
|
7
|
+
const generatePattern_1 = __importDefault(require("./generatePattern"));
|
|
8
|
+
const generateVectors_1 = __importDefault(require("./generateVectors"));
|
|
9
|
+
const generateVerticalPatterns = (config, board) => {
|
|
10
|
+
const getNthVector = (index) => board.getColumn(index);
|
|
11
|
+
const vectorsCount = config.boardWidth;
|
|
12
|
+
const verticalVectors = (0, generateVectors_1.default)({ getNthVector, vectorsCount });
|
|
13
|
+
const verticalPatterns = verticalVectors.flatMap((cells) => {
|
|
14
|
+
return (0, generatePattern_1.default)({ board, config, PatternModel: types_1.VerticalPattern, cells });
|
|
15
|
+
});
|
|
16
|
+
return verticalPatterns;
|
|
17
|
+
};
|
|
18
|
+
exports.default = generateVerticalPatterns;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const constants_1 = require("@scrabble-solver/constants");
|
|
4
|
+
const getCellsScore = (config, cells) => {
|
|
5
|
+
const total = cells.reduce(({ multiplier, score }, cell) => {
|
|
6
|
+
const bonus = config.getCellBonus(cell);
|
|
7
|
+
const { characterMultiplier, wordMultiplier } = bonus && bonus.canApply(config, cell) ? bonus.value : constants_1.NO_BONUS;
|
|
8
|
+
const characterScore = cell.tile.isBlank ? config.blankScore : config.pointsMap[cell.tile.character];
|
|
9
|
+
return {
|
|
10
|
+
multiplier: multiplier * wordMultiplier,
|
|
11
|
+
score: score + characterScore * characterMultiplier,
|
|
12
|
+
};
|
|
13
|
+
}, { multiplier: 1, score: 0 });
|
|
14
|
+
return total.score * total.multiplier;
|
|
15
|
+
};
|
|
16
|
+
exports.default = getCellsScore;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const getPatternHash = (pattern) => {
|
|
4
|
+
return pattern.cells
|
|
5
|
+
.map((cell) => {
|
|
6
|
+
const blank = cell.tile.isBlank ? '!' : '';
|
|
7
|
+
const tile = cell.tile.character + blank;
|
|
8
|
+
// eslint-disable-next-line prefer-template
|
|
9
|
+
return cell.x + ',' + cell.y + ',' + tile;
|
|
10
|
+
})
|
|
11
|
+
.join('-');
|
|
12
|
+
};
|
|
13
|
+
exports.default = getPatternHash;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const getCellsScore_1 = __importDefault(require("./getCellsScore"));
|
|
7
|
+
const getPatternScore = (config, pattern) => {
|
|
8
|
+
const areAllTilesUsed = pattern.getEmptyCellsCount() === config.maximumCharactersCount;
|
|
9
|
+
const bonusScore = areAllTilesUsed ? config.allTilesBonusScore : 0;
|
|
10
|
+
const score = pattern
|
|
11
|
+
.getCollisions()
|
|
12
|
+
.reduce((sum, collision) => sum + (0, getCellsScore_1.default)(config, collision.cells), (0, getCellsScore_1.default)(config, pattern.cells));
|
|
13
|
+
return score + bonusScore;
|
|
14
|
+
};
|
|
15
|
+
exports.default = getPatternScore;
|
|
@@ -1,20 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
return pattern.cells
|
|
5
|
-
.map((cell) => {
|
|
6
|
-
const blank = cell.tile.isBlank ? '!' : '';
|
|
7
|
-
const tile = cell.tile.character + blank;
|
|
8
|
-
// eslint-disable-next-line prefer-template
|
|
9
|
-
return cell.x + ',' + cell.y + ',' + tile;
|
|
10
|
-
})
|
|
11
|
-
.join('-');
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
12
4
|
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const getPatternHash_1 = __importDefault(require("./getPatternHash"));
|
|
13
7
|
const getUniquePatterns = (patterns) => {
|
|
14
8
|
const hashes = new Set();
|
|
15
9
|
const uniquePatterns = [];
|
|
16
10
|
for (const pattern of patterns) {
|
|
17
|
-
const hash =
|
|
11
|
+
const hash = (0, getPatternHash_1.default)(pattern);
|
|
18
12
|
if (!hashes.has(hash)) {
|
|
19
13
|
hashes.add(hash);
|
|
20
14
|
uniquePatterns.push(pattern);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { default } from './
|
|
1
|
+
export { default as solve } from './solve';
|
|
@@ -3,6 +3,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
7
|
-
var
|
|
8
|
-
Object.defineProperty(exports, "
|
|
6
|
+
exports.solve = void 0;
|
|
7
|
+
var solve_1 = require("./solve");
|
|
8
|
+
Object.defineProperty(exports, "solve", { enumerable: true, get: function () { return __importDefault(solve_1).default; } });
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const fillPattern_1 = __importDefault(require("./fillPattern"));
|
|
7
|
+
const generatePatterns_1 = __importDefault(require("./generatePatterns"));
|
|
8
|
+
const getPatternScore_1 = __importDefault(require("./getPatternScore"));
|
|
9
|
+
const getUniquePatterns_1 = __importDefault(require("./getUniquePatterns"));
|
|
10
|
+
const solve = (trie, config, board, tiles) => {
|
|
11
|
+
const patterns = (0, generatePatterns_1.default)(config, board);
|
|
12
|
+
const filledPatterns = patterns.flatMap((pattern) => (0, fillPattern_1.default)(trie, config, pattern, tiles));
|
|
13
|
+
const uniquePatterns = (0, getUniquePatterns_1.default)(filledPatterns);
|
|
14
|
+
const results = uniquePatterns.map((pattern, index) => ({
|
|
15
|
+
cells: pattern.cells.map((cell) => cell.toJson()),
|
|
16
|
+
collisions: pattern.getCollisions().map((collision) => collision.cells.map((cell) => cell.toJson())),
|
|
17
|
+
id: index,
|
|
18
|
+
points: (0, getPatternScore_1.default)(config, pattern),
|
|
19
|
+
}));
|
|
20
|
+
return results;
|
|
21
|
+
};
|
|
22
|
+
exports.default = solve;
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@scrabble-solver/solver",
|
|
3
|
-
"version": "2.8.
|
|
3
|
+
"version": "2.8.10",
|
|
4
4
|
"lockfileVersion": 2,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@scrabble-solver/solver",
|
|
9
|
-
"version": "2.8.
|
|
9
|
+
"version": "2.8.10",
|
|
10
10
|
"license": "CC-BY-NC-ND-4.0",
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@kamilmielnik/trie": "^2.0.
|
|
12
|
+
"@kamilmielnik/trie": "^2.0.1"
|
|
13
13
|
}
|
|
14
14
|
},
|
|
15
15
|
"node_modules/@kamilmielnik/trie": {
|
|
16
|
-
"version": "2.0.
|
|
17
|
-
"resolved": "https://registry.npmjs.org/@kamilmielnik/trie/-/trie-2.0.
|
|
18
|
-
"integrity": "sha512-
|
|
16
|
+
"version": "2.0.1",
|
|
17
|
+
"resolved": "https://registry.npmjs.org/@kamilmielnik/trie/-/trie-2.0.1.tgz",
|
|
18
|
+
"integrity": "sha512-6Ulw5/xgFRadHsx0uVnpOxB2E2ZO2osnaakI26yS3RMlww580JiaQEfXUmQjXZcmOjcO+HrZ0CWjRDhoDYKHbg==",
|
|
19
19
|
"engines": {
|
|
20
20
|
"node": ">=16"
|
|
21
21
|
}
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"@kamilmielnik/trie": {
|
|
26
|
-
"version": "2.0.
|
|
27
|
-
"resolved": "https://registry.npmjs.org/@kamilmielnik/trie/-/trie-2.0.
|
|
28
|
-
"integrity": "sha512-
|
|
26
|
+
"version": "2.0.1",
|
|
27
|
+
"resolved": "https://registry.npmjs.org/@kamilmielnik/trie/-/trie-2.0.1.tgz",
|
|
28
|
+
"integrity": "sha512-6Ulw5/xgFRadHsx0uVnpOxB2E2ZO2osnaakI26yS3RMlww580JiaQEfXUmQjXZcmOjcO+HrZ0CWjRDhoDYKHbg=="
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@scrabble-solver/solver",
|
|
3
|
-
"version": "2.8.
|
|
3
|
+
"version": "2.8.10",
|
|
4
4
|
"description": "Scrabble Solver 2 - Solver",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -24,13 +24,13 @@
|
|
|
24
24
|
"clean:force": "npm run clean && rimraf package-lock.json"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@kamilmielnik/trie": "^2.0.
|
|
28
|
-
"@scrabble-solver/types": "^2.8.
|
|
27
|
+
"@kamilmielnik/trie": "^2.0.1",
|
|
28
|
+
"@scrabble-solver/types": "^2.8.10"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
|
-
"@scrabble-solver/configs": "^2.8.
|
|
32
|
-
"@scrabble-solver/constants": "^2.8.
|
|
33
|
-
"@scrabble-solver/dictionaries": "^2.8.
|
|
31
|
+
"@scrabble-solver/configs": "^2.8.10",
|
|
32
|
+
"@scrabble-solver/constants": "^2.8.10",
|
|
33
|
+
"@scrabble-solver/dictionaries": "^2.8.10"
|
|
34
34
|
},
|
|
35
35
|
"gitHead": "1e2d1ad49a288d4a44196d8e3336740da132c637"
|
|
36
36
|
}
|