Mathematica, bez 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]]]]
Rozbijmy to.
Najpierw używamy „kreatywnej arytmetyki”, aby dowiedzieć się, ile cyfr jest w liczbie: length = Ceiling[Log[10, n]];
Następnie rasteryzujemy liczbę do ładnego dużego obrazu:
Teraz pytamy o ramkę graniczną tego obrazu i wypełniamy szerokość i wysokość (faktycznie używając przesunięcia linii bazowej zamiast wysokości obrazu, ponieważ MM dodaje trochę białych znaków poniżej linii bazowej na obrazie).
Następnie NestList rekurencyjnie odejmuje szerokość obrazu podzieloną przez długość łańcucha, aby umożliwić ImageTake wyrywanie znaków z końca obrazu jeden po drugim, a te są ponownie składane przez ImageAssemble do tego obrazu:
Następnie przekazujemy to do funkcji TextRecognize do optycznego rozpoznawania znaków, która przy tym rozmiarze obrazu i jakości rasteryzacji jest w stanie bezbłędnie rozpoznać ostateczny wynik i podać nam liczbę całkowitą:
72641
Logarytmy i OCR - To jak czekolada i masło orzechowe!
Nowe i ulepszone
Ta wersja wypisuje liczbę, aby poradzić sobie z upartym zachowaniem TextRecognize z małymi liczbami, a następnie odejmuje pad na końcu. Działa to nawet w przypadku liczb jednocyfrowych!
Jednak dlaczego miałbyś wykonywać odwrotną procedurę dla jednego numeru, to dla mnie tajemnica. Ale tylko ze względu na kompletność, nawet sprawiłem, że działał on dla danych wejściowych równych zero i jeden, co normalnie by się zepsuło, ponieważ log logiczny nie zwraca dla nich 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