Means to an End done!
This commit is contained in:
parent
1c7efe5a9e
commit
de9e412451
1 changed files with 38 additions and 14 deletions
52
main.ts
52
main.ts
|
@ -1,5 +1,4 @@
|
|||
import { copy } from "https://deno.land/std@0.157.0/streams/conversion.ts?s=copy";
|
||||
import { Buffer } from "https://deno.land/std@0.157.0/io/buffer.ts";
|
||||
import { BufReader } from "https://deno.land/std@0.157.0/io/buffer.ts";
|
||||
import { ByteSet } from "https://deno.land/x/bytes@1.0.3/mod.ts";
|
||||
|
||||
const QUERY_SIZE = 9;
|
||||
|
@ -22,29 +21,54 @@ for await (const conn of listener) {
|
|||
// problem 2
|
||||
async function meansToAnEnd(conn: Deno.Conn) {
|
||||
try {
|
||||
const prices = [];
|
||||
for await (const query of queries(conn)) {
|
||||
console.log("Query:", query);
|
||||
conn.write(ByteSet.from(Uint8Array.from([0]), "big").buffer);
|
||||
if (query == null) break;
|
||||
const bs = ByteSet.from(query, "big");
|
||||
const queryChar = String.fromCharCode(bs.read.uint8());
|
||||
const a1 = bs.read.int32();
|
||||
const a2 = bs.read.int32();
|
||||
if (queryChar == "I") {
|
||||
console.log(conn.remoteAddr, "Pushing I:", [a1, a2]);
|
||||
prices.push([a1, a2]);
|
||||
} else if (queryChar == "Q") {
|
||||
console.log(conn.remoteAddr, "Querying:", a1, a2);
|
||||
let numMatches = 0;
|
||||
let sum = 0;
|
||||
for (const [ts, price] of prices) {
|
||||
if (ts < a1 || ts > a2) continue;
|
||||
numMatches++;
|
||||
sum += price;
|
||||
}
|
||||
let result = Math.floor(sum / numMatches);
|
||||
if (isNaN(result)) result = 0;
|
||||
console.log(
|
||||
conn.remoteAddr,
|
||||
`Result for ${prices.length} prices: ${sum} / ${numMatches} = ${result}`,
|
||||
);
|
||||
const response = new ByteSet(4, "big");
|
||||
response.write.int32(result);
|
||||
conn.write(response.buffer);
|
||||
}
|
||||
}
|
||||
console.log("Done!");
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
console.error("Error processing query:", err);
|
||||
}
|
||||
}
|
||||
|
||||
function queries(conn: Deno.Conn) {
|
||||
return {
|
||||
async *[Symbol.asyncIterator]() {
|
||||
const b = new Uint8Array(1024);
|
||||
const q = new Uint8Array();
|
||||
let bytesRead = 0;
|
||||
console.debug(b.length);
|
||||
while (bytesRead < QUERY_SIZE) {
|
||||
const n = await conn.read(b);
|
||||
bytesRead += n;
|
||||
console.debug(n, b.length);
|
||||
const b = new Uint8Array(9);
|
||||
const reader = new BufReader(conn, QUERY_SIZE);
|
||||
try {
|
||||
while (await reader.readFull(b) != null) {
|
||||
yield b;
|
||||
}
|
||||
} catch (err) {
|
||||
console.error("Error receiving query:", err);
|
||||
}
|
||||
yield q;
|
||||
},
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue