scrabble-solver 2.8.5 → 2.8.7
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/README.md +31 -24
- package/lerna.json +1 -1
- package/package.json +2 -2
- package/packages/configs/build/literaki/literaki.js +2 -2
- package/packages/configs/build/scrabble/scrabble.js +2 -2
- package/packages/configs/package.json +3 -3
- package/packages/configs/src/literaki/literaki.ts +2 -2
- package/packages/configs/src/scrabble/scrabble.ts +2 -2
- package/packages/constants/package.json +1 -1
- package/packages/dictionaries/package-lock.json +2 -2
- package/packages/dictionaries/package.json +4 -4
- 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 +9 -9
- 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 +183 -94
- package/packages/scrabble-solver/.next/server/chunks/{206.js → 429.js} +2 -4137
- package/packages/scrabble-solver/.next/server/chunks/515.js +111 -78
- package/packages/scrabble-solver/.next/server/chunks/{907.js → 911.js} +134 -367
- package/packages/scrabble-solver/.next/server/chunks/939.js +218 -0
- 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 +3 -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/dictionary/[locale]/[word].js +33 -17
- package/packages/scrabble-solver/.next/server/pages/api/dictionary/[locale]/[word].js.nft.json +1 -1
- package/packages/scrabble-solver/.next/server/pages/api/solve.js +404 -58
- package/packages/scrabble-solver/.next/server/pages/api/solve.js.nft.json +1 -1
- package/packages/scrabble-solver/.next/server/pages/api/visit.js +3 -2
- package/packages/scrabble-solver/.next/server/pages/api/visit.js.nft.json +1 -1
- package/packages/scrabble-solver/.next/server/pages/index.html +3 -7
- package/packages/scrabble-solver/.next/server/pages/index.js +12 -14
- 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/static/chunks/56-cf37c430261bbea5.js +1 -0
- package/packages/scrabble-solver/.next/static/chunks/pages/_app-0b12a65bea70a0df.js +1 -0
- package/packages/scrabble-solver/.next/static/chunks/pages/index-fcb69802550afb81.js +1 -0
- package/packages/scrabble-solver/.next/static/css/1f39b55d50f5b30b.css +1 -0
- package/packages/scrabble-solver/.next/static/css/751e8a14776d05d8.css +1 -0
- package/packages/scrabble-solver/.next/static/z_0_lqfmiI_ISokr6NNRq/_buildManifest.js +1 -0
- package/packages/scrabble-solver/.next/static/{TzKQ3IntkvaYmHBkWpfoi → z_0_lqfmiI_ISokr6NNRq}/_ssgManifest.js +0 -0
- package/packages/scrabble-solver/.next/trace +40 -42
- package/packages/scrabble-solver/package-lock.json +2 -2
- package/packages/scrabble-solver/package.json +8 -8
- package/packages/scrabble-solver/src/api/index.ts +3 -9
- package/packages/scrabble-solver/src/api/isBoardValid.ts +43 -0
- package/packages/scrabble-solver/src/api/isCellValid.ts +26 -0
- package/packages/scrabble-solver/src/api/isRowValid.ts +19 -0
- package/packages/scrabble-solver/src/components/Board/Board.tsx +3 -1
- package/packages/scrabble-solver/src/components/Board/BoardPure.tsx +4 -1
- package/packages/scrabble-solver/src/components/Board/components/Cell/Cell.module.scss +28 -11
- package/packages/scrabble-solver/src/components/Board/components/Cell/Cell.tsx +12 -1
- package/packages/scrabble-solver/src/components/Board/components/Cell/CellPure.tsx +3 -1
- package/packages/scrabble-solver/src/components/Board/components/Cell/lib.ts +10 -2
- package/packages/scrabble-solver/src/components/Dictionary/Dictionary.module.scss +20 -0
- package/packages/scrabble-solver/src/components/Dictionary/Dictionary.tsx +40 -29
- package/packages/scrabble-solver/src/components/Results/Cell.tsx +3 -2
- package/packages/scrabble-solver/src/components/Results/Result.tsx +16 -6
- package/packages/scrabble-solver/src/components/ResultsInput/ResultsInput.tsx +11 -3
- package/packages/scrabble-solver/src/hooks/useIsTablet.ts +2 -2
- package/packages/scrabble-solver/src/lib/getRemainingTiles.ts +1 -1
- package/packages/scrabble-solver/src/lib/index.ts +2 -1
- package/packages/scrabble-solver/src/lib/isRegExp.ts +11 -0
- package/packages/scrabble-solver/src/lib/isStringArray.ts +5 -0
- package/packages/scrabble-solver/src/lib/sortResults.ts +5 -5
- package/packages/scrabble-solver/src/pages/_app.tsx +6 -3
- package/packages/scrabble-solver/src/pages/api/dictionary/[locale]/[word].ts +35 -11
- package/packages/scrabble-solver/src/pages/api/solve.ts +39 -19
- package/packages/scrabble-solver/src/pages/api/visit.ts +1 -0
- package/packages/scrabble-solver/src/pages/index.module.scss +5 -11
- package/packages/scrabble-solver/src/pages/index.tsx +5 -5
- package/packages/scrabble-solver/src/sdk/{findWordDefinition.ts → findWordDefinitions.ts} +3 -3
- package/packages/scrabble-solver/src/sdk/index.ts +1 -1
- package/packages/scrabble-solver/src/state/sagas.ts +11 -11
- package/packages/scrabble-solver/src/state/selectors.ts +6 -2
- package/packages/scrabble-solver/src/state/slices/dictionaryInitialState.ts +3 -3
- package/packages/scrabble-solver/src/state/slices/dictionarySlice.ts +4 -10
- package/packages/solver/build/PatternsFiller.js +1 -1
- package/packages/solver/build/PatternsGenerator.d.ts +4 -4
- package/packages/solver/build/PatternsGenerator.js +6 -6
- package/packages/solver/build/ScoresCalculator.js +1 -1
- package/packages/solver/build/Solver.js +3 -3
- package/packages/solver/build/getUniquePatterns.d.ts +3 -0
- package/packages/solver/build/getUniquePatterns.js +25 -0
- package/packages/solver/package-lock.json +3 -29
- package/packages/solver/package.json +5 -7
- package/packages/solver/src/PatternsFiller.ts +1 -1
- package/packages/solver/src/PatternsGenerator.test.ts +2 -2
- package/packages/solver/src/PatternsGenerator.ts +8 -8
- package/packages/solver/src/ScoresCalculator.ts +1 -1
- package/packages/solver/src/Solver.ts +3 -3
- package/packages/solver/src/getUniquePatterns.ts +30 -0
- package/packages/types/build/Board.d.ts +2 -2
- package/packages/types/build/Board.js +8 -8
- package/packages/types/build/BoardJson.d.ts +2 -1
- package/packages/types/build/BoardJson.js +19 -0
- package/packages/types/build/Cell.d.ts +2 -3
- package/packages/types/build/Cell.js +0 -15
- package/packages/types/build/CellJson.d.ts +1 -0
- package/packages/types/build/CellJson.js +14 -0
- package/packages/types/build/Collision.d.ts +3 -0
- package/packages/types/build/Collision.js +2 -0
- package/packages/types/build/CollisionJson.d.ts +3 -0
- package/packages/types/build/CollisionJson.js +2 -0
- package/packages/types/build/Config.d.ts +2 -2
- package/packages/types/build/Config.js +5 -5
- package/packages/types/build/ConfigJson.d.ts +2 -2
- package/packages/types/build/Locale.d.ts +1 -0
- package/packages/types/build/Locale.js +4 -0
- package/packages/types/build/Pattern.d.ts +1 -1
- package/packages/types/build/Pattern.js +4 -4
- package/packages/types/build/PatternJson.d.ts +1 -1
- package/packages/types/build/Result.d.ts +10 -8
- package/packages/types/build/Result.js +15 -10
- package/packages/types/build/ResultJson.d.ts +3 -2
- package/packages/types/build/TileJson.d.ts +1 -0
- package/packages/types/build/TileJson.js +9 -0
- package/packages/types/build/index.d.ts +7 -4
- package/packages/types/build/index.js +10 -1
- package/packages/types/build/isObject.d.ts +2 -0
- package/packages/types/build/isObject.js +6 -0
- package/packages/types/package.json +2 -2
- package/packages/types/src/Board.ts +11 -11
- package/packages/types/src/BoardJson.ts +22 -2
- package/packages/types/src/Cell.ts +2 -19
- package/packages/types/src/CellJson.ts +12 -1
- package/packages/types/src/Collision.ts +5 -0
- package/packages/types/src/CollisionJson.ts +5 -0
- package/packages/types/src/Config.ts +6 -6
- package/packages/types/src/ConfigJson.ts +2 -2
- package/packages/types/src/Locale.ts +4 -0
- package/packages/types/src/Pattern.ts +4 -5
- package/packages/types/src/PatternJson.ts +1 -1
- package/packages/types/src/Result.ts +33 -23
- package/packages/types/src/ResultJson.ts +3 -2
- package/packages/types/src/TileJson.ts +6 -0
- package/packages/types/src/index.ts +7 -4
- package/packages/types/src/isObject.ts +5 -0
- package/packages/word-definitions/package-lock.json +2 -2
- package/packages/word-definitions/package.json +2 -2
- package/packages/word-lists/build/getDeDeWordList.js +1 -1
- package/packages/word-lists/build/lib/extractWords.js +4 -1
- package/packages/word-lists/package-lock.json +2 -2
- package/packages/word-lists/package.json +2 -2
- package/packages/word-lists/src/getDeDeWordList.ts +1 -1
- package/packages/word-lists/src/lib/extractWords.ts +4 -1
- package/packages/scrabble-solver/.next/static/TzKQ3IntkvaYmHBkWpfoi/_buildManifest.js +0 -1
- package/packages/scrabble-solver/.next/static/chunks/56-2d34867599a0ac66.js +0 -1
- package/packages/scrabble-solver/.next/static/chunks/pages/_app-6ffa2ab900772b67.js +0 -1
- package/packages/scrabble-solver/.next/static/chunks/pages/index-13ea7770a65c69ee.js +0 -1
- package/packages/scrabble-solver/.next/static/css/3159cfe62ff742a3.css +0 -1
- package/packages/scrabble-solver/.next/static/css/551d09cac435debb.css +0 -1
- package/packages/scrabble-solver/src/api/validateBoard.ts +0 -45
- package/packages/scrabble-solver/src/api/validateCell.ts +0 -40
- package/packages/scrabble-solver/src/api/validateCharacter.ts +0 -14
- package/packages/scrabble-solver/src/api/validateCharacters.ts +0 -24
- package/packages/scrabble-solver/src/api/validateConfigId.ts +0 -9
- package/packages/scrabble-solver/src/api/validateLocale.ts +0 -15
- package/packages/scrabble-solver/src/api/validateRow.ts +0 -17
- package/packages/scrabble-solver/src/api/validateTile.ts +0 -21
- package/packages/scrabble-solver/src/api/validateWord.ts +0 -11
- package/packages/scrabble-solver/src/lib/isLocale.ts +0 -7
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@scrabble-solver/types",
|
|
3
|
-
"version": "2.8.
|
|
3
|
+
"version": "2.8.7",
|
|
4
4
|
"description": "Scrabble Solver 2 - Types",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"clean:force": "npm run clean && rimraf package-lock.json"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@scrabble-solver/constants": "^2.8.
|
|
27
|
+
"@scrabble-solver/constants": "^2.8.7"
|
|
28
28
|
},
|
|
29
29
|
"gitHead": "1e2d1ad49a288d4a44196d8e3336740da132c637"
|
|
30
30
|
}
|
|
@@ -31,21 +31,21 @@ class Board {
|
|
|
31
31
|
});
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
public readonly
|
|
34
|
+
public readonly columnsCount: number;
|
|
35
35
|
|
|
36
|
-
public readonly
|
|
36
|
+
public readonly rows: Cell[][];
|
|
37
37
|
|
|
38
|
-
public readonly
|
|
38
|
+
public readonly rowsCount: number;
|
|
39
39
|
|
|
40
40
|
constructor({ rows }: { rows: Cell[][] }) {
|
|
41
41
|
this.rows = rows;
|
|
42
|
-
this.
|
|
43
|
-
this.
|
|
42
|
+
this.columnsCount = rows[0].length;
|
|
43
|
+
this.rowsCount = rows.length;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
public get center(): Cell {
|
|
47
|
-
const x = Math.floor(this.
|
|
48
|
-
const y = Math.floor(this.
|
|
47
|
+
const x = Math.floor(this.columnsCount / 2);
|
|
48
|
+
const y = Math.floor(this.rowsCount / 2);
|
|
49
49
|
return this.rows[y][x];
|
|
50
50
|
}
|
|
51
51
|
|
|
@@ -59,7 +59,7 @@ class Board {
|
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
public collidesDown({ x, y }: Cell): boolean {
|
|
62
|
-
return y < this.
|
|
62
|
+
return y < this.rowsCount - 1 && !this.rows[y + 1][x].isEmpty;
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
public collidesLeft({ x, y }: Cell): boolean {
|
|
@@ -67,7 +67,7 @@ class Board {
|
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
public collidesRight({ x, y }: Cell): boolean {
|
|
70
|
-
return x < this.
|
|
70
|
+
return x < this.columnsCount - 1 && !this.rows[y][x + 1].isEmpty;
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
public collidesUp({ x, y }: Cell): boolean {
|
|
@@ -76,8 +76,8 @@ class Board {
|
|
|
76
76
|
|
|
77
77
|
public equals(other: Board): boolean {
|
|
78
78
|
return (
|
|
79
|
-
this.
|
|
80
|
-
this.
|
|
79
|
+
this.columnsCount === other.columnsCount &&
|
|
80
|
+
this.rowsCount === other.rowsCount &&
|
|
81
81
|
this.rows.every((row, rowIndex) => {
|
|
82
82
|
return row.every((cell, cellIndex) => {
|
|
83
83
|
return cell.equals(other.rows[rowIndex][cellIndex]);
|
|
@@ -1,5 +1,25 @@
|
|
|
1
|
-
import CellJson from './CellJson';
|
|
1
|
+
import CellJson, { isCellJson } from './CellJson';
|
|
2
2
|
|
|
3
|
-
type BoardJson =
|
|
3
|
+
type BoardJson = CellJson[][];
|
|
4
|
+
|
|
5
|
+
export const isBoardJson = (value: unknown): value is BoardJson => {
|
|
6
|
+
if (!Array.isArray(value)) {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
for (const row of value) {
|
|
11
|
+
if (!Array.isArray(value)) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
for (const cell of row) {
|
|
16
|
+
if (!isCellJson(cell)) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return true;
|
|
23
|
+
};
|
|
4
24
|
|
|
5
25
|
export default BoardJson;
|
|
@@ -2,11 +2,7 @@ import CellJson from './CellJson';
|
|
|
2
2
|
import Tile from './Tile';
|
|
3
3
|
|
|
4
4
|
class Cell {
|
|
5
|
-
public static fromJson(json: CellJson
|
|
6
|
-
if (!json) {
|
|
7
|
-
return Cell.Null;
|
|
8
|
-
}
|
|
9
|
-
|
|
5
|
+
public static fromJson(json: CellJson): Cell {
|
|
10
6
|
return new Cell({
|
|
11
7
|
isEmpty: json.isEmpty,
|
|
12
8
|
tile: Tile.fromJson(json.tile),
|
|
@@ -15,19 +11,6 @@ class Cell {
|
|
|
15
11
|
});
|
|
16
12
|
}
|
|
17
13
|
|
|
18
|
-
public static readonly Null: Cell = Object.freeze({
|
|
19
|
-
isEmpty: true,
|
|
20
|
-
tile: Tile.Null,
|
|
21
|
-
x: 0,
|
|
22
|
-
y: 0,
|
|
23
|
-
clone: () => Cell.Null,
|
|
24
|
-
equals: (other: Cell) => other === Cell.Null,
|
|
25
|
-
hasTile: () => false,
|
|
26
|
-
isCandidate: () => false,
|
|
27
|
-
toString: () => '',
|
|
28
|
-
toJson: () => null,
|
|
29
|
-
});
|
|
30
|
-
|
|
31
14
|
public readonly isEmpty: boolean;
|
|
32
15
|
|
|
33
16
|
public tile: Tile;
|
|
@@ -65,7 +48,7 @@ class Cell {
|
|
|
65
48
|
return this.isEmpty && this.hasTile();
|
|
66
49
|
}
|
|
67
50
|
|
|
68
|
-
public toJson(): CellJson
|
|
51
|
+
public toJson(): CellJson {
|
|
69
52
|
return {
|
|
70
53
|
isEmpty: this.isEmpty,
|
|
71
54
|
tile: this.tile.toJson(),
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import isObject from './isObject';
|
|
2
|
+
import TileJson, { isTileJson } from './TileJson';
|
|
2
3
|
|
|
3
4
|
interface CellJson {
|
|
4
5
|
isEmpty: boolean;
|
|
@@ -7,4 +8,14 @@ interface CellJson {
|
|
|
7
8
|
y: number;
|
|
8
9
|
}
|
|
9
10
|
|
|
11
|
+
export const isCellJson = (value: unknown): value is CellJson => {
|
|
12
|
+
return (
|
|
13
|
+
isObject(value) &&
|
|
14
|
+
typeof value.isEmpty === 'boolean' &&
|
|
15
|
+
(isTileJson(value.tile) || value.tile === null) &&
|
|
16
|
+
typeof value.x === 'number' &&
|
|
17
|
+
typeof value.y === 'number'
|
|
18
|
+
);
|
|
19
|
+
};
|
|
20
|
+
|
|
10
21
|
export default CellJson;
|
|
@@ -38,6 +38,10 @@ class Config {
|
|
|
38
38
|
return this.config.blankScore;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
+
public get blanksCount(): number {
|
|
42
|
+
return this.config.blanksCount;
|
|
43
|
+
}
|
|
44
|
+
|
|
41
45
|
public get boardHeight(): number {
|
|
42
46
|
return this.config.boardHeight;
|
|
43
47
|
}
|
|
@@ -94,12 +98,8 @@ class Config {
|
|
|
94
98
|
return typeof this.getTwoCharacterTileByPrefix(character) !== 'undefined';
|
|
95
99
|
}
|
|
96
100
|
|
|
97
|
-
public get
|
|
98
|
-
return this.config.
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
public get numberOfBlanks(): number {
|
|
102
|
-
return this.config.numberOfBlanks;
|
|
101
|
+
public get maximumCharactersCount(): number {
|
|
102
|
+
return this.config.maximumCharactersCount;
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
public get tiles(): TileConfig[] {
|
|
@@ -4,13 +4,13 @@ import TileConfig from './TileConfig';
|
|
|
4
4
|
interface ConfigJson {
|
|
5
5
|
allTilesBonusScore: number;
|
|
6
6
|
blankScore: number;
|
|
7
|
+
blanksCount: number;
|
|
7
8
|
boardHeight: number;
|
|
8
9
|
boardWidth: number;
|
|
9
10
|
bonuses: BonusJson[];
|
|
10
11
|
id: string;
|
|
11
|
-
|
|
12
|
+
maximumCharactersCount: number;
|
|
12
13
|
name: string;
|
|
13
|
-
numberOfBlanks: number;
|
|
14
14
|
tiles: TileConfig[];
|
|
15
15
|
}
|
|
16
16
|
|
|
@@ -14,11 +14,10 @@ class Pattern {
|
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
public canBePlaced(config: Config): boolean {
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
numberOfEmptyCells >= 1 && numberOfEmptyCells <= config.maximumNumberOfCharacters;
|
|
17
|
+
const emptyCellsCount = this.getEmptyCellsCount();
|
|
18
|
+
const isUsedCellsCountInRange = emptyCellsCount >= 1 && emptyCellsCount <= config.maximumCharactersCount;
|
|
20
19
|
return (
|
|
21
|
-
|
|
20
|
+
isUsedCellsCountInRange &&
|
|
22
21
|
(this.hasAtLeast1NonEmptyCell() || this.collides() || (this.goesThroughBoardCenter() && this.board.isEmpty()))
|
|
23
22
|
);
|
|
24
23
|
}
|
|
@@ -38,7 +37,7 @@ class Pattern {
|
|
|
38
37
|
return this.cells.findIndex((cell) => !cell.hasTile());
|
|
39
38
|
}
|
|
40
39
|
|
|
41
|
-
public
|
|
40
|
+
public getEmptyCellsCount(): number {
|
|
42
41
|
return this.cells.filter((cell) => cell.isEmpty).length;
|
|
43
42
|
}
|
|
44
43
|
|
|
@@ -4,33 +4,29 @@ import Cell from './Cell';
|
|
|
4
4
|
import ResultJson from './ResultJson';
|
|
5
5
|
import Tile from './Tile';
|
|
6
6
|
|
|
7
|
+
type Collision = Cell[];
|
|
8
|
+
|
|
7
9
|
class Result {
|
|
8
10
|
public static fromJson(json: ResultJson): Result {
|
|
9
11
|
return new Result({
|
|
10
|
-
cells: json.cells.map(Cell.fromJson),
|
|
11
12
|
id: json.id,
|
|
12
|
-
|
|
13
|
+
cells: json.cells.map(Cell.fromJson),
|
|
14
|
+
collisions: json.collisions.map((collision) => collision.map(Cell.fromJson)),
|
|
13
15
|
points: json.points,
|
|
14
16
|
});
|
|
15
17
|
}
|
|
16
18
|
|
|
17
|
-
public readonly
|
|
18
|
-
|
|
19
|
-
public readonly id: number;
|
|
20
|
-
|
|
21
|
-
public readonly length: number;
|
|
22
|
-
|
|
23
|
-
public readonly numberOfBlanks: number;
|
|
19
|
+
public readonly blanksCount: number;
|
|
24
20
|
|
|
25
|
-
public readonly
|
|
21
|
+
public readonly cells: Cell[];
|
|
26
22
|
|
|
27
|
-
public readonly
|
|
23
|
+
public readonly collisions: Collision[];
|
|
28
24
|
|
|
29
|
-
public readonly
|
|
25
|
+
public readonly consonantsCount: number;
|
|
30
26
|
|
|
31
|
-
public readonly
|
|
27
|
+
public readonly id: number;
|
|
32
28
|
|
|
33
|
-
public readonly
|
|
29
|
+
public readonly length: number;
|
|
34
30
|
|
|
35
31
|
public readonly points: number;
|
|
36
32
|
|
|
@@ -40,41 +36,50 @@ class Result {
|
|
|
40
36
|
|
|
41
37
|
public readonly tilesCharacters: string;
|
|
42
38
|
|
|
39
|
+
public readonly tilesCount: number;
|
|
40
|
+
|
|
41
|
+
public readonly vowelsCount: number;
|
|
42
|
+
|
|
43
43
|
public readonly word: string;
|
|
44
44
|
|
|
45
|
+
public readonly words: string[];
|
|
46
|
+
|
|
47
|
+
public readonly wordsCount: number;
|
|
48
|
+
|
|
45
49
|
constructor({
|
|
46
50
|
cells,
|
|
47
51
|
id,
|
|
48
|
-
|
|
52
|
+
collisions,
|
|
49
53
|
points,
|
|
50
54
|
}: {
|
|
51
55
|
cells: Cell[];
|
|
52
56
|
id: number;
|
|
53
|
-
|
|
57
|
+
collisions: Collision[];
|
|
54
58
|
points: number;
|
|
55
59
|
}) {
|
|
56
60
|
const tiles = getTiles(cells);
|
|
61
|
+
this.blanksCount = getBlanks(tiles).length;
|
|
57
62
|
this.cells = cells;
|
|
63
|
+
this.collisions = collisions;
|
|
64
|
+
this.consonantsCount = getConsonants(tiles).length;
|
|
58
65
|
this.id = id;
|
|
59
66
|
this.length = cells.length;
|
|
60
|
-
this.numberOfCollisions = numberOfCollisions;
|
|
61
|
-
this.numberOfConsonants = getConsonants(tiles).length;
|
|
62
|
-
this.numberOfBlanks = getBlanks(tiles).length;
|
|
63
|
-
this.numberOfTiles = tiles.length;
|
|
64
|
-
this.numberOfVowels = getVowels(tiles).length;
|
|
65
|
-
this.numberOfWords = 1 + this.numberOfCollisions;
|
|
66
67
|
this.points = points;
|
|
67
68
|
this.pointsRatio = getPointsRatio(tiles, points);
|
|
68
69
|
this.tiles = tiles;
|
|
69
70
|
this.tilesCharacters = getTilesCharacters(tiles);
|
|
71
|
+
this.tilesCount = tiles.length;
|
|
72
|
+
this.vowelsCount = getVowels(tiles).length;
|
|
70
73
|
this.word = getWord(cells);
|
|
74
|
+
this.words = getWords(cells, collisions);
|
|
75
|
+
this.wordsCount = 1 + this.collisions.length;
|
|
71
76
|
}
|
|
72
77
|
|
|
73
78
|
public toJson(): ResultJson {
|
|
74
79
|
return {
|
|
75
80
|
cells: this.cells.map((cell) => cell.toJson()),
|
|
76
81
|
id: this.id,
|
|
77
|
-
|
|
82
|
+
collisions: this.collisions.map((collision) => collision.map((cell) => cell.toJson())),
|
|
78
83
|
points: this.points,
|
|
79
84
|
};
|
|
80
85
|
}
|
|
@@ -100,6 +105,11 @@ const getTilesCharacters = (tiles: Tile[]): string => getNonBlankCharacters(tile
|
|
|
100
105
|
|
|
101
106
|
const getWord = (cells: Cell[]): string => cells.map(String).join('');
|
|
102
107
|
|
|
108
|
+
const getWords = (cells: Cell[], collisions: Collision[]): string[] => [
|
|
109
|
+
getWord(cells),
|
|
110
|
+
...collisions.map((collision) => collision.map(String).join('')),
|
|
111
|
+
];
|
|
112
|
+
|
|
103
113
|
const isConsonant = ({ character, isBlank }: Tile): boolean => CONSONANTS.includes(character) && !isBlank;
|
|
104
114
|
|
|
105
115
|
const isVowel = ({ character, isBlank }: Tile): boolean => VOWELS.includes(character) && !isBlank;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import CellJson from './CellJson';
|
|
2
|
+
import CollisionJson from './CollisionJson';
|
|
2
3
|
|
|
3
4
|
interface ResultJson {
|
|
4
|
-
cells:
|
|
5
|
+
cells: CellJson[];
|
|
6
|
+
collisions: CollisionJson[];
|
|
5
7
|
id: number;
|
|
6
|
-
numberOfCollisions: number;
|
|
7
8
|
points: number;
|
|
8
9
|
}
|
|
9
10
|
|
|
@@ -1,6 +1,12 @@
|
|
|
1
|
+
import isObject from './isObject';
|
|
2
|
+
|
|
1
3
|
interface TileJson {
|
|
2
4
|
character: string;
|
|
3
5
|
isBlank: boolean;
|
|
4
6
|
}
|
|
5
7
|
|
|
8
|
+
export const isTileJson = (value: unknown): value is TileJson => {
|
|
9
|
+
return isObject(value) && typeof value.character === 'string' && typeof value.isBlank === 'boolean';
|
|
10
|
+
};
|
|
11
|
+
|
|
6
12
|
export default TileJson;
|
|
@@ -1,22 +1,25 @@
|
|
|
1
1
|
export { default as Board } from './Board';
|
|
2
|
-
export { default as BoardJson } from './BoardJson';
|
|
2
|
+
export { default as BoardJson, isBoardJson } from './BoardJson';
|
|
3
3
|
export { default as Bonus } from './Bonus';
|
|
4
4
|
export { default as BonusJson } from './BonusJson';
|
|
5
5
|
export { default as BonusValue } from './BonusValue';
|
|
6
6
|
export { default as Cell } from './Cell';
|
|
7
|
-
export { default as CellJson } from './CellJson';
|
|
7
|
+
export { default as CellJson, isCellJson } from './CellJson';
|
|
8
8
|
export { default as CharacterBonus } from './CharacterBonus';
|
|
9
|
+
export { default as Collision } from './Collision';
|
|
10
|
+
export { default as CollisionJson } from './CollisionJson';
|
|
9
11
|
export { default as Config } from './Config';
|
|
10
12
|
export { default as ConfigJson } from './ConfigJson';
|
|
11
13
|
export { default as HorizontalPattern } from './HorizontalPattern';
|
|
12
|
-
export { default as
|
|
14
|
+
export { default as isObject } from './isObject';
|
|
15
|
+
export { default as Locale, isLocale } from './Locale';
|
|
13
16
|
export { default as Pattern } from './Pattern';
|
|
14
17
|
export { default as PatternJson } from './PatternJson';
|
|
15
18
|
export { default as Result } from './Result';
|
|
16
19
|
export { default as ResultJson } from './ResultJson';
|
|
17
20
|
export { default as Tile } from './Tile';
|
|
18
21
|
export { default as TileConfig } from './TileConfig';
|
|
19
|
-
export { default as TileJson } from './TileJson';
|
|
22
|
+
export { default as TileJson, isTileJson } from './TileJson';
|
|
20
23
|
export { default as VerticalPattern } from './VerticalPattern';
|
|
21
24
|
export { default as WordBonus } from './WordBonus';
|
|
22
25
|
export { default as WordDefinition } from './WordDefinition';
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@scrabble-solver/word-definitions",
|
|
3
|
-
"version": "2.8.
|
|
3
|
+
"version": "2.8.7",
|
|
4
4
|
"lockfileVersion": 2,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@scrabble-solver/word-definitions",
|
|
9
|
-
"version": "2.8.
|
|
9
|
+
"version": "2.8.7",
|
|
10
10
|
"license": "CC-BY-NC-ND-4.0",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"cheerio": "^1.0.0-rc.12",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@scrabble-solver/word-definitions",
|
|
3
|
-
"version": "2.8.
|
|
3
|
+
"version": "2.8.7",
|
|
4
4
|
"description": "Scrabble Solver 2 - Word definitions",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"clean": "rimraf build/ node_modules/ package-lock.json"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@scrabble-solver/types": "^2.8.
|
|
26
|
+
"@scrabble-solver/types": "^2.8.7",
|
|
27
27
|
"cheerio": "^1.0.0-rc.12",
|
|
28
28
|
"follow-redirects": "^1.15.2",
|
|
29
29
|
"striptags": "^3.2.0"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const lib_1 = require("./lib");
|
|
4
|
-
const FILE_URL = 'https://raw.githubusercontent.com/
|
|
4
|
+
const FILE_URL = 'https://raw.githubusercontent.com/enz/german-wordlist/master/words';
|
|
5
5
|
const getDeDeWordList = async () => {
|
|
6
6
|
return (0, lib_1.getTxtWordList)(FILE_URL);
|
|
7
7
|
};
|
|
@@ -7,7 +7,10 @@ const findFirstWordIndex_1 = __importDefault(require("./findFirstWordIndex"));
|
|
|
7
7
|
const extractWords = (file) => {
|
|
8
8
|
const lines = file.replace(/\r/g, '').split('\n');
|
|
9
9
|
const firstWordIndex = (0, findFirstWordIndex_1.default)(lines);
|
|
10
|
-
const words = lines
|
|
10
|
+
const words = lines
|
|
11
|
+
.slice(firstWordIndex)
|
|
12
|
+
.filter((word) => word.trim().length > 0)
|
|
13
|
+
.map((word) => word.toLocaleLowerCase());
|
|
11
14
|
return words;
|
|
12
15
|
};
|
|
13
16
|
exports.default = extractWords;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@scrabble-solver/word-lists",
|
|
3
|
-
"version": "2.8.
|
|
3
|
+
"version": "2.8.7",
|
|
4
4
|
"lockfileVersion": 2,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@scrabble-solver/word-lists",
|
|
9
|
-
"version": "2.8.
|
|
9
|
+
"version": "2.8.7",
|
|
10
10
|
"license": "CC-BY-NC-ND-4.0",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"cheerio": "^1.0.0-rc.12",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@scrabble-solver/word-lists",
|
|
3
|
-
"version": "2.8.
|
|
3
|
+
"version": "2.8.7",
|
|
4
4
|
"description": "Scrabble Solver 2 - Word lists",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"clean:force": "npm run clean && rimraf package-lock.json"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@scrabble-solver/types": "^2.8.
|
|
27
|
+
"@scrabble-solver/types": "^2.8.7",
|
|
28
28
|
"cheerio": "^1.0.0-rc.12",
|
|
29
29
|
"follow-redirects": "^1.15.2",
|
|
30
30
|
"memfs": "^3.4.7",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getTxtWordList } from './lib';
|
|
2
2
|
|
|
3
|
-
const FILE_URL = 'https://raw.githubusercontent.com/
|
|
3
|
+
const FILE_URL = 'https://raw.githubusercontent.com/enz/german-wordlist/master/words';
|
|
4
4
|
|
|
5
5
|
const getDeDeWordList = async (): Promise<string[]> => {
|
|
6
6
|
return getTxtWordList(FILE_URL);
|
|
@@ -3,7 +3,10 @@ import findFirstWordIndex from './findFirstWordIndex';
|
|
|
3
3
|
const extractWords = (file: string): string[] => {
|
|
4
4
|
const lines = file.replace(/\r/g, '').split('\n');
|
|
5
5
|
const firstWordIndex = findFirstWordIndex(lines);
|
|
6
|
-
const words = lines
|
|
6
|
+
const words = lines
|
|
7
|
+
.slice(firstWordIndex)
|
|
8
|
+
.filter((word) => word.trim().length > 0)
|
|
9
|
+
.map((word) => word.toLocaleLowerCase());
|
|
7
10
|
return words;
|
|
8
11
|
};
|
|
9
12
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
self.__BUILD_MANIFEST=function(s,a,e){return{__rewrites:{beforeFiles:[],afterFiles:[],fallback:[]},"/":[s,a,e,"static/css/3159cfe62ff742a3.css","static/chunks/pages/index-13ea7770a65c69ee.js"],"/404":[s,a,e,"static/chunks/pages/404-30c06e61d256c5b2.js"],"/_error":["static/chunks/pages/_error-a4ba2246ff8fb532.js"],sortedPages:["/","/404","/_app","/_error"]}}("static/chunks/758-f333b1dcdb941547.js","static/css/551d09cac435debb.css","static/chunks/56-2d34867599a0ac66.js"),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
|