diff --git a/data/package.json b/data/package.json index 429cd1d..143d379 100644 --- a/data/package.json +++ b/data/package.json @@ -7,6 +7,7 @@ "ginka": "tsx ./src/ginka.ts", "minamo": "tsx ./src/minamo.ts", "merge": "tsx ./src/merge.ts", + "review": "tsx ./src/review.ts", "test:topo": "tsx ./src/topology/test.ts", "test:vision": "tsx ./src/vision/test.ts" }, diff --git a/data/src/minamo.ts b/data/src/minamo.ts index d96bc52..9d7980d 100644 --- a/data/src/minamo.ts +++ b/data/src/minamo.ts @@ -1,5 +1,11 @@ import { writeFile } from 'fs-extra'; -import { FloorData, readOne, getAllFloors, parseTowerInfo } from './utils'; +import { + FloorData, + readOne, + getAllFloors, + parseTowerInfo, + chooseFrom +} from './utils'; import { compareMap } from './topology/compare'; import { mirrorMapX, mirrorMapY, rotateMap } from './topology/transform'; import { directions, tileType } from './topology/graph'; @@ -34,15 +40,6 @@ function parseAssigned(arg: string): [number, number] { return [parseInt(a) || 100, parseInt(b) || 100]; } -function chooseFrom(arr: T[], n: number): T[] { - const copy = arr.slice(); - for (let i = copy.length - 1; i > 0; i--) { - let randIndex = Math.floor(Math.random() * (i + 1)); - [copy[i], copy[randIndex]] = [copy[randIndex], copy[i]]; - } - return copy.slice(0, n); -} - function chooseN(maxCount: number, n: number) { return chooseFrom( Array(maxCount) diff --git a/data/src/review.ts b/data/src/review.ts new file mode 100644 index 0000000..5ba0df6 --- /dev/null +++ b/data/src/review.ts @@ -0,0 +1,38 @@ +import { readFile, writeFile } from 'fs-extra'; +import { chooseFrom, DatasetMergable, mergeDataset } from './utils'; + +const [target, ...review] = process.argv.slice(2); +const n = getNum(); + +function getNum() { + const last = review.at(-1); + if (!last) return 1000; + else { + const n = parseInt(last); + if (!n) return 1000; + else { + review.pop(); + return n; + } + } +} + +(async () => { + const datas = await Promise.all( + review.map(async v => { + const file = await readFile(v, 'utf-8'); + return JSON.parse(file) as DatasetMergable; + }) + ); + const targetFile = await readFile(target, 'utf-8'); + const targetData = JSON.parse(targetFile) as DatasetMergable; + const merged = mergeDataset(...datas); + const keys = Object.keys(merged.data); + const toReview = chooseFrom(keys, n); + const reviewData: DatasetMergable = { + datasetId: Math.floor(Math.random() * 1e12), + data: Object.fromEntries(toReview.map(v => [v, merged.data[v]])) + }; + const reviewed = mergeDataset(targetData, reviewData); + await writeFile(target, JSON.stringify(reviewed), 'utf-8'); +})(); diff --git a/data/src/utils.ts b/data/src/utils.ts index 9aa6276..aa58e7c 100644 --- a/data/src/utils.ts +++ b/data/src/utils.ts @@ -17,6 +17,9 @@ export interface FloorData { export function mergeDataset( ...datasets: DatasetMergable[] ): DatasetMergable { + if (datasets.length === 1) { + return datasets[0]; + } const data: Record = {}; datasets.forEach(v => { for (const [key, value] of Object.entries(v.data)) { @@ -175,3 +178,12 @@ export async function fromJSON(path: string) { } return floorMap; } + +export function chooseFrom(arr: T[], n: number): T[] { + const copy = arr.slice(); + for (let i = copy.length - 1; i > 0; i--) { + let randIndex = Math.floor(Math.random() * (i + 1)); + [copy[i], copy[randIndex]] = [copy[randIndex], copy[i]]; + } + return copy.slice(0, n); +}