Add rule generator
This commit is contained in:
29
src/rules/allValuesBlock.ts
Normal file
29
src/rules/allValuesBlock.ts
Normal file
@ -0,0 +1,29 @@
|
||||
import { v } from "../util";
|
||||
|
||||
export default function* allValuesBlock(): Generator<number[], null, undefined> {
|
||||
let count = 0;
|
||||
for (const x of [1, 4, 7]) {
|
||||
for (const y of [1, 4, 7]) {
|
||||
for (let w = 1; w < 10; w++) {
|
||||
yield [
|
||||
v(x, y, w),
|
||||
v(x, y + 1, w),
|
||||
v(x, y + 2, w),
|
||||
v(x + 1, y, w),
|
||||
v(x + 1, y + 1, w),
|
||||
v(x + 1, y + 2, w),
|
||||
v(x + 2, y, w),
|
||||
v(x + 2, y + 1, w),
|
||||
v(x + 2, y + 2, w),
|
||||
];
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log("allValuesBlock: " + count);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
export const length = 3 * 3 * 9;
|
17
src/rules/allValuesColumn.ts
Normal file
17
src/rules/allValuesColumn.ts
Normal file
@ -0,0 +1,17 @@
|
||||
import { v } from "../util";
|
||||
|
||||
export default function* allValuesColumn(): Generator<number[], null, undefined> {
|
||||
let count = 0;
|
||||
for (let x = 1; x < 10; x++) {
|
||||
for (let w = 1; w < 10; w++) {
|
||||
yield [v(x, 1, w), v(x, 2, w), v(x, 3, w), v(x, 4, w), v(x, 5, w), v(x, 6, w), v(x, 7, w), v(x, 8, w), v(x, 9, w)];
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
console.log("allValuesColumn: " + count);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
export const length = 9 * 9;
|
17
src/rules/allValuesRow.ts
Normal file
17
src/rules/allValuesRow.ts
Normal file
@ -0,0 +1,17 @@
|
||||
import { v } from "../util";
|
||||
|
||||
export default function* allValuesRow(): Generator<number[], null, undefined> {
|
||||
let count = 0;
|
||||
for (let y = 1; y < 10; y++) {
|
||||
for (let w = 1; w < 10; w++) {
|
||||
yield [v(1, y, w), v(2, y, w), v(3, y, w), v(4, y, w), v(5, y, w), v(6, y, w), v(7, y, w), v(8, y, w), v(9, y, w)];
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
console.log("allValuesRow: " + count);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
export const length = 9 * 9;
|
17
src/rules/atLeastOneValue.ts
Normal file
17
src/rules/atLeastOneValue.ts
Normal file
@ -0,0 +1,17 @@
|
||||
import { v } from "../util";
|
||||
|
||||
export default function* atLeastOneValue(): Generator<number[], null, undefined> {
|
||||
let count = 0;
|
||||
for (let x = 1; x < 10; x++) {
|
||||
for (let y = 1; y < 10; y++) {
|
||||
yield [v(x, y, 1), v(x, y, 2), v(x, y, 3), v(x, y, 4), v(x, y, 5), v(x, y, 6), v(x, y, 7), v(x, y, 8), v(x, y, 9)];
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
console.log("atLeastOneValue: " + count);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
export const length = 9 * 9;
|
15
src/rules/fixedValues.ts
Normal file
15
src/rules/fixedValues.ts
Normal file
@ -0,0 +1,15 @@
|
||||
export default function* fixedValues(values: number[]): Generator<number[], null, undefined> {
|
||||
let count = 0;
|
||||
for (const value of values) {
|
||||
yield [value];
|
||||
count++;
|
||||
}
|
||||
|
||||
console.log("fixedValues: " + count);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
export function getLength(values: number[]): number {
|
||||
return values.length;
|
||||
}
|
24
src/rules/index.ts
Normal file
24
src/rules/index.ts
Normal file
@ -0,0 +1,24 @@
|
||||
import allValuesBlock, { length as l1 } from "./allValuesBlock";
|
||||
import allValuesColumn, { length as l2 } from "./allValuesColumn";
|
||||
import allValuesRow, { length as l3 } from "./allValuesRow";
|
||||
import atLeastOneValue, { length as l4 } from "./atLeastOneValue";
|
||||
import fixedValuesHandler, { getLength as getL5 } from "./fixedValues";
|
||||
import maxOneValue, { length as l6 } from "./maxOneValue";
|
||||
|
||||
export default function* generateRules(fixedValues: number[]): Generator<string, null, undefined> {
|
||||
const generators = [allValuesBlock(), allValuesColumn(), allValuesRow(), atLeastOneValue(), maxOneValue(), fixedValuesHandler(fixedValues)];
|
||||
|
||||
for (const generator of generators) {
|
||||
let rule = generator.next().value;
|
||||
while (rule !== null) {
|
||||
yield rule.join(" ") + " 0";
|
||||
rule = generator.next().value;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
export function getLength(fixedValues: number[]): number {
|
||||
return l1 + l2 + l3 + l4 + getL5(fixedValues) + l6;
|
||||
}
|
21
src/rules/maxOneValue.ts
Normal file
21
src/rules/maxOneValue.ts
Normal file
@ -0,0 +1,21 @@
|
||||
import { v } from "../util";
|
||||
|
||||
export default function* maxOneValue(): Generator<number[], null, undefined> {
|
||||
let count = 0;
|
||||
for (let x = 1; x < 10; x++) {
|
||||
for (let y = 1; y < 10; y++) {
|
||||
for (let w = 1; w < 9; w++) {
|
||||
for (let w2 = w + 1; w2 < 10; w2++) {
|
||||
yield [-v(x, y, w), -v(x, y, w2)];
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log("maxOneValue: " + count);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
export const length = 9 * 9 * (8 + 7 + 6 + 5 + 4 + 3 + 2 + 1);
|
11
src/util.ts
Normal file
11
src/util.ts
Normal file
@ -0,0 +1,11 @@
|
||||
import { assert } from "console";
|
||||
|
||||
export function v(x: number, y: number, w: number): number {
|
||||
assert(1 <= x && x <= 9);
|
||||
assert(1 <= y && y <= 9);
|
||||
assert(1 <= w && w <= 9);
|
||||
|
||||
return x + 9 * (y - 1) + 81 * (w - 1);
|
||||
}
|
||||
|
||||
export type N = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
|
Reference in New Issue
Block a user