puzlink 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +21 -0
- package/README.md +35 -0
- package/dist/data/answerLengths.d.ts +10 -0
- package/dist/data/answerLengths.d.ts.map +1 -0
- package/dist/data/answerLengths.js +63 -0
- package/dist/data/answerLengths.js.map +1 -0
- package/dist/data/categories/compass.d.ts +3 -0
- package/dist/data/categories/compass.d.ts.map +1 -0
- package/dist/data/categories/compass.js +11 -0
- package/dist/data/categories/compass.js.map +1 -0
- package/dist/data/categories/countryAlpha2.d.ts +3 -0
- package/dist/data/categories/countryAlpha2.d.ts.map +1 -0
- package/dist/data/categories/countryAlpha2.js +252 -0
- package/dist/data/categories/countryAlpha2.js.map +1 -0
- package/dist/data/categories/countryAlpha3.d.ts +3 -0
- package/dist/data/categories/countryAlpha3.d.ts.map +1 -0
- package/dist/data/categories/countryAlpha3.js +252 -0
- package/dist/data/categories/countryAlpha3.js.map +1 -0
- package/dist/data/categories/daysOfTheWeek.d.ts +3 -0
- package/dist/data/categories/daysOfTheWeek.d.ts.map +1 -0
- package/dist/data/categories/daysOfTheWeek.js +10 -0
- package/dist/data/categories/daysOfTheWeek.js.map +1 -0
- package/dist/data/categories/elementSymbols.d.ts +3 -0
- package/dist/data/categories/elementSymbols.d.ts.map +1 -0
- package/dist/data/categories/elementSymbols.js +121 -0
- package/dist/data/categories/elementSymbols.js.map +1 -0
- package/dist/data/categories/greekLetters.d.ts +3 -0
- package/dist/data/categories/greekLetters.d.ts.map +1 -0
- package/dist/data/categories/greekLetters.js +27 -0
- package/dist/data/categories/greekLetters.js.map +1 -0
- package/dist/data/categories/months.d.ts +3 -0
- package/dist/data/categories/months.d.ts.map +1 -0
- package/dist/data/categories/months.js +15 -0
- package/dist/data/categories/months.js.map +1 -0
- package/dist/data/categories/natoAlphabet.d.ts +3 -0
- package/dist/data/categories/natoAlphabet.d.ts.map +1 -0
- package/dist/data/categories/natoAlphabet.js +29 -0
- package/dist/data/categories/natoAlphabet.js.map +1 -0
- package/dist/data/categories/numbers.d.ts +3 -0
- package/dist/data/categories/numbers.d.ts.map +1 -0
- package/dist/data/categories/numbers.js +16 -0
- package/dist/data/categories/numbers.js.map +1 -0
- package/dist/data/categories/romanNumerals.d.ts +3 -0
- package/dist/data/categories/romanNumerals.d.ts.map +1 -0
- package/dist/data/categories/romanNumerals.js +134 -0
- package/dist/data/categories/romanNumerals.js.map +1 -0
- package/dist/data/categories/solfege.d.ts +3 -0
- package/dist/data/categories/solfege.d.ts.map +1 -0
- package/dist/data/categories/solfege.js +11 -0
- package/dist/data/categories/solfege.js.map +1 -0
- package/dist/data/categories/usStateAbbreviations.d.ts +3 -0
- package/dist/data/categories/usStateAbbreviations.d.ts.map +1 -0
- package/dist/data/categories/usStateAbbreviations.js +53 -0
- package/dist/data/categories/usStateAbbreviations.js.map +1 -0
- package/dist/data/categories.d.ts +10 -0
- package/dist/data/categories.d.ts.map +1 -0
- package/dist/data/categories.js +31 -0
- package/dist/data/categories.js.map +1 -0
- package/dist/data/knownLogProbs.d.ts +6 -0
- package/dist/data/knownLogProbs.d.ts.map +1 -0
- package/dist/data/knownLogProbs.js +2975 -0
- package/dist/data/knownLogProbs.js.map +1 -0
- package/dist/data/morse.d.ts +2 -0
- package/dist/data/morse.d.ts.map +1 -0
- package/dist/data/morse.js +29 -0
- package/dist/data/morse.js.map +1 -0
- package/dist/data/scrabble.d.ts +2 -0
- package/dist/data/scrabble.d.ts.map +1 -0
- package/dist/data/scrabble.js +29 -0
- package/dist/data/scrabble.js.map +1 -0
- package/dist/features/index.d.ts +32 -0
- package/dist/features/index.d.ts.map +1 -0
- package/dist/features/index.js +79 -0
- package/dist/features/index.js.map +1 -0
- package/dist/features/letterCount.d.ts +7 -0
- package/dist/features/letterCount.d.ts.map +1 -0
- package/dist/features/letterCount.js +121 -0
- package/dist/features/letterCount.js.map +1 -0
- package/dist/features/letterSequence.d.ts +7 -0
- package/dist/features/letterSequence.d.ts.map +1 -0
- package/dist/features/letterSequence.js +155 -0
- package/dist/features/letterSequence.js.map +1 -0
- package/dist/features/logProbCache.d.ts +16 -0
- package/dist/features/logProbCache.d.ts.map +1 -0
- package/dist/features/logProbCache.js +36 -0
- package/dist/features/logProbCache.js.map +1 -0
- package/dist/features/other.d.ts +4 -0
- package/dist/features/other.d.ts.map +1 -0
- package/dist/features/other.js +190 -0
- package/dist/features/other.js.map +1 -0
- package/dist/features/substring.d.ts +3 -0
- package/dist/features/substring.d.ts.map +1 -0
- package/dist/features/substring.js +146 -0
- package/dist/features/substring.js.map +1 -0
- package/dist/features/wordplay.d.ts +7 -0
- package/dist/features/wordplay.d.ts.map +1 -0
- package/dist/features/wordplay.js +387 -0
- package/dist/features/wordplay.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/affixDistribution.d.ts +26 -0
- package/dist/lib/affixDistribution.d.ts.map +1 -0
- package/dist/lib/affixDistribution.js +105 -0
- package/dist/lib/affixDistribution.js.map +1 -0
- package/dist/lib/counter.d.ts +23 -0
- package/dist/lib/counter.d.ts.map +1 -0
- package/dist/lib/counter.js +55 -0
- package/dist/lib/counter.js.map +1 -0
- package/dist/lib/distribution.d.ts +40 -0
- package/dist/lib/distribution.d.ts.map +1 -0
- package/dist/lib/distribution.js +176 -0
- package/dist/lib/distribution.js.map +1 -0
- package/dist/lib/lengthDistribution.d.ts +30 -0
- package/dist/lib/lengthDistribution.d.ts.map +1 -0
- package/dist/lib/lengthDistribution.js +137 -0
- package/dist/lib/lengthDistribution.js.map +1 -0
- package/dist/lib/letterBitset.d.ts +49 -0
- package/dist/lib/letterBitset.d.ts.map +1 -0
- package/dist/lib/letterBitset.js +101 -0
- package/dist/lib/letterBitset.js.map +1 -0
- package/dist/lib/letterDistribution.d.ts +60 -0
- package/dist/lib/letterDistribution.d.ts.map +1 -0
- package/dist/lib/letterDistribution.js +230 -0
- package/dist/lib/letterDistribution.js.map +1 -0
- package/dist/lib/letterIndices.d.ts +13 -0
- package/dist/lib/letterIndices.d.ts.map +1 -0
- package/dist/lib/letterIndices.js +41 -0
- package/dist/lib/letterIndices.js.map +1 -0
- package/dist/lib/logCounter.d.ts +23 -0
- package/dist/lib/logCounter.d.ts.map +1 -0
- package/dist/lib/logCounter.js +49 -0
- package/dist/lib/logCounter.js.map +1 -0
- package/dist/lib/logNum.d.ts +36 -0
- package/dist/lib/logNum.d.ts.map +1 -0
- package/dist/lib/logNum.js +193 -0
- package/dist/lib/logNum.js.map +1 -0
- package/dist/lib/memoize.d.ts +5 -0
- package/dist/lib/memoize.d.ts.map +1 -0
- package/dist/lib/memoize.js +104 -0
- package/dist/lib/memoize.js.map +1 -0
- package/dist/lib/util.d.ts +30 -0
- package/dist/lib/util.d.ts.map +1 -0
- package/dist/lib/util.js +111 -0
- package/dist/lib/util.js.map +1 -0
- package/dist/lib/wordlist.d.ts +66 -0
- package/dist/lib/wordlist.d.ts.map +1 -0
- package/dist/lib/wordlist.js +166 -0
- package/dist/lib/wordlist.js.map +1 -0
- package/dist/linkers/index.d.ts +34 -0
- package/dist/linkers/index.d.ts.map +1 -0
- package/dist/linkers/index.js +25 -0
- package/dist/linkers/index.js.map +1 -0
- package/dist/linkers/indexing.d.ts +5 -0
- package/dist/linkers/indexing.d.ts.map +1 -0
- package/dist/linkers/indexing.js +152 -0
- package/dist/linkers/indexing.js.map +1 -0
- package/dist/linkers/length.d.ts +5 -0
- package/dist/linkers/length.d.ts.map +1 -0
- package/dist/linkers/length.js +101 -0
- package/dist/linkers/length.js.map +1 -0
- package/dist/linkers/letterDistribution.d.ts +4 -0
- package/dist/linkers/letterDistribution.d.ts.map +1 -0
- package/dist/linkers/letterDistribution.js +46 -0
- package/dist/linkers/letterDistribution.js.map +1 -0
- package/dist/linkers/other.d.ts +5 -0
- package/dist/linkers/other.d.ts.map +1 -0
- package/dist/linkers/other.js +90 -0
- package/dist/linkers/other.js.map +1 -0
- package/dist/parse.d.ts +8 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +23 -0
- package/dist/parse.js.map +1 -0
- package/dist/puzlink.d.ts +84 -0
- package/dist/puzlink.d.ts.map +1 -0
- package/dist/puzlink.js +59 -0
- package/dist/puzlink.js.map +1 -0
- package/package.json +57 -0
- package/src/data/answerLengths.ts +63 -0
- package/src/data/categories/README.md +3 -0
- package/src/data/categories/compass.ts +1 -0
- package/src/data/categories/countryAlpha2.ts +251 -0
- package/src/data/categories/countryAlpha3.ts +251 -0
- package/src/data/categories/daysOfTheWeek.ts +1 -0
- package/src/data/categories/elementSymbols.ts +120 -0
- package/src/data/categories/greekLetters.ts +26 -0
- package/src/data/categories/months.ts +14 -0
- package/src/data/categories/natoAlphabet.ts +28 -0
- package/src/data/categories/numbers.ts +15 -0
- package/src/data/categories/romanNumerals.ts +133 -0
- package/src/data/categories/solfege.ts +1 -0
- package/src/data/categories/txt/compass.txt +8 -0
- package/src/data/categories/txt/daysOfTheWeek.txt +7 -0
- package/src/data/categories/txt/elementSymbols.txt +118 -0
- package/src/data/categories/txt/greekLetters.txt +24 -0
- package/src/data/categories/txt/months.txt +12 -0
- package/src/data/categories/txt/natoAlphabet.txt +26 -0
- package/src/data/categories/txt/numbers.txt +13 -0
- package/src/data/categories/txt/solfege.txt +8 -0
- package/src/data/categories/txt/usStateAbbreviations.txt +50 -0
- package/src/data/categories/usStateAbbreviations.ts +52 -0
- package/src/data/categories.ts +42 -0
- package/src/data/knownLogProbs.ts +2992 -0
- package/src/data/morse.ts +28 -0
- package/src/data/scrabble.ts +28 -0
- package/src/features/index.ts +120 -0
- package/src/features/letterCount.ts +174 -0
- package/src/features/letterSequence.ts +222 -0
- package/src/features/logProbCache.ts +48 -0
- package/src/features/other.ts +214 -0
- package/src/features/substring.ts +173 -0
- package/src/features/wordplay.ts +428 -0
- package/src/index.ts +3 -0
- package/src/lib/affixDistribution.ts +70 -0
- package/src/lib/counter.ts +71 -0
- package/src/lib/distribution.ts +162 -0
- package/src/lib/lengthDistribution.ts +108 -0
- package/src/lib/letterBitset.ts +123 -0
- package/src/lib/letterDistribution.ts +236 -0
- package/src/lib/letterIndices.ts +51 -0
- package/src/lib/logCounter.ts +74 -0
- package/src/lib/logNum.ts +193 -0
- package/src/lib/memoize.ts +136 -0
- package/src/lib/testUtils.ts +1 -0
- package/src/lib/util.ts +150 -0
- package/src/lib/wordlist.ts +162 -0
- package/src/linkers/index.ts +56 -0
- package/src/linkers/indexing.ts +194 -0
- package/src/linkers/length.ts +122 -0
- package/src/linkers/other.ts +117 -0
- package/src/parse.ts +20 -0
- package/src/puzlink.ts +141 -0
package/src/puzlink.ts
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { loadWordlist } from "cromulence";
|
|
2
|
+
import { Wordlist } from "./lib/wordlist.js";
|
|
3
|
+
import type { Linker } from "./linkers/index.js";
|
|
4
|
+
import { allLinkers } from "./linkers/index.js";
|
|
5
|
+
import { parse } from "./parse.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* A Link is a relationship between a (possibly ordered) set of words, with how
|
|
9
|
+
* strong it is quantified via its score.
|
|
10
|
+
*/
|
|
11
|
+
export type Link = {
|
|
12
|
+
/** The name of the link. */
|
|
13
|
+
name: string;
|
|
14
|
+
/**
|
|
15
|
+
* Any additional information about the link. Typically, this would be an
|
|
16
|
+
* explanation for why the words satisfy the given link.
|
|
17
|
+
*/
|
|
18
|
+
description: readonly string[];
|
|
19
|
+
/**
|
|
20
|
+
* The score of the link. A higher score means it's more likely to be
|
|
21
|
+
* important (because it's less likely to happen by chance).
|
|
22
|
+
*
|
|
23
|
+
* This is calculated as the negative of the log probability we'd expect to
|
|
24
|
+
* see this link, if each word was replaced with a random puzzle answer,
|
|
25
|
+
* rounded to 1 decimal place.
|
|
26
|
+
*/
|
|
27
|
+
score: number;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/** Options for Puzlink.link(). */
|
|
31
|
+
export type LinkOptions = {
|
|
32
|
+
/**
|
|
33
|
+
* Whether to return links via a generator instead of a list. If true, links
|
|
34
|
+
* will be returned *unsorted*, and the limit option will be ignored.
|
|
35
|
+
*
|
|
36
|
+
* Defaults to false.
|
|
37
|
+
*/
|
|
38
|
+
lazy?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Limit the number of links returned. Pass null or Infinity to return
|
|
41
|
+
* all links.
|
|
42
|
+
*
|
|
43
|
+
* Defaults to 10.
|
|
44
|
+
*/
|
|
45
|
+
limit?: number | null;
|
|
46
|
+
/**
|
|
47
|
+
* Only report features that are satisfied by either 0, or at least
|
|
48
|
+
* minFeatureRatio of the words.
|
|
49
|
+
*
|
|
50
|
+
* Defaults to 0.5.
|
|
51
|
+
*/
|
|
52
|
+
minFeatureRatio?: number;
|
|
53
|
+
/**
|
|
54
|
+
* Set to true if the input has a particular order. Some of the links we use
|
|
55
|
+
* apply only if the words have a given order.
|
|
56
|
+
*
|
|
57
|
+
* Defaults to true if the words are NOT alphabetically sorted.
|
|
58
|
+
*/
|
|
59
|
+
ordered?: boolean;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export class Puzlink {
|
|
63
|
+
linkers: Linker[];
|
|
64
|
+
|
|
65
|
+
constructor(wordlist: Record<string, number>) {
|
|
66
|
+
this.linkers = allLinkers(new Wordlist(wordlist));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Create a Puzlink instance by downloading the cromulence wordlist. */
|
|
70
|
+
static async download(): Promise<Puzlink> {
|
|
71
|
+
return new Puzlink(await loadWordlist());
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
private *linkLazy(
|
|
75
|
+
slugs: string[],
|
|
76
|
+
options: Required<LinkOptions>,
|
|
77
|
+
): Generator<Link> {
|
|
78
|
+
for (const linker of this.linkers) {
|
|
79
|
+
for (const partialLink of linker.eval(slugs, options)) {
|
|
80
|
+
yield {
|
|
81
|
+
name: linker.name,
|
|
82
|
+
score: Math.round(partialLink.logProb.toLog() * -10) / 10,
|
|
83
|
+
...partialLink,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Given a list of words, returns a list of links they share, sorted from
|
|
91
|
+
* highest to lowest score.
|
|
92
|
+
*/
|
|
93
|
+
link(
|
|
94
|
+
/** The words to link. See parse() for how these are parsed. */
|
|
95
|
+
words: string | readonly string[],
|
|
96
|
+
options?: LinkOptions & { lazy?: false },
|
|
97
|
+
): Link[];
|
|
98
|
+
/** Given a list of words, returns a generator of links they share. */
|
|
99
|
+
link(
|
|
100
|
+
/** The words to link. See parse() for how these are parsed. */
|
|
101
|
+
words: string | readonly string[],
|
|
102
|
+
options?: LinkOptions & { lazy: true },
|
|
103
|
+
): Generator<Link>;
|
|
104
|
+
link(
|
|
105
|
+
words: string | readonly string[],
|
|
106
|
+
{
|
|
107
|
+
lazy = false,
|
|
108
|
+
limit = 10,
|
|
109
|
+
minFeatureRatio = 0.5,
|
|
110
|
+
ordered,
|
|
111
|
+
}: LinkOptions = {},
|
|
112
|
+
): Generator<Link> | Link[] {
|
|
113
|
+
const slugs = parse(words);
|
|
114
|
+
|
|
115
|
+
if (slugs.length === 0) {
|
|
116
|
+
return lazy
|
|
117
|
+
? (function* () {
|
|
118
|
+
// empty
|
|
119
|
+
})()
|
|
120
|
+
: [];
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (ordered === undefined) {
|
|
124
|
+
const sortedSlugs = slugs.slice().sort();
|
|
125
|
+
const isSorted = slugs.every((slug, i) => slug === sortedSlugs[i]);
|
|
126
|
+
ordered = !isSorted;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const options = { lazy, limit, ordered, minFeatureRatio };
|
|
130
|
+
|
|
131
|
+
if (lazy) {
|
|
132
|
+
return this.linkLazy(slugs, options);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return Array.from(this.linkLazy(slugs, options))
|
|
136
|
+
.sort((a, b) => (a.score > b.score ? -1 : 1))
|
|
137
|
+
.slice(0, limit ?? Infinity);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// TODO: clustering, pos/neg
|
|
141
|
+
}
|