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.
Files changed (222) hide show
  1. package/.eslintrc.js +3 -1
  2. package/.eslintrc.prettier-only.js +1 -1
  3. package/.prettierignore +3 -0
  4. package/.prettierrc +3 -3
  5. package/babel.config.js +1 -1
  6. package/lerna.json +1 -1
  7. package/package.json +17 -17
  8. package/packages/configs/package.json +3 -3
  9. package/packages/constants/package.json +1 -1
  10. package/packages/dictionaries/package-lock.json +9 -9
  11. package/packages/dictionaries/package.json +5 -5
  12. package/packages/logger/package-lock.json +2 -2
  13. package/packages/logger/package.json +1 -1
  14. package/packages/scrabble-solver/.next/BUILD_ID +1 -1
  15. package/packages/scrabble-solver/.next/build-manifest.json +12 -12
  16. package/packages/scrabble-solver/.next/cache/.tsbuildinfo +1 -1
  17. package/packages/scrabble-solver/.next/cache/eslint/.cache_8dgz12 +1 -1
  18. package/packages/scrabble-solver/.next/cache/next-server.js.nft.json +1 -1
  19. package/packages/scrabble-solver/.next/cache/webpack/client-production/0.pack +0 -0
  20. package/packages/scrabble-solver/.next/cache/webpack/client-production/index.pack +0 -0
  21. package/packages/scrabble-solver/.next/cache/webpack/server-production/0.pack +0 -0
  22. package/packages/scrabble-solver/.next/cache/webpack/server-production/index.pack +0 -0
  23. package/packages/scrabble-solver/.next/next-server.js.nft.json +1 -1
  24. package/packages/scrabble-solver/.next/prerender-manifest.json +1 -1
  25. package/packages/scrabble-solver/.next/routes-manifest.json +1 -1
  26. package/packages/scrabble-solver/.next/server/chunks/413.js +350 -73
  27. package/packages/scrabble-solver/.next/server/chunks/429.js +2 -13
  28. package/packages/scrabble-solver/.next/server/chunks/44.js +802 -0
  29. package/packages/scrabble-solver/.next/server/chunks/515.js +767 -322
  30. package/packages/scrabble-solver/.next/server/chunks/911.js +77 -25
  31. package/packages/scrabble-solver/.next/server/middleware-build-manifest.js +1 -1
  32. package/packages/scrabble-solver/.next/server/pages/404.html +2 -2
  33. package/packages/scrabble-solver/.next/server/pages/404.js.nft.json +1 -1
  34. package/packages/scrabble-solver/.next/server/pages/500.html +2 -2
  35. package/packages/scrabble-solver/.next/server/pages/_app.js.nft.json +1 -1
  36. package/packages/scrabble-solver/.next/server/pages/_document.js.nft.json +1 -1
  37. package/packages/scrabble-solver/.next/server/pages/_error.js.nft.json +1 -1
  38. package/packages/scrabble-solver/.next/server/pages/api/solve.js +226 -927
  39. package/packages/scrabble-solver/.next/server/pages/api/solve.js.nft.json +1 -1
  40. package/packages/scrabble-solver/.next/server/pages/api/verify.js +217 -0
  41. package/packages/scrabble-solver/.next/server/pages/api/verify.js.nft.json +1 -0
  42. package/packages/scrabble-solver/.next/server/pages/index.html +3 -3
  43. package/packages/scrabble-solver/.next/server/pages/index.js +8 -2
  44. package/packages/scrabble-solver/.next/server/pages/index.js.nft.json +1 -1
  45. package/packages/scrabble-solver/.next/server/pages/index.json +1 -1
  46. package/packages/scrabble-solver/.next/server/pages-manifest.json +1 -0
  47. package/packages/scrabble-solver/.next/static/A8A_Lmg8cM-Bkf-Jo1CLh/_buildManifest.js +1 -0
  48. package/packages/scrabble-solver/.next/static/{z3J3qmq1nazbDv_ENIkCo → A8A_Lmg8cM-Bkf-Jo1CLh}/_ssgManifest.js +0 -0
  49. package/packages/scrabble-solver/.next/static/chunks/317-95ab9051449362fa.js +1 -0
  50. package/packages/scrabble-solver/.next/static/chunks/758-eff80059a1365d5d.js +1 -0
  51. package/packages/scrabble-solver/.next/static/chunks/pages/{404-8eb3ba4f0ba17e08.js → 404-90c624da3c83fd17.js} +1 -1
  52. package/packages/scrabble-solver/.next/static/chunks/pages/_app-0e358b5622cf9e66.js +1 -0
  53. package/packages/scrabble-solver/.next/static/chunks/pages/index-0cc5e6eda5adac73.js +1 -0
  54. package/packages/scrabble-solver/.next/static/css/9ac903004135f4b1.css +1 -0
  55. package/packages/scrabble-solver/.next/static/css/{cdbc9e0afcff5473.css → ad2a08918868cad8.css} +1 -1
  56. package/packages/scrabble-solver/.next/trace +42 -41
  57. package/packages/scrabble-solver/package-lock.json +298 -298
  58. package/packages/scrabble-solver/package.json +11 -11
  59. package/packages/scrabble-solver/src/components/Badge/Badge.module.scss +13 -0
  60. package/packages/scrabble-solver/src/components/Badge/Badge.tsx +15 -0
  61. package/packages/scrabble-solver/src/components/Badge/index.ts +1 -0
  62. package/packages/scrabble-solver/src/components/Board/Board.tsx +4 -2
  63. package/packages/scrabble-solver/src/components/Board/BoardPure.tsx +25 -5
  64. package/packages/scrabble-solver/src/components/Board/hooks/useGrid.ts +212 -91
  65. package/packages/scrabble-solver/src/components/Dictionary/Dictionary.tsx +8 -1
  66. package/packages/scrabble-solver/src/components/NavButtons/NavButtons.tsx +33 -14
  67. package/packages/scrabble-solver/src/components/Rack/Rack.tsx +51 -11
  68. package/packages/scrabble-solver/src/components/Rack/RackTile.tsx +33 -16
  69. package/packages/scrabble-solver/src/components/RemainingTiles/RemainingTiles.module.scss +8 -7
  70. package/packages/scrabble-solver/src/components/RemainingTiles/RemainingTiles.tsx +13 -4
  71. package/packages/scrabble-solver/src/components/Results/Results.tsx +19 -3
  72. package/packages/scrabble-solver/src/components/Sidebar/Sidebar.tsx +2 -2
  73. package/packages/scrabble-solver/src/components/Sidebar/components/Section/Section.module.scss +0 -1
  74. package/packages/scrabble-solver/src/components/Sidebar/components/Section/Section.tsx +1 -1
  75. package/packages/scrabble-solver/src/components/SquareButton/Link.tsx +1 -1
  76. package/packages/scrabble-solver/src/components/SquareButton/SquareButton.module.scss +5 -0
  77. package/packages/scrabble-solver/src/components/Tile/Tile.module.scss +4 -0
  78. package/packages/scrabble-solver/src/components/Tile/Tile.tsx +13 -4
  79. package/packages/scrabble-solver/src/components/Tile/TilePure.tsx +3 -4
  80. package/packages/scrabble-solver/src/components/Words/Words.module.scss +35 -0
  81. package/packages/scrabble-solver/src/components/Words/Words.tsx +57 -0
  82. package/packages/scrabble-solver/src/components/Words/index.ts +1 -0
  83. package/packages/scrabble-solver/src/components/index.ts +2 -0
  84. package/packages/scrabble-solver/src/i18n/de.json +4 -1
  85. package/packages/scrabble-solver/src/i18n/en.json +4 -1
  86. package/packages/scrabble-solver/src/i18n/es.json +4 -1
  87. package/packages/scrabble-solver/src/i18n/fr.json +4 -1
  88. package/packages/scrabble-solver/src/i18n/pl.json +4 -1
  89. package/packages/scrabble-solver/src/icons/BookHalf.svg +4 -0
  90. package/packages/scrabble-solver/src/icons/Check.svg +4 -0
  91. package/packages/scrabble-solver/src/icons/Cross.svg +2 -2
  92. package/packages/scrabble-solver/src/icons/CrossFill.svg +4 -0
  93. package/packages/scrabble-solver/src/icons/index.ts +3 -0
  94. package/packages/scrabble-solver/src/lib/extractCharacters.ts +26 -0
  95. package/packages/scrabble-solver/src/lib/extractInputValue.ts +17 -0
  96. package/packages/scrabble-solver/src/lib/index.ts +2 -0
  97. package/packages/scrabble-solver/src/lib/isCtrl.ts +1 -1
  98. package/packages/scrabble-solver/src/lib/memoize.ts +15 -1
  99. package/packages/scrabble-solver/src/pages/api/solve.ts +3 -4
  100. package/packages/scrabble-solver/src/pages/api/verify.ts +71 -0
  101. package/packages/scrabble-solver/src/pages/index.tsx +5 -0
  102. package/packages/scrabble-solver/src/sdk/fetchJson.ts +36 -0
  103. package/packages/scrabble-solver/src/sdk/findWordDefinitions.ts +4 -3
  104. package/packages/scrabble-solver/src/sdk/index.ts +1 -0
  105. package/packages/scrabble-solver/src/sdk/solve.ts +8 -7
  106. package/packages/scrabble-solver/src/sdk/verify.ts +23 -0
  107. package/packages/scrabble-solver/src/state/rootReducer.ts +2 -0
  108. package/packages/scrabble-solver/src/state/sagas.ts +35 -8
  109. package/packages/scrabble-solver/src/state/selectors.ts +17 -1
  110. package/packages/scrabble-solver/src/state/slices/dictionaryInitialState.ts +10 -2
  111. package/packages/scrabble-solver/src/state/slices/dictionarySlice.ts +10 -16
  112. package/packages/scrabble-solver/src/state/slices/index.ts +2 -0
  113. package/packages/scrabble-solver/src/state/slices/rackSlice.ts +7 -0
  114. package/packages/scrabble-solver/src/state/slices/solveInitialState.ts +14 -2
  115. package/packages/scrabble-solver/src/state/slices/solveSlice.ts +7 -4
  116. package/packages/scrabble-solver/src/state/slices/verifyInitialState.ts +12 -0
  117. package/packages/scrabble-solver/src/state/slices/verifySlice.ts +31 -0
  118. package/packages/scrabble-solver/src/styles/variables.scss +2 -1
  119. package/packages/scrabble-solver/src/types/index.ts +6 -1
  120. package/packages/solver/build/fillPattern.d.ts +5 -0
  121. package/packages/solver/build/fillPattern.js +52 -0
  122. package/packages/solver/build/generateEndIndices.d.ts +3 -0
  123. package/packages/solver/build/generateEndIndices.js +16 -0
  124. package/packages/solver/build/generateHorizontalPatterns.d.ts +3 -0
  125. package/packages/solver/build/generateHorizontalPatterns.js +18 -0
  126. package/packages/solver/build/generatePattern.d.ts +8 -0
  127. package/packages/solver/build/generatePattern.js +22 -0
  128. package/packages/solver/build/generatePatterns.d.ts +3 -0
  129. package/packages/solver/build/generatePatterns.js +13 -0
  130. package/packages/solver/build/generateStartIndices.d.ts +3 -0
  131. package/packages/solver/build/generateStartIndices.js +15 -0
  132. package/packages/solver/build/generateVectors.d.ts +7 -0
  133. package/packages/solver/build/generateVectors.js +6 -0
  134. package/packages/solver/build/generateVerticalPatterns.d.ts +3 -0
  135. package/packages/solver/build/generateVerticalPatterns.js +18 -0
  136. package/packages/solver/build/getCellsScore.d.ts +3 -0
  137. package/packages/solver/build/getCellsScore.js +16 -0
  138. package/packages/solver/build/getPatternHash.d.ts +3 -0
  139. package/packages/solver/build/getPatternHash.js +13 -0
  140. package/packages/solver/build/getPatternScore.d.ts +3 -0
  141. package/packages/solver/build/getPatternScore.js +15 -0
  142. package/packages/solver/build/getUniquePatterns.js +5 -11
  143. package/packages/solver/build/index.d.ts +1 -1
  144. package/packages/solver/build/index.js +3 -3
  145. package/packages/solver/build/solve.d.ts +4 -0
  146. package/packages/solver/build/solve.js +22 -0
  147. package/packages/solver/package-lock.json +9 -9
  148. package/packages/solver/package.json +6 -6
  149. package/packages/solver/src/fillPattern.test.ts +107 -0
  150. package/packages/solver/src/fillPattern.ts +70 -0
  151. package/packages/solver/src/generateEndIndices.test.ts +23 -0
  152. package/packages/solver/src/generateEndIndices.ts +21 -0
  153. package/packages/solver/src/generateHorizontalPatterns.test.ts +31 -0
  154. package/packages/solver/src/generateHorizontalPatterns.ts +17 -0
  155. package/packages/solver/src/generatePattern.ts +35 -0
  156. package/packages/solver/src/generatePatterns.ts +13 -0
  157. package/packages/solver/src/generateStartIndices.test.ts +19 -0
  158. package/packages/solver/src/generateStartIndices.ts +19 -0
  159. package/packages/solver/src/generateVectors.test.ts +12 -0
  160. package/packages/solver/src/generateVectors.ts +12 -0
  161. package/packages/solver/src/generateVerticalPatterns.test.ts +32 -0
  162. package/packages/solver/src/generateVerticalPatterns.ts +17 -0
  163. package/packages/solver/src/getCellsScore.ts +22 -0
  164. package/packages/solver/src/getPatternHash.test.ts +17 -0
  165. package/packages/solver/src/getPatternHash.ts +14 -0
  166. package/packages/solver/src/getPatternScore.test.ts +60 -0
  167. package/packages/solver/src/getPatternScore.ts +15 -0
  168. package/packages/solver/src/getUniquePatterns.ts +1 -10
  169. package/packages/solver/src/index.ts +1 -1
  170. package/packages/solver/src/{Solver.test.ts → solve.test.ts} +17 -16
  171. package/packages/solver/src/solve.ts +23 -0
  172. package/packages/types/build/Board.d.ts +1 -0
  173. package/packages/types/build/Board.js +19 -3
  174. package/packages/types/build/Config.js +1 -1
  175. package/packages/types/build/FinalPattern.d.ts +7 -0
  176. package/packages/types/build/FinalPattern.js +16 -0
  177. package/packages/types/build/HorizontalPattern.js +2 -5
  178. package/packages/types/build/Pattern.d.ts +1 -4
  179. package/packages/types/build/Pattern.js +2 -5
  180. package/packages/types/build/Result.js +3 -5
  181. package/packages/types/build/Tile.d.ts +2 -2
  182. package/packages/types/build/VerticalPattern.js +2 -5
  183. package/packages/types/build/index.d.ts +2 -0
  184. package/packages/types/build/index.js +5 -1
  185. package/packages/types/build/isError.d.ts +2 -0
  186. package/packages/types/build/isError.js +13 -0
  187. package/packages/types/package.json +2 -2
  188. package/packages/types/src/Board.ts +25 -3
  189. package/packages/types/src/Config.ts +1 -1
  190. package/packages/types/src/FinalPattern.ts +16 -0
  191. package/packages/types/src/HorizontalPattern.ts +5 -5
  192. package/packages/types/src/Pattern.ts +5 -5
  193. package/packages/types/src/Result.ts +3 -5
  194. package/packages/types/src/Tile.ts +2 -2
  195. package/packages/types/src/VerticalPattern.ts +5 -5
  196. package/packages/types/src/index.ts +2 -0
  197. package/packages/types/src/isError.ts +11 -0
  198. package/packages/word-definitions/package-lock.json +8 -8
  199. package/packages/word-definitions/package.json +2 -2
  200. package/packages/word-lists/package-lock.json +2 -2
  201. package/packages/word-lists/package.json +2 -2
  202. package/packages/scrabble-solver/.next/static/chunks/615-d258f6c528c18622.js +0 -1
  203. package/packages/scrabble-solver/.next/static/chunks/758-f333b1dcdb941547.js +0 -1
  204. package/packages/scrabble-solver/.next/static/chunks/pages/_app-4a663fd3d5ca4524.js +0 -1
  205. package/packages/scrabble-solver/.next/static/chunks/pages/index-1a9826d740cc8830.js +0 -1
  206. package/packages/scrabble-solver/.next/static/css/180c6c26317ac90f.css +0 -1
  207. package/packages/scrabble-solver/.next/static/z3J3qmq1nazbDv_ENIkCo/_buildManifest.js +0 -1
  208. package/packages/solver/build/PatternsFiller.d.ts +0 -12
  209. package/packages/solver/build/PatternsFiller.js +0 -70
  210. package/packages/solver/build/PatternsGenerator.d.ts +0 -32
  211. package/packages/solver/build/PatternsGenerator.js +0 -66
  212. package/packages/solver/build/ScoresCalculator.d.ts +0 -17
  213. package/packages/solver/build/ScoresCalculator.js +0 -37
  214. package/packages/solver/build/Solver.d.ts +0 -10
  215. package/packages/solver/build/Solver.js +0 -30
  216. package/packages/solver/src/PatternsFiller.test.ts +0 -92
  217. package/packages/solver/src/PatternsFiller.ts +0 -91
  218. package/packages/solver/src/PatternsGenerator.test.ts +0 -89
  219. package/packages/solver/src/PatternsGenerator.ts +0 -103
  220. package/packages/solver/src/ScoresCalculator.test.ts +0 -70
  221. package/packages/solver/src/ScoresCalculator.ts +0 -52
  222. 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
- return {
18
- ...state,
19
- isLoading: true,
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
- return {
26
- ...state,
27
- isLoading: false,
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
- return {
34
- ...state,
35
- isLoading: false,
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
- const solveInitialState = {
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: [] as string[],
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
- return { ...state, isLoading: true };
16
+ const error = solveInitialState.error;
17
+ return { ...state, error, isLoading: true };
17
18
  },
18
19
 
19
- submitFailure: (state) => {
20
- return { ...state, isLoading: false };
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: rgba(255, 0, 0, 0.75);
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,3 @@
1
+ import { Cell } from '@scrabble-solver/types';
2
+ declare const generateEndIndices: (cells: Cell[], startIndex: number) => number[];
3
+ export default generateEndIndices;
@@ -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,3 @@
1
+ import { Board, Config, Pattern } from '@scrabble-solver/types';
2
+ declare const generateHorizontalPatterns: (config: Config, board: Board) => Pattern[];
3
+ export default generateHorizontalPatterns;
@@ -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,3 @@
1
+ import { Board, Config, Pattern } from '@scrabble-solver/types';
2
+ declare const generatePatterns: (config: Config, board: Board) => Pattern[];
3
+ export default generatePatterns;
@@ -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,3 @@
1
+ import { Cell } from '@scrabble-solver/types';
2
+ declare const generateStartIndices: (cells: Cell[]) => number[];
3
+ export default generateStartIndices;
@@ -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,7 @@
1
+ import { Cell } from '@scrabble-solver/types';
2
+ interface Parameters {
3
+ getNthVector: (index: number) => Cell[];
4
+ vectorsCount: number;
5
+ }
6
+ declare const generateVectors: ({ getNthVector, vectorsCount }: Parameters) => Cell[][];
7
+ export default generateVectors;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const generateVectors = ({ getNthVector, vectorsCount }) => {
4
+ return Array.from({ length: vectorsCount }, (_, index) => getNthVector(index));
5
+ };
6
+ exports.default = generateVectors;
@@ -0,0 +1,3 @@
1
+ import { Board, Config, Pattern } from '@scrabble-solver/types';
2
+ declare const generateVerticalPatterns: (config: Config, board: Board) => Pattern[];
3
+ export default generateVerticalPatterns;
@@ -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,3 @@
1
+ import { Cell, Config } from '@scrabble-solver/types';
2
+ declare const getCellsScore: (config: Config, cells: Cell[]) => number;
3
+ export default getCellsScore;
@@ -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,3 @@
1
+ import { Pattern } from '@scrabble-solver/types';
2
+ declare const getPatternHash: (pattern: Pattern) => string;
3
+ export default getPatternHash;
@@ -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,3 @@
1
+ import { Config, Pattern } from '@scrabble-solver/types';
2
+ declare const getPatternScore: (config: Config, pattern: Pattern) => number;
3
+ export default getPatternScore;
@@ -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
- 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('-');
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 = getPatternHash(pattern);
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 './Solver';
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.default = void 0;
7
- var Solver_1 = require("./Solver");
8
- Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(Solver_1).default; } });
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,4 @@
1
+ import { Trie } from '@kamilmielnik/trie';
2
+ import { Board, Config, ResultJson, Tile } from '@scrabble-solver/types';
3
+ declare const solve: (trie: Trie, config: Config, board: Board, tiles: Tile[]) => ResultJson[];
4
+ export default solve;
@@ -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.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.8",
9
+ "version": "2.8.10",
10
10
  "license": "CC-BY-NC-ND-4.0",
11
11
  "dependencies": {
12
- "@kamilmielnik/trie": "^2.0.0"
12
+ "@kamilmielnik/trie": "^2.0.1"
13
13
  }
14
14
  },
15
15
  "node_modules/@kamilmielnik/trie": {
16
- "version": "2.0.0",
17
- "resolved": "https://registry.npmjs.org/@kamilmielnik/trie/-/trie-2.0.0.tgz",
18
- "integrity": "sha512-YWTYtrV97bQ5hRifG1FImP47PI400a56O8+oQClQOtDjY3tioxab4sOgFHckiDdswciN1RwngCZ9Kv3phJfSuA==",
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.0",
27
- "resolved": "https://registry.npmjs.org/@kamilmielnik/trie/-/trie-2.0.0.tgz",
28
- "integrity": "sha512-YWTYtrV97bQ5hRifG1FImP47PI400a56O8+oQClQOtDjY3tioxab4sOgFHckiDdswciN1RwngCZ9Kv3phJfSuA=="
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.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.0",
28
- "@scrabble-solver/types": "^2.8.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.8",
32
- "@scrabble-solver/constants": "^2.8.8",
33
- "@scrabble-solver/dictionaries": "^2.8.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
  }