Mathematica ไม่มีแบบโมดูโล!
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