Райтап на задачу «Огрызок»

musa2ap

Автор:

musa2ap

6 ноября 2026

12

06.11.2026
Огрызок
Категория:

Misc

Задача «Огрызок»

LastTeamLead

Автор:

LastTeamLead

Первая кровь:
credo123
Сложность:
medium
Дата публикации:
28.02.2026
Решений:
39
Рейтинг:
4.33/5
Ссылка:
Решать

Открываем stub.png:

Решение задачи «Огрызок»: иллюстрация 1

Пытаться прочитать сканером через камеру или стандартными методами можно не пытаться.

У обычного QR-кода есть три «поисковых маркера» (finder patterns) — большие квадраты в трёх углах:

Решение задачи «Огрызок»: иллюстрация 2

А в нашем маркере только один — в левом верхнем углу.

Кроме того, у обычного QR-кода timing-дорожки (полоски из чередующихся чёрных и белых модулей) идут по 6-й строке и 6-му столбцу (если считать с нуля).

Это не обычный QR. Это Micro QR — уменьшенная версия QR-кода.

Вот как выглядит структура нашего кода:

Решение задачи «Огрызок»: иллюстрация 3

Обозначения на картинке:

  • синий контур — единственный поисковый маркер (7 × 7 модулей);
  • красные линии — timing-дорожки по верхней и левой границе;
  • зелёный контур — граница всего символа Micro QR (17 × 17 модулей).

Декодирую через zxing-wasm

Установка

В папке с заданием создаём проект и ставим зависимости:

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
Если вы нашли опечатку или ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter

Также по теме:

Райтап на задачу «Огрызок»

/Разборы задач

Райтап на задачу «Огрызок»

Узнаём Micro QR по размеру матрицы и единственному маркеру, восстанавливаем холст 17 на 17 модулей и читаем код.
Прочитать

8

Райтап на задачу «Счет на минуты»

/Разборы задач

Райтап на задачу «Счет на минуты»

Извлекаем минуты из хронологии рапорта и восстанавливаем скрытую пометку с помощью ASCII-таблицы.
Прочитать

7