Mathematica, не по модулю!
n = 14627;
length = Ceiling[Log[10, n]];
img = Rasterize[n, RasterSize -> 400, ImageSize -> 400];
box = Rasterize[n, "BoundingBox", RasterSize -> 400, ImageSize -> 400];
width = box[[1]]; height = box[[3]];
ToExpression[
TextRecognize[
ImageAssemble[
ImageTake[img, {1, height}, #] & /@
NestList[# - width/length &, {width - width/length, width},
length - 1]]]]
Давайте разберемся с этим.
Сначала мы используем «творческую арифметику», чтобы узнать, сколько цифр в числе: length = Ceiling[Log[10, n]];
Далее мы растеризуем число в красивое большое изображение:
Теперь мы запрашиваем ограничивающую рамку этого изображения и заполняем ширину и высоту (фактически используя смещение базовой линии вместо высоты изображения, потому что MM добавляет некоторые пробелы ниже базовой линии в изображении).
Затем NestList рекурсивно вычитает ширину изображения, деленную на длину строки, чтобы ImageTake мог выщипывать символы с конца изображения один за другим, и они повторно собираются ImageAssemble в это изображение:
Затем мы передаем это функции TextRecognize для оптического распознавания символов, которая при таком размере изображения и качестве растеризации может безупречно распознать окончательный результат и дает нам целое число:
72641
Логарифмы и распознавание текста - это как шоколад и арахисовое масло!
Новый и улучшенный
Эта версия дополняет число, чтобы справиться с упрямым поведением TextRecognize с небольшими числами, а затем вычитает площадку в конце. Это даже работает для однозначных чисел!
Хотя почему вы запускаете обратную процедуру для одного числа, для меня загадка. Но для полноты картины я даже сделал так, чтобы он работал для входов ноль и единица, которые обычно ломаются, потому что журнал с полами не возвращает 1 для них.
n = 1;
pad = 94949;
length = If[n == 1 || n == 0, 1, Ceiling[Log[10, n]]];
img = Rasterize[n + (pad*10^length), RasterSize -> 400,
ImageSize -> 400];
padlength = length + 5;
box = ImageDimensions[img];
width = box[[1]]; height = box[[2]];
reversed =
ImageResize[
ImageAssemble[
ImageTake[img, {1, height}, #] & /@
NestList[# - width/padlength &, {width + 1 - width/padlength,
width}, padlength - 1]], 200];
recognized = ToExpression[TextRecognize[reversed]];
(recognized - pad)/10^5