বারকোডেগল্ফ: একটি সংখ্যার ইউপিসি উত্পন্ন করুন


12

আজকাল প্রায় প্রতিটি স্টোর চেক আউট প্রক্রিয়াটিকে সহজ করার জন্য ইউনিভার্সাল প্রোডাক্ট কোড (ইউপিসি) বারকোড ব্যবহার করে। নামটি যদি আপনার কোনও অর্থ না বোঝায় তবে আপনি অবশ্যই দেখতে পাবেন যে তারা কী দেখাচ্ছে:

নমুনা ইউপিসি-এ বারকোড

বিন্যাস

সর্বাধিক প্রচলিত সিস্টেমটি ইউপিসি-এ, যা প্রতিটি নির্দিষ্ট পণ্যের প্রতিনিধিত্ব করতে 12 ডিজিট ব্যবহার করে। প্রতিটি ডিজিটকে মেশিনগুলিকে কোডটি পড়তে দেয়, সাত বিটের দৈর্ঘ্যে একটি সিরিজ কালো এবং সাদা ফিতে দেয় od মোট 11 টি বিট মূল্যবান নিদর্শন রয়েছে যা বারকোডের শুরু, মাঝারি এবং শেষ নির্দেশ করে। এটি 12 × 7 + 11 = 95 বিটের মোট বারকোড দৈর্ঘ্যে আসে। (এখন থেকে, যখন বাইনারি প্রতিটি বিটের রঙ বোঝাতে ব্যবহৃত হয়, 0সাদা হয় এবং 1কালো হয়))

শুরু এবং শেষের উভয়ের একটি প্যাটার্ন রয়েছে 101। অঙ্কগুলি তখন 6 টির 2 টি গ্রুপে বিভক্ত হয় এবং 01010বাম এবং ডানদিকের গোষ্ঠীর মধ্যে একটি প্যাটার্ন সহ নীচের চিত্রের মতো এনকোড করা হয় । এই টেবিলটি প্রতিটি সংখ্যার জন্য প্যাটার্ন তালিকাভুক্ত করে। লক্ষ্য করুন যে অঙ্কটি ডান বা বাম দিকে রয়েছে তার উপর নির্ভর করে প্যাটার্নটি আলাদা (এটি বারকোডটিকে উল্টোদিকে স্ক্যান করতে দেয়)। তবে, ডানদিকের প্যাটার্নটি হ'ল বিপরীতে (সাদা রঙের ওপরে কালো এবং তার বিপরীতে) বাম দিকের।

ইউপিসি রূপান্তর টেবিল

যদি আপনি উপরের চিত্রটি দেখতে না পান তবে এটি প্রতিটি সংখ্যার বাইনারি সমতুল্য।

#   Left    Right
0   0001101 1110010
1   0011001 1100110
2   0010011 1101100
3   0111101 1000010
4   0100011 1011100
5   0110001 1001110
6   0101111 1010000
7   0111011 1000100
8   0110111 1001000
9   0001011 1110100

উদাহরণ

বলুন আপনার ইউপিসি আছে 022000 125033। (এগুলি এলোমেলো সংখ্যা নয় their আপনি যদি তাদের তাত্পর্যটি অনুভব করেন তবে একটি মন্তব্য দিন)) আপনি প্রতিটি বারকোডে একই বয়লারপ্লেটটি দিয়ে শুরু করুন:

101xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx01010xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx101

অঙ্কগুলির জন্য, আপনি প্রতিটিকে তার পাশ (বাম বা ডান) এর জন্য সংশ্লিষ্ট এনকোডিং দিয়ে প্রতিস্থাপন করবেন। আপনি যদি এখনও বিভ্রান্ত থাকেন তবে নীচের চিত্রটি দেখুন।

ইউপিসি এনকোডিং ভাঙ্গা

|পাইপগুলির সাথে অংশগুলি পৃথক করে বাইনারিতে আউটপুট দেওয়া হচ্ছে ।

101|0001101|0010011|0010011|0001101|0001101|0001101|01010|1100110|1101100|1001110|1110010|1000010|1000010|101

চ্যালেঞ্জ

এমন একটি প্রোগ্রাম লিখুন যা ব্যবহারকারীর ইনপুটটির জন্য ইউপিসি-এ বারকোডকে আউটপুট করে। চিত্রটির মাত্রা 95 × 30 পিক্সেল হওয়া উচিত, প্রতিটি "বিট" এক পিক্সেল প্রশস্ত এবং 30 পিক্সেল লম্বা। কালো স্ট্রাইপগুলি রয়েছে rgb(0, 0, 0)এবং সাদা ফিতেগুলি ধারাবাহিকভাবে স্বচ্ছ বা হয় rgb(255, 255, 255)

মন্তব্য

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

উদাহরণ

আপনার কোডটি পরীক্ষা করে দেখার জন্য এখানে আরও কয়েকটি উদাহরণ রয়েছে। বাইনারি আউটপুট এছাড়াও সুবিধার জন্য দেওয়া হয়।

ইনপুট: 012345678910

আউটপুট:

10100011010011001001001101111010100011011000101010101000010001001001000111010011001101110010101

ইনপুট: 777777222222

আউটপুট:

10101110110111011011101101110110111011011101101010110110011011001101100110110011011001101100101

স্কোরিং

এটি কোড গল্ফ , তাই সংক্ষিপ্ততম জমা (বাইট জিততে)। টাইব্রেকার প্রথম পোস্টে যায়।


মিম ... রসালো ফল।
ডেনিস

ইনপুটটি অ্যারে হিসাবে নেওয়া যেতে পারে? উদাহরণস্বরূপ["777777","222222"]
ডাউনগোট

@ভিহান হুম, আমি মনে করি এটি কিছুটা প্রসারিত। আমি না বলতে যাচ্ছি।
নিনজাবার্মনকি

2
প্রথমবারের মতো ইউপিসির বারকোড স্ক্যান!
ডেনিস

1
এটা অসাধারণ. বারকোড সবসময় আমাকে মুগ্ধ করেছে
বিটা ডেক

উত্তর:


3

সিজেম, 58 57 বাইট

'P1N95S30N[A1r:~"rflB\NPDHt":i2fbf=:R6<::!0AAR6>A1]s30*S*

একটি পোর্টেবল বিটম্যাপ (এএসসিআইআই) মুদ্রণ করুন STDOUT এ। এটি অনলাইনে চেষ্টা করুন।

কিভাবে এটা কাজ করে

'P1N95S30N     e# Push 'P', 1, '\n', 95, ' ', 30 and '\n'.

[              e#
  A1           e#   Push 10 and 1.
  r            e#   Read a token from STDIN.
  :~           e#   Caluate each character ('0' -> 0).
  "rflB\NPDHt" e#   Push that string.
  :i           e#   Cast each character to integer.
               e#   This pushes [114 102 108 66 92 78 80 68 72 116].
  2fb          e#   Convert each integer to base 2.
               e#   This pushes the representations for the right side.
  f=           e#   Select the proper representation of each digit in the input.
  :R           e#   Save the result in R.
  6<           e#   Keep the representations of the first six digits.
  ::!          e#   Negate each binary digit to obtain the "left" representation.
  0AA          e#   Push 0, 10, 10.
  R6>          e#   Push the representations of the last six digits.
  A1           e#   Push 10, 1.
]s             e# Collect in an array and cast to string.

30*            e# Repeat the resulting string 30 times.
S*             e# Join it, using spaces as separators.

4

Rev 1 বিবিসি বেসিক, 155 এসকি চর, টোকেনাইজড ফাইলাইজ 132 বাইট

INPUTn$
FORi=91TO185p=i MOD2j=i MOD47IFj<42j+=i DIV141*42p=(j>41EORASC(MID$("XLd^bFznvh",VAL(MID$(n$,j/7+1,1))+1)))>>(j MOD7)AND1
IFp LINEi*2,60,i*2,0
NEXT

iলুপের মধ্যে অফসেটটি 43 টি সংযুক্ত করে কয়েকটি বাইট সংরক্ষণ করেছে । MOD2অতিরিক্ত বিরতি এড়াতে অতিরিক্ত 90 টি মোট 90 এর জন্য যুক্ত করতে হয়েছিল।

এটি বারকোডটিকে উত্স থেকে আরও সরিয়ে নিয়েছে, যেমন দেখানো হয়েছে, যদি তা গ্রহণযোগ্য হয়:

এখানে চিত্র বর্ণনা লিখুন

রেভ 0 বিবিসি বেসিক, 157 এসকি চর, টোকেনাইজড ফাইলাইজ 137 বাইট

INPUTn$
FORi=1TO95p=i MOD2j=(i+43)MOD47IFj<42j+=i DIV51*42p=(i>50EORASC(MID$("XLd^bFznvh",VAL(MID$(n$,j/7+1,1))+1)))>>(j MOD7)AND1
IFp LINEi*2,0,i*2,60
NEXT

Http://www.bbcbasic.co.uk/bbcwin/bbcwin.html এ দোভাষী ডাউনলোড করুন

ডিফল্ট স্ক্রিন মোড একটি সাদা পটভূমিতে কালো পাঠ্য। এটি মূল বিবিসি বিএএসসি থেকে পৃথক।

পরীক্ষা মুদ্রণের সাথে অদ্বিতীয় সংস্করণ

ডেটা বারের গণনা নির্ভর করে IF j<42এবং সবগুলি একটি লাইনেই করা আবশ্যক। অরোগল্ফড সংস্করণে এটি তিনটি ধাপে সম্পন্ন করা হয়। গল্ফযুক্ত সংস্করণে শেষ দুটি পদক্ষেপ একক বিশাল অভিব্যক্তিতে একত্রিত হয়p=...

আমাকে বিটম্যাপের ক্রমটি বিপরীত করতে হয়েছিল, কারণ আমি >>(j MOD 7)বিটগুলি অ্যাক্সেস করতে ব্যবহার করি যার অর্থ আমি প্রথমে কমপক্ষে উল্লেখযোগ্য বিট অ্যাক্সেস করি। এটি সম্পন্ন হয়ে গেলে, সমস্ত বাম বিটম্যাপগুলি ASCII সীমার মধ্যে সুবিধে হয়।

  INPUTn$
  FOR i=1TO95                            :REM iterate through 95 bars
    p=i MOD2                             :REM calculate colour of format bar 1=black
    j=(i+43)MOD47                        :REM repetition is 42 data bars + 5 format bars. offset and modulo. if j<42 it is a data bar and we must change p.

    REM if i DIV 51=1 we are in the second half, so add 42 to j. Find the bitmap for left hand value, from character j/7 of the input.
    REM i>50 evaluates to false=0 true=-1. XOR this with p to invert bitmap for right hand side. Shift and AND with 1.  
    IF j<42 j+=i DIV51*42:p=ASC(MID$("XLd^bFznvh",  VAL(MID$(n$,j/7+1,1))+1  )) :p=(i>50EORp)>>(j MOD7) AND 1

    IF j MOD 7 = 0 PRINT                  :REM format test output
    PRINT ;p;                             :REM print test output
    IF p LINEi*2-2,0,i*2-2,60             :REM if p=1 plot bar. there are 2 logical units for each pixel.
  NEXT

পরীক্ষামূলক আউটপুট সহ সাধারণ আউটপুট, অদম্য সংস্করণ

এখানে চিত্র বর্ণনা লিখুন


2

জাভাস্ক্রিপ্ট ES6, 225 বাইট

s=>`P1
30 90
`+([...`101${(f=(z,j)=>[...j].map(i=>`000${z[+i].toString(2)}`.slice(-7)).join``)([13,25,19,61,35,49,47,59,55,11],s[0])}01010${f([114,102,108,66,92,78,80,68,72,116],s[1])}101`].join` `+`
`).repeat(30).slice(0,-1)

ES7 বৈশিষ্ট্যগুলি সংক্ষিপ্ত হতে পারে তবে আমি তাদের সমর্থন সম্পর্কে নিশ্চিত নই তাই আমি ES6 এর সাথে লেগে আছি। আমি অ্যারে হিসাবে একটি ইনপুটও ধরে নিচ্ছি। আউটপুট একটি পিবিএন ফাইল । করার জন্য প্রচুর গল্ফিং রয়েছে।

আমি যদি কিছু ভুল করে থাকে তবে একটি মন্তব্য করুন এবং আমি এটি ঠিক করে নেব


আমার মনে হয় আপনি পিবিএম ফাইলটি বোঝাচ্ছেন ...
sergiol

2

পার্ল, 153 বাইট

substr($_=<>,6,0)=A;y/0-9A/=ICmSa_kg;0/;$s.=sprintf("%07b",-48+ord$1^($k++>6?127:0))while/(.)/g;$s=~s/0{7}/01010/;print"P1
95 30
".('101'.$s.'101'.$/)x30

একটি ফাইল বারকোড.পেরেল অনুলিপি করুন এবং তারপরে এভাবে চালান:

perl barcode.perl > output.pbm

তারপরে বারকোড নম্বরটি ইনপুট করুন।

ব্যাখ্যা:

বারকোড ডিজিটের বিট প্যাটার্নগুলি স্ট্রিংয়ে সংরক্ষণ করা হয় এবং পার্ল y///ট্রান্সলিটেশন অপারেটরটি ব্যবহার করে ইনপুট ডিজিটের পরিবর্তে প্রতিস্থাপিত হয় । প্রতিস্থাপনের স্ট্রিংয়ের প্রতিটি মানের 48 টি (ASCII '0') অপ্রিন্টযোগ্য অক্ষর এড়াতে এটি থেকে যুক্ত করা হয়। বারকোডের দ্বিতীয়ার্ধের অঙ্কগুলি প্রথমার্ধের বিপরীত হয়।

কেন্দ্রীয় প্যাটার্নটি 0000000 এ সেট করা হয়েছে (এমন একটি প্যাটার্ন যা অন্যথায় কখনই প্রদর্শিত হয় না, 'এ' এবং পরে '0' হিসাবে এনকোড হয়) এবং তারপরে ইঙ্গিত করার সময় তার আলাদা দৈর্ঘ্যটিকে বিশেষ কেস হিসাবে পরিচালনা করার পরিবর্তে 01010 দ্বারা প্রতিস্থাপিত হয় sprint


1

অক্টাভা, ১১৮ বাইট

function b(s)
n='rflB\MPDHt'-0;r=dec2bin(n(s-47)',7)'(:)-48;v=[a=[1 0 1] ~r(1:42)' 0 a r(43:84)' a];v(ones(30,1),:)

মাল্টি-লাইন সংস্করণ:

function b(s)
   n='rflB\MPDHt'-0;
   r=dec2bin(n(s-47)',7)'(:)-48;
   v=[a=[1 0 1] ~r(1:42)' 0 a r(43:84)' a];
   v(ones(30,1),:)

nডান পাশের অঙ্কের কোডগুলির ASCII সমতুল্য (তারা সমস্ত প্রদর্শনযোগ্য অক্ষর হওয়ায় বাম পাশের চেয়ে এগুলি প্রবেশ করা সহজ ছিল)। এরপরে, কিছু বিরক্তিকর ধরণের পরিবর্তে সংখ্যাসূচক থেকে দশমিক-থেকে-বাইনারি রূপান্তর। vচূড়ান্ত বাইনারি স্ট্রিং তৈরি করে এবং তারপরে আমরা এটি 30 বার এবং কনসোল আউটপুট পুনরাবৃত্তি করি।

ব্রিভটির জন্য দেখানো 30 টির মধ্যে কেবল 2 টির সাথে নমুনা আউটপুট:

s = '777777222222';
ans =

 Columns 1 through 30:

   1   0   1   0   1   1   1   0   1   1   0   1   1   1   0   1   1   0   1   1   1   0   1   1   0   1   1   1   0   1
   1   0   1   0   1   1   1   0   1   1   0   1   1   1   0   1   1   0   1   1   1   0   1   1   0   1   1   1   0   1
...

 Columns 31 through 60:

   1   0   1   1   1   0   1   1   0   1   1   1   0   1   1   0   1   0   1   1   1   0   1   1   0   0   1   1   0   1
   1   0   1   1   1   0   1   1   0   1   1   1   0   1   1   0   1   0   1   1   1   0   1   1   0   0   1   1   0   1
...

 Columns 61 through 90:

   1   0   0   1   1   0   1   1   0   0   1   1   0   1   1   0   0   1   1   0   1   1   0   0   1   1   0   1   1   0
   1   0   0   1   1   0   1   1   0   0   1   1   0   1   1   0   0   1   1   0   1   1   0   0   1   1   0   1   1   0
...

 Columns 91 through 94:

   0   1   0   1
   0   1   0   1
...

সঙ্কুচিত আউটপুট:

1010111011011101101110110111011011101101110110101110110011011001101100110110011011001101100101

আমি মূলত চিত্রটি প্রদর্শন করার উদ্দেশ্যেই রেখেছিলাম, তবে কনসোলে আউটপুট পাঠানো আমাকে 9 বাইট সংরক্ষণ করেছিল। আপনি ব্যবহার করে ফলাফলগুলি প্রদর্শন করতে পারেন imshowতবে এটি 1সাদা এবং 0কালো হিসাবে প্রদর্শিত হয় , তাই আপনাকে প্রথমে ডেটা উল্টাতে হবে।

imshow(~v(ones(30,1),:));

1

কোবরা - 218

do(s='')
    print'P1\n95 30'+('\n'+('101'+(for n in 12get Convert.toString(if((t=139+[2,14,8,50,24,38,36,48,44,0][s[n]to int-48])and n<6,t,~t),2)[-7:]+if(n-5,'','01010')).join('')+'101').toCharArray.join(' ')).repeat(30)

1

জাভাস্ক্রিপ্ট ES6, 199 বাইট

n=>`P1 95 30 `+(101+(g=(a,...s)=>(``+1e12+n).slice(...s,-6).split``.map(m=>(1e3+a[m].toString(2)).slice(-7)).join``)(a=[13,25,19,61,35,49,47,59,55,11],-12)+`01010`+g(a.map(i=>~i&127))+101).repeat(30)

"সংক্ষিপ্ততম জমা (বাইট জিততে)"। আপনার কোডটি বাইটে গুনতে হবে, তাই ইউনিকোড ব্যবহার করা হলে এটি প্রতি চরিত্রের 2 বাইট হয় I
mbomb007

বাহ, হ্যাঁ, আমার অনুমানবিহীন উত্তরটি তখনই সংক্ষিপ্ত হবে বলে মনে করেন
ডেনড্রোবিয়াম

0

পাইথন 2, 174 বাইট

আমি জানি এটি গল্ফ করা যেতে পারে।

স্ট্রিংটি sটেবিলের বাম অর্ধেক স্ট্রিংয়ের বাম অর্ধেক হিসাবে প্রশ্নের বাইনারি টেবিল। ডান অর্ধে (প্রথম 1 টি সরান) মানগুলি প্রথমে 63 দ্বারা অগ্রাহ্য হয়, তারপরে প্রিন্টযোগ্য এএসসিআইতে 63 দ্বারা স্থানান্তরিত হবে।

বাউজি: বর্তমানে একটি বাগ ঠিক করার চেষ্টা করা হচ্ছে। প্রথম উদাহরণটির আউটপুট বারকোডের এক অঙ্কের দ্বারা বন্ধ। যদি আপনি এটি বুঝতে পারেন, দয়া করে আমাকে জানাবেন।

I=raw_input()
s="LXR|bpnzvJcekA[MOCGs"
x="".join(format(ord(s[int(I[i])+10*(i>5)])-63|1+63*(i>5),'07b')for i in range(len(I)))
L=len(x)/2
print"101%s01010%s101"%(x[:L],x[L:])

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