Mathematica, tanpa 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]]]]
Mari kita jabarkan.
Pertama-tama kita menggunakan beberapa "aritmatika kreatif" untuk mencari tahu berapa digit dalam angka: length = Ceiling[Log[10, n]];
Selanjutnya, kami Rasterize nomor ke gambar besar yang bagus:
Sekarang kita kueri untuk kotak pembatas dari gambar itu, dan mengisi lebar dan tinggi (sebenarnya menggunakan offset dasar alih-alih tinggi gambar, karena MM menambahkan beberapa spasi putih di bawah garis dasar pada gambar).
Selanjutnya, NestList secara berulang mengurangi lebar gambar dibagi dengan panjang string untuk memungkinkan ImageTake memetik karakter dari ujung gambar satu per satu, dan itu disusun kembali oleh ImageAssemble ke gambar ini:
Kemudian kami meneruskannya ke fungsi TextRecognize untuk pengenalan karakter optik, yang pada ukuran gambar ini dan kualitas rasterisasi mampu mengenali hasil akhir tanpa cela dan memberi kami integer:
72641
Logaritma dan OCR - Ini seperti cokelat dan selai kacang!
Baru dan ditingkatkan
Versi ini melengkapi nomor untuk berurusan dengan perilaku keras kepala dari TextRecognize dengan angka kecil, dan kemudian kurangi bantalan pada akhir. Ini bahkan berfungsi untuk angka satu digit!
Padahal, mengapa Anda menjalankan rutinitas terbalik pada satu nomor merupakan misteri bagi saya. Tetapi hanya demi kelengkapan, saya bahkan membuatnya bekerja untuk input nol dan satu, yang biasanya akan rusak karena log lantai tidak mengembalikan 1 untuk mereka.
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