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がイメージの末尾から文字を1つずつ抜き取り、ImageAssembleによってこのイメージに再アセンブルします。
次に、それを光学文字認識のTextRecognize関数に渡します。この関数は、この画像サイズとラスター化品質で最終出力を完璧に認識し、整数を与えることができます。
72641
対数とOCR-チョコレートとピーナッツバターのようなものです!
新しくなり改善された
このバージョンでは、小さな数字でTextRecognizeの頑固な動作に対処するために数字を埋めてから、最後のパッドを差し引きます。これは1桁の数字でも機能します!
しかし、なぜあなたは単一の番号で逆ルーチンを実行するのかは私には謎です。しかし、完全を期すために、0と1の入力に対しても機能させました。これは、フロアログが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