/Разборы задач
6 ноября 2026
Райтап на задачу «Огрызок»
Узнаём Micro QR по размеру матрицы и единственному маркеру, восстанавливаем холст 17 на 17 модулей и читаем код.8
12

Misc
Задача «Огрызок»
Открываем stub.png:
Пытаться прочитать сканером через камеру или стандартными методами можно не пытаться.
У обычного QR-кода есть три «поисковых маркера» (finder patterns) — большие квадраты в трёх углах:
А в нашем маркере только один — в левом верхнем углу.
Кроме того, у обычного QR-кода timing-дорожки (полоски из чередующихся чёрных и белых модулей) идут по 6-й строке и 6-му столбцу (если считать с нуля).
Это не обычный QR. Это Micro QR — уменьшенная версия QR-кода.
Вот как выглядит структура нашего кода:
Обозначения на картинке:
В папке с заданием создаём проект и ставим зависимости:
npm init -y
npm install zxing-wasm pngjsСоздаём файл tools/read_micro.mjs:
// zxing-wasm в Node не умеет сам скачивать .wasm — подсовываем файл из node_modules.
const wasmPath = fileURLToPath(
new URL('../node_modules/zxing-wasm/dist/reader/zxing_reader.wasm', import.meta.url),
);
const wasmFileBuffer = readFileSync(wasmPath);
prepareZXingModule({
overrides: {
wasmBinary: wasmFileBuffer.buffer.slice(
wasmFileBuffer.byteOffset,
wasmFileBuffer.byteOffset + wasmFileBuffer.byteLength,
),
},
});
const imagePath = process.argv[2] || fileURLToPath(new URL('../stub.png', import.meta.url));
const png = PNG.sync.read(readFileSync(imagePath));
// zxing-wasm принимает "duck-typed" ImageData: data, width, height.
const imageData = {
data: new Uint8ClampedArray(png.data),
width: png.width,
height: png.height,
};
const results = await readBarcodes(imageData, {
formats: ['MicroQRCode'],
tryHarder: true,
tryRotate: true,
tryInvert: true,
tryDownscale: true,
maxNumberOfSymbols: 1,
binarizer: 'LocalAverage',
});
if (results.length === 0) {
console.log('Ничего не найдено');
process.exit(1);
}
for (const r of results) {
console.log(`Текст: ${r.text}`);
console.log(`Формат: ${r.format}`);
console.log(`Версия: ${r.version}`);
console.log(`ECC: ${r.ecLevel}`);
}Запускаем скрипт и получаем ответ.
node tools/read_micro.mjs stub.png