@scrabble-solver/solver 2.5.0 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -20,6 +20,7 @@ var __spread = (this && this.__spread) || function () {
20
20
  return ar;
21
21
  };
22
22
  Object.defineProperty(exports, "__esModule", { value: true });
23
+ var constants_1 = require("@scrabble-solver/constants");
23
24
  var types_1 = require("@scrabble-solver/types");
24
25
  var PatternsFiller = /** @class */ (function () {
25
26
  function PatternsFiller(config, trie) {
@@ -53,8 +54,9 @@ var PatternsFiller = /** @class */ (function () {
53
54
  var previousTile = pattern.cells[indexOfFirstCellWithoutTile].tile;
54
55
  pattern.cells[indexOfFirstCellWithoutTile].tile = tile;
55
56
  var indexOfNextCellWithoutTile = pattern.getIndexOfFirstCellWithoutTile();
56
- var newWordPrefix = word.substring(0, indexOfFirstCellWithoutTile) + tile.character;
57
- var newWord = newWordPrefix + word.substring(indexOfFirstCellWithoutTile + 1);
57
+ var indexOfFirstEmptyLetter = word.indexOf(constants_1.EMPTY_CELL);
58
+ var newWordPrefix = word.substring(0, indexOfFirstEmptyLetter) + tile.character;
59
+ var newWord = newWordPrefix + word.substring(indexOfFirstEmptyLetter + 1);
58
60
  if (indexOfNextCellWithoutTile === -1) {
59
61
  if (this.canAddPattern(pattern, newWord)) {
60
62
  onPatternFound(pattern.clone());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scrabble-solver/solver",
3
- "version": "2.5.0",
3
+ "version": "2.7.0",
4
4
  "description": "Scrabble Solver 2 - Solver",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -11,7 +11,7 @@
11
11
  "author": {
12
12
  "name": "Kamil Mielnik",
13
13
  "email": "kamil.adam.mielnik@gmail.com",
14
- "url": "http://kamilmielnik.com/"
14
+ "url": "https://kamilmielnik.com/"
15
15
  },
16
16
  "license": "CC-BY-NC-ND-4.0",
17
17
  "bugs": {
@@ -25,14 +25,14 @@
25
25
  },
26
26
  "dependencies": {
27
27
  "@kamilmielnik/trie": "^1.0.3",
28
- "@scrabble-solver/types": "^2.5.0",
28
+ "@scrabble-solver/types": "^2.7.0",
29
29
  "lodash": "^4.17.20"
30
30
  },
31
31
  "devDependencies": {
32
- "@scrabble-solver/configs": "^2.5.0",
33
- "@scrabble-solver/constants": "^2.5.0",
34
- "@scrabble-solver/dictionaries": "^2.5.0",
32
+ "@scrabble-solver/configs": "^2.7.0",
33
+ "@scrabble-solver/constants": "^2.7.0",
34
+ "@scrabble-solver/dictionaries": "^2.7.0",
35
35
  "@types/lodash": "^4.14.168"
36
36
  },
37
- "gitHead": "e698e6466c1872c2c325cfce1585f3e22892e633"
37
+ "gitHead": "db0e2eab74ee597f70df456444312241f2646f9e"
38
38
  }
@@ -1,4 +1,5 @@
1
1
  import { Trie } from '@kamilmielnik/trie';
2
+ import { EMPTY_CELL } from '@scrabble-solver/constants';
2
3
  import { Config, Pattern, Tile } from '@scrabble-solver/types';
3
4
 
4
5
  class PatternsFiller {
@@ -48,8 +49,9 @@ class PatternsFiller {
48
49
  const previousTile = pattern.cells[indexOfFirstCellWithoutTile].tile;
49
50
  pattern.cells[indexOfFirstCellWithoutTile].tile = tile;
50
51
  const indexOfNextCellWithoutTile = pattern.getIndexOfFirstCellWithoutTile();
51
- const newWordPrefix = word.substring(0, indexOfFirstCellWithoutTile) + tile.character;
52
- const newWord = newWordPrefix + word.substring(indexOfFirstCellWithoutTile + 1);
52
+ const indexOfFirstEmptyLetter = word.indexOf(EMPTY_CELL);
53
+ const newWordPrefix = word.substring(0, indexOfFirstEmptyLetter) + tile.character;
54
+ const newWord = newWordPrefix + word.substring(indexOfFirstEmptyLetter + 1);
53
55
  if (indexOfNextCellWithoutTile === -1) {
54
56
  if (this.canAddPattern(pattern, newWord)) {
55
57
  onPatternFound(pattern.clone());
@@ -1,13 +1,21 @@
1
- import { literaki } from '@scrabble-solver/configs';
1
+ import { literaki, scrabble } from '@scrabble-solver/configs';
2
2
  import { dictionaries } from '@scrabble-solver/dictionaries';
3
- import { Board, Locale, Tile } from '@scrabble-solver/types';
3
+ import { Board, Locale, Result, Tile } from '@scrabble-solver/types';
4
4
 
5
5
  import Solver from './Solver';
6
6
 
7
- const generateTiles = (characters: string): Tile[] =>
8
- characters.split('').map((character) => new Tile({ character, isBlank: false }));
7
+ const generateTiles = (characters: string[]): Tile[] => {
8
+ return characters.map((character) => new Tile({ character, isBlank: false }));
9
+ };
9
10
 
10
- describe('Solver', () => {
11
+ const getBestResult = ([firstResult, ...results]: Result[]): Result => {
12
+ return results.reduce(
13
+ (bestResultCandidate, result) => (result.points > bestResultCandidate.points ? result : bestResultCandidate),
14
+ firstResult,
15
+ );
16
+ };
17
+
18
+ describe('Solver - PL', () => {
11
19
  const locale = Locale.PL_PL;
12
20
  const config = literaki[locale];
13
21
  let solver: Solver | undefined;
@@ -36,9 +44,9 @@ describe('Solver', () => {
36
44
  ' ',
37
45
  ' ',
38
46
  ]);
39
- const tiles = generateTiles('lino');
47
+ const tiles = generateTiles(['l', 'i', 'n', 'o']);
40
48
  const results = solver!.solve(board, tiles);
41
- expect(results.length).toBe(60);
49
+ expect(results.length).toBe(61);
42
50
  });
43
51
 
44
52
  it('zmartwychwstałą x9', () => {
@@ -59,12 +67,9 @@ describe('Solver', () => {
59
67
  ' ',
60
68
  ' ',
61
69
  ]);
62
- const tiles = generateTiles('aaąrtwz');
63
- const [firstResult, ...results] = solver!.solve(board, tiles);
64
- const bestResult = results.reduce(
65
- (bestResultCandidate, result) => (result.points > bestResultCandidate.points ? result : bestResultCandidate),
66
- firstResult,
67
- );
70
+ const tiles = generateTiles(['a', 'a', 'ą', 'r', 't', 'w', 'z']);
71
+ const results = solver!.solve(board, tiles);
72
+ const bestResult = getBestResult(results);
68
73
  expect(bestResult.word).toBe('zmartwychwstałą');
69
74
  expect(bestResult.points).toBe(682);
70
75
  });
@@ -87,13 +92,47 @@ describe('Solver', () => {
87
92
  'da do ot ',
88
93
  'ar ń m ',
89
94
  ]);
90
- const tiles = generateTiles('ąchtwwz');
91
- const [firstResult, ...results] = solver!.solve(board, tiles);
92
- const bestResult = results.reduce(
93
- (bestResultCandidate, result) => (result.points > bestResultCandidate.points ? result : bestResultCandidate),
94
- firstResult,
95
- );
95
+ const tiles = generateTiles(['ą', 'c', 'h', 't', 'w', 'w', 'z']);
96
+ const results = solver!.solve(board, tiles);
97
+ const bestResult = getBestResult(results);
96
98
  expect(bestResult.word).toBe('zmartwychwstałą');
97
99
  expect(bestResult.points).toBe(1157);
98
100
  });
99
101
  });
102
+
103
+ describe('Solver - ES', () => {
104
+ const locale = Locale.ES_ES;
105
+ const config = scrabble[locale];
106
+ let solver: Solver | undefined;
107
+
108
+ beforeAll(() => {
109
+ return dictionaries.get(locale).then((trie) => {
110
+ solver = new Solver(config, trie);
111
+ });
112
+ });
113
+
114
+ it('llana', () => {
115
+ const board = Board.fromStringArray([
116
+ ' ',
117
+ ' ',
118
+ ' ',
119
+ ' ',
120
+ ' ',
121
+ ' ',
122
+ ' ',
123
+ ' ',
124
+ ' ',
125
+ ' ',
126
+ ' ',
127
+ ' ',
128
+ ' ',
129
+ ' ',
130
+ ' ',
131
+ ]);
132
+ const tiles = generateTiles(['ll', 'a', 'n', 'a']);
133
+ const results = solver!.solve(board, tiles);
134
+ const bestResult = getBestResult(results);
135
+ expect(results.length).toBe(24);
136
+ expect(bestResult.points).toBe(22);
137
+ });
138
+ });