From 895e9a4fc2c1a427c55ebaafb5423d3db6e3dddc Mon Sep 17 00:00:00 2001 From: Emmanuel Gaillot Date: Sat, 20 Dec 2025 21:14:53 +0100 Subject: Solve retrieved challenge --- lambda-calcul/javascript/index.js | 6 ++++-- lambda-calcul/javascript/src/client.js | 19 ++++++++++++++++- lambda-calcul/javascript/src/internals.js | 5 +++++ lambda-calcul/javascript/src/interpreter.js | 7 ++++++ lambda-calcul/javascript/src/parser.js | 7 ++++++ lambda-calcul/javascript/src/printer.js | 5 +++++ lambda-calcul/javascript/test/client.test.js | 26 +++++++++++++++++++++++ lambda-calcul/javascript/test/interpreter.test.js | 9 ++++++++ lambda-calcul/javascript/test/parser.test.js | 9 ++++++++ lambda-calcul/javascript/test/printer.test.js | 9 ++++++++ 10 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 lambda-calcul/javascript/src/internals.js create mode 100644 lambda-calcul/javascript/src/interpreter.js create mode 100644 lambda-calcul/javascript/src/parser.js create mode 100644 lambda-calcul/javascript/src/printer.js create mode 100644 lambda-calcul/javascript/test/interpreter.test.js create mode 100644 lambda-calcul/javascript/test/parser.test.js create mode 100644 lambda-calcul/javascript/test/printer.test.js (limited to 'lambda-calcul') diff --git a/lambda-calcul/javascript/index.js b/lambda-calcul/javascript/index.js index e06ac4d..a71697d 100644 --- a/lambda-calcul/javascript/index.js +++ b/lambda-calcul/javascript/index.js @@ -8,6 +8,8 @@ client = LC.newClient({ }); client.start() - .then((token) => console.log(`${playerName} has registered with token ${token}`) || token) + .then(token => console.log(`${playerName} has registered with token ${token}`) || token) .then(client.nextChallenge) - .then((challenge) => console.log(`Next challenge: ${challenge}`)); + .then(challenge => console.log(`Next challenge: ${challenge}`) || challenge) + .then(client.solve) + .then(solution => console.log(`… solved into: ${solution}`)); diff --git a/lambda-calcul/javascript/src/client.js b/lambda-calcul/javascript/src/client.js index d046187..88ea253 100644 --- a/lambda-calcul/javascript/src/client.js +++ b/lambda-calcul/javascript/src/client.js @@ -1,11 +1,27 @@ const axios = require('axios'); -const newClient = ({ playerName, challengerURL }) => { +const defaultInterpreter = require('./interpreter'); +const defaultParser = require('./parser'); +const defaultPrinter = require('./printer'); + +const newClient = ({ + challengerURL, + interpreter = defaultInterpreter, + parser = defaultParser, + playerName, + printer = defaultPrinter, +}) => { const nextChallenge = (token) => axios ({ url: `${challengerURL}/api/challenge?token=${token}`, }) .then(({ data: { expr } }) => expr); + const solve = (challenge) => { + const parsedExpression = parser.parse(challenge); + const evaluatedExpression = interpreter.evaluate(parsedExpression); + return printer.print(evaluatedExpression); + } + const start = () => axios({ method: 'POST', url: `${challengerURL}/api/register`, @@ -16,6 +32,7 @@ const newClient = ({ playerName, challengerURL }) => { return { nextChallenge, + solve, start, }; }; diff --git a/lambda-calcul/javascript/src/internals.js b/lambda-calcul/javascript/src/internals.js new file mode 100644 index 0000000..f55736a --- /dev/null +++ b/lambda-calcul/javascript/src/internals.js @@ -0,0 +1,5 @@ +const σ = (name) => ({ sym: name }); + +module.exports = { + σ, +}; diff --git a/lambda-calcul/javascript/src/interpreter.js b/lambda-calcul/javascript/src/interpreter.js new file mode 100644 index 0000000..a2e8481 --- /dev/null +++ b/lambda-calcul/javascript/src/interpreter.js @@ -0,0 +1,7 @@ +const { σ } = require('./internals'); + +const evaluate = (term) => term; + +module.exports = { + evaluate, +}; diff --git a/lambda-calcul/javascript/src/parser.js b/lambda-calcul/javascript/src/parser.js new file mode 100644 index 0000000..77593e0 --- /dev/null +++ b/lambda-calcul/javascript/src/parser.js @@ -0,0 +1,7 @@ +const { σ } = require('./internals'); + +const parse = (x) => σ(x); + +module.exports = { + parse, +}; diff --git a/lambda-calcul/javascript/src/printer.js b/lambda-calcul/javascript/src/printer.js new file mode 100644 index 0000000..39dbf38 --- /dev/null +++ b/lambda-calcul/javascript/src/printer.js @@ -0,0 +1,5 @@ +const print = ({ sym: name }) => name; + +module.exports = { + print, +}; diff --git a/lambda-calcul/javascript/test/client.test.js b/lambda-calcul/javascript/test/client.test.js index 5fcc42c..8b68a61 100644 --- a/lambda-calcul/javascript/test/client.test.js +++ b/lambda-calcul/javascript/test/client.test.js @@ -54,4 +54,30 @@ describe('λ-calculator', () => { return client.nextChallenge('SomeToken') .then((challenge) => expect(challenge).toBe('SomeChallenge')); }); + + it('solves challenges', () => { + const parser = { + parse: (challenge) => { + expect(challenge).toBe('Some challenge'); + return 'Parsed expression'; + }, + }; + + const interpreter = { + evaluate: (parsedExpression) => { + expect(parsedExpression).toBe('Parsed expression'); + return 'Evaluated expression'; + }, + }; + + const printer = { + print: (evaluatedExpression) => { + expect(evaluatedExpression).toBe('Evaluated expression'); + return 'Expression to print'; + }, + }; + + const client = LC.newClient({ parser, interpreter, printer }); + expect(client.solve('Some challenge')).toBe('Expression to print'); + }); }); diff --git a/lambda-calcul/javascript/test/interpreter.test.js b/lambda-calcul/javascript/test/interpreter.test.js new file mode 100644 index 0000000..a859bfe --- /dev/null +++ b/lambda-calcul/javascript/test/interpreter.test.js @@ -0,0 +1,9 @@ +const { σ } = require('../src/internals'); +const { evaluate } = require('../src/interpreter'); + +describe('An interpreter', () => { + it('evaluates symbols', () => { + expect(evaluate(σ('x'))).toEqual(σ('x')); + expect(evaluate(σ('y'))).toEqual(σ('y')); + }); +}); diff --git a/lambda-calcul/javascript/test/parser.test.js b/lambda-calcul/javascript/test/parser.test.js new file mode 100644 index 0000000..e9cab60 --- /dev/null +++ b/lambda-calcul/javascript/test/parser.test.js @@ -0,0 +1,9 @@ +const { σ } = require('../src/internals'); +const { parse } = require('../src/parser'); + +describe('A parser', () => { + it('parses symbols', () => { + expect(parse('x')).toEqual(σ('x')); + expect(parse('y')).toEqual(σ('y')); + }); +}); diff --git a/lambda-calcul/javascript/test/printer.test.js b/lambda-calcul/javascript/test/printer.test.js new file mode 100644 index 0000000..1684d31 --- /dev/null +++ b/lambda-calcul/javascript/test/printer.test.js @@ -0,0 +1,9 @@ +const { σ } = require('../src/internals'); +const { print } = require('../src/printer'); + +describe('A printer', () => { + it('prints symbols', () => { + expect(print(σ('x'))).toEqual('x'); + expect(print(σ('y'))).toEqual('y'); + }); +}); -- cgit v1.3.1