Toán học, không có 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]]]]
Hãy phá vỡ nó.
Đầu tiên chúng tôi sử dụng một số "mỹ phẩm sáng tạo" để tìm hiểu có bao nhiêu chữ số trong số: length = Ceiling[Log[10, n]];
Tiếp theo, chúng tôi Rasterize số thành một hình ảnh lớn đẹp:
Bây giờ chúng tôi truy vấn hộp giới hạn của hình ảnh đó và điền vào chiều rộng và chiều cao (thực tế sử dụng phần bù đường cơ sở thay vì chiều cao hình ảnh, vì MM thêm một số khoảng trắng bên dưới đường cơ sở trong hình ảnh).
Tiếp theo, NestList trừ đi độ rộng của hình ảnh chia cho chiều dài của chuỗi để cho phép ImageTake nhổ từng ký tự từ cuối hình ảnh một và từng cái được ImageAssemble ghép lại với hình ảnh này:
Sau đó, chúng tôi chuyển nó sang chức năng TextRecognize để nhận dạng ký tự quang học, với kích thước hình ảnh và chất lượng rasterization này có thể nhận ra hoàn hảo đầu ra cuối cùng và cung cấp cho chúng tôi số nguyên:
72641
Logarit và OCR - Nó giống như sô cô la và bơ đậu phộng!
Mới và cải tiến
Phiên bản này loại bỏ số để xử lý hành vi cố chấp của TextRecognize với số lượng nhỏ, và sau đó trừ đi phần đệm ở cuối. Điều này thậm chí hoạt động cho các số một chữ số!
Mặc dù, tại sao bạn lại chạy một thói quen đảo ngược trên một số duy nhất là một bí ẩn đối với tôi. Nhưng chỉ vì mục đích hoàn chỉnh, tôi thậm chí còn làm cho nó hoạt động với các đầu vào bằng 0 và một, thường sẽ bị hỏng vì nhật ký thả nổi không trả về 1 cho chúng.
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