এএসসিআইআই আর্ট নম্বরগুলি সনাক্ত করুন


15

চ্যালেঞ্জ

এএসসিআইআই আর্ট নম্বরগুলি সনাক্ত করুন। জিনিসগুলিকে আকর্ষণীয় করে তোলার জন্য, চিত্রের তিনটি এলোমেলো পয়েন্টগুলি উল্টানো যেতে পারে। উদাহরণ স্বরূপ:

 ***** 
 *  ** 
    ** 

   **  
  **   
 **    

ইনপুট

নীচে পাইথন স্ক্রিপ্ট দ্বারা উত্পন্ন একটি 7x7 ASCII আর্ট নম্বর।

আউটপুট

একটি অঙ্ক।

স্ক্রিপ্ট পরীক্ষা করা হচ্ছে

পরীক্ষার কেসগুলি তৈরি করতে এখানে পাইথন স্ক্রিপ্ট (২.6+) রয়েছে:

import random

digits = '''\
  ***  
 ** ** 
**   **
**   **
**   **
 ** ** 
  ***  

   *   
 ***   
   *   
   *   
   *   
   *   
 ***** 

  ***  
 *  ** 
     * 
    ** 
   **  
  **   
 ******

  ***  
 *  ** 
     * 
  ***  
     * 
 *  ** 
  ***  

   **  
  ***  
 * **  
*  **  
****** 
   **  
   **  

 ***** 
 **    
 ****  
     * 
     * 
 *   * 
  ***  

  **** 
 **    
 ***** 
 *   * 
 **  **
 **  * 
  **** 

 ***** 
    ** 
    ** 
   **  
   **  
  **   
 **    

  **** 
 **  **
 **  **
  **** 
 **  **
 **  **
  **** 

  ***  
 ** ** 
**   **
 **  * 
  **** 
    ** 
 ****  '''.split('\n\n')

def speckle(image, num_speckles):
    grid = [list(row) for row in image.split('\n')]

    for i in range(num_speckles):
        row = random.choice(grid)
        row[random.randint(0, 6)] = random.choice([' ', '*'])

    return '\n'.join([''.join(row) for row in grid])

digit = random.choice(digits)

print(speckle(digit, 3))

আপনি কি নিশ্চিত যে প্রতি দুটি সংখ্যার মধ্যে হামিংয়ের দূরত্ব 6 টিরও বেশি?
জন ডিভোরাক

@ জনডভোরাক: আমি ফন্টটি টুইট করেছি যাতে এটি কোনও সমস্যা না হয়। আপনি একটি দেখতে পাচ্ছেন?
ব্লেন্ডার

উত্তর:


9

এপিএল ( 87 85)

1-⍨⊃⍒(,↑{7↑'*'=⍞}¨⍳7)∘(+.=)¨{49↑,(16/2)⊤⎕UCS⍵}¨↓10 3⍴'嵝䍝뫂傁ဣ␋䠁䊫낫䢝䊅넂垵僡ᑨ嘙쐅嘹䜝䪀슪퀪岹亝尵䌧뮢'

ব্যাখ্যা:

প্রতিটি সম্ভাব্য ASCII নম্বর 48 বিটগুলিতে এনকোড করা হয়। (49 তম বিট যাইহোক সর্বদা শূন্য থাকে)। স্ট্রিংটিতে 嵝䍝뫂傁ဣ␋䠁䊫낫䢝䊅넂垵僡ᑨ嘙쐅嘹䜝䪀슪퀪岹亝尵䌧뮢ASCII সংখ্যা অনুযায়ী তিনটি অক্ষর রয়েছে, যার প্রতিটিটিতে 16 বিট এনকোড হয়।

  • ↓10 3⍴: ডেটা স্ট্রিংকে 10 3-চর গ্রুপগুলিতে বিভক্ত করুন, যার প্রত্যেকটিতে একটি সংখ্যা এনকোড হয়।
  • {... : প্রতিটি দলের জন্য:
    • (16/2)⊤⎕UCS⍵: তিনটি অক্ষরের প্রত্যেকের প্রথম 16 বিট পান
    • ,: বিট অ্যারেগুলিকে এক অ্যারেতে সংযুক্ত করুন
    • 49↑: প্রথম 49 উপাদান নিন। এখানে কেবল 48 টি রয়েছে, সুতরাং 0এটি শেষে একটি যোগ করার সমতুল্য ।
  • ,↑{7↑'*'=⍞}¨⍳7: কীবোর্ড থেকে characters টি অক্ষরের 7 টি লাইন পড়ুন, প্রতিটি লাইনের জন্য কিছুটা অ্যারে তৈরি করুন যেখানে 1অক্ষরটি ছিল তার অর্থ *এবং তাদের একসাথে যোগদান করুন।
  • (+.=)¨: প্রতিটি সম্ভাব্য অঙ্কের জন্য, অঙ্কটির সাথে ইনপুটটিতে কত বিট ছিল তা গণনা করুন।
  • : তালিকার নীচের দিকে সাজানোর জন্য সূচকগুলি পান, যাতে ফলাফলের প্রথম আইটেমটি পূর্বের তালিকার বৃহত্তম সংখ্যার সূচক হয়।
  • : প্রথম আইটেমটি গ্রহণ করুন, যা অঙ্কের সূচক
  • 1-⍨: একটিকে বিয়োগ করুন, কারণ এপিএল সূচকগুলি 1-ভিত্তিক।

3
বাহ 87? অবশ্যই এ পর্যন্ত দীর্ঘতম এপিএল প্রোগ্রাম হতে হবে।
ইজাবেরের

4
আমি সবসময় ভেবেছিলাম এপিএল সবসময় গ্রিকের মতো লাগে। এখন চাইনিজদেরও?!?
ডিজিটাল ট্রমা


5

পাইথন

আমি নিশ্চিত ওসিআর সমাধান থাকবে, তবে আমার সঠিক হওয়ার সম্ভাবনা অনেক বেশি।

import difflib as x;r=range;s='2***3**1**1**3****3****3**1**1**3***23*4***6*6*6*6*4*****12***3*2**6*5**4**4**4******2***3*2**6*3***7*2*2**3***23**4***3*1**2*2**2******4**5**21*****2**5****7*6*2*3*3***22****2**5*****2*3*2**2**1**2*3****11*****5**5**4**5**4**4**42****2**2**1**2**2****2**2**1**2**2****12***3**1**1**3**1**2*3****5**2****2'
for c in r(8):s=s.replace(str(c),' '*c)
s=map(''.join,zip(*[iter(s)]*7));a=[raw_input("") for i in r(7)];l=[[x.SequenceMatcher('','|'.join(a),'|'.join(s[i*7:(i+1)*7])).ratio()] for i in r(10)];print l.index(max(l))

একসাথে এক লাইনের পাঠ্য ইনপুট করুন।

চরিত্রের সংখ্যা বাড়িয়ে না দিয়ে তারাগুলি নিয়ে আরও ভাল উপায়ের বিষয়ে নিশ্চিত নন।


4

জাভাস্ক্রিপ্ট (ES6), 89

f=n=>(a=1,[a=(a+a^c.charCodeAt())%35 for(c of n)],[4,25,5,16,0,11,32,13,10,1].indexOf(a))

ব্যবহার:

> f("  ***  \n *  ** \n     * \n    ** \n   **  \n  **   \n ******")
2

আন-গল্ফ করা সংস্করণ:

f = (n) => (
  // Initialize the digit's hash.
  a=1,
  // Hash the digit.
  // 35 is used because the resulting hash is unique for the first ten digits.
  // Moreover, it generates 4 1-digit hashes.
  [a = (a + a ^ c.charCodeAt()) % 35 for(c of n)],
  // Compare the hash to pre-computed digit hash.
  // The matching hash index is the digit.
  [4,25,5,16,0,11,32,13,10,1].indexOf(a)
)

3
ইনপুটটি যদি কোনও এক অঙ্কের সমান না হয় তবে এটি কি কাজ করবে? প্রশ্ন অনুসারে, তিন পিক্সেল ফ্লিপ হতে পারে এবং এটি এখনও কাজ করা উচিত।
মেরিনাস

3

বাশ + ইমেজম্যাগিক + পরীক্ষা, 316 টি অক্ষর

এখানে একটি ওসিআর সমাধানে ছুরিকাঘাত। যদিও এটি খুব নির্ভুল নয়, এমনকি পরীক্ষামূলক বলার সময়ও আমাদের কেবল একটি চর রয়েছে এবং এটি একটি অঙ্ক is মাঝারিভাবে গল্ফড, তবে এখনও কিছুটা পাঠযোগ্য:

w=0
c()((w=${#2}>w?${#2}:w))
mapfile -c1 -Cc -t l
h=${#l[@]}
{
echo "# ImageMagick pixel enumeration: $w,$h,1,gray"
for y in ${!l[@]};{
for((x=0;x<w;x++));{
[ "${l[$y]:$x:1}" != " " ]
echo "$x,$y: ($?,$?,$?)"
}
}
}|convert txt:- i.png
tesseract i.png o -psm 10 <(echo "tessedit_char_whitelist 0123456789")
cat o.txt

স্ক্রিপ্টটি স্টিডিন থেকে ইনপুট নেয়, তাই আমরা পরীক্ষার স্ক্রিপ্ট থেকে পাইপ করতে পারি।

দ্রষ্টব্য আমি tee >( cat 1>&2 )পাইপলাইনটি ঠিক রেখেছি যাতে পরীক্ষার স্ক্রিপ্টটি আসলে কী তৈরি হয়েছিল তা আমরা দেখতে পারি।

উদাহরণ আউটপুট (6 টির মধ্যে কেবল 1 টি ভুল চর এটি একটি দুর্দান্ত রান ছিল):

$ অজগর ./asciitest.py | টি> (বিড়াল 1> & 2) | ./scanascii.sh
  ***  
 ** ** 
* **
 ** * 
  **** 
    ***
 ****  
লেপটোনিকার সাথে ওপেন সোর্স ওসিআর ইঞ্জিন v3.02 পরীক্ষা করুন
9

$ অজগর ./asciitest.py | টি> (বিড়াল 1> & 2) | ./scanascii.sh
   *   
 *** *
   *   
   *   
   *   
   *   
 ***** 
লেপটোনিকার সাথে ওপেন সোর্স ওসিআর ইঞ্জিন v3.02 পরীক্ষা করুন
1

$ অজগর ./asciitest.py | টি> (বিড়াল 1> & 2) | ./scanascii.sh
  ***  
 ** ** 
** **
** **
** **
  * ** 
  ***  
লেপটোনিকার সাথে ওপেন সোর্স ওসিআর ইঞ্জিন v3.02 পরীক্ষা করুন
0

$ অজগর ./asciitest.py | টি> (বিড়াল 1> & 2) | ./scanascii.sh
 ***** 
 **    
 ****  
     * 
     * 
 ** * 
  ***  
লেপটোনিকার সাথে ওপেন সোর্স ওসিআর ইঞ্জিন v3.02 পরীক্ষা করুন
5

$ অজগর ./asciitest.py | টি> (বিড়াল 1> & 2) | ./scanascii.sh
  **** 
 **    
 ***** 
 * * 
*** ***
 ** **
  **** 
লেপটোনিকার সাথে ওপেন সোর্স ওসিআর ইঞ্জিন v3.02 পরীক্ষা করুন
5

$ অজগর ./asciitest.py | টি> (বিড়াল 1> & 2) | ./scanascii.sh
  ***  
 * ** 
     * 
    ** 
   *** 
  **   
 ******
লেপটোনিকার সাথে ওপেন সোর্স ওসিআর ইঞ্জিন v3.02 পরীক্ষা করুন
2

$ 

1

LÖVE2D, 560 বাইট

t=...;g=love.graphics g.setNewFont(124)g.setBackgroundColor(255,255,255)A=g.newCanvas()B=g.newCanvas()x=1 y=1 g.setColor(255,255,255)g.setCanvas(B)g.clear(0,0,0)for i=1,#t do x=x+1 if t:sub(i,i)=="\n"then x=1 y=y+1 end if t:sub(i,i)=="*"then g.rectangle("fill",x*16,y*16,16,16)end end u=B:newImageData()g.setCanvas(A)S={}for i=0,9 do g.clear(0,0,0,0)g.print(i,48,0)r=A:newImageData()s={i=i,s=0}for x=0,16*8 do for y=0,16*8 do a=u:getPixel(x,y)b=r:getPixel(x,y)s.s=s.s+math.abs(a-b)end end S[i+1]=s end table.sort(S,function(a,b)return a.s<b.s end)print(S[1].i)

প্রথমে ইনপুট পাঠ্যের একটি ব্লক উপস্থাপনা আঁকুন, তারপরে, প্রতিটি সংখ্যার 0 - 9 এর জন্য, একটি সংখ্যাকে ওভারলে করে, সেখানে কতগুলি অনুরূপ পিক্সেল রয়েছে তা পরীক্ষা করে এবং যে সংখ্যাটি সবচেয়ে কাছের পেয়েছিল তা মুদ্রণ করে। খুব বেসিক ওসিআর। এটি সমস্ত টেস্ট কেসের সাথে মেলে এবং মিউটেশনের সাথে যুক্তিসঙ্গতভাবে ভাল অভিনয় করে।

সাথে কল করুন:

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