Математика, без модуля!
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
Логарифми та OCR - це як шоколад та арахісове масло!
Нове та вдосконалене
Ця версія вибиває число, щоб вирішити вперту поведінку 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