@fnndsc/brasa 0.31.4 → 0.32.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.
Files changed (68) hide show
  1. package/dist/buildinfo.json +1 -1
  2. package/dist/builtins/fs/pull.js +16 -0
  3. package/dist/builtins/fs/pull.js.map +1 -1
  4. package/dist/builtins/games/bytes.d.ts +21 -0
  5. package/dist/builtins/games/bytes.js +224 -0
  6. package/dist/builtins/games/bytes.js.map +1 -0
  7. package/dist/builtins/games/chimes.d.ts +64 -0
  8. package/dist/builtins/games/chimes.js +223 -0
  9. package/dist/builtins/games/chimes.js.map +1 -0
  10. package/dist/builtins/games/cowsay.d.ts +36 -0
  11. package/dist/builtins/games/cowsay.js +127 -0
  12. package/dist/builtins/games/cowsay.js.map +1 -0
  13. package/dist/builtins/games/figlet.d.ts +25 -0
  14. package/dist/builtins/games/figlet.js +109 -0
  15. package/dist/builtins/games/figlet.js.map +1 -0
  16. package/dist/builtins/games/lab.d.ts +51 -0
  17. package/dist/builtins/games/lab.js +161 -0
  18. package/dist/builtins/games/lab.js.map +1 -0
  19. package/dist/builtins/games/lolcat.d.ts +26 -0
  20. package/dist/builtins/games/lolcat.js +71 -0
  21. package/dist/builtins/games/lolcat.js.map +1 -0
  22. package/dist/builtins/games/morse.d.ts +18 -0
  23. package/dist/builtins/games/morse.js +46 -0
  24. package/dist/builtins/games/morse.js.map +1 -0
  25. package/dist/builtins/games/numbers.d.ts +55 -0
  26. package/dist/builtins/games/numbers.js +270 -0
  27. package/dist/builtins/games/numbers.js.map +1 -0
  28. package/dist/builtins/games/play.d.ts +53 -0
  29. package/dist/builtins/games/play.js +228 -0
  30. package/dist/builtins/games/play.js.map +1 -0
  31. package/dist/builtins/games/qr.d.ts +40 -0
  32. package/dist/builtins/games/qr.js +336 -0
  33. package/dist/builtins/games/qr.js.map +1 -0
  34. package/dist/builtins/games/shelf.d.ts +27 -0
  35. package/dist/builtins/games/shelf.js +71 -0
  36. package/dist/builtins/games/shelf.js.map +1 -0
  37. package/dist/builtins/games/show.d.ts +32 -0
  38. package/dist/builtins/games/show.js +68 -0
  39. package/dist/builtins/games/show.js.map +1 -0
  40. package/dist/builtins/games/sky.d.ts +69 -0
  41. package/dist/builtins/games/sky.js +190 -0
  42. package/dist/builtins/games/sky.js.map +1 -0
  43. package/dist/builtins/games/stdin.d.ts +34 -0
  44. package/dist/builtins/games/stdin.js +48 -0
  45. package/dist/builtins/games/stdin.js.map +1 -0
  46. package/dist/builtins/games/text.d.ts +46 -0
  47. package/dist/builtins/games/text.js +133 -0
  48. package/dist/builtins/games/text.js.map +1 -0
  49. package/dist/builtins/games/wtf.d.ts +13 -0
  50. package/dist/builtins/games/wtf.data.d.ts +12 -0
  51. package/dist/builtins/games/wtf.data.js +70 -0
  52. package/dist/builtins/games/wtf.data.js.map +1 -0
  53. package/dist/builtins/games/wtf.js +45 -0
  54. package/dist/builtins/games/wtf.js.map +1 -0
  55. package/dist/builtins/help.d.ts +8 -0
  56. package/dist/builtins/help.js +296 -0
  57. package/dist/builtins/help.js.map +1 -1
  58. package/dist/core/dispatch.js +125 -9
  59. package/dist/core/dispatch.js.map +1 -1
  60. package/dist/core/engine.js +1 -0
  61. package/dist/core/engine.js.map +1 -1
  62. package/dist/core/surface.d.ts +14 -0
  63. package/dist/core/surface.js.map +1 -1
  64. package/dist/lib/vfs/providers/static.js +15 -1
  65. package/dist/lib/vfs/providers/static.js.map +1 -1
  66. package/dist/lib/vfs/providers/static_content.js +2 -2
  67. package/dist/lib/vfs/providers/static_content.js.map +1 -1
  68. package/package.json +4 -4
@@ -0,0 +1,270 @@
1
+ /**
2
+ * @file Number toys from the shelf: `factor`, `primes`, `roll`, `calc`, `units`.
3
+ *
4
+ * `calc` is a small arithmetic reader of its own — no `eval` — with the
5
+ * usual operators, parentheses, a few functions and `pi` and `e`. `units`
6
+ * converts within a modest table: length, mass, time, data and temperature.
7
+ *
8
+ * @module
9
+ */
10
+ import { envelope_ok, envelope_error } from '@fnndsc/cumin';
11
+ import { text_input } from './stdin.js';
12
+ /** The most primes `primes` lists in one call. */
13
+ export const PRIMES_MAX = 10_000;
14
+ /** The prime factors of n, smallest first, with repeats. */
15
+ export function factors_of(n) {
16
+ const out = [];
17
+ let rest = n;
18
+ for (let p = 2; p * p <= rest; p++) {
19
+ while (rest % p === 0) {
20
+ out.push(p);
21
+ rest /= p;
22
+ }
23
+ }
24
+ if (rest > 1)
25
+ out.push(rest);
26
+ return out;
27
+ }
28
+ /** The primes in [from, to], at most PRIMES_MAX of them. */
29
+ export function primes_between(from, to) {
30
+ const out = [];
31
+ const isPrime = (n) => {
32
+ if (n < 2)
33
+ return false;
34
+ for (let p = 2; p * p <= n; p++)
35
+ if (n % p === 0)
36
+ return false;
37
+ return true;
38
+ };
39
+ for (let n = Math.max(2, from); n <= to && out.length < PRIMES_MAX; n++)
40
+ if (isPrime(n))
41
+ out.push(n);
42
+ return out;
43
+ }
44
+ /**
45
+ * Rolls dice written as `NdS[+M]`, e.g. `2d6+1`, `d20`.
46
+ *
47
+ * @returns Each die's face and the total, or a refusal.
48
+ */
49
+ export function dice_roll(spec, random = Math.random) {
50
+ const m = /^(\d*)d(\d+)([+-]\d+)?$/i.exec(spec.trim());
51
+ if (m === null)
52
+ return { refusal: `roll: '${spec}' is not dice (try 2d6, d20, 3d8+2)` };
53
+ const count = m[1] === '' || m[1] === undefined ? 1 : Number(m[1]);
54
+ const sides = Number(m[2]);
55
+ const modifier = m[3] === undefined ? 0 : Number(m[3]);
56
+ if (count < 1 || count > 100 || sides < 2 || sides > 1000)
57
+ return { refusal: 'roll: 1 to 100 dice of 2 to 1000 sides' };
58
+ const rolls = Array.from({ length: count }, () => 1 + Math.floor(random() * sides));
59
+ return { rolls, modifier, total: rolls.reduce((a, b) => a + b, 0) + modifier };
60
+ }
61
+ /* ------------------------------------------------------------- calc */
62
+ const CALC_FUNCTIONS = {
63
+ sqrt: Math.sqrt, abs: Math.abs, ln: Math.log, log: Math.log10, log2: Math.log2, exp: Math.exp,
64
+ sin: Math.sin, cos: Math.cos, tan: Math.tan, asin: Math.asin, acos: Math.acos, atan: Math.atan,
65
+ floor: Math.floor, ceil: Math.ceil, round: Math.round,
66
+ };
67
+ const CALC_CONSTANTS = { pi: Math.PI, e: Math.E, tau: 2 * Math.PI };
68
+ /**
69
+ * Evaluates an arithmetic expression: + - * / % ^, parentheses, unary minus,
70
+ * the functions above, pi and e. Throws with a reason on a malformed one.
71
+ */
72
+ export function calc_evaluate(expression) {
73
+ const src = expression.replace(/\s+/g, '');
74
+ let at = 0;
75
+ const peek = () => src[at] ?? '';
76
+ const fail = (why) => { throw new Error(`calc: ${why} at position ${at + 1}`); };
77
+ const number = () => {
78
+ const m = /^(\d+\.?\d*|\.\d+)(e[+-]?\d+)?/i.exec(src.slice(at));
79
+ if (m === null)
80
+ return fail('expected a number');
81
+ at += m[0].length;
82
+ return Number(m[0]);
83
+ };
84
+ const atom = () => {
85
+ if (peek() === '(') {
86
+ at++;
87
+ const v = expr();
88
+ if (peek() !== ')')
89
+ return fail("expected ')'");
90
+ at++;
91
+ return v;
92
+ }
93
+ if (peek() === '-') {
94
+ at++;
95
+ return -atom();
96
+ }
97
+ if (peek() === '+') {
98
+ at++;
99
+ return atom();
100
+ }
101
+ const word = /^[a-z][a-z0-9]*/i.exec(src.slice(at));
102
+ if (word !== null) {
103
+ const name = word[0].toLowerCase();
104
+ at += name.length;
105
+ if (name in CALC_CONSTANTS)
106
+ return CALC_CONSTANTS[name];
107
+ const fn = CALC_FUNCTIONS[name];
108
+ if (fn === undefined)
109
+ return fail(`unknown name '${name}'`);
110
+ if (peek() !== '(')
111
+ return fail(`'${name}' wants parentheses`);
112
+ at++;
113
+ const v = expr();
114
+ if (peek() !== ')')
115
+ return fail("expected ')'");
116
+ at++;
117
+ return fn(v);
118
+ }
119
+ return number();
120
+ };
121
+ const power = () => {
122
+ const base = atom();
123
+ if (peek() === '^') {
124
+ at++;
125
+ return Math.pow(base, power());
126
+ }
127
+ return base;
128
+ };
129
+ const term = () => {
130
+ let v = power();
131
+ while (peek() === '*' || peek() === '/' || peek() === '%') {
132
+ const op = peek();
133
+ at++;
134
+ const r = power();
135
+ v = op === '*' ? v * r : op === '/' ? v / r : v % r;
136
+ }
137
+ return v;
138
+ };
139
+ const expr = () => {
140
+ let v = term();
141
+ while (peek() === '+' || peek() === '-') {
142
+ const op = peek();
143
+ at++;
144
+ const r = term();
145
+ v = op === '+' ? v + r : v - r;
146
+ }
147
+ return v;
148
+ };
149
+ if (src === '')
150
+ fail('nothing to compute');
151
+ const value = expr();
152
+ if (at < src.length)
153
+ fail(`unexpected '${peek()}'`);
154
+ return value;
155
+ }
156
+ const UNITS = {
157
+ m: { kind: 'length', factor: 1 }, meter: { kind: 'length', factor: 1 }, metre: { kind: 'length', factor: 1 },
158
+ km: { kind: 'length', factor: 1000 }, cm: { kind: 'length', factor: 0.01 }, mm: { kind: 'length', factor: 0.001 }, um: { kind: 'length', factor: 1e-6 },
159
+ in: { kind: 'length', factor: 0.0254 }, inch: { kind: 'length', factor: 0.0254 }, ft: { kind: 'length', factor: 0.3048 }, foot: { kind: 'length', factor: 0.3048 }, feet: { kind: 'length', factor: 0.3048 },
160
+ yd: { kind: 'length', factor: 0.9144 }, mi: { kind: 'length', factor: 1609.344 }, mile: { kind: 'length', factor: 1609.344 }, nmi: { kind: 'length', factor: 1852 },
161
+ kg: { kind: 'mass', factor: 1 }, g: { kind: 'mass', factor: 0.001 }, mg: { kind: 'mass', factor: 1e-6 }, lb: { kind: 'mass', factor: 0.45359237 }, oz: { kind: 'mass', factor: 0.028349523125 }, st: { kind: 'mass', factor: 6.35029318 },
162
+ s: { kind: 'time', factor: 1 }, sec: { kind: 'time', factor: 1 }, ms: { kind: 'time', factor: 0.001 }, us: { kind: 'time', factor: 1e-6 }, min: { kind: 'time', factor: 60 }, h: { kind: 'time', factor: 3600 }, hr: { kind: 'time', factor: 3600 },
163
+ d: { kind: 'time', factor: 86400 }, day: { kind: 'time', factor: 86400 }, wk: { kind: 'time', factor: 604800 }, week: { kind: 'time', factor: 604800 }, yr: { kind: 'time', factor: 31557600 }, year: { kind: 'time', factor: 31557600 },
164
+ B: { kind: 'data', factor: 1 }, byte: { kind: 'data', factor: 1 }, kB: { kind: 'data', factor: 1e3 }, MB: { kind: 'data', factor: 1e6 }, GB: { kind: 'data', factor: 1e9 }, TB: { kind: 'data', factor: 1e12 },
165
+ KiB: { kind: 'data', factor: 1024 }, MiB: { kind: 'data', factor: 1024 ** 2 }, GiB: { kind: 'data', factor: 1024 ** 3 }, TiB: { kind: 'data', factor: 1024 ** 4 }, bit: { kind: 'data', factor: 0.125 },
166
+ C: { kind: 'temperature', factor: 1 }, F: { kind: 'temperature', factor: 1 }, K: { kind: 'temperature', factor: 1 },
167
+ };
168
+ /** Temperature is affine, not a factor: converted by hand. */
169
+ function temperature_convert(value, from, to) {
170
+ const celsius = from === 'C' ? value : from === 'F' ? (value - 32) * 5 / 9 : value - 273.15;
171
+ return to === 'C' ? celsius : to === 'F' ? celsius * 9 / 5 + 32 : celsius + 273.15;
172
+ }
173
+ /**
174
+ * Converts a quantity between two units of one kind.
175
+ *
176
+ * @returns The converted value, or a refusal naming what went wrong.
177
+ */
178
+ export function units_convert(value, from, to) {
179
+ const a = UNITS[from] ?? UNITS[from.toLowerCase()];
180
+ const b = UNITS[to] ?? UNITS[to.toLowerCase()];
181
+ if (a === undefined)
182
+ return { refusal: `units: unknown unit '${from}'` };
183
+ if (b === undefined)
184
+ return { refusal: `units: unknown unit '${to}'` };
185
+ if (a.kind !== b.kind)
186
+ return { refusal: `units: cannot convert ${a.kind} to ${b.kind}` };
187
+ if (a.kind === 'temperature')
188
+ return { value: temperature_convert(value, from.toUpperCase(), to.toUpperCase()) };
189
+ return { value: value * a.factor / b.factor };
190
+ }
191
+ /** The unit names `units` knows, for its help and its refusals. */
192
+ export function units_known() {
193
+ return Object.keys(UNITS);
194
+ }
195
+ /* --------------------------------------------------------- builtins */
196
+ /** `factor N...` */
197
+ export async function builtin_factor(args) {
198
+ const words = text_input(args)?.trim().split(/\s+/) ?? [];
199
+ if (words.length === 0)
200
+ return envelope_error('', undefined, 'factor: usage: factor N [N...]\n');
201
+ const lines = [];
202
+ const data = [];
203
+ for (const word of words) {
204
+ const n = Number(word);
205
+ if (!Number.isInteger(n) || n < 1 || n > Number.MAX_SAFE_INTEGER)
206
+ return envelope_error('', undefined, `factor: '${word}' is not a positive whole number\n`);
207
+ const factors = n === 1 ? [] : factors_of(n);
208
+ data.push({ n, factors });
209
+ lines.push(`${n}: ${factors.join(' ')}`.trimEnd());
210
+ }
211
+ return envelope_ok(`${lines.join('\n')}\n`, { kind: 'games.factor', data: { numbers: data } });
212
+ }
213
+ /** `primes [FROM] TO` */
214
+ export async function builtin_primes(args) {
215
+ const nums = args.map(Number);
216
+ if (nums.length === 0 || nums.length > 2 || nums.some((n) => !Number.isInteger(n))) {
217
+ return envelope_error('', undefined, 'primes: usage: primes [FROM] TO\n');
218
+ }
219
+ const [from, to] = nums.length === 1 ? [2, nums[0]] : [nums[0], nums[1]];
220
+ const primes = primes_between(from, to);
221
+ const note = primes.length >= PRIMES_MAX ? `primes: stopped at ${PRIMES_MAX}\n` : '';
222
+ return envelope_ok(`${primes.join(' ')}\n${note}`, { kind: 'games.primes', data: { from, to, primes } });
223
+ }
224
+ /** `roll [NdS[+M]]...` — 1d6 when bare. */
225
+ export async function builtin_roll(args) {
226
+ const specs = args.length === 0 ? ['1d6'] : args;
227
+ const lines = [];
228
+ const data = [];
229
+ for (const spec of specs) {
230
+ const r = dice_roll(spec);
231
+ if ('refusal' in r)
232
+ return envelope_error('', undefined, `${r.refusal}\n`);
233
+ const mod = r.modifier === 0 ? '' : ` ${r.modifier > 0 ? '+' : '-'} ${Math.abs(r.modifier)}`;
234
+ lines.push(r.rolls.length === 1 && r.modifier === 0 ? `${spec}: ${r.total}` : `${spec}: ${r.rolls.join(' + ')}${mod} = ${r.total}`);
235
+ data.push({ dice: spec, rolls: r.rolls, total: r.total });
236
+ }
237
+ return envelope_ok(`${lines.join('\n')}\n`, { kind: 'games.roll', data: { rolls: data } });
238
+ }
239
+ /** `calc EXPRESSION` */
240
+ export async function builtin_calc(args) {
241
+ const expression = text_input(args);
242
+ if (expression === null)
243
+ return envelope_error('', undefined, 'calc: usage: calc <expression> (e.g. calc 2^10, calc sqrt(2)*pi)\n');
244
+ try {
245
+ const value = calc_evaluate(expression.trim());
246
+ const shown = Number.isInteger(value) ? String(value) : String(Number(value.toPrecision(12)));
247
+ return envelope_ok(`${shown}\n`, { kind: 'games.calc', data: { expression: expression.trim(), value } });
248
+ }
249
+ catch (error) {
250
+ return envelope_error('', undefined, `${error instanceof Error ? error.message : String(error)}\n`);
251
+ }
252
+ }
253
+ /** `units VALUE FROM [to] TO` */
254
+ export async function builtin_units(args) {
255
+ // `units 10 mm to in`, `units 10 mm in in`: the joining word is dropped.
256
+ const words = args.length === 4 && /^(to|in|as)$/i.test(args[2]) ? [args[0], args[1], args[3]] : [...args];
257
+ if (words.length === 1 && (words[0] === 'list' || words[0] === '--list')) {
258
+ return envelope_ok(`${units_known().join(' ')}\n`, { kind: 'games.units', data: { known: units_known() } });
259
+ }
260
+ if (words.length !== 3 || !Number.isFinite(Number(words[0]))) {
261
+ return envelope_error('', undefined, 'units: usage: units VALUE FROM [to] TO (units list names the units)\n');
262
+ }
263
+ const value = Number(words[0]);
264
+ const r = units_convert(value, words[1], words[2]);
265
+ if ('refusal' in r)
266
+ return envelope_error('', undefined, `${r.refusal}\n`);
267
+ const shown = String(Number(r.value.toPrecision(10)));
268
+ return envelope_ok(`${value} ${words[1]} = ${shown} ${words[2]}\n`, { kind: 'games.units', data: { value, from: words[1], to: words[2], result: r.value } });
269
+ }
270
+ //# sourceMappingURL=numbers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"numbers.js","sourceRoot":"","sources":["../../../src/builtins/games/numbers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * @file Games played by question and answer: `quiz`, `hangman`, `2048`.
3
+ *
4
+ * Each turn is a question the kernel asks the surface — the console in a
5
+ * terminal, the console's ask bar in ARGUS — so the same game plays
6
+ * anywhere a question can be answered. The boards and the scoring are pure
7
+ * functions, tested apart from the asking.
8
+ *
9
+ * @module
10
+ */
11
+ import { CommandEnvelope } from '@fnndsc/cumin';
12
+ /** One question and its acceptable answers (matched without case or punctuation). */
13
+ export interface QuizItem {
14
+ q: string;
15
+ a: ReadonlyArray<string>;
16
+ }
17
+ /** The bank: the lab's own vocabulary. */
18
+ export declare const QUIZ_BANK: ReadonlyArray<QuizItem>;
19
+ /** How many a round asks. */
20
+ export declare const QUIZ_ROUND: number;
21
+ /** Whether an answer matches: case, spaces and punctuation set aside. */
22
+ export declare function answer_matches(given: string, accepted: ReadonlyArray<string>): boolean;
23
+ /** `quiz`: five questions from the bank; the score at the end. */
24
+ export declare function builtin_quiz(_args: string[]): Promise<CommandEnvelope>;
25
+ /** The words: the lab's. */
26
+ export declare const HANGMAN_WORDS: ReadonlyArray<string>;
27
+ /** The gallows, by misses. */
28
+ export declare const GALLOWS: ReadonlyArray<ReadonlyArray<string>>;
29
+ /** The word with the letters not yet guessed hidden. */
30
+ export declare function word_mask(word: string, guessed: ReadonlySet<string>): string;
31
+ /** `hangman`: a word from the lab, six misses allowed. */
32
+ export declare function builtin_hangman(_args: string[]): Promise<CommandEnvelope>;
33
+ /** A 4×4 board, 0 for empty. */
34
+ export type Board = number[][];
35
+ /** Slides and merges one row to the left; returns the row and the points scored. */
36
+ export declare function row_slide(row: number[]): {
37
+ row: number[];
38
+ score: number;
39
+ };
40
+ /** Moves the whole board; returns the new board, the points, and whether anything moved. */
41
+ export declare function board_move(board: Board, direction: 'left' | 'right' | 'up' | 'down'): {
42
+ board: Board;
43
+ score: number;
44
+ moved: boolean;
45
+ };
46
+ /** Puts a 2 (or, one time in ten, a 4) on an empty cell; false when there is none. */
47
+ export declare function board_spawn(board: Board, random?: () => number): boolean;
48
+ /** Whether any move is left. */
49
+ export declare function board_canMove(board: Board): boolean;
50
+ /** The board drawn. */
51
+ export declare function board_render(board: Board, score: number): string;
52
+ /** `2048`: w/a/s/d (or h/j/k/l) by question, q to stop. */
53
+ export declare function builtin_2048(_args: string[]): Promise<CommandEnvelope>;
@@ -0,0 +1,228 @@
1
+ /**
2
+ * @file Games played by question and answer: `quiz`, `hangman`, `2048`.
3
+ *
4
+ * Each turn is a question the kernel asks the surface — the console in a
5
+ * terminal, the console's ask bar in ARGUS — so the same game plays
6
+ * anywhere a question can be answered. The boards and the scoring are pure
7
+ * functions, tested apart from the asking.
8
+ *
9
+ * @module
10
+ */
11
+ import { envelope_ok, envelope_error } from '@fnndsc/cumin';
12
+ import chalk from 'chalk';
13
+ import { repl_question } from '../../core/question.js';
14
+ import { sink_dataLine } from '../../core/sink.js';
15
+ /** The bank: the lab's own vocabulary. */
16
+ export const QUIZ_BANK = [
17
+ { q: 'What does CUBE stand for?', a: ['chris ultron back end', 'chris ultron backend'] },
18
+ { q: 'Which DICOM service asks a PACS what it holds: C-FIND, C-MOVE or C-STORE?', a: ['c-find', 'cfind', 'c find'] },
19
+ { q: 'Which DICOM service tells a PACS to send a series?', a: ['c-move', 'cmove', 'c move'] },
20
+ { q: 'What is the DICOM tag name for the hospital\'s patient identifier (the MRN)?', a: ['patientid', 'patient id'] },
21
+ { q: 'Which service receives DICOM files for ChRIS and reports progress over LONK?', a: ['oxidicom'] },
22
+ { q: 'Which service does `pull` go through to reach a PACS?', a: ['pfdcm'] },
23
+ { q: 'A plugin that takes data in and gives data out is of which kind: fs, ds or ts?', a: ['ds'] },
24
+ { q: 'A plugin that joins several parents is of which kind: fs, ds or ts?', a: ['ts'] },
25
+ { q: 'What is one analysis in ChRIS called (a tree of plugin instances on some data)?', a: ['feed', 'a feed'] },
26
+ { q: 'What does the K in LONK stand for? (spelling counts)', a: ['notifikations', 'notifications'] },
27
+ { q: 'Which file format do most neuroimaging tools read: NIfTI or DICOM?', a: ['nifti'] },
28
+ { q: 'In SeaGaP, what does the P stand for?', a: ['process'] },
29
+ { q: 'What is the mise kernel package called?', a: ['brasa'] },
30
+ { q: 'What is the mise daemon called?', a: ['calypso'] },
31
+ { q: 'At 0 Hounsfield units, what are you looking at?', a: ['water'] },
32
+ ];
33
+ /** How many a round asks. */
34
+ export const QUIZ_ROUND = 5;
35
+ /** Whether an answer matches: case, spaces and punctuation set aside. */
36
+ export function answer_matches(given, accepted) {
37
+ const norm = (s) => s.toLowerCase().replace(/[^a-z0-9]+/g, '');
38
+ const g = norm(given);
39
+ return g.length > 0 && accepted.some((a) => norm(a) === g);
40
+ }
41
+ /** `quiz`: five questions from the bank; the score at the end. */
42
+ export async function builtin_quiz(_args) {
43
+ const asked = [...QUIZ_BANK].sort(() => Math.random() - 0.5).slice(0, QUIZ_ROUND);
44
+ let right = 0;
45
+ const results = [];
46
+ try {
47
+ for (const [i, item] of asked.entries()) {
48
+ const answer = await repl_question(`${i + 1}/${asked.length} ${item.q} `);
49
+ if (answer.trim().toLowerCase() === 'q')
50
+ break;
51
+ const ok = answer_matches(answer, item.a);
52
+ if (ok)
53
+ right++;
54
+ results.push({ q: item.q, right: ok });
55
+ sink_dataLine(ok ? chalk.green(' right') : chalk.yellow(` no — ${item.a[0]}`));
56
+ }
57
+ }
58
+ catch (error) {
59
+ return envelope_error('', undefined, `quiz: cannot ask here (${error instanceof Error ? error.message : String(error)})\n`);
60
+ }
61
+ const verdict = right === results.length && results.length === asked.length ? 'perfect' : right >= Math.ceil(results.length / 2) ? 'not bad' : 'wtf -l will help';
62
+ return envelope_ok(`\n${right} of ${results.length} — ${verdict}\n`, { kind: 'games.quiz', data: { right, asked: results.length, results } });
63
+ }
64
+ /* ------------------------------------------------------------- hangman */
65
+ /** The words: the lab's. */
66
+ export const HANGMAN_WORDS = ['oxidicom', 'pipeline', 'dicom', 'cohort', 'feed', 'plugin', 'calypso', 'brasa', 'accession', 'series', 'modality', 'nifti', 'hounsfield', 'lonk', 'pfdcm', 'stardate'];
67
+ /** The gallows, by misses. */
68
+ export const GALLOWS = [
69
+ [' +---+', ' | |', ' |', ' |', ' |', ' |', '========='],
70
+ [' +---+', ' | |', ' O |', ' |', ' |', ' |', '========='],
71
+ [' +---+', ' | |', ' O |', ' | |', ' |', ' |', '========='],
72
+ [' +---+', ' | |', ' O |', ' /| |', ' |', ' |', '========='],
73
+ [' +---+', ' | |', ' O |', ' /|\\ |', ' |', ' |', '========='],
74
+ [' +---+', ' | |', ' O |', ' /|\\ |', ' / |', ' |', '========='],
75
+ [' +---+', ' | |', ' O |', ' /|\\ |', ' / \\ |', ' |', '========='],
76
+ ];
77
+ /** The word with the letters not yet guessed hidden. */
78
+ export function word_mask(word, guessed) {
79
+ return [...word].map((c) => (guessed.has(c) ? c : '_')).join(' ');
80
+ }
81
+ /** `hangman`: a word from the lab, six misses allowed. */
82
+ export async function builtin_hangman(_args) {
83
+ const word = HANGMAN_WORDS[Math.floor(Math.random() * HANGMAN_WORDS.length)];
84
+ const guessed = new Set();
85
+ let misses = 0;
86
+ try {
87
+ while (misses < GALLOWS.length - 1) {
88
+ const mask = word_mask(word, guessed);
89
+ if (!mask.includes('_'))
90
+ break;
91
+ sink_dataLine(`${GALLOWS[misses].join('\n')}\n\n ${mask} missed: ${[...guessed].filter((c) => !word.includes(c)).join(' ') || '—'}`);
92
+ const answer = (await repl_question('letter (or the word, or q): ')).trim().toLowerCase();
93
+ if (answer === 'q')
94
+ return envelope_ok(`\nthe word was ${word}\n`, { kind: 'games.hangman', data: { word, won: false, quit: true } });
95
+ if (answer.length > 1) {
96
+ if (answer === word) {
97
+ for (const c of word)
98
+ guessed.add(c);
99
+ break;
100
+ }
101
+ misses++;
102
+ continue;
103
+ }
104
+ if (!/^[a-z]$/.test(answer) || guessed.has(answer))
105
+ continue;
106
+ guessed.add(answer);
107
+ if (!word.includes(answer))
108
+ misses++;
109
+ }
110
+ }
111
+ catch (error) {
112
+ return envelope_error('', undefined, `hangman: cannot ask here (${error instanceof Error ? error.message : String(error)})\n`);
113
+ }
114
+ const won = !word_mask(word, guessed).includes('_');
115
+ const end = won ? chalk.green(`\n ${word} — saved, with ${misses} miss${misses === 1 ? '' : 'es'}\n`) : `${GALLOWS[GALLOWS.length - 1].join('\n')}\n\n ${chalk.red('hanged')} — the word was ${word}\n`;
116
+ return envelope_ok(end, { kind: 'games.hangman', data: { word, won, misses } });
117
+ }
118
+ /** Slides and merges one row to the left; returns the row and the points scored. */
119
+ export function row_slide(row) {
120
+ const tiles = row.filter((v) => v !== 0);
121
+ const out = [];
122
+ let score = 0;
123
+ for (let i = 0; i < tiles.length; i++) {
124
+ if (i + 1 < tiles.length && tiles[i] === tiles[i + 1]) {
125
+ out.push(tiles[i] * 2);
126
+ score += tiles[i] * 2;
127
+ i++;
128
+ }
129
+ else
130
+ out.push(tiles[i]);
131
+ }
132
+ while (out.length < row.length)
133
+ out.push(0);
134
+ return { row: out, score };
135
+ }
136
+ /** Moves the whole board; returns the new board, the points, and whether anything moved. */
137
+ export function board_move(board, direction) {
138
+ const n = board.length;
139
+ const get = (r, c) => {
140
+ if (direction === 'left')
141
+ return board[r][c];
142
+ if (direction === 'right')
143
+ return board[r][n - 1 - c];
144
+ if (direction === 'up')
145
+ return board[c][r];
146
+ return board[n - 1 - c][r];
147
+ };
148
+ const next = board.map((row) => [...row]);
149
+ let score = 0;
150
+ let moved = false;
151
+ for (let r = 0; r < n; r++) {
152
+ const line = Array.from({ length: n }, (_, c) => get(r, c));
153
+ const slid = row_slide(line);
154
+ score += slid.score;
155
+ for (let c = 0; c < n; c++) {
156
+ const v = slid.row[c];
157
+ if (v !== line[c])
158
+ moved = true;
159
+ if (direction === 'left')
160
+ next[r][c] = v;
161
+ else if (direction === 'right')
162
+ next[r][n - 1 - c] = v;
163
+ else if (direction === 'up')
164
+ next[c][r] = v;
165
+ else
166
+ next[n - 1 - c][r] = v;
167
+ }
168
+ }
169
+ return { board: next, score, moved };
170
+ }
171
+ /** Puts a 2 (or, one time in ten, a 4) on an empty cell; false when there is none. */
172
+ export function board_spawn(board, random = Math.random) {
173
+ const empty = [];
174
+ board.forEach((row, r) => row.forEach((v, c) => { if (v === 0)
175
+ empty.push([r, c]); }));
176
+ if (empty.length === 0)
177
+ return false;
178
+ const [r, c] = empty[Math.floor(random() * empty.length)];
179
+ board[r][c] = random() < 0.1 ? 4 : 2;
180
+ return true;
181
+ }
182
+ /** Whether any move is left. */
183
+ export function board_canMove(board) {
184
+ return ['left', 'right', 'up', 'down'].some((d) => board_move(board, d).moved);
185
+ }
186
+ /** The board drawn. */
187
+ export function board_render(board, score) {
188
+ const cell = (v) => (v === 0 ? ' .' : String(v).padStart(5));
189
+ return `${board.map((row) => row.map(cell).join('')).join('\n')}\n score ${score}`;
190
+ }
191
+ /** `2048`: w/a/s/d (or h/j/k/l) by question, q to stop. */
192
+ export async function builtin_2048(_args) {
193
+ let board = Array.from({ length: 4 }, () => [0, 0, 0, 0]);
194
+ board_spawn(board);
195
+ board_spawn(board);
196
+ let score = 0;
197
+ const keys = { a: 'left', h: 'left', d: 'right', l: 'right', w: 'up', k: 'up', s: 'down', j: 'down' };
198
+ try {
199
+ for (;;) {
200
+ sink_dataLine(board_render(board, score));
201
+ if (board.some((row) => row.includes(2048))) {
202
+ sink_dataLine(chalk.green(' 2048 — you have it'));
203
+ break;
204
+ }
205
+ if (!board_canMove(board)) {
206
+ sink_dataLine(chalk.yellow(' no move left'));
207
+ break;
208
+ }
209
+ const answer = (await repl_question('move (w a s d, q to stop): ')).trim().toLowerCase();
210
+ if (answer === 'q')
211
+ break;
212
+ const direction = keys[answer[0] ?? ''];
213
+ if (direction === undefined)
214
+ continue;
215
+ const moved = board_move(board, direction);
216
+ if (!moved.moved)
217
+ continue;
218
+ board = moved.board;
219
+ score += moved.score;
220
+ board_spawn(board);
221
+ }
222
+ }
223
+ catch (error) {
224
+ return envelope_error('', undefined, `2048: cannot ask here (${error instanceof Error ? error.message : String(error)})\n`);
225
+ }
226
+ return envelope_ok(`final score ${score}\n`, { kind: 'games.2048', data: { board, score } });
227
+ }
228
+ //# sourceMappingURL=play.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"play.js","sourceRoot":"","sources":["../../../src/builtins/games/play.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @file `qr`: a QR code in the console, for a phone to read off the screen.
3
+ *
4
+ * A small encoder of its own — byte mode, error correction level L,
5
+ * versions 1 to 10 (up to 271 bytes) — drawn in half-block characters so a
6
+ * code is half as tall as it is wide, with the light modules bright: on a
7
+ * dark console that is what a camera reads. No library: the whole of it
8
+ * is below, and a surface may draw the matrix in the model its own way.
9
+ *
10
+ * @module
11
+ */
12
+ import { CommandEnvelope } from '@fnndsc/cumin';
13
+ /** The most bytes the biggest version here carries. */
14
+ export declare const QR_MAX_BYTES: number;
15
+ /** The Reed–Solomon remainder of `data` for `ec` check codewords. */
16
+ export declare function rs_remainder(data: number[], ec: number): number[];
17
+ /** The penalty of a drawn matrix, by the four rules; lower is better. */
18
+ export declare function penalty_of(dark: boolean[][]): number;
19
+ /**
20
+ * Encodes bytes as a QR matrix.
21
+ *
22
+ * @param text - The text (UTF-8).
23
+ * @param maskForced - A mask to use instead of the least-penalty one (a test's seam).
24
+ * @returns The dark/light matrix, its version and the mask chosen; null when too long.
25
+ */
26
+ export declare function qr_encode(text: string, maskForced?: number): {
27
+ size: number;
28
+ dark: boolean[][];
29
+ version: number;
30
+ mask: number;
31
+ } | null;
32
+ /**
33
+ * Draws a matrix in half blocks, light modules bright, a quiet zone round it.
34
+ *
35
+ * @param dark - The matrix.
36
+ * @returns The lines.
37
+ */
38
+ export declare function qr_render(dark: boolean[][]): string[];
39
+ /** `qr <text>` */
40
+ export declare function builtin_qr(args: string[]): Promise<CommandEnvelope>;