@nawa-captcha/server 0.0.0-stage → 0.1.1
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 +65 -2
- package/dist/binding.d.ts +22 -0
- package/dist/binding.d.ts.map +1 -0
- package/dist/binding.js +46 -0
- package/dist/binding.js.map +1 -0
- package/dist/catalog.d.ts +12 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +42 -0
- package/dist/catalog.js.map +1 -0
- package/dist/crypto.d.ts +44 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +108 -0
- package/dist/crypto.js.map +1 -0
- package/dist/engine.d.ts +245 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +407 -0
- package/dist/engine.js.map +1 -0
- package/dist/express.d.ts +47 -0
- package/dist/express.d.ts.map +1 -0
- package/dist/express.js +107 -0
- package/dist/express.js.map +1 -0
- package/dist/heuristics.d.ts +33 -0
- package/dist/heuristics.d.ts.map +1 -0
- package/dist/heuristics.js +152 -0
- package/dist/heuristics.js.map +1 -0
- package/dist/http.d.ts +51 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +70 -0
- package/dist/http.js.map +1 -0
- package/dist/i18n.d.ts +237 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +92 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/primitives.browser.d.ts +15 -0
- package/dist/primitives.browser.d.ts.map +1 -0
- package/dist/primitives.browser.js +328 -0
- package/dist/primitives.browser.js.map +1 -0
- package/dist/primitives.d.ts +17 -0
- package/dist/primitives.d.ts.map +1 -0
- package/dist/primitives.js +58 -0
- package/dist/primitives.js.map +1 -0
- package/dist/puzzles/accessible.d.ts +43 -0
- package/dist/puzzles/accessible.d.ts.map +1 -0
- package/dist/puzzles/accessible.js +317 -0
- package/dist/puzzles/accessible.js.map +1 -0
- package/dist/puzzles/audio.d.ts +42 -0
- package/dist/puzzles/audio.d.ts.map +1 -0
- package/dist/puzzles/audio.js +109 -0
- package/dist/puzzles/audio.js.map +1 -0
- package/dist/puzzles/biggest.d.ts +5 -0
- package/dist/puzzles/biggest.d.ts.map +1 -0
- package/dist/puzzles/biggest.js +40 -0
- package/dist/puzzles/biggest.js.map +1 -0
- package/dist/puzzles/clock.d.ts +8 -0
- package/dist/puzzles/clock.d.ts.map +1 -0
- package/dist/puzzles/clock.js +68 -0
- package/dist/puzzles/clock.js.map +1 -0
- package/dist/puzzles/color-name.d.ts +5 -0
- package/dist/puzzles/color-name.d.ts.map +1 -0
- package/dist/puzzles/color-name.js +73 -0
- package/dist/puzzles/color-name.js.map +1 -0
- package/dist/puzzles/common.d.ts +75 -0
- package/dist/puzzles/common.d.ts.map +1 -0
- package/dist/puzzles/common.js +268 -0
- package/dist/puzzles/common.js.map +1 -0
- package/dist/puzzles/count.d.ts +8 -0
- package/dist/puzzles/count.d.ts.map +1 -0
- package/dist/puzzles/count.js +38 -0
- package/dist/puzzles/count.js.map +1 -0
- package/dist/puzzles/dice.d.ts +8 -0
- package/dist/puzzles/dice.d.ts.map +1 -0
- package/dist/puzzles/dice.js +61 -0
- package/dist/puzzles/dice.js.map +1 -0
- package/dist/puzzles/find-shape.d.ts +8 -0
- package/dist/puzzles/find-shape.d.ts.map +1 -0
- package/dist/puzzles/find-shape.js +45 -0
- package/dist/puzzles/find-shape.js.map +1 -0
- package/dist/puzzles/grid.d.ts +44 -0
- package/dist/puzzles/grid.d.ts.map +1 -0
- package/dist/puzzles/grid.js +33 -0
- package/dist/puzzles/grid.js.map +1 -0
- package/dist/puzzles/hold.d.ts +24 -0
- package/dist/puzzles/hold.d.ts.map +1 -0
- package/dist/puzzles/hold.js +68 -0
- package/dist/puzzles/hold.js.map +1 -0
- package/dist/puzzles/icons-objects.d.ts +3 -0
- package/dist/puzzles/icons-objects.d.ts.map +1 -0
- package/dist/puzzles/icons-objects.js +5 -0
- package/dist/puzzles/icons-objects.js.map +1 -0
- package/dist/puzzles/icons-weather.d.ts +3 -0
- package/dist/puzzles/icons-weather.d.ts.map +1 -0
- package/dist/puzzles/icons-weather.js +5 -0
- package/dist/puzzles/icons-weather.js.map +1 -0
- package/dist/puzzles/icons.d.ts +14 -0
- package/dist/puzzles/icons.d.ts.map +1 -0
- package/dist/puzzles/icons.js +49 -0
- package/dist/puzzles/icons.js.map +1 -0
- package/dist/puzzles/index.d.ts +63 -0
- package/dist/puzzles/index.d.ts.map +1 -0
- package/dist/puzzles/index.js +93 -0
- package/dist/puzzles/index.js.map +1 -0
- package/dist/puzzles/jigsaw.d.ts +22 -0
- package/dist/puzzles/jigsaw.d.ts.map +1 -0
- package/dist/puzzles/jigsaw.js +38 -0
- package/dist/puzzles/jigsaw.js.map +1 -0
- package/dist/puzzles/math-compare.d.ts +8 -0
- package/dist/puzzles/math-compare.d.ts.map +1 -0
- package/dist/puzzles/math-compare.js +47 -0
- package/dist/puzzles/math-compare.js.map +1 -0
- package/dist/puzzles/math.d.ts +16 -0
- package/dist/puzzles/math.d.ts.map +1 -0
- package/dist/puzzles/math.js +106 -0
- package/dist/puzzles/math.js.map +1 -0
- package/dist/puzzles/maze.d.ts +18 -0
- package/dist/puzzles/maze.d.ts.map +1 -0
- package/dist/puzzles/maze.js +138 -0
- package/dist/puzzles/maze.js.map +1 -0
- package/dist/puzzles/odd-one-out.d.ts +5 -0
- package/dist/puzzles/odd-one-out.d.ts.map +1 -0
- package/dist/puzzles/odd-one-out.js +36 -0
- package/dist/puzzles/odd-one-out.js.map +1 -0
- package/dist/puzzles/odd-rotation.d.ts +8 -0
- package/dist/puzzles/odd-rotation.d.ts.map +1 -0
- package/dist/puzzles/odd-rotation.js +48 -0
- package/dist/puzzles/odd-rotation.js.map +1 -0
- package/dist/puzzles/order-numbers.d.ts +5 -0
- package/dist/puzzles/order-numbers.d.ts.map +1 -0
- package/dist/puzzles/order-numbers.js +32 -0
- package/dist/puzzles/order-numbers.js.map +1 -0
- package/dist/puzzles/order-size.d.ts +5 -0
- package/dist/puzzles/order-size.d.ts.map +1 -0
- package/dist/puzzles/order-size.js +30 -0
- package/dist/puzzles/order-size.js.map +1 -0
- package/dist/puzzles/order-time.d.ts +5 -0
- package/dist/puzzles/order-time.d.ts.map +1 -0
- package/dist/puzzles/order-time.js +27 -0
- package/dist/puzzles/order-time.js.map +1 -0
- package/dist/puzzles/order.d.ts +30 -0
- package/dist/puzzles/order.d.ts.map +1 -0
- package/dist/puzzles/order.js +61 -0
- package/dist/puzzles/order.js.map +1 -0
- package/dist/puzzles/pairs.d.ts +15 -0
- package/dist/puzzles/pairs.d.ts.map +1 -0
- package/dist/puzzles/pairs.js +63 -0
- package/dist/puzzles/pairs.js.map +1 -0
- package/dist/puzzles/pattern.d.ts +8 -0
- package/dist/puzzles/pattern.d.ts.map +1 -0
- package/dist/puzzles/pattern.js +68 -0
- package/dist/puzzles/pattern.js.map +1 -0
- package/dist/puzzles/pow.d.ts +23 -0
- package/dist/puzzles/pow.d.ts.map +1 -0
- package/dist/puzzles/pow.js +52 -0
- package/dist/puzzles/pow.js.map +1 -0
- package/dist/puzzles/rotate-match.d.ts +8 -0
- package/dist/puzzles/rotate-match.d.ts.map +1 -0
- package/dist/puzzles/rotate-match.js +34 -0
- package/dist/puzzles/rotate-match.js.map +1 -0
- package/dist/puzzles/rotate-object.d.ts +5 -0
- package/dist/puzzles/rotate-object.d.ts.map +1 -0
- package/dist/puzzles/rotate-object.js +33 -0
- package/dist/puzzles/rotate-object.js.map +1 -0
- package/dist/puzzles/rotate.d.ts +24 -0
- package/dist/puzzles/rotate.d.ts.map +1 -0
- package/dist/puzzles/rotate.js +40 -0
- package/dist/puzzles/rotate.js.map +1 -0
- package/dist/puzzles/shadow-drag.d.ts +20 -0
- package/dist/puzzles/shadow-drag.d.ts.map +1 -0
- package/dist/puzzles/shadow-drag.js +64 -0
- package/dist/puzzles/shadow-drag.js.map +1 -0
- package/dist/puzzles/shadow-pick.d.ts +5 -0
- package/dist/puzzles/shadow-pick.d.ts.map +1 -0
- package/dist/puzzles/shadow-pick.js +38 -0
- package/dist/puzzles/shadow-pick.js.map +1 -0
- package/dist/puzzles/slide-unlock.d.ts +11 -0
- package/dist/puzzles/slide-unlock.d.ts.map +1 -0
- package/dist/puzzles/slide-unlock.js +79 -0
- package/dist/puzzles/slide-unlock.js.map +1 -0
- package/dist/puzzles/slider.d.ts +23 -0
- package/dist/puzzles/slider.d.ts.map +1 -0
- package/dist/puzzles/slider.js +74 -0
- package/dist/puzzles/slider.js.map +1 -0
- package/dist/puzzles/spell.d.ts +8 -0
- package/dist/puzzles/spell.d.ts.map +1 -0
- package/dist/puzzles/spell.js +41 -0
- package/dist/puzzles/spell.js.map +1 -0
- package/dist/puzzles/story.d.ts +5 -0
- package/dist/puzzles/story.d.ts.map +1 -0
- package/dist/puzzles/story.js +101 -0
- package/dist/puzzles/story.js.map +1 -0
- package/dist/puzzles/symmetry.d.ts +8 -0
- package/dist/puzzles/symmetry.d.ts.map +1 -0
- package/dist/puzzles/symmetry.js +49 -0
- package/dist/puzzles/symmetry.js.map +1 -0
- package/dist/puzzles/tap-order.d.ts +20 -0
- package/dist/puzzles/tap-order.d.ts.map +1 -0
- package/dist/puzzles/tap-order.js +37 -0
- package/dist/puzzles/tap-order.js.map +1 -0
- package/dist/puzzles/trace-letters.d.ts +5 -0
- package/dist/puzzles/trace-letters.d.ts.map +1 -0
- package/dist/puzzles/trace-letters.js +19 -0
- package/dist/puzzles/trace-letters.js.map +1 -0
- package/dist/puzzles/trace.d.ts +32 -0
- package/dist/puzzles/trace.d.ts.map +1 -0
- package/dist/puzzles/trace.js +81 -0
- package/dist/puzzles/trace.js.map +1 -0
- package/dist/render/audio.d.ts +53 -0
- package/dist/render/audio.d.ts.map +1 -0
- package/dist/render/audio.js +236 -0
- package/dist/render/audio.js.map +1 -0
- package/dist/render/clock.d.ts +6 -0
- package/dist/render/clock.d.ts.map +1 -0
- package/dist/render/clock.js +23 -0
- package/dist/render/clock.js.map +1 -0
- package/dist/render/glyphs.d.ts +18 -0
- package/dist/render/glyphs.d.ts.map +1 -0
- package/dist/render/glyphs.js +70 -0
- package/dist/render/glyphs.js.map +1 -0
- package/dist/render/pictograms.d.ts +60 -0
- package/dist/render/pictograms.d.ts.map +1 -0
- package/dist/render/pictograms.js +167 -0
- package/dist/render/pictograms.js.map +1 -0
- package/dist/render/png.d.ts +11 -0
- package/dist/render/png.d.ts.map +1 -0
- package/dist/render/png.js +107 -0
- package/dist/render/png.js.map +1 -0
- package/dist/render/raster.d.ts +61 -0
- package/dist/render/raster.d.ts.map +1 -0
- package/dist/render/raster.js +389 -0
- package/dist/render/raster.js.map +1 -0
- package/dist/render/shapes.d.ts +25 -0
- package/dist/render/shapes.d.ts.map +1 -0
- package/dist/render/shapes.js +157 -0
- package/dist/render/shapes.js.map +1 -0
- package/dist/rng.d.ts +25 -0
- package/dist/rng.d.ts.map +1 -0
- package/dist/rng.js +93 -0
- package/dist/rng.js.map +1 -0
- package/dist/selection.d.ts +54 -0
- package/dist/selection.d.ts.map +1 -0
- package/dist/selection.js +85 -0
- package/dist/selection.js.map +1 -0
- package/dist/store.d.ts +66 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +100 -0
- package/dist/store.js.map +1 -0
- package/dist/tokens.d.ts +70 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +103 -0
- package/dist/tokens.js.map +1 -0
- package/dist/types.d.ts +62 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +61 -0
- package/dist/types.js.map +1 -0
- package/package.json +68 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitives.js","sourceRoot":"","sources":["../src/primitives.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Rng } from '../rng.js';
|
|
2
|
+
import { type Lang, type PuzzleDefinition } from '../types.js';
|
|
3
|
+
export interface AccessibleSolution {
|
|
4
|
+
/** Normalized accepted answers. */
|
|
5
|
+
readonly accept: readonly string[];
|
|
6
|
+
readonly pow: {
|
|
7
|
+
readonly salt: string;
|
|
8
|
+
readonly bits: number;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
/** View `accessible`: a plain-text question (no image, no audio) plus a silent proof-of-work tax. */
|
|
12
|
+
export interface AccessiblePublic {
|
|
13
|
+
/** Plain-text question, designed to be read by a screen reader. */
|
|
14
|
+
readonly question: string;
|
|
15
|
+
readonly pow: {
|
|
16
|
+
readonly algorithm: 'SHA-256';
|
|
17
|
+
readonly salt: string;
|
|
18
|
+
readonly bits: number;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Normalizes free-text answers: case, whitespace, punctuation, Arabic diacritics/tatweel, alef and
|
|
23
|
+
* teh-marbuta/alef-maqsura variants, a leading definite article or English article, and Arabic-Indic digits.
|
|
24
|
+
*/
|
|
25
|
+
export declare function normalizeAnswer(text: string): string;
|
|
26
|
+
type Question = {
|
|
27
|
+
question: string;
|
|
28
|
+
accept: string[];
|
|
29
|
+
};
|
|
30
|
+
type Template = (lang: Lang, rng: Rng) => Question;
|
|
31
|
+
/**
|
|
32
|
+
* Over 50 question templates (each randomised), in Arabic and English. Answers are accepted in either
|
|
33
|
+
* language, as words or digits, after {@link normalizeAnswer}.
|
|
34
|
+
*/
|
|
35
|
+
export declare const TEMPLATES: readonly Template[];
|
|
36
|
+
/**
|
|
37
|
+
* Text questions are inherently machine-readable, so the accessible type also carries a
|
|
38
|
+
* proof-of-work "tax" that the widget computes silently while the person types. Switching to the
|
|
39
|
+
* accessible mode therefore never makes bulk abuse cheaper than the visual puzzles.
|
|
40
|
+
*/
|
|
41
|
+
export declare function createAccessible(powBaseBits: number): PuzzleDefinition<AccessibleSolution, AccessiblePublic>;
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=accessible.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accessible.d.ts","sourceRoot":"","sources":["../../src/puzzles/accessible.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAsB,KAAK,IAAI,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKnF,MAAM,WAAW,kBAAkB;IACjC,mCAAmC;IACnC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAChE;AAED,qGAAqG;AACrG,MAAM,WAAW,gBAAgB;IAC/B,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/F;AA+HD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOpD;AAUD,KAAK,QAAQ,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AACvD,KAAK,QAAQ,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,KAAK,QAAQ,CAAC;AAEnD;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,SAAS,QAAQ,EAkJxC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAuB5G"}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
import { sha256 } from '../crypto.js';
|
|
2
|
+
import { prompt } from '../i18n.js';
|
|
3
|
+
import { invalid, ok, wrong } from '../types.js';
|
|
4
|
+
import { isRecord } from './common.js';
|
|
5
|
+
import { normalizeDigits } from './math.js';
|
|
6
|
+
import { leadingZeroBits, powBitsFor } from './pow.js';
|
|
7
|
+
const NUMBERS = {
|
|
8
|
+
en: [
|
|
9
|
+
['zero'], ['one'], ['two'], ['three'], ['four'], ['five'], ['six'], ['seven'], ['eight'], ['nine'], ['ten'],
|
|
10
|
+
['eleven'], ['twelve'], ['thirteen'], ['fourteen'], ['fifteen'], ['sixteen'], ['seventeen'], ['eighteen'], ['nineteen'], ['twenty'],
|
|
11
|
+
],
|
|
12
|
+
ar: [
|
|
13
|
+
['صفر'],
|
|
14
|
+
['واحد', 'واحدة'],
|
|
15
|
+
['اثنان', 'اثنين', 'اثنتان'],
|
|
16
|
+
['ثلاثة', 'ثلاث'],
|
|
17
|
+
['أربعة', 'أربع'],
|
|
18
|
+
['خمسة', 'خمس'],
|
|
19
|
+
['ستة', 'ست'],
|
|
20
|
+
['سبعة', 'سبع'],
|
|
21
|
+
['ثمانية', 'ثماني', 'ثمان'],
|
|
22
|
+
['تسعة', 'تسع'],
|
|
23
|
+
['عشرة', 'عشر'],
|
|
24
|
+
['أحد عشر', 'إحدى عشرة', 'احدعش'],
|
|
25
|
+
['اثنا عشر', 'اثني عشر', 'اثنتا عشرة', 'اطنعش'],
|
|
26
|
+
['ثلاثة عشر', 'ثلاث عشرة', 'ثلطعش'],
|
|
27
|
+
['أربعة عشر', 'أربع عشرة', 'اربعطعش'],
|
|
28
|
+
['خمسة عشر', 'خمس عشرة', 'خمسطعش'],
|
|
29
|
+
['ستة عشر', 'ست عشرة', 'سطعش'],
|
|
30
|
+
['سبعة عشر', 'سبع عشرة', 'سبعطعش'],
|
|
31
|
+
['ثمانية عشر', 'ثماني عشرة', 'ثمنطعش'],
|
|
32
|
+
['تسعة عشر', 'تسع عشرة', 'تسعطعش'],
|
|
33
|
+
['عشرون', 'عشرين'],
|
|
34
|
+
],
|
|
35
|
+
};
|
|
36
|
+
const DAYS = {
|
|
37
|
+
en: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
|
|
38
|
+
ar: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
|
|
39
|
+
};
|
|
40
|
+
const MONTHS = {
|
|
41
|
+
en: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
|
|
42
|
+
ar: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],
|
|
43
|
+
arLevant: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],
|
|
44
|
+
};
|
|
45
|
+
const SEASONS = { en: ['spring', 'summer', 'autumn', 'winter'], ar: ['الربيع', 'الصيف', 'الخريف', 'الشتاء'] };
|
|
46
|
+
const COLOURS = { en: ['red', 'blue', 'green', 'yellow', 'black', 'white'], ar: ['أحمر', 'أزرق', 'أخضر', 'أصفر', 'أسود', 'أبيض'] };
|
|
47
|
+
const THINGS = {
|
|
48
|
+
en: ['table', 'river', 'chair', 'book', 'bread', 'door', 'window', 'spoon', 'stone', 'cloud'],
|
|
49
|
+
ar: ['طاولة', 'نهر', 'كرسي', 'كتاب', 'خبز', 'باب', 'نافذة', 'ملعقة', 'حجر', 'غيمة'],
|
|
50
|
+
};
|
|
51
|
+
const CATEGORY = {
|
|
52
|
+
animal: { name: { en: 'an animal', ar: 'اسم حيوان' }, items: { en: ['cat', 'horse', 'lion', 'rabbit', 'camel', 'sheep'], ar: ['قطة', 'حصان', 'أسد', 'أرنب', 'جمل', 'خروف'] } },
|
|
53
|
+
fruit: { name: { en: 'a fruit', ar: 'اسم فاكهة' }, items: { en: ['apple', 'banana', 'orange', 'grape', 'mango', 'peach'], ar: ['تفاحة', 'موزة', 'برتقالة', 'عنب', 'مانجو', 'خوخ'] } },
|
|
54
|
+
body: { name: { en: 'a part of the body', ar: 'عضو من أعضاء الجسم' }, items: { en: ['hand', 'nose', 'ear', 'foot', 'eye', 'knee'], ar: ['يد', 'أنف', 'أذن', 'قدم', 'عين', 'ركبة'] } },
|
|
55
|
+
shape: { name: { en: 'a shape', ar: 'اسم شكل هندسي' }, items: { en: ['circle', 'square', 'triangle'], ar: ['دائرة', 'مربع', 'مثلث'] } },
|
|
56
|
+
drink: { name: { en: 'something you drink', ar: 'شيء يُشرب' }, items: { en: ['water', 'milk', 'juice', 'tea'], ar: ['ماء', 'حليب', 'عصير', 'شاي'] } },
|
|
57
|
+
};
|
|
58
|
+
const OPPOSITES = [
|
|
59
|
+
{ word: { en: 'hot', ar: 'حار' }, answer: { en: ['cold'], ar: ['بارد', 'بارده'] } },
|
|
60
|
+
{ word: { en: 'big', ar: 'كبير' }, answer: { en: ['small', 'little'], ar: ['صغير'] } },
|
|
61
|
+
{ word: { en: 'up', ar: 'فوق' }, answer: { en: ['down'], ar: ['تحت', 'أسفل'] } },
|
|
62
|
+
{ word: { en: 'day', ar: 'النهار' }, answer: { en: ['night'], ar: ['الليل', 'ليل'] } },
|
|
63
|
+
{ word: { en: 'open', ar: 'مفتوح' }, answer: { en: ['closed', 'shut'], ar: ['مغلق', 'مسكر', 'مقفل'] } },
|
|
64
|
+
{ word: { en: 'fast', ar: 'سريع' }, answer: { en: ['slow'], ar: ['بطيء', 'بطيئ'] } },
|
|
65
|
+
{ word: { en: 'full', ar: 'ممتلئ' }, answer: { en: ['empty'], ar: ['فارغ'] } },
|
|
66
|
+
{ word: { en: 'left', ar: 'يسار' }, answer: { en: ['right'], ar: ['يمين'] } },
|
|
67
|
+
];
|
|
68
|
+
const COMPARE = [
|
|
69
|
+
{ q: { en: 'Which is heavier', ar: 'أيهما أثقل' }, a: { en: 'a stone', ar: 'حجر' }, b: { en: 'a feather', ar: 'ريشة' } },
|
|
70
|
+
{ q: { en: 'Which is bigger', ar: 'أيهما أكبر' }, a: { en: 'an elephant', ar: 'فيل' }, b: { en: 'a mouse', ar: 'فأر' } },
|
|
71
|
+
{ q: { en: 'Which is faster', ar: 'أيهما أسرع' }, a: { en: 'a car', ar: 'سيارة' }, b: { en: 'a snail', ar: 'حلزون' } },
|
|
72
|
+
{ q: { en: 'Which is hotter', ar: 'أيهما أسخن' }, a: { en: 'fire', ar: 'نار' }, b: { en: 'ice', ar: 'ثلج' } },
|
|
73
|
+
{ q: { en: 'Which is taller', ar: 'أيهما أطول' }, a: { en: 'a tree', ar: 'شجرة' }, b: { en: 'a flower', ar: 'زهرة' } },
|
|
74
|
+
];
|
|
75
|
+
const USES = [
|
|
76
|
+
{ q: { en: 'What do you write with', ar: 'بماذا تكتب' }, a: { en: 'a pen', ar: 'قلم' }, b: { en: 'a spoon', ar: 'ملعقة' } },
|
|
77
|
+
{ q: { en: 'What do you drink from', ar: 'من أي شيء تشرب' }, a: { en: 'a cup', ar: 'كوب' }, b: { en: 'a shoe', ar: 'حذاء' } },
|
|
78
|
+
{ q: { en: 'What do you sleep on', ar: 'على أي شيء تنام' }, a: { en: 'a bed', ar: 'سرير' }, b: { en: 'a plate', ar: 'صحن' } },
|
|
79
|
+
{ q: { en: 'What do you read', ar: 'ماذا تقرأ' }, a: { en: 'a book', ar: 'كتاب' }, b: { en: 'a hammer', ar: 'مطرقة' } },
|
|
80
|
+
{ q: { en: 'What keeps you dry in the rain', ar: 'ما الذي يحميك من المطر' }, a: { en: 'an umbrella', ar: 'مظلة' }, b: { en: 'a sock', ar: 'جورب' } },
|
|
81
|
+
];
|
|
82
|
+
const SOUNDS = [
|
|
83
|
+
{ sound: { en: 'meow', ar: 'مياو' }, answer: { en: ['cat', 'kitten'], ar: ['قطة', 'قط', 'هرة', 'بسة'] } },
|
|
84
|
+
{ sound: { en: 'woof', ar: 'هو هو' }, answer: { en: ['dog', 'puppy'], ar: ['كلب'] } },
|
|
85
|
+
{ sound: { en: 'moo', ar: 'مووو' }, answer: { en: ['cow'], ar: ['بقرة', 'بقره'] } },
|
|
86
|
+
{ sound: { en: 'baa', ar: 'ماء ماء' }, answer: { en: ['sheep', 'lamb'], ar: ['خروف', 'نعجة', 'ماعز', 'غنم'] } },
|
|
87
|
+
];
|
|
88
|
+
const FACTS = [
|
|
89
|
+
{ q: { en: 'What colour is the sky on a clear day?', ar: 'ما لون السماء في يوم صافٍ؟' }, answer: { en: ['blue'], ar: ['أزرق', 'زرقاء'] } },
|
|
90
|
+
{ q: { en: 'What colour is fresh grass?', ar: 'ما لون العشب الطازج؟' }, answer: { en: ['green'], ar: ['أخضر', 'خضراء'] } },
|
|
91
|
+
{ q: { en: 'What colour is snow?', ar: 'ما لون الثلج؟' }, answer: { en: ['white'], ar: ['أبيض', 'بيضاء'] } },
|
|
92
|
+
{ q: { en: 'What colour is a ripe banana?', ar: 'ما لون الموزة الناضجة؟' }, answer: { en: ['yellow'], ar: ['أصفر', 'صفراء'] } },
|
|
93
|
+
{ q: { en: 'What do we call frozen water?', ar: 'ماذا نسمي الماء المتجمد؟' }, answer: { en: ['ice'], ar: ['ثلج', 'جليد'] } },
|
|
94
|
+
{ q: { en: 'What do bees make?', ar: 'ماذا يصنع النحل؟' }, answer: { en: ['honey'], ar: ['عسل'] } },
|
|
95
|
+
{ q: { en: 'Which animal is called the ship of the desert?', ar: 'أي حيوان يُسمّى سفينة الصحراء؟' }, answer: { en: ['camel'], ar: ['جمل', 'الجمل', 'ناقة'] } },
|
|
96
|
+
{ q: { en: 'What shines in the sky during the day?', ar: 'ما الذي يضيء السماء في النهار؟' }, answer: { en: ['sun', 'the sun'], ar: ['شمس', 'الشمس'] } },
|
|
97
|
+
];
|
|
98
|
+
const COUNTS = [
|
|
99
|
+
{ q: { en: 'How many days are there in a week?', ar: 'كم يومًا في الأسبوع؟' }, n: 7 },
|
|
100
|
+
{ q: { en: 'How many months are there in a year?', ar: 'كم شهرًا في السنة؟' }, n: 12 },
|
|
101
|
+
{ q: { en: 'How many legs does a cat have?', ar: 'كم رِجلًا للقطة؟' }, n: 4 },
|
|
102
|
+
{ q: { en: 'How many legs does a bird have?', ar: 'كم رِجلًا للطائر؟' }, n: 2 },
|
|
103
|
+
{ q: { en: 'How many legs does a spider have?', ar: 'كم رِجلًا للعنكبوت؟' }, n: 8 },
|
|
104
|
+
{ q: { en: 'How many wheels does a bicycle have?', ar: 'كم عجلة للدراجة الهوائية؟' }, n: 2 },
|
|
105
|
+
{ q: { en: 'How many wheels does a car usually have?', ar: 'كم عجلة للسيارة عادةً؟' }, n: 4 },
|
|
106
|
+
{ q: { en: 'How many sides does a triangle have?', ar: 'كم ضلعًا للمثلث؟' }, n: 3 },
|
|
107
|
+
{ q: { en: 'How many sides does a square have?', ar: 'كم ضلعًا للمربع؟' }, n: 4 },
|
|
108
|
+
{ q: { en: 'How many fingers are on one hand?', ar: 'كم إصبعًا في اليد الواحدة؟' }, n: 5 },
|
|
109
|
+
{ q: { en: 'How many eyes does a person have?', ar: 'كم عينًا للإنسان؟' }, n: 2 },
|
|
110
|
+
];
|
|
111
|
+
const WORDS_FOR_LETTERS = {
|
|
112
|
+
en: ['cat', 'sun', 'book', 'tree', 'milk', 'door', 'fish', 'lamp', 'hand', 'rain'],
|
|
113
|
+
ar: ['باب', 'شمس', 'قمر', 'كتاب', 'نهر', 'بيت', 'ورد', 'جبل', 'سمك', 'قلم'],
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* Normalizes free-text answers: case, whitespace, punctuation, Arabic diacritics/tatweel, alef and
|
|
117
|
+
* teh-marbuta/alef-maqsura variants, a leading definite article or English article, and Arabic-Indic digits.
|
|
118
|
+
*/
|
|
119
|
+
export function normalizeAnswer(text) {
|
|
120
|
+
let t = normalizeDigits(text.normalize('NFKC')).toLowerCase();
|
|
121
|
+
t = t.replace(/[ً-ٰٟـ]/g, '');
|
|
122
|
+
t = t.replace(/[أإآٱ]/g, 'ا').replace(/ة/g, 'ه').replace(/ى/g, 'ي');
|
|
123
|
+
t = t.replace(/[^\p{L}\p{N}\s]/gu, ' ').replace(/\s+/g, ' ').trim();
|
|
124
|
+
t = t.replace(/^(the\s+|an?\s+|ال)/u, '');
|
|
125
|
+
return t;
|
|
126
|
+
}
|
|
127
|
+
const num = (n, lang) => NUMBERS[lang][n]?.[0] ?? String(n);
|
|
128
|
+
const numberAnswers = (n) => [String(n), ...(NUMBERS.en[n] ?? []), ...(NUMBERS.ar[n] ?? [])];
|
|
129
|
+
const list = (items, lang) => items.join(lang === 'ar' ? '، ' : ', ');
|
|
130
|
+
const both = (b) => [...b.en, ...b.ar];
|
|
131
|
+
const q = (lang, en, ar) => (lang === 'ar' ? ar : en);
|
|
132
|
+
/** "a stone" → also accept "stone". */
|
|
133
|
+
const bare = (s) => [s, s.replace(/^(a|an|the)\s+/i, '')];
|
|
134
|
+
/**
|
|
135
|
+
* Over 50 question templates (each randomised), in Arabic and English. Answers are accepted in either
|
|
136
|
+
* language, as words or digits, after {@link normalizeAnswer}.
|
|
137
|
+
*/
|
|
138
|
+
export const TEMPLATES = [
|
|
139
|
+
// ---- numbers
|
|
140
|
+
(lang, rng) => {
|
|
141
|
+
const [a, b] = rng.sample([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 2);
|
|
142
|
+
return { question: q(lang, `Which number is larger: ${num(a, lang)} or ${num(b, lang)}?`, `أيّ العددين أكبر: ${num(a, lang)} أم ${num(b, lang)}؟`), accept: numberAnswers(Math.max(a, b)) };
|
|
143
|
+
},
|
|
144
|
+
(lang, rng) => {
|
|
145
|
+
const [a, b] = rng.sample([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 2);
|
|
146
|
+
return { question: q(lang, `Which number is smaller: ${num(a, lang)} or ${num(b, lang)}?`, `أيّ العددين أصغر: ${num(a, lang)} أم ${num(b, lang)}؟`), accept: numberAnswers(Math.min(a, b)) };
|
|
147
|
+
},
|
|
148
|
+
(lang, rng) => {
|
|
149
|
+
const a = rng.int(1, 7);
|
|
150
|
+
const b = rng.int(1, 6);
|
|
151
|
+
return { question: q(lang, `What is ${num(a, lang)} plus ${num(b, lang)}?`, `كم يساوي ${num(a, lang)} زائد ${num(b, lang)}؟`), accept: numberAnswers(a + b) };
|
|
152
|
+
},
|
|
153
|
+
(lang, rng) => {
|
|
154
|
+
const a = rng.int(5, 11);
|
|
155
|
+
const b = rng.int(1, a);
|
|
156
|
+
return { question: q(lang, `What is ${num(a, lang)} minus ${num(b, lang)}?`, `كم يساوي ${num(a, lang)} ناقص ${num(b, lang)}؟`), accept: numberAnswers(a - b) };
|
|
157
|
+
},
|
|
158
|
+
(lang, rng) => {
|
|
159
|
+
const a = rng.int(2, 5);
|
|
160
|
+
const b = rng.int(2, 5);
|
|
161
|
+
return { question: q(lang, `What is ${num(a, lang)} times ${num(b, lang)}?`, `كم يساوي ${num(a, lang)} ضرب ${num(b, lang)}؟`), accept: numberAnswers(a * b) };
|
|
162
|
+
},
|
|
163
|
+
(lang, rng) => {
|
|
164
|
+
const n = rng.int(1, 19);
|
|
165
|
+
return { question: q(lang, `Which number comes right after ${n}?`, `ما العدد الذي يأتي بعد ${n} مباشرة؟`), accept: numberAnswers(n + 1) };
|
|
166
|
+
},
|
|
167
|
+
(lang, rng) => {
|
|
168
|
+
const n = rng.int(2, 21);
|
|
169
|
+
return { question: q(lang, `Which number comes right before ${n}?`, `ما العدد الذي يأتي قبل ${n} مباشرة؟`), accept: numberAnswers(n - 1) };
|
|
170
|
+
},
|
|
171
|
+
(lang, rng) => {
|
|
172
|
+
const n = rng.int(2, 11);
|
|
173
|
+
return { question: q(lang, `What is double ${num(n, lang)}?`, `ما ضعف العدد ${num(n, lang)}؟`), accept: numberAnswers(n * 2) };
|
|
174
|
+
},
|
|
175
|
+
(lang, rng) => {
|
|
176
|
+
const n = rng.int(1, 11) * 2;
|
|
177
|
+
return { question: q(lang, `What is half of ${n}?`, `ما نصف العدد ${n}؟`), accept: numberAnswers(n / 2) };
|
|
178
|
+
},
|
|
179
|
+
(lang, rng) => {
|
|
180
|
+
const nums = rng.sample([2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19], 3);
|
|
181
|
+
return { question: q(lang, `Which is the largest of these numbers: ${list(nums.map(String), lang)}?`, `ما أكبر هذه الأعداد: ${list(nums.map(String), lang)}؟`), accept: numberAnswers(Math.max(...nums)) };
|
|
182
|
+
},
|
|
183
|
+
(lang, rng) => {
|
|
184
|
+
const odd = rng.sample([1, 3, 5, 7, 9, 11, 13, 15], 2);
|
|
185
|
+
const even = rng.pick([2, 4, 6, 8, 10, 12, 14, 16]);
|
|
186
|
+
const nums = rng.shuffle([...odd, even]);
|
|
187
|
+
return { question: q(lang, `Which of these numbers is even: ${list(nums.map(String), lang)}?`, `أيّ هذه الأعداد زوجي: ${list(nums.map(String), lang)}؟`), accept: numberAnswers(even) };
|
|
188
|
+
},
|
|
189
|
+
(lang, rng) => {
|
|
190
|
+
const nums = rng.sample([1, 2, 3, 4, 5, 6, 7, 8, 9], 4);
|
|
191
|
+
const pos = rng.int(0, 4);
|
|
192
|
+
const ord = { en: ['first', 'second', 'third', 'fourth'], ar: ['الأول', 'الثاني', 'الثالث', 'الرابع'] };
|
|
193
|
+
return { question: q(lang, `What is the ${ord.en[pos]} number in this list: ${list(nums.map(String), lang)}?`, `ما العدد ${ord.ar[pos]} في هذه القائمة: ${list(nums.map(String), lang)}؟`), accept: numberAnswers(nums[pos]) };
|
|
194
|
+
},
|
|
195
|
+
(lang, rng) => {
|
|
196
|
+
const n = rng.int(2, 10);
|
|
197
|
+
return { question: q(lang, `Write the word "${NUMBERS.en[n][0]}" as a number.`, `اكتب كلمة «${NUMBERS.ar[n][0]}» بالأرقام.`), accept: [String(n)] };
|
|
198
|
+
},
|
|
199
|
+
(lang, rng) => {
|
|
200
|
+
const word = rng.pick(lang === 'ar' ? WORDS_FOR_LETTERS.ar : WORDS_FOR_LETTERS.en);
|
|
201
|
+
return { question: q(lang, `How many letters are in the word "${word}"?`, `كم حرفًا في كلمة «${word}»؟`), accept: numberAnswers([...word].length) };
|
|
202
|
+
},
|
|
203
|
+
// ---- counting facts
|
|
204
|
+
...COUNTS.map((c) => (lang) => ({ question: c.q[lang], accept: numberAnswers(c.n) })),
|
|
205
|
+
// ---- days, months, seasons
|
|
206
|
+
(lang, rng) => {
|
|
207
|
+
const d = rng.int(0, 7);
|
|
208
|
+
return { question: q(lang, `Which day comes after ${DAYS.en[d]}?`, `ما اليوم الذي يأتي بعد يوم ${DAYS.ar[d]}؟`), accept: [DAYS.en[(d + 1) % 7], DAYS.ar[(d + 1) % 7]] };
|
|
209
|
+
},
|
|
210
|
+
(lang, rng) => {
|
|
211
|
+
const d = rng.int(0, 7);
|
|
212
|
+
return { question: q(lang, `Which day comes before ${DAYS.en[d]}?`, `ما اليوم الذي يأتي قبل يوم ${DAYS.ar[d]}؟`), accept: [DAYS.en[(d + 6) % 7], DAYS.ar[(d + 6) % 7]] };
|
|
213
|
+
},
|
|
214
|
+
(lang, rng) => {
|
|
215
|
+
const d = rng.int(0, 7);
|
|
216
|
+
return { question: q(lang, `If today is ${DAYS.en[d]}, what day will it be in two days?`, `إذا كان اليوم ${DAYS.ar[d]}، فما اليوم بعد يومين؟`), accept: [DAYS.en[(d + 2) % 7], DAYS.ar[(d + 2) % 7]] };
|
|
217
|
+
},
|
|
218
|
+
(lang, rng) => {
|
|
219
|
+
const m = rng.int(0, 11);
|
|
220
|
+
return { question: q(lang, `Which month comes after ${MONTHS.en[m]}?`, `ما الشهر الذي يأتي بعد ${MONTHS.ar[m]} (${MONTHS.arLevant[m]})؟`), accept: [MONTHS.en[m + 1], MONTHS.ar[m + 1], MONTHS.arLevant[m + 1], String(m + 2)] };
|
|
221
|
+
},
|
|
222
|
+
(lang, rng) => {
|
|
223
|
+
const m = rng.int(1, 12);
|
|
224
|
+
return { question: q(lang, `Which month comes before ${MONTHS.en[m]}?`, `ما الشهر الذي يأتي قبل ${MONTHS.ar[m]} (${MONTHS.arLevant[m]})؟`), accept: [MONTHS.en[m - 1], MONTHS.ar[m - 1], MONTHS.arLevant[m - 1], String(m)] };
|
|
225
|
+
},
|
|
226
|
+
(lang) => ({ question: q(lang, 'What is the first month of the year?', 'ما الشهر الأول في السنة؟'), accept: [MONTHS.en[0], MONTHS.ar[0], MONTHS.arLevant[0], '1'] }),
|
|
227
|
+
(lang, rng) => {
|
|
228
|
+
const s = rng.int(0, 4);
|
|
229
|
+
return { question: q(lang, `Which season comes after ${SEASONS.en[s]}?`, `ما الفصل الذي يأتي بعد ${SEASONS.ar[s]}؟`), accept: [SEASONS.en[(s + 1) % 4], SEASONS.ar[(s + 1) % 4], ...(s === 1 ? ['fall'] : [])] };
|
|
230
|
+
},
|
|
231
|
+
(lang, rng) => {
|
|
232
|
+
const words = rng.sample(THINGS[lang], 2);
|
|
233
|
+
const d = rng.int(0, 7);
|
|
234
|
+
return { question: q(lang, `Which of these words is a day of the week: ${list(rng.shuffle([...words, DAYS.en[d]]), lang)}?`, `أيّ هذه الكلمات اسم يوم من أيام الأسبوع: ${list(rng.shuffle([...words, DAYS.ar[d]]), lang)}؟`), accept: [DAYS.en[d], DAYS.ar[d]] };
|
|
235
|
+
},
|
|
236
|
+
// ---- colours
|
|
237
|
+
(lang, rng) => {
|
|
238
|
+
const ci = rng.int(0, COLOURS.en.length);
|
|
239
|
+
const options = rng.shuffle([COLOURS[lang][ci], ...rng.sample(THINGS[lang], 2)]);
|
|
240
|
+
return { question: q(lang, `Which of these words is a colour: ${list(options, lang)}?`, `أيّ هذه الكلمات اسم لون: ${list(options, lang)}؟`), accept: [COLOURS.en[ci], COLOURS.ar[ci]] };
|
|
241
|
+
},
|
|
242
|
+
...FACTS.map((f) => (lang) => ({ question: f.q[lang], accept: both(f.answer) })),
|
|
243
|
+
// ---- categories
|
|
244
|
+
...Object.keys(CATEGORY).map((key) => (lang, rng) => {
|
|
245
|
+
const cat = CATEGORY[key];
|
|
246
|
+
const i = rng.int(0, cat.items.en.length);
|
|
247
|
+
const options = rng.shuffle([cat.items[lang][i], ...rng.sample(THINGS[lang], 2)]);
|
|
248
|
+
return { question: q(lang, `Which of these is ${cat.name.en}: ${list(options, lang)}?`, `أيّ هذه الكلمات ${cat.name.ar}: ${list(options, lang)}؟`), accept: [cat.items.en[i], cat.items.ar[i]] };
|
|
249
|
+
}),
|
|
250
|
+
(lang, rng) => {
|
|
251
|
+
const fruits = rng.sample([0, 1, 2, 3, 4, 5], 3);
|
|
252
|
+
const t = rng.int(0, THINGS.en.length);
|
|
253
|
+
const items = rng.shuffle([...fruits.map((i) => CATEGORY.fruit.items[lang][i]), THINGS[lang][t]]);
|
|
254
|
+
return { question: q(lang, `Which word does not belong: ${list(items, lang)}?`, `أيّ كلمة لا تنتمي إلى المجموعة: ${list(items, lang)}؟`), accept: [THINGS.en[t], THINGS.ar[t]] };
|
|
255
|
+
},
|
|
256
|
+
(lang, rng) => {
|
|
257
|
+
const o = rng.pick(OPPOSITES);
|
|
258
|
+
return { question: q(lang, `What is the opposite of "${o.word.en}"?`, `ما عكس كلمة «${o.word.ar}»؟`), accept: both(o.answer) };
|
|
259
|
+
},
|
|
260
|
+
(lang, rng) => {
|
|
261
|
+
const c = rng.pick(COMPARE);
|
|
262
|
+
const [x, y] = rng.next() < 0.5 ? [c.a, c.b] : [c.b, c.a];
|
|
263
|
+
return { question: q(lang, `${c.q.en}: ${x.en} or ${y.en}?`, `${c.q.ar}: ${x.ar} أم ${y.ar}؟`), accept: [...bare(c.a.en), c.a.ar] };
|
|
264
|
+
},
|
|
265
|
+
(lang, rng) => {
|
|
266
|
+
const u = rng.pick(USES);
|
|
267
|
+
const [x, y] = rng.next() < 0.5 ? [u.a, u.b] : [u.b, u.a];
|
|
268
|
+
return { question: q(lang, `${u.q.en}: ${x.en} or ${y.en}?`, `${u.q.ar}: ${x.ar} أم ${y.ar}؟`), accept: [...bare(u.a.en), u.a.ar] };
|
|
269
|
+
},
|
|
270
|
+
(lang, rng) => {
|
|
271
|
+
const s = rng.pick(SOUNDS);
|
|
272
|
+
return { question: q(lang, `Which animal says "${s.sound.en}"?`, `أيّ حيوان يقول «${s.sound.ar}»؟`), accept: both(s.answer) };
|
|
273
|
+
},
|
|
274
|
+
// ---- letters
|
|
275
|
+
(lang, rng) => {
|
|
276
|
+
const word = rng.pick(WORDS_FOR_LETTERS[lang]);
|
|
277
|
+
return { question: q(lang, `What is the first letter of the word "${word}"?`, `ما الحرف الأول من كلمة «${word}»؟`), accept: [[...word][0]] };
|
|
278
|
+
},
|
|
279
|
+
(lang, rng) => {
|
|
280
|
+
const word = rng.pick(WORDS_FOR_LETTERS[lang]);
|
|
281
|
+
const chars = [...word];
|
|
282
|
+
return { question: q(lang, `What is the last letter of the word "${word}"?`, `ما الحرف الأخير من كلمة «${word}»؟`), accept: [chars[chars.length - 1]] };
|
|
283
|
+
},
|
|
284
|
+
];
|
|
285
|
+
/**
|
|
286
|
+
* Text questions are inherently machine-readable, so the accessible type also carries a
|
|
287
|
+
* proof-of-work "tax" that the widget computes silently while the person types. Switching to the
|
|
288
|
+
* accessible mode therefore never makes bulk abuse cheaper than the visual puzzles.
|
|
289
|
+
*/
|
|
290
|
+
export function createAccessible(powBaseBits) {
|
|
291
|
+
return {
|
|
292
|
+
type: 'accessible',
|
|
293
|
+
view: 'accessible',
|
|
294
|
+
minSolveMs: 2000,
|
|
295
|
+
maxAttempts: 2,
|
|
296
|
+
generate({ lang, level, rng }) {
|
|
297
|
+
const { question, accept } = rng.pick(TEMPLATES)(lang, rng);
|
|
298
|
+
const pow = { salt: rng.id(16), bits: powBitsFor(powBaseBits, level) };
|
|
299
|
+
return {
|
|
300
|
+
solution: { accept: [...new Set(accept.map(normalizeAnswer))].filter((a) => a.length > 0), pow },
|
|
301
|
+
prompt: prompt('accessible', lang),
|
|
302
|
+
publicData: { question, pow: { algorithm: 'SHA-256', ...pow } },
|
|
303
|
+
};
|
|
304
|
+
},
|
|
305
|
+
check(solution, answer) {
|
|
306
|
+
if (!isRecord(answer) || typeof answer['text'] !== 'string' || answer['text'].length > 64)
|
|
307
|
+
return invalid('text');
|
|
308
|
+
if (typeof answer['nonce'] !== 'string' || !/^\d{1,16}$/.test(answer['nonce']))
|
|
309
|
+
return invalid('nonce');
|
|
310
|
+
if (leadingZeroBits(sha256(`${solution.pow.salt}:${answer['nonce']}`)) < solution.pow.bits)
|
|
311
|
+
return wrong('pow');
|
|
312
|
+
const given = normalizeAnswer(answer['text']);
|
|
313
|
+
return given.length > 0 && solution.accept.includes(given) ? ok : wrong();
|
|
314
|
+
},
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=accessible.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accessible.js","sourceRoot":"","sources":["../../src/puzzles/accessible.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type PuzzleDefinition } from '../types.js';
|
|
2
|
+
export type AudioKind = 'digits' | 'beeps';
|
|
3
|
+
export interface AudioSolution {
|
|
4
|
+
/** Normalized accepted answers. */
|
|
5
|
+
readonly accept: readonly string[];
|
|
6
|
+
/** Length of the clip; answers sooner than (most of) one listen are refused. */
|
|
7
|
+
readonly ms: number;
|
|
8
|
+
readonly pow: {
|
|
9
|
+
readonly salt: string;
|
|
10
|
+
readonly bits: number;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* View `audio`: a WAV clip (data: URL, synthesized on the server) plus a silent proof-of-work tax.
|
|
15
|
+
* No transcript, no per-item timing, nothing but the sound itself.
|
|
16
|
+
*/
|
|
17
|
+
export interface AudioPublic {
|
|
18
|
+
readonly audio: string;
|
|
19
|
+
readonly durationMs: number;
|
|
20
|
+
/** What to listen for: digits to type, or high beeps to count. */
|
|
21
|
+
readonly kind: AudioKind;
|
|
22
|
+
/** Digits only: how many digits are spoken (so the input can say so). */
|
|
23
|
+
readonly length?: number;
|
|
24
|
+
/** Plays allowed by the widget (a UX limit; the clip itself is in the payload). */
|
|
25
|
+
readonly maxPlays: number;
|
|
26
|
+
readonly pow: {
|
|
27
|
+
readonly algorithm: 'SHA-256';
|
|
28
|
+
readonly salt: string;
|
|
29
|
+
readonly bits: number;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/** Accepts "4 7 2 1", "4-7-2-1", Arabic-Indic digits, … — everything but the digits is dropped. */
|
|
33
|
+
export declare function digitsOnly(text: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* Audio challenge for blind and low-vision visitors.
|
|
36
|
+
* - `digits` (English): 4–5 digits spoken by a randomized formant voice over rain-like noise and
|
|
37
|
+
* muffled crowd babble; type the digits.
|
|
38
|
+
* - `beeps` (language-neutral, used for Arabic): a run of low and high beeps; type how many were high.
|
|
39
|
+
* The answer is sealed server-side like every other type; the clip only exists as audio.
|
|
40
|
+
*/
|
|
41
|
+
export declare function createAudio(powBaseBits: number): PuzzleDefinition<AudioSolution, AudioPublic>;
|
|
42
|
+
//# sourceMappingURL=audio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../../src/puzzles/audio.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsB,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKxE,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE3C,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,gFAAgF;IAChF,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAChE;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,kEAAkE;IAClE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,yEAAyE;IACzE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/F;AAYD,mGAAmG;AACnG,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAAC,aAAa,EAAE,WAAW,CAAC,CA0E7F"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { sha256 } from '../crypto.js';
|
|
2
|
+
import { prompt } from '../i18n.js';
|
|
3
|
+
import { base64 } from '../primitives.js';
|
|
4
|
+
import { babble, backgroundNoise, beep, encodeWav, master, noiseSource, speakDigit, Track } from '../render/audio.js';
|
|
5
|
+
import { invalid, ok, wrong } from '../types.js';
|
|
6
|
+
import { isRecord } from './common.js';
|
|
7
|
+
import { normalizeAnswer } from './accessible.js';
|
|
8
|
+
import { leadingZeroBits, powBitsFor } from './pow.js';
|
|
9
|
+
const NUMBER_WORDS = {
|
|
10
|
+
3: ['three', 'ثلاثة', 'ثلاث'],
|
|
11
|
+
4: ['four', 'أربعة', 'أربع'],
|
|
12
|
+
5: ['five', 'خمسة', 'خمس'],
|
|
13
|
+
6: ['six', 'ستة', 'ست'],
|
|
14
|
+
7: ['seven', 'سبعة', 'سبع'],
|
|
15
|
+
8: ['eight', 'ثمانية', 'ثماني', 'ثمان'],
|
|
16
|
+
9: ['nine', 'تسعة', 'تسع'],
|
|
17
|
+
};
|
|
18
|
+
/** Accepts "4 7 2 1", "4-7-2-1", Arabic-Indic digits, … — everything but the digits is dropped. */
|
|
19
|
+
export function digitsOnly(text) {
|
|
20
|
+
return normalizeAnswer(text).replace(/\D+/g, '');
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Audio challenge for blind and low-vision visitors.
|
|
24
|
+
* - `digits` (English): 4–5 digits spoken by a randomized formant voice over rain-like noise and
|
|
25
|
+
* muffled crowd babble; type the digits.
|
|
26
|
+
* - `beeps` (language-neutral, used for Arabic): a run of low and high beeps; type how many were high.
|
|
27
|
+
* The answer is sealed server-side like every other type; the clip only exists as audio.
|
|
28
|
+
*/
|
|
29
|
+
export function createAudio(powBaseBits) {
|
|
30
|
+
return {
|
|
31
|
+
type: 'audio',
|
|
32
|
+
view: 'audio',
|
|
33
|
+
minSolveMs: 2500,
|
|
34
|
+
maxAttempts: 3,
|
|
35
|
+
generate({ lang, level, rng }) {
|
|
36
|
+
const rnd = noiseSource(rng);
|
|
37
|
+
const kind = lang === 'en' ? 'digits' : 'beeps';
|
|
38
|
+
let track;
|
|
39
|
+
let accept;
|
|
40
|
+
let length;
|
|
41
|
+
if (kind === 'digits') {
|
|
42
|
+
length = level >= 2 ? 5 : 4;
|
|
43
|
+
const digits = Array.from({ length }, () => rng.int(0, 10));
|
|
44
|
+
const voice = { f0: rng.float(95, 175), scale: rng.float(0.94, 1.12), rate: rng.float(0.95, 1.12) };
|
|
45
|
+
const words = digits.map((d) => speakDigit(d, voice, rnd));
|
|
46
|
+
const gaps = digits.map(() => rng.int(380, 720));
|
|
47
|
+
const lead = rng.int(450, 700);
|
|
48
|
+
const totalMs = lead + words.reduce((s, w, i) => s + (w.length / 11.025) + gaps[i], 0) + 200;
|
|
49
|
+
track = Track.ms(totalMs);
|
|
50
|
+
let at = lead;
|
|
51
|
+
words.forEach((w, i) => {
|
|
52
|
+
track.mix(w, at, rng.float(0.8, 1));
|
|
53
|
+
at += w.length / 11.025 + gaps[i];
|
|
54
|
+
});
|
|
55
|
+
backgroundNoise(track, 0.05 + level * 0.012, rnd);
|
|
56
|
+
babble(track, 0.12 + level * 0.03, rnd, 4 + level * 2);
|
|
57
|
+
accept = [digits.join('')];
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
const highs = rng.int(3, 8);
|
|
61
|
+
const lows = rng.int(3, 6) + Math.min(level, 3);
|
|
62
|
+
const pattern = rng.shuffle([...Array(highs).fill(true), ...Array(lows).fill(false)]);
|
|
63
|
+
const low = rng.float(330, 470);
|
|
64
|
+
const high = low * rng.float(2.4, 3.1);
|
|
65
|
+
const lead = rng.int(400, 650);
|
|
66
|
+
const steps = pattern.map(() => rng.int(300, 560));
|
|
67
|
+
const lens = pattern.map(() => rng.int(110, 190));
|
|
68
|
+
track = Track.ms(lead + steps.reduce((a, b) => a + b, 0) + 400);
|
|
69
|
+
let at = lead;
|
|
70
|
+
pattern.forEach((isHigh, i) => {
|
|
71
|
+
track.mix(beep(isHigh ? high * rng.float(0.97, 1.03) : low * rng.float(0.97, 1.03), lens[i], rnd), at, rng.float(0.55, 0.8));
|
|
72
|
+
at += steps[i];
|
|
73
|
+
});
|
|
74
|
+
backgroundNoise(track, 0.08 + level * 0.02, rnd);
|
|
75
|
+
accept = [String(highs), ...(NUMBER_WORDS[highs] ?? [])];
|
|
76
|
+
}
|
|
77
|
+
master(track);
|
|
78
|
+
const pow = { salt: rng.id(16), bits: powBitsFor(powBaseBits, level) };
|
|
79
|
+
const wav = encodeWav(track);
|
|
80
|
+
return {
|
|
81
|
+
solution: { accept: [...new Set(accept.map((a) => (kind === 'digits' ? digitsOnly(a) : normalizeAnswer(a))))], ms: track.durationMs, pow },
|
|
82
|
+
prompt: prompt(kind === 'digits' ? 'audioDigits' : 'audioBeeps', lang, { n: length ?? 0 }),
|
|
83
|
+
publicData: {
|
|
84
|
+
audio: `data:audio/wav;base64,${base64(wav)}`,
|
|
85
|
+
durationMs: track.durationMs,
|
|
86
|
+
kind,
|
|
87
|
+
...(length ? { length } : {}),
|
|
88
|
+
maxPlays: 3,
|
|
89
|
+
pow: { algorithm: 'SHA-256', ...pow },
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
},
|
|
93
|
+
check(solution, answer, { elapsedMs }) {
|
|
94
|
+
if (!isRecord(answer) || typeof answer['text'] !== 'string' || answer['text'].length > 64)
|
|
95
|
+
return invalid('text');
|
|
96
|
+
if (typeof answer['nonce'] !== 'string' || !/^\d{1,16}$/.test(answer['nonce']))
|
|
97
|
+
return invalid('nonce');
|
|
98
|
+
if (leadingZeroBits(sha256(`${solution.pow.salt}:${answer['nonce']}`)) < solution.pow.bits)
|
|
99
|
+
return wrong('pow');
|
|
100
|
+
// Nobody can answer before hearing most of the clip once.
|
|
101
|
+
if (elapsedMs < Math.min(solution.ms * 0.75, 4000))
|
|
102
|
+
return { ok: false, reason: 'bot-suspected', detail: 'too-fast-for-audio' };
|
|
103
|
+
const text = answer['text'];
|
|
104
|
+
const given = /\d|[٠-٩۰-۹]/.test(text) && solution.accept[0] && /^\d+$/.test(solution.accept[0]) ? digitsOnly(text) : normalizeAnswer(text);
|
|
105
|
+
return given.length > 0 && solution.accept.includes(given) ? ok : wrong();
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=audio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio.js","sourceRoot":"","sources":["../../src/puzzles/audio.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { PuzzleDefinition } from '../types.js';
|
|
2
|
+
import { type GridPublic, type GridSolution } from './grid.js';
|
|
3
|
+
/** Compare sizes: select the largest (or, at random, the smallest) of nine copies of a pictogram. */
|
|
4
|
+
export declare const biggest: PuzzleDefinition<GridSolution, GridPublic>;
|
|
5
|
+
//# sourceMappingURL=biggest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"biggest.d.ts","sourceRoot":"","sources":["../../src/puzzles/biggest.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAA6C,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAE1G,qGAAqG;AACrG,eAAO,MAAM,OAAO,EAAE,gBAAgB,CAAC,YAAY,EAAE,UAAU,CA+B9D,CAAC"}
|