নম্বর প্লেট গল্ফ: স্বীকৃতি


20

আরও দেখুন: পার্সিং

ভূমিকা

আপনি একটি সরকারী প্রোগ্রামিং দলে কাজ করছেন, যারা স্পিড ক্যামেরা প্রোগ্রাম করে চলেছে। যাইহোক, গতি ক্যালকুলেটর প্রোগ্রামকারী লোকেরা খুব বেশি জায়গা নিয়েছে, তাই আপনাকে নম্বর প্লেট স্বীকৃতি সফটওয়্যারটি যতটা সম্ভব ছোট করা উচিত।

চ্যালেঞ্জ

একটি নম্বর প্লেটের একটি চিত্র দেওয়া, প্লেটে পাঠ্যটি ফেরত দিন।

নম্বর প্লেট

আপনার প্রোগ্রামটি অবশ্যই স্বীকৃতি দেবে এমন সমস্ত অক্ষর নিম্নলিখিত:

ABCDEFG

H1JKLMN0

PQRSTUVW

XYZ01234

56789

বিঃদ্রঃ

ব্রিটিশ নম্বর প্লেটে, আমি (i) এবং 1 (এক) এর জন্য অক্ষর একই এবং ও (ও) এবং 0 (শূন্য) এর অক্ষর একই। যে কারণে, সর্বদা অনুমান অক্ষর সংখ্যা হয়। অর্থাৎ নিম্নলিখিত নম্বর প্লেটটি 10 ​​(এক শূন্য):

উদাহরণ

C0D3 GLF

বি 3 টি 4 ডিসিওয়াই

এম 1 এন ইউ 15

YET1CGN

অন্যান্য বিধি

ইন্টারনেট অ্যাক্সেস এবং ওসিআর লাইব্রেরি এবং ফাংশনগুলি অনুমোদিত নয়।

নম্বর প্লেটগুলি সর্বদা উপরের চিত্রের মতো দেখায়। সমস্ত নম্বর প্লেটগুলি মোটামুটি একই আকারের হবে (ক্রপিং পদ্ধতির কারণে কিছু ভুল হবে) be

আপনার যদি কোনও নম্বর প্লেটের ক্ষয়বিহীন পিএনজি সংস্করণ প্রয়োজন হয় তবে আমি সেগুলি আপনাকে সরবরাহ করব।

স্কোরিং

বাইটের মধ্যে সংক্ষিপ্ততম প্রোগ্রামটি জিতেছে।

সমস্ত নম্বর প্লেট এই সাইটে অনুসন্ধান বারের স্ক্রিনশট


8
আপনার গতির ফাঁদে দিয়ে গাড়ি চালিয়ে যেতে আমাকে মনে করিয়ে দিন। (আমার নম্বর প্লেটে একটি চিঠি রয়েছে O)
নিল

3
হ্যাঁ, এই প্রশ্নের শিরোনামটি বেশ ভুল। কেমন হয় "OCR করুন ব্রিটিশ লাইসেন্স প্লেট" ?
লিন

3
@ নীল আমার ইউকে নম্বর প্লেটে একটি ও ও 0 উভয়ই রয়েছে এবং তারা দেখতে অভিন্ন। সঠিক ব্যাখ্যাটি কোনটি নির্ধারণ করার জন্য অবশ্যই নিয়ম রয়েছে তবে এটি সম্পূর্ণ অন্য চ্যালেঞ্জ হবে।
স্তর নদী সেন্ট

2
এটি খুব খারাপ যে অক্ষরগুলি নির্দিষ্ট প্রস্থ নয়। এটি কিছু খুব সংক্ষিপ্ত কোড সম্ভাবনা তৈরি করতে পারে।
গিটারপিকার

1
@ ইয়েটিসিজিএন আপনার ইচ্ছা আমার আদেশ;)
বিটা

উত্তর:


11

সি, 409 বাইট (এবং আমি কারও মত অবাক)

f(w,h,d,X,T,B,x,y,b,v,u,t,a)char*d;{for(x=X=0;++x<w;){for(y=b=h;y--;a=0)d[(y*w+x)*3+1]&224||(b=0,X||(X=x,T=B=y),T=y<T?y:T,B=y>B?y:B);if(X*b){for(B+=1-T,X=x-X,v=5;v--;)for(u=4;u--;a|=(b>X/4*(B/5)*.35)<<19-u*5-v)for(b=0,t=X/4;t--;)for(y=B/5;y--;)b+=!(d[((v*B/5+y+T)*w+x-X+u*X/4+t)*3+1]&224);X=!putchar("g------a----mj---et-u--6----7--8s4-c-x--q--d9xy5-0v--n-2-hw-k-----3---bf-----t-r---pzn-1---l"[a%101-7]);}}}

ইনপুট হিসাবে নেয়: চিত্রের প্রস্থ ( w) এবং উচ্চতা ( h) এবং এর পরে প্যাক করা আরজিবি ডেটা charএস ( d) এর অ্যারে হিসাবে অনুসরণ করবে । অন্যান্য সমস্ত ফাংশন প্যারামিটারগুলি ছদ্মবেশে পরিবর্তনশীল ঘোষণা। সবুজ চ্যানেল ব্যতীত সবকিছু উপেক্ষা করে এবং প্রাথমিক পাস হিসাবে 32 এর একটি প্রান্তিক প্রয়োগ করে।

প্রায়শই @ ডেভিডসি'র পদ্ধতির মতোই, এই পরীক্ষাগুলি ব্যতীত প্রতিটি নমুনা বাক্সের কমপক্ষে 35% ভরাট হয় cks আশা করি এটি স্কেল পরিবর্তনগুলিকে আরও দৃust় করে তোলে তবে কে জানে।

কোনটি নির্ভরযোগ্য আকার এবং কভারেজটি সেরা নির্ভরযোগ্যতার জন্য ব্যবহার করতে হয় (যেমন একাধিক ব্যাখ্যার সাথে একটি চরিত্রের সবচেয়ে কম ক্ষেত্রে) এটি ব্যবহার করার জন্য আমি একটি নিষ্ঠুর-শক্তি পদ্ধতি ব্যবহার করেছি। দেখা গেল যে 35% কভারেজ সহ 4x5 গ্রিডটি সবচেয়ে ভাল। তারপরে আমি অক্ষরের ডেটাটিকে একটি ছোট স্ট্রিংয়ে প্যাক করার জন্য সেরা বিট বিন্যাস এবং মডুলো মান গণনা করার জন্য একটি দ্বিতীয় ব্রুট-ফোর্স পদ্ধতি ব্যবহার করেছি - চূড়ান্ত মান% 101 পরিণত হওয়ার সাথে সাথে এক্স-y এর পরে বৃদ্ধি পেয়ে উপরের-বামে নিম্ন বিট সেরা এই চেহারা সারণী প্রদান:

-------g------a----mj---et-u--6----7--8s4-c-x--q--d9xy5-0v--n-2-hw-k-----3---bf-----t-r---pzn-1---l--

7 বিয়োগের অর্থ প্রাথমিক-প্রত্যক্ষগুলি সরানো যেতে পারে এবং শেষ 2 কোনও অতিরিক্ত কাজ ছাড়াই সরানো যেতে পারে। এই অপসারণটির অর্থ হ'ল নির্দিষ্ট অবৈধ ইনপুটগুলি একটি অবৈধ মেমরি পড়ার কারণ হতে পারে, সুতরাং এটি নির্দিষ্ট চিত্রগুলিতে সেগফল্ট করতে পারে।

ব্যবহার:

ছবিগুলিতে এটি পেতে, আমি লিপপ্যাঞ্জ ব্যবহার করে একটি মোড়ক লিখেছিলাম। এছাড়াও দেখা যাচ্ছে যে ফাইলের নাম সত্ত্বেও, প্রশ্নের মধ্যে থাকা চিত্রগুলি আসলে jpegs (!), তাই আপনাকে প্রথমে পিএনজি হিসাবে ম্যানুয়ালি রফতানি করতে হবে।

#include <png.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, const char *const *argv) {
    if(argc < 2) {
        fprintf(stderr, "Usage: %s <file.png>\n", argv[0]);
        return 1;
    }

    const char *file = argv[1];

    FILE *const fp = fopen(file, "rb");
    if(fp == NULL) {
        fprintf(stderr, "Failed to open %s for reading\n", file);
        return 1;
    }

    png_structp png_ptr = png_create_read_struct(
        PNG_LIBPNG_VER_STRING, NULL, NULL, NULL
    );

    if(!png_ptr) {
        fclose(fp);
        fprintf(stderr, "Failed to initialise LibPNG (A)\n");
        return 1;
    }

    png_infop info_ptr = png_create_info_struct(png_ptr);

    if(!info_ptr) {
        png_destroy_read_struct(&png_ptr, NULL, NULL);
        fclose(fp);
        fprintf(stderr, "Failed to initialise LibPNG (B)\n");
        return 1;
    }

    if(setjmp(png_jmpbuf(png_ptr))) {
        png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
        fclose(fp);
        fprintf(stderr, "Error while reading PNG\n");
        return 1;
    }

    png_init_io(png_ptr, fp);
    png_set_sig_bytes(png_ptr, 0);

    png_read_png(
        png_ptr, info_ptr,
        PNG_TRANSFORM_STRIP_16 |
        PNG_TRANSFORM_GRAY_TO_RGB |
        PNG_TRANSFORM_STRIP_ALPHA,
        NULL
    );
    const png_bytep *const rows = png_get_rows(png_ptr, info_ptr);
    const int w = png_get_image_width(png_ptr, info_ptr);
    const int h = png_get_image_height(png_ptr, info_ptr);
    unsigned char *const data = malloc(w*h*3 * sizeof(unsigned char));
    for(int y = 0; y < h; ++ y) {
        for(int x = 0; x < w; ++ x) {
            memcpy(&data[y*w*3], rows[y], w * 3 * sizeof(unsigned char));
        }
    }
    png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
    fclose(fp);

    f(w, h, (char*) data);

    free(data);

    return 0;
}

ভাঙ্গন

f(                          // Function
    w,h,d,                  // Parameters: width, height, RGB data
    X,T,B,x,y,b,v,u,t,a     // Variables
)char*d;{                   // K&R syntax to save lots of type decls
  for(x=X=0;++x<w;){        // Loop through each column of the image:
    for(y=b=h;y--;a=0)      //  Loop through pixels in column:
      d[(y*w+x)*3+1]&224||( //   If green < 32: (char could be signed or unsigned)
        b=0,                //    This is not a blank line
        X||(X=x,T=B=y),     //    Start a new character if not already in one
        T=y<T?y:T,          //    Record top of character
        B=y>B?y:B           //    Record bottom of character
      );
    if(X*b){                //  If we just found the end of a character:
      // Check cell grid & record bits into "a"
      for(B+=1-T,X=x-X,v=5;v--;)
        for(u=4;u--;a|=(b>X/4*(B/5)*.35)<<19-u*5-v)
          // Calculate coverage of current cell
          for(b=0,t=X/4;t--;)
            for(y=B/5;y--;)
              b+=!(d[((v*B/5+y+T)*w+x-X+u*X/4+t)*3+1]&224);

      // Look up meaning of "a" in table & print, reset X to 0
      X=!putchar(
        "g------a----mj---et-u--6----7--8s4-c-x--q--d9x"
        "y5-0v--n-2-hw-k-----3---bf-----t-r---pzn-1---l"
        [a%101-7]
      );
    }
  }
}

Freaking সঙ্গে পাইথন এবং Mathemetica প্রহার জন্য +1 সি । Oooollllld স্কুল, ইও।
রবার্ট ফ্রেজার

সি দিয়ে বিজয়ী হওয়ার জন্য +1, যেমন কখনও
ভাবেনি

12

গণিত 1170 1270 1096 1059 650 528 570 551 525 498 বাইট

সর্বশেষ সংস্করণটি প্লেট বিশ্লেষণের আগে "ছাঁটাই" করা দরকার না করে 27 বাইট সংরক্ষণ করে। পেনাল্টিমেট সংস্করণটি মূল 24 টি নমুনা পয়েন্টের মধ্যে 10 টি ব্যবহার করে 26 বাইট সংরক্ষণ করেছে।

z=Partition;h@i_:=i~PixelValue~#/.{_,_,_,z_}:>⌈z⌉&/@z[{45,99,27,81,63,81,9,63,45,63,9,45,45,45,63,45,45,27,45,9},2];f@p_:=h/@SortBy[Select[p~ColorReplace~Yellow~ComponentMeasurements~{"Image","Centroid"},100<Last@ImageDimensions@#[[2,1]]<120&],#[[2,2,1]]&][[All,2,1]]/.Thread[IntegerDigits[#,2,10]&/@(z[IntegerDigits[Subscript["ekqeuiv5pa5rsebjlic4i5886qsmvy34z5vu4e7nlg9qqe3g0p8hcioom6qrrkzv4k7c9fdc3shsm1cij7jrluo", "36"]],4]/.{a__Integer}:> FromDigits[{a}])-> Characters@"BD54TARP89Q0723Z6EFGCSWMNVYXHUJKL1"]

122 বাইটগুলি একক, বেস 36 নম্বর হিসাবে বেস 10 সংখ্যাগুলির দীর্ঘ তালিকা প্যাকিংয়ের লেজিওনম্যামাল 978 এর ধারণার মাধ্যমে সংরক্ষণ করা হয়েছে। চূড়ান্ত কোডটি ছেড়ে তিনি আরও 20 বাইট রেখেছিলেন।

528 থেকে 570 বাইটে লাফ দেওয়া অতিরিক্ত কোডের কারণে নিশ্চিত হয়েছিল যে চিঠিগুলি ফেরত পাঠানো হয়েছে যাতে লাইসেন্স প্লেটে থাকা চিঠির ক্রম অনুসারে হয়। প্রতিটি বর্ণের সেন্ট্রয়েডে এক্স-সমন্বিত থাকে যা এক্স সহ অক্ষরের তুলনামূলক অবস্থান প্রকাশ করে reve


অবহেলিত কোড

coordinates=Flatten[Table[{x,y},{y,99,0,-18},{x,9,72,18}],1];
h[img_] :=ArrayReshape[PixelValue[img, #] /. {_, _, _, z_} :>  ⌈z⌉  & /@ coordinates, {6, 4}];
plateCrop[img_]:=ColorReplace[ImageTrim[img,{{100,53},{830,160}}],Yellow];
codes={{{15,13,15,13,13,15},"B"},{{15,8,8,8,9,15},"C"},{{15,13,13,13,13,15},"D"},{{15,8,14,8,8,15},"E"},{{15,8,14,8,8,8},"F"},{{15,8,8,11,9,15},"G"},{{6,6,6,6,15,9},"A"},{{9,9,15,15,9,9},"H"},{{8,8,8,8,8,15},"L"},{{9,15,15,15,13,9},"M"},{{15,9,9,9,9,15},"0"},{{9,10,12,14,10,9},"K"},{{9,13,13,11,11,9},"N"},{{8,8,8,8,8,8},"1"},{{1,1,1,1,9,15},"J"},{{15,9,15,14,8,8},"P"},{{15,9,9,9,15,15},"Q"},{{15,9,15,14,10,11},"R"},{{15,8,12,3,1,15},"S"},{{9,15,6,6,6,6},"V"},{{15,6,6,6,6,6},"T"},{{9,15,15,15,15,15},"W"},{{9,9,9,9,9,15},"U"},{{9,14,6,6,14,9},"X"},{{9,14,6,6,6,6},"Y"},{{15,3,2,4,12,15},"Z"},{{15,9,9,9,9,15},"0"},{{8,8,8,8,8,8},"1"},{{15,1,3,6,12,15},"2"},{{15,1,3,1,9,15},"3"},{{2,6,6,15,2,2},"4"},{{7,12,14,1,1,15},"5"},{{15,8,14,9,9,15},"6"},{{15,1,2,2,6,4},"7"},{{15,9,15,9,9,15},"8"},{{15,9,15,1,9,15},"9"}};
decryptRules=Rule@@@codes;
isolateLetters[img_]:=SortBy[Select[ComponentMeasurements[plateCrop[img],{"Image","Centroid"}],ImageDimensions[#[[2,1]]][[2]]>100&],#[[2,2,1]]&][[All,2,1]]
f[plate_]:=FromDigits[#,2]&/@#&/@h/@isolateLetters[plate]/.decryptRules

সংক্ষিপ্ত বিবরণ

মূল ধারণাটি হ'ল ইনপুট চিত্র থেকে পিক্সেলের একটি নিয়মিত নমুনা বোনফাইড চিত্রগুলিতে একই অবস্থান থেকে পিক্সেলের সাথে মেলে কিনা check কোডের বেশিরভাগ অংশে প্রতিটি চরিত্রের বিট স্বাক্ষর থাকে,

চিত্রটি "জে", "পি", "কিউ" এবং "আর" অক্ষর থেকে নমুনাযুক্ত পিক্সেলগুলি দেখায়।

jpqr

পিক্সেল মানগুলিকে ম্যাট্রিক হিসাবে উপস্থাপন করা যেতে পারে। গা ,়, গা bold় 1কালো বর্ণের সাথে মিল রয়েছে। 0সাদা কোষ এর মিলা।

jjjj

এগুলি JPQ আর এর ডিক্রিপশন প্রতিস্থাপনের নিয়ম are

{1, 1, 1, 1, 9, 15} -> "জে",
{15, 9, 15, 14, 8, 8} -> "পি",
{15, 9, 9, 9, 15, 15 } -> "কিউ",
{15, 9, 15, 14, 10, 11} -> "আর"

"0" এর বিধিটি কেন তা বোঝা উচিত:

{15, 9, 9, 9, 9, 15} -> "0"

এবং এইভাবে "প্রশ্ন" বর্ণটি থেকে পৃথকযোগ্য।


নিম্নলিখিতটি চূড়ান্ত সংস্করণে ব্যবহৃত 10 পয়েন্টগুলি দেখায়। এই পয়েন্টগুলি সমস্ত অক্ষর সনাক্ত করার জন্য যথেষ্ট।

হ্রাসপ্রাপ্ত


ফাংশন কি

plateCrop[img]প্লেট থেকে ফ্রেম এবং বাম প্রান্ত অপসারণ, ব্যাকগ্রাউন্ড সাদা করে তোলে। চিত্রের উপাদানগুলি, 100 থেকে 120 পিক্সেলের উচ্চতর সম্ভাব্য অক্ষরগুলি নির্বাচন করে আমি এই ফাংশনটিকে চূড়ান্ত সংস্করণ থেকে সরিয়ে দিতে সক্ষম হয়েছি।

platecrop


isolateLetters[img] ক্রপযুক্ত চিত্র থেকে স্বতন্ত্র অক্ষর সরিয়ে দেয়।

ক্রপযুক্ত চিত্র, আউটপুট plateCropযেহেতু ইনপুট হিসাবে যায় সেগুলি দেখিয়ে এটি কীভাবে কাজ করে তা আমরা প্রদর্শন করতে পারি isolateLetters। আউটপুটটি স্বতন্ত্র অক্ষরের একটি তালিকা

অক্ষর


Coordinatesপিক্সেল রঙ চেক করার জন্য 24 সমানভাবে বিতরণ করা অবস্থান are স্থানাঙ্কগুলি প্রথম চিত্রের সাথে মিলে যায়।

coordinates=Flatten[Table[{x,y},{y,99,0,-18},{x,9,72,18}],1];

{, 9, 99}, {27, 99}, {45, 99}, {63, 99}, {9, 81}, {27, 81}, {45, 81}, {63, 81}, { 9, 63}, {27, 63}, {45, 63}, {63, 63}, {9, 45}, {27, 45}, {45, 45}, {63, 45}, {9, 27, {27, 27}, {45, 27}, {63, 27}, {9, 9}, {27, 9}, {45, 9}, {63, 9}


h পিক্সেলগুলিকে বাইনারি রূপান্তরিত করে।

h[img_] :=ArrayReshape[PixelValue[img, #] /. {_, _, _, z_} :>  ⌈z⌉  & /@ coordinates, {6, 4}];

codesপ্রতিটি চরিত্রের স্বাক্ষর। দশমিক মানগুলি কালো (0) এবং হোয়াইট (1) কোষের জন্য বাইনারি কোডের সংক্ষেপণ। গল্ফযুক্ত সংস্করণে, বেস 36 ব্যবহার করা হয়।

codes={{{15, 9, 9, 9, 9, 15}, "0"}, {{8, 8, 8, 8, 8, 8}, "1"}, {{15, 1, 3,6,12, 15}, "2"}, {{15, 1, 3, 1, 9, 15}, "3"}, {{2, 6, 6, 15, 2, 2}, "4"}, {{7, 12, 14, 1, 1, 15},"5"}, {{15, 8, 14, 9, 9, 15}, "6"}, {{15, 1, 2, 2, 6, 4},"7"}, {{15, 9, 15, 9, 9, 15}, "8"}, {{15, 9, 15, 1, 9, 15},"9"}, {{6, 6, 6, 6, 15, 9}, "A"}, {{15, 13, 15, 13, 13, 15}, "B"}, {{15, 8, 8, 8, 9, 15}, "C"}, {{15, 13, 13, 13, 13, 15}, "D"}, {{15, 8, 14, 8, 8, 15}, "E"}, {{15, 8, 14, 8, 8, 8},"F"}, {{15, 8, 8, 11, 9, 15}, "G"}, {{9, 9, 15, 15, 9, 9}, "H"}, {{1, 1, 1, 1, 9, 15}, "J"}, {{9, 10, 12, 14, 10, 9}, "K"}, {{8, 8, 8, 8, 8, 15}, "L"}, {{9, 15, 15, 15, 13, 9}, "M"}, {{9, 13, 13, 11, 11, 9}, "N"}, {{15, 9, 15, 14, 8, 8}, "P"}, {{15, 9, 9, 9, 15, 15}, "Q"}, {{15, 9, 15, 14, 10, 11}, "R"}, {{15, 8, 12, 3, 1, 15}, "S"}, {{15, 6, 6, 6, 6, 6}, "T"}, {{9, 9, 9, 9, 9, 15}, "U"}, {{9, 15, 6, 6, 6, 6}, "V"}, {{9, 15, 15, 15, 15, 15}, "W"}, {{9, 14, 6, 6, 14, 9}, "X"}, {{9, 14, 6, 6, 6, 6}, "Y"}, {{15, 3, 2, 4, 12, 15}, "Z"}};

(* decryptRulesস্ব স্ব স্ব স্ব চরিত্রের সাথে প্রতিস্থাপনের জন্য *)

decryptRules=Rule@@@codes;

f একটি ফাংশন যা লাইসেন্স প্লেটের একটি চিত্র নেয় এবং একটি চিঠি দেয়।

f[plate_]:=FromDigits[#,2]&/@#&/@h/@isolate[plateCrop@plate]/.decryptRules;

প্লেট

{"এ", "বি", "সি", "ডি", "ই", "এফ", "জি"}
H "এইচ", "1", "জে", "কে", "এল", "এম", "এন", "0"}
P "পি", "কিউ", "আর", "এস", "টি", "ইউ", "ভি", "ডাব্লু"}
X "এক্স", "Y", "জেড", "0", "1", "2", "3", "4"}
5 "5", "6", "7", "8", "9"


Golfed

কোডটি প্রতিটি অক্ষরের জন্য সমস্ত 24 বিট (সাদা বা কালো) উপস্থাপন করতে একক দশমিক সংখ্যা ব্যবহার করে সংক্ষিপ্ত করা হয়। উদাহরণস্বরূপ, পত্র "জে" নিম্নলিখিত প্রতিস্থাপন নিয়ম ব্যবহার করে: 1118623 -> "J"

1118623 এর সাথে সম্পর্কিত

IntegerDigits[1118623 , 2, 24]

{0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1 1

যা হিসাবে repackaged করা যেতে পারে

ArrayReshape[{0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1}, {6, 4}]

{{0, 0, 0, 1}, {0, 0, 0, 1}, {0, 0, 0, 1}, {0, 0, 0, 1}, {1, 0, 0, 1} , {1, 1, 1, 1}

এটি কেবল "জে" এর ম্যাট্রিক্স যা আমরা উপরে দেখলাম।

%//MatrixForm

জরায়ু

বর্ণের "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ"তালিকা হিসাবে বর্ণের প্রতিনিধিত্ব করার পরিবর্তে আর এক সঞ্চয় আসে ।

পরিশেষে, দীর্ঘ সংস্করণ থেকে সমস্ত ফাংশন পৃথকভাবে সংজ্ঞায়িত না hকরে ফাংশনে সংহত করা হয়েছিল f


h@i_:=ArrayReshape[i~PixelValue~#/.{_,_,_,z_}:>⌈z⌉&/@Join@@Table[{x,y},{y,99,0,-18},{x,9,72,18}],{6,4}];f@p_:=#~FromDigits~2&/@(Join@@@h/@SortBy[Select[p~ImageTrim~{{100,53},{830,160}}~ColorReplace~Yellow~ComponentMeasurements~{"Image","Centroid"},Last@ImageDimensions@#[[2,1]]>100&],#[[2,2,1]]&][[;;,2,1]])/.Thread[IntegerDigits[36^^1c01agxiuxom9ds3c3cskcp0esglxf68g235g1d27jethy2e1lbttwk1xj6yf590oin0ny1r45wc1i6yu68zxnm2jnb8vkkjc5yu06t05l0xnqhw9oi2lwvzd5f6lsvsb4izs1kse3xvx694zwxz007pnj8f6n,8^8]->Characters@"J4A51LUHKNYXVMW732ZTCGSFE60Q98PRDB"]

@ ডেভিডসি দেখে মনে হচ্ছে এসই এলোমেলো হয়েছে; প্রতিস্থাপন চেষ্টা {1118623, 2518818, ..., 16645599}সঙ্গে এই
LegionMammal978

@ লিজনম্যামাল978, আপনার পরামর্শের ফলে 100 বাইটের বেশি দিয়ে কোডটি সংক্ষিপ্ত করা যায়। আমি এখন আরও ভালভাবে বুঝতে পারি যে ম্যাথমেটিকা ​​কীভাবে বেসগুলি পরিচালনা করে।
ডেভিডসি

@ ডেভিডসি এছাড়াও এটির মতো মনে হচ্ছে কিছু গোপন স্পেস আপনার গল্ফড কোডটি ছড়িয়ে পড়ে এবং আমি এটি ছাড়াই 571 বাইট গণনা করি। অতিরিক্তভাবে, কিছু ফাংশন ইনফিক্স ফর্মে রূপান্তরিত হতে পারে। x[[All,2,1]]সঙ্গে প্রতিস্থাপন করা যেতে পারে x[[;;,2,1]]Flatten[x,1]সমান Join@@x, এবং Flatten[#,1]&/@xসমতুল্য Join@@@x। আরও কয়েকটি ছোট ছোট অপটিমাইজেশন রয়েছে যা করা যেতে পারে। এই গল্ফগুলির পরে 551-বাইট কোড।
LegionMammal978

সুন্দর টিপস এবং যত্ন সহকারে পড়া। ধন্যবাদ।
ডেভিডসি

স্যাম্পলিং পয়েন্টগুলি এদিক ওদিক ঘুরিয়ে দিয়ে আপনি কি ছোট করার চেষ্টা করেছেন?
স্পার

4

সি #, 1040 1027 বাইট

using System;using System.Drawing;class _{static Bitmap i;static bool b(int x,int y)=>i.GetPixel(x,y).GetBrightness()<.4;static char l(int x,int y){if(y<45)return b(x+5,145)?((b(x+30,100)||b(x+30,50))?(b(x+68,94)?(b(x+40,50)?'D':b(x+40,120)?(b(x+45,80)?'M':'N'):'H'):b(x,97)?(b(x+30,140)?'E':b(x+60,70)?(b(x+50,140)?'R':'P'):'F'):b(x+65,45)?(b(x+5,100)?'K':b(x+30,145)?'Z':'X'):'B'):b(x+30,140)?'L':'1'):b(x+30,55)?(b(x+60,70)?'7':'T'):b(x+2,100)?'U':b(x+30,70)?'W':b(x+15,100)?'V':'Y';if(y<70)return b(x+50,110)?(b(x+50,70)?(b(x+10,110)?(b(x+30,100)?(b(x+55,80)?'8':'6'):b(x+55,80)?'0':'G'):b(x+10,70)?(b(x+60,80)?'9':'S'):b(x+60,120)?'3':'2'):'G'):b(x+30,125)?'Q':'C';if(y>150)return'A';if(y>120)return'J';else return b(x+10,135)?'5':'4';}static void Main(string[]z){i=new Bitmap(Console.ReadLine());bool s=true;int w=int.MinValue;for(int x=100;x<800;++x){for(int y=40;y<160;++y)if(s){if(b(x,y)){if(w>50)Console.Write(' ');Console.Write(l(x,y));s=false;goto e;}}else if(b(x,y))goto e;if(!s){s=true;w=0;}else++w;e:continue;}}}

Ungolfed:

using System;
using System.Drawing;

class _
{
    static Bitmap bmp;
    static bool b(int x, int y) => bmp.GetPixel(x, y).GetBrightness() < .4;
    static char l(int x, int y)
    {
        if (y < 45)
            return b(x + 5, 145) ? ((b(x + 30, 100) || b(x + 30, 50)) ? (b(x + 68, 94) ? (b(x + 40, 50) ? 'D' : b(x + 40, 120) ? (b(x + 45, 80) ? 'M' : 'N') : 'H') : b(x, 97) ? (b(x + 30, 140) ? 'E' : b(x + 60, 70) ? (b(x + 50, 140) ? 'R' : 'P') : 'F') : b(x + 65, 45) ? (b(x + 5, 100) ? 'K' : b(x + 30, 145) ? 'Z' : 'X') : 'B') : b(x + 30, 140) ? 'L' : '1') : b(x + 30, 55) ? (b(x + 60, 70) ? '7' : 'T') : b(x + 2, 100) ? 'U' : b(x + 30, 70) ? 'W' : b(x + 15, 100) ? 'V' : 'Y';
        if (y < 70)
            return b(x + 50, 110) ? (b(x + 50, 70) ? (b(x + 10, 110) ? (b(x + 30, 100) ? (b(x + 55, 80) ? '8' : '6') : b(x + 55, 80) ? '0' : 'G') : b(x + 10, 70) ? (b(x + 60, 80) ? '9' : 'S') : b(x + 60, 120) ? '3' : '2') : 'G') : b(x + 30, 125) ? 'Q' : 'C';
        if (y > 150)
            return 'A';
        if (y > 120)
            return 'J';
        if (y > 95)
            return b(x + 10, 135) ? '5' : '4';
        return '-';
    }
    static void Main(string[] args)
    {
        bmp = new Bitmap(Console.ReadLine());
        bool state = true;
        int space = int.MinValue;
        for (int x = 100; x < 800; ++x)
        {
            for (int y = 40; y < 160; ++y)
                if (state)
                {
                    if (b(x, y))
                    {
                        if (space > 50)
                            Console.Write(' ');
                        Console.Write(l(x, y));
                        state = false;
                        goto bad;
                    }
                }
                else if (b(x, y))
                    goto bad;
            if (!state)
            {
                state = true;
                space = 0;
            }
            else
                ++space;
            bad:
            continue;
        }
    }
}

মূলত আমি প্রতিটি বর্ণের পরিচয় নির্ধারণ করতে হলুদ / কালো যাচাই করার জন্য কিছু নির্দিষ্ট রেফারেন্স পয়েন্ট পেয়েছি।


আপনি কি নিশ্চিত যে সরবরাহ করা চিত্রগুলিতে কোনও উপকার নেই এবং এটি এমন লাইসেন্স প্লেটগুলিকে স্বীকৃতি দেবে যেখানে অক্ষরগুলি যেমন 10 পিক্সেল দ্বারা স্থানান্তরিত হয়?
ইয়েটিসিজিএন

@ ইটিসিজিএন এটির আকারটি একই হিসাবে এটি দীর্ঘস্থায়ী হওয়া উচিত এবং তারা একই উল্লম্ব অবস্থানে রয়েছে। আমি প্রদত্ত সমস্ত উদাহরণ দিয়ে চেষ্টা করেছি এবং এটি কার্যকর হয়; দয়া করে আপনি যদি এটির সন্ধান করেন তবে তা আমাকে জানান
নিক মের্টিন

আমি কেবল এর জন্য ভিজ্যুয়াল স্টুডিও ইনস্টল করতে চাই না, তবে আপনি i.imgur.com/i8jkCJu.png চেষ্টা করতে পারেন যা আকারে কিছুটা ছোট। আমি মনে করি এটি নিরাপদ মনে করি যে সমস্ত জমাটি সেই নির্দিষ্ট ওয়েবসাইটের চিত্র হবে। প্রথমদিকে আমার মন্তব্যটি "এটি যদি সত্যিকারের প্লেট স্ক্যান হয় তবে কি হবে?" / "যদি অন্য কেউ সমস্ত প্লেট 10 পিক্সেল দ্বারা উল্লম্বভাবে একটি প্লেট স্থানান্তরিত করে তবে কী হবে?"
ইয়েটিসিজিএন

@ ইয়েটিসিজিএন আপনার সংকলনের জন্য ভিজ্যুয়াল স্টুডিওর প্রয়োজন হবে নাcsc.exe main.cs /r:System.Drawing.dll
ভিজুয়ালমেলন

2

পিএইচপি - 1741 1674 1143 বাইট

প্রথম কয়েকটি উদাহরণ থেকে অক্ষরের প্রোফাইলগুলি শিখিয়ে এটি প্রথম স্থাপন করা হয়েছিল, যা প্রতিটি অক্ষরকে ছয় সংখ্যায় সংক্ষিপ্ত করে তোলে। আমি ছয়টি বেছে নিয়েছিলাম কারণ আমার কাছে পাঁচটি ছিল এবং এটি আমার পছন্দ মতো দুর্দান্ত কাজ করে নি তবে ছয়টি আরও ভালভাবে কাজ করছে বলে মনে হচ্ছে। অপ্টিমাইজেশনের বেশিরভাগ অংশে এই প্রোফাইলগুলিকে ছোট এবং ছোট বাইট গণনায় অন্তর্ভুক্ত করা হয়।

প্রথম এবং দ্বিতীয় প্রোফাইল *lhdfdnএবং |nnmmkkনীচে নীচে "জিবি" সহ নীল ব্লব *এবং ডান সীমানা |, যা আমরা উপেক্ষা করছি। এগুলি অন্তর্ভুক্ত করা আরও নিরাপদ যাতে ব্লব এবং ডান সীমানার কিছু মিল থাকে।

যে কোনও ইমেজ ফর্ম্যাটটি হ্যান্ডেল করা উচিত, যে কোনও যুক্তিসঙ্গত স্কেলিং যদি দিকের অনুপাত খুব বেশি না পরিবর্তিত হয়, হালকা রঙের গা dark় অন্ধকার, এমনকি কিছুটা গোলমাল এবং ছায়াময়!

এটির সীমানা দরকার, কমপক্ষে উপরে এবং নীচে, এটি প্রোফাইলের অংশ।

<?php $X=[];foreach(str_split('*lhdfdn|nnmmkkA<njjk;BOnKB`^Chn::E7DHn?1X`EnkGGD4Fn_330!Gnj9G[IHnX!!XnJ%(##knKnX.EN6LnX!!!!Mn_<:bnNn^77_nPn^33@6QhfBDjnRn_8LaDSOlYYnUT$$nn$$Uh_##^nV9c][n;W_nWTlhXHnLTiCY4LhnM5ZJbnmaI0ng88lk1nnnnnn2C[__n`34B?Kna4+=Fnb"5NnUReX6gnKKaM7*4Xnb=8gkIIne9K`KKni',7)as$s){$t=[];foreach(str_split(substr($s,1))as$u)$t[]=ord($u)-11;$X[$s[0]]=$t;}echo m(r($argv[1]),$X)."\n";function r($u){$a=[];$i=imagecreatefromstring(file_get_contents($u));$w=imagesx($i);$h=imagesy($i);$s=[];for($x=0;$x<$w;$x++){$s[$x]=0;for($y=0;$y<$h;$y++){$p=imagecolorsforindex($i,imagecolorat($i,$x,$y));if(3*$p['red']+6*$p['green']+$p['blue']<1280)$s[$x]++;}}$j=0;$k=[];for($x=0;$x<$w;$x++){if($s[$x]>$h/10)for($o=0;$o<6;$o++)$k[]=$s[$x];elseif(count($k)){$a[]=$k;$j++;$k=[];}}$b=[];foreach($a as$v){$t=[];$u=array_chunk($v,intval(count($v)/6));foreach($u as$c)$t[]=array_sum($c)/count($c);$m=99/max($t);$e=[];foreach($t as$x)$e[]=intval($x*$m+0.5);$b[]=$e;}return$b;}function m($A,$X){$r='';foreach($A as$a){$s=INF;$c='';foreach($X as$k=>$x){$t=0;for($i=0;$i<6;$i++)$t+=pow($a[$i]-$x[$i],2);if($s>$t){$s=$t;$c=$k;}}$r.=$c;}return trim($r,'|*');}

হিসাবে সংরক্ষণ করুন ocr.php, তারপরে কমান্ড লাইন থেকে চালান:

$ php ocr.php http://i.imgur.com/UfI63md.png
ABCDEFG

$ php ocr.php http://i.imgur.com/oSAK7dy.png
H1JKLMN0

$ php ocr.php http://i.imgur.com/inuIHjm.png
PQRSTUVW

$ php ocr.php http://i.imgur.com/Th0QkhT.png
XYZ01234

$ php ocr.php http://i.imgur.com/igH3ZPQ.png
56789

$ php ocr.php http://i.imgur.com/YfVwebo.png
10

$ php ocr.php http://i.imgur.com/3ibQARb.png
C0D3GLF

$ php ocr.php http://i.imgur.com/c7XZqhL.png
B3T4DCY

$ php ocr.php http://i.imgur.com/ysBgXhn.png
M1NUS15

আগ্রহী তাদের জন্য, এখানে শেখার কোডটি দেওয়া আছে। হিসাবে সংরক্ষণ করুন learn.phpএবং কমান্ড লাইন থেকে চালানো, কোন আর্গুমেন্ট।

<?php

define('BANDS', 6);

main();

function main()
{
    $glyphs = [];

    learn($glyphs, 'http://imgur.com/UfI63md.png', '*ABCDEFG|');
    learn($glyphs, 'http://imgur.com/oSAK7dy.png', '*H1JKLMN0|');
    learn($glyphs, 'http://imgur.com/inuIHjm.png', '*PQRSTUVW|');
    learn($glyphs, 'http://imgur.com/Th0QkhT.png', '*XYZ01234|');
    learn($glyphs, 'http://imgur.com/igH3ZPQ.png', '*56789|');

    $profiles = summarize($glyphs);

    foreach ($profiles as $glyph=>$profile)
    {
        print $glyph;
        foreach ($profile as $value)
            print chr($value + 11);
        print "\n";
    }
}

function learn(&$glyphs, $url, $answer)
{
    $image = imagecreatefromstring(file_get_contents($url));
    $width = imagesx($image);
    $height = imagesy($image);
    $counts = [];
    for ($x = 0; $x < $width; $x++)
    {
        $counts[$x] = 0;
        for ($y = 0; $y < $height; $y++)
        {
            $pixel = imagecolorsforindex($image, imagecolorat($image, $x, $y));
            if (3 * $pixel['red'] + 6 * $pixel['green'] + $pixel['blue'] < 1280)
                $counts[$x]++;
        }
    }

    $index = 0;
    $expanded = [];
    for ($x = 0; $x < $width; $x++)
    {
        if ($counts[$x] > $height / 10)
            for ($inner = 0; $inner < BANDS; $inner++)
                $expanded[] = $counts[$x];
        else if (count($expanded)) {
            $glyphs[$answer[$index]] = $expanded;
            $index++;
            $expanded = [];
        }
    }
}

function summarize($glyphs)
{
    $profiles = [];
    foreach ($glyphs as $glyph=>$expanded)
    {
        $averages = [];
        $bands = array_chunk($expanded, count($expanded) / BANDS);
        foreach ($bands as $band)
            $averages[] = array_sum($band) / count($band);
        $scaling = 99 / max($averages);
        $profile = [];
        foreach ($averages as $average)
            $profile[] = intval($average * $scaling + 0.5);
        $profiles[$glyph] = $profile;
    }
    return $profiles;
}

?>

আপনার আউটপুটে ফাঁকা স্থানগুলি অন্তর্ভুক্ত করা উচিত
বিটা ডিকায়

3
এটি নীচের চশমাগুলিতে নয় নীচে আপনার প্রোগ্রামটি যে অক্ষরগুলি অবশ্যই স্বীকৃতি দেবে সেগুলি হ'ল এএইচ, জেএন, পিজেড এবং 0-9। জায়গাগুলির কোনও উল্লেখ নেই।

ওহ, ঠিক আছে, আপনার তখন ঠিক আছে
বিটা ডেক

"প্রথম এবং দ্বিতীয় প্রোফাইল [...] আসলে নীচে নীচে" জিবি "সহ নীল ব্লব এবং ডান সীমানা, যা আমরা উপেক্ষা করছি" " তাহলে আপনি কেন তাদের কোডটিতে অন্তর্ভুক্ত করলেন, বিশেষত যদি খালি স্ট্রিং সহ অ্যারে কী ওভাররাইট করা হয়? প্লাস: কোড গল্ফের জন্য এটি শর্ট ওপেন সিনট্যাক্স ব্যবহারের অনুমতি রয়েছে! :-)
ইটিসিজিএন

@ ইয়েটিসিজিএন - যদি তা না হয় তবে কোডগুলি তাদের সাথে অন্য কোনও কিছুতে মিলানোর চেষ্টা করবে! আমি বুঝতে পারি নি যে তারা ওভাররাইট হয়েছে, ভাগ্যবান কোডটি এখনও কাজ করে। পরিমার্জনা করেছেন বারবার। আপনি আমার উত্তরের সাথে আমার কিছু পরিবর্তন মানিয়ে নিতে সক্ষম হতে পারেন।

0

পিএইচপি, 971 970 বাইট

উপর প্রচন্ডভাবে আঁকে Yimin রঙ এর উত্তর , যা গুরুত্বের নিচে golfed যেতে পারে, বিশেষ করে অ্যারের সূচকগুলি, এবং gzip, কম্প্রেশন সঙ্গে একটি Phar পুরা।

ফার ডাউনলোড করুন

এটি 1557 1535 বাইটে আমার উন্নত বেস সংস্করণ , কেবল ফাইল নাম "ও" এর অধীনে সংরক্ষিত:

<?$X=[[99,92,45,45,97,96],[99,99,99,99,99,99],[56,80,84,84,99,85],[41,55,52,64,99,86],[32,50,59,99,87,23],[67,99,74,71,90,77],[92,99,64,64,86,66],[31,41,77,99,87,50],[92,96,62,62,99,90],[64,85,64,64,99,94],''=>[99,99,98,98,96,96],A=>[49,99,95,95,96,48],B=>[68,99,64,55,85,83],C=>[93,99,47,47,58,44],D=>[61,99,52,38,77,85],E=>[99,96,60,60,57,41],F=>[99,84,40,40,37,22],G=>[99,95,46,60,80,62],H=>[99,77,22,22,77,99],1=>[99,99,99,99,99,99],J=>[26,29,24,24,96,99],K=>[99,77,35,58,67,43],L=>[99,77,22,22,22,22],M=>[99,84,49,47,87,99],N=>[99,83,44,44,84,99],P=>[99,83,40,40,53,43],Q=>[93,91,55,57,95,99],R=>[99,84,45,65,86,57],S=>[68,97,78,78,99,74],T=>[25,25,99,99,25,25],U=>[93,84,24,24,83,99],V=>[46,88,82,80,99,48],W=>[84,99,76,73,97,93],X=>[61,99,65,73,94,56],Y=>[41,65,93,99,66,42],Z=>[63,87,99,98,86,62]];echo m(r($argv[1]),$X);function r($u){$a=[];$i=imagecreatefromstring(join('',file($u)));$w=imagesx($i);$h=imagesy($i);$s=[];for(;$x<$w;$x++){$s[$x]=0;for($y=0;$y<$h;$y++){$p=imagecolorsforindex($i,imagecolorat($i,$x,$y));if(3*$p[red]+6*$p[green]+$p[blue]<1280)$s[$x]++;}}$j=0;$k=[];for(;$z<$w;$z++){if($s[$z]>$h/10)for($o=0;$o<6;$o++)$k[]=$s[$z];elseif(count($k)){$a[]=$k;$j++;$k=[];}}$b=[];foreach($a as$v){$t=[];$u=array_chunk($v,~~(count($v)/6));foreach($u as$c)$t[]=array_sum($c)/count($c);$m=99/max($t);$e=[];foreach($t as$x)$e[]=~~($x*$m+.5);$b[]=$e;}return$b;}function m($A,$X){$r='';foreach($A as$a){$s=INF;$c='';foreach($X as$k=>$x){$t=0;for($i=0;$i<6;)$t+=($a[$i]-$x[$i++])**2;if($s>$t){$s=$t;$c=$k;}}$r.=$c;}return$r;}

উন্নতি:

1 ম পর্যায়

  • সংখ্যার অ্যারে সূচকগুলি সরানো হয়েছে এবং অ্যারেটিকে পুনরায় সাজিয়েছে, স্ট্রিং সূচকগুলি অন্তর্নিহিত স্থিরূপ হিসাবে

২ য় পর্যায়

  • প্রতিস্থাপিত intvalসঙ্গে ~~(সংরক্ষণ 8 বাইট, দুই occurences)
  • অপ্রয়োজনীয় যেখানে জন্য লুপ প্রারম্ভিকরণ অপসারণ
  • file_get_contents($u)প্রতিস্থাপন join('',file($u))(5 বাইট সাশ্রয়)
  • এবং কয়েক অন্যান্য

দুর্ভাগ্যক্রমে, দ্বিতীয় স্তরের সমস্ত উন্নতি কেবল 1 বাইট কম জিজেপড কোডে অনুবাদ করে। :-D

এবং এই কোডটি ফার তৈরি করতে ব্যবহৃত হয়েছিল:

<?php
$phar = new Phar('o.phar');
$phar->addFile('o');
$phar['o']->compress(Phar::GZ);
$phar->setStub('<?Phar::mapPhar(o.phar);include"phar://o.phar/o";__HALT_COMPILER();');

টেস্ট php ocr.phar http://i.imgur.com/i8jkCJu.pngকেস ইমেজগুলির সাথে পরীক্ষা করুন বা অন্য কোনও

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.