Mathematica, nessun modulo!
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]]]]
Analizziamolo.
Innanzitutto usiamo alcune "aritmetiche creative" per scoprire quante cifre ci sono nel numero: length = Ceiling[Log[10, n]];
Successivamente, rasterizziamo il numero in una bella immagine di grandi dimensioni:
Ora chiediamo il riquadro di delimitazione di quell'immagine e popoliamo la larghezza e l'altezza (in realtà usando l'offset della linea di base anziché l'altezza dell'immagine, perché MM aggiunge degli spazi bianchi sotto la linea di base nell'immagine).
Successivamente, NestList sottrae in modo ricorsivo la larghezza dell'immagine divisa per la lunghezza della stringa per consentire a ImageTake di strappare i caratteri dalla fine dell'immagine uno alla volta, e questi vengono riassemblati da ImageAssemble in questa immagine:
Quindi passiamo alla funzione TextRecognize per il riconoscimento ottico dei caratteri, che a questa dimensione dell'immagine e qualità di rasterizzazione è in grado di riconoscere impeccabilmente l'output finale e darci il numero intero:
72641
Logaritmi e OCR - È come cioccolato e burro di arachidi!
Nuovo e migliorato
Questa versione completa il numero per gestire il comportamento ostinato di TextRecognize con piccoli numeri, quindi sottrae il pad alla fine. Funziona anche con numeri a una cifra!
Tuttavia, il motivo per cui eseguiresti una routine inversa su un singolo numero è un mistero per me. Ma solo per completezza, l'ho persino fatto funzionare per input di zero e uno, che normalmente si spezzerebbero perché il log pavimentato non restituisce 1 per loro.
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