কোড 39 বারকোড এনকোডার


16

একটি ফাংশন বা প্রোগ্রাম লিখুন যা একটি স্ট্রিংকে কোড 39 ফর্ম্যাট বারকোডে এনকোড করে, যেখানে প্রতিটি অক্ষর চারটি ফাঁক দিয়ে পৃথক পাঁচটি বার হিসাবে এনকোড থাকে। দুটি বারের মধ্যে দুটি এবং ফাঁকের একটি ফাঁকা এবং অন্যগুলি সরু (10 * 4 কোড), বা তিনটি ফাঁক প্রশস্ত এবং বারগুলির কোনওটিই (4 কোড) নয়। এটি ৪৪ টি ভিন্ন কোড দেয়, যার মধ্যে একটি সংরক্ষিত কোড যা এনকোডযুক্ত স্ট্রিংয়ের শুরু এবং শেষ বোঝাতে ব্যবহৃত হয়।

চ্যালেঞ্জ

ইনপুটটি স্ট্রিং থেকে সেট থেকে কেবলমাত্র অক্ষর থাকে

1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ-. +/$%

আউটপুটটি বারকোড স্ট্রিং হিসাবে এনকোড করা স্ট্রিং। সংকীর্ণ ফাঁক এবং আন্তঃসারকের ফাঁকগুলি একটি একক স্থান এবং প্রশস্ত ফাঁক তিনটি স্থান। সংকীর্ণ বারটি ইউনিকোড অক্ষর "ফুল ব্লক", █ এর জন্য ইউটিএফ -8 বাইট অনুক্রম, 0xE2 0x96 0x88এবং প্রশস্ত বারটি এই জাতীয় তিনটি বাইট অনুক্রম / অক্ষর ( ███)। কোডগুলির সম্পূর্ণ তালিকাটি হ'ল:

      Spaces
      0100 0010 0001 1000 1011 1101 1110 0111
Bars
00000                       +    /    $   %
10001   1    A    K    U
01001   2    B    L    V
11000   3    C    M    W
00101   4    D    N    X
10100   5    E    O    Y
01100   6    F    P    Z
00011   7    G    Q    -
10010   8    H    R    .
01010   9    I    S  space          1=wide
00110   0    J    T  start/end      0=narrow

বার এবং স্পেসগুলি একটি বার থেকে শুরু করে আন্তঃবিভক্ত হয়, উদাহরণস্বরূপ Q হয়

bar   0 0 0  1     1 
code  █ █ █ ███   ███
space  0 0 0    1

সমস্ত অক্ষর এনকোড করার পরে, উভয় প্রান্তে স্ট্রিংটি সীমানা সহ প্রান্তিক করা হয় █ █ ███ ███ █। আন্তঃচক্রের ফাঁক, একটি একক স্থান, প্রতিটি বর্ণের মধ্যে সন্নিবেশ করা হয়। আপনার সমাধানটি ফাঁকা স্থান এবং একটি ট্রেলিং করা নতুন লাইন আউটপুট করতে পারে (সেই ক্রমে)।

উদাহরণ

""     → "█   █ ███ ███ █ █   █ ███ ███ █"

"A"    → "█   █ ███ ███ █ ███ █ █   █ ███ █   █ ███ ███ █"

"C++"  → "█   █ ███ ███ █ ███ ███ █   █ █ █   █ █   █   █ █   █ █   █   █ █   █ ███ ███ █"

"GOLF" → "█   █ ███ ███ █ █ █ █   ███ ███ ███ █ ███ █   █ █ ███ █ █   ███ █ ███ ███   █ █ █   █ ███ ███ █"

স্ট্যান্ডার্ড ইনপুট / আউটপুট ফর্ম্যাটগুলি অনুমোদিত এবং স্ট্যান্ডার্ড লুফোলগুলি অনুমোদিত নয়। এটি , তাই বাইট জিতে স্বল্পতম কোডটি মাপা!


1
আমরা কি print এর পরিবর্তে প্রিন্টযোগ্য এএসসিআইআই অক্ষরটি ব্যবহার করতে পারি (কোনটি অনুমোদন করতে চান তা চয়ন করতে পারেন)?
এরিক দি আউটগল্ফার

ব্রেইনফাকের মতো ভাষার জন্য, "এক ব্যবহার" হিসাবে কী গণনা করা যায়?
l4m2

1
@ অ্যাংসগুলি কোডটি নয়, মূলত আউটপুটকে বোঝাতে চাইছিলাম। #চরিত্রটির ব্যবহারের জন্য শাস্তি দেওয়া খুব ন্যায়সঙ্গত নয় , উদাহরণস্বরূপ, "#"কোনও ভাষায় এটির ব্যবহারের একমাত্র কারণ নয়।
এরিক দি আউটগল্ফার

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

উত্তর:


7

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

@ ল 4 এম 2 ধন্যবাদ 4 বাইট সংরক্ষণ করা

s=>`#${s}#`.replace(/./g,c=>'0202020202'.replace(/./g,(j,k)=>[C='█',C+C+C,' ','   '][(i="%+/$U1AKV2BLW3CMX4DNY5EOZ6FP-7GQ.8HR 9IS#0JT".indexOf(c),[170,257,260,5,272,17,20,320,65,68,80][i>>2]^2<<i%4*2)>>k&1|j]))

এটি অনলাইন চেষ্টা করুন!

কিভাবে?

টেবিলটি এমনভাবে পুনর্বিন্যস্ত করা যেতে পারে যে নীচের সূত্রটি ব্যবহার করে চরিত্রটির 9-বিট বাইনারি মাস্কটি দ্রুত তার সারি এবং কলাম থেকে দ্রুত কেটে নেওয়া যায়:

n = m XOR (2 << k)

সঙ্গে:

  m  | k: 0   2   4   6
-----+------------------      Examples:
 170 |    %   +   /   $
 257 |    U   1   A   K         'G' = 320 XOR (2 << 4) = 320 XOR 32 = 352
 260 |    V   2   B   L
   5 |    W   3   C   M         '+' = 170 XOR (2 << 2) = 170 XOR 8  = 162
 272 |    X   4   D   N
  17 |    Y   5   E   O
  20 |    Z   6   F   P
 320 |    -   7   G   Q
  65 |    .   8   H   R
  68 |   spc  9   I   S
  80 |    #   0   J   T

s=>`#${s}#`.replace(/./g,c=>'0202020202'.replace(/./g,(j,k)=>[C='#',C+C+C,' ',' '][(i="%+/$U1AKV2BLW3CMX4DNY5EOZ6FP-7GQ.8HR 9IS#0JT".indexOf(c),[,257,260,5,272,17,20,320,65,68,80][i>>2]|(2<<i%4*2^(i<4)*170))>>k&1|j]))(221)
l4m2


@ এরিকথ আউটগল্ফার আমি মনে করি এটিই মূলত '#' এর পরিবর্তে সম্পূর্ণ ব্লক দিয়ে এল 4 এম 2 জমা দিয়েছে। নাকি আমি কিছু মিস করছি?
আর্নাউল্ড

@ আরনাউল্ড তাদের মূল স্থানটি ঠিক মতো স্থান দেয় না।
এরিক দ্য আউটগল্ফার

3

লাল , 452 445 বাইট

func[s][q: func[x y z][append/dup x y z]append insert s"*""*"b:
func[n][v: copy[]until[append v n % 2 * 2 + 1
1 > n: n / 2]q v 1 5 - length? v
reverse v]a: q":1234567890:ABCDEFGHIJ:KLMNOPQRST:UVWXYZ-. *"" "44
a/45: #"+"a/56: #"/"a/67: #"$"a/78: #"%"foreach t s[i: index? find a t
k: b pick[0 17 9 24 5 20 12 3 18 10 6]either 0 = j: i % 11[11][j]m:
b pick[8 4 2 16 22 26 28 14]i - 1 / 11 + 1 z: copy""repeat n 5[q z"█"k/(n)
q z" "m/(n)]prin z]]

এটি অনলাইন চেষ্টা করুন!

আমি এটি আরও গল্ফ করার চেষ্টা করব, তবে এই নিষ্পাপ সমাধান থেকে আমি খুব বেশি আশা করি না।


2

জাভা 10, 455 বাইট

s->{String r="",R=r;for(var c:("~"+s+"~").split(""))r+=r.format("%9s",Long.toString(new int[]{148,289,97,352,49,304,112,37,292,100,52,265,73,328,25,280,88,13,268,76,28,259,67,322,19,274,82,7,262,70,22,385,193,448,145,400,208,133,388,196,138,162,168,42}["~1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ-. +/$%".indexOf(c)],2)).replace(' ','0');for(int l=r.length(),i=0,c;i<l;R+=""+(i%9%2<1?c<49?"█":"███":c<49?" ":"   ")+(i%9>7&++i<l?" ":""))c=r.charAt(i);return R;}

এটি অনলাইনে চেষ্টা করুন।

ব্যাখ্যা:

s->{                     // Method with String as both parameter and return-type
  String r="",           //  Temp-String, staring empty
         R=r;            //  Result-String, starting empty as well
  for(var c:("~"+s+"~")  //  Prepend and append "~" to the input
            .split(""))  //  And loop over each character
    r+=r.format("%9s",Long.toString( 
                         //   Convert the following integer to a 9-bit binary String:
       new int[]{148,289,97,352,49,304,112,37,292,100,52,
                 265,73,328,25,280,88,13,268,76,28,259,67,322,
                 19,274,82,7,262,70,22,385,193,448,145,400,208,
                 133,388,196,138,162,168,42}
                         //    Array containing all decimal values of the binary Strings
       ["~1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ-. +/$%".indexOf(c)]
                         //    with the index based on the current character
   ,2)).replace(' ','0');
                         //   (also part of the integer to 9-bit binary String conversion)
  for(int l=r.length(),i=0,c;i<l;
                         //  Loop `i` over the temp-String
      R+=                //    After every iteration: append the following to the result:
         ""+(i%9%2<1?    //     If `i` modulo-9 modulo-2 is 0:
              c<49?      //      And `c` is '0':
               "█"       //       Append a single block
              :          //      Else:
               "███"     //       Append three blocks
             :c<49?      //     Else-if `c` is '0':
              " "        //      Append a single space
             :           //     Else:
              "   ")     //      Append three spaces
         +(i%9>7         //     If `i` modulo-9 is 8,
           &++i<l?       //     and this is not the very last character
            " "          //      Append a space delimiter
           :             //     Else:
            ""))         //      Append nothing more
    c=r.charAt(i);       //   Set `c` to the current character in `r`
  return R;}             //  Return the result

2

সি (জিসিসি) , 311 , 303 বাইট

(*P)()=printf;i;j;w;m[]={170,257,260,5,272,17,20,320,65,68,80};char*b=" \0\xE2\x96\x88",*t="%+/$U1AKV2BLW3CMX4DNY5EOZ6FP-7GQ.8HR 9IS#0JT",*c;p(x){j=256;w=2;while(j){P(b+w);if(x&1){P(b+w);P(b+w);}x/=2;j>>=1;w=2*!w;}P(" ");}f(char*_){p(82);for(c=_;*c;c++){i=strchr(t,*c)-t;p(m[i>>2]^(2<<(i&3)*2));}p(82);}

এটি অনলাইন চেষ্টা করুন!

-8 সিলিংক্যাট ধন্যবাদ

আরনল্ডের উত্তর থেকে এনকোডিং কৌশল ব্যবহার করে। টিআইও লিঙ্কটিতে -wসতর্কতাগুলি সরাতে স্যুইচ এবং বয়লারপ্লেট অন্তর্ভুক্ত রয়েছে , এগুলি অপ্রয়োজনীয় এবং এইভাবে স্কোরের অন্তর্ভুক্ত নয়।

আরনল্ডের ব্যাখ্যা অনুসারে এনকোডিং স্কিম বাদে, এখানে অন্য কৌশলটি w2 এবং 0 ( w=2*!w) এর মধ্যে টগলিং হিসাবে চলকটি বজায় রাখা । এটি আমাকে প্রথম এবং দ্বিতীয় স্ট্রিংয়ের মধ্যে নির্বাচন করতে দেয় b। প্রথমটি একটি স্থান, দ্বিতীয়টি ভরাট আয়তক্ষেত্র।


চতুর, আপনার এটি পোস্ট করা উচিত :)
লাম্বদাবেটা

2

সি (জিসিসি) , 241 239 227 213 207 বাইট

#define P printf(i%2?" ":"█")
i;p(x){for(i=9;i--;x/=2)P,x&1&&P+P;P;}f(char*_){p(82);for(char*t="%+/$U1AKV2BLW3CMX4DNY5EOZ6FP-7GQ.8HR 9IS#0JT";*_;p(L"ªāĄ\5Đ\21\24ŀADP"[i/4]^2<<i%4*2))i=index(t,*_++)-t;p(82);}

এটি অনলাইন চেষ্টা করুন!

@ ল্যাম্বদাবেতার বাস্তবায়নের ভিত্তিতে ।

সামান্য কম গল্ফড:

#define P printf(i%2?" ":"█")
i;
p(x){
 for(i=9;i--;x/=2)
  P,
  x&1&&
   P+
   P;
 P;
}
f(char*_){
 p(82);
 for(char*t="%+/$U1AKV2BLW3CMX4DNY5EOZ6FP-7GQ.8HR 9IS#0JT";*_;p(L"ªāĄ\5Đ\21\24ŀADP"[i/4]^2<<i%4*2))
  i=index(t,*_++)-t;
 p(82);
}

1

কাঠকয়লা , 90 বাইট

⪫EE⪫**S⌕⁺⁺⭆…αχ﹪⊕μχα-. *+/$%ι⪫E⁵⁺⎇μ× ∨⁼›ι³⁹⁼²﹪⁻÷ι∨›ι³⁹χμ⁴¦³ω×█∨›ι³⁹∨§↨℅§.6':+3<-59ι²⊕μ³ω 

এটি অনলাইন চেষ্টা করুন! দ্রষ্টব্য: ট্রেলিং স্পেস লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। ব্যাখ্যা:

⪫EE⪫**S...⪫E⁵⁺...ω 

ইনপুট স্ট্রিং *গুলি এস এবং তারপরে এটির উপর দু'বার ম্যাপ করুন, শেষ পর্যন্ত ফাঁকা স্থান দিয়ে ফলাফলটিতে যোগদান করুন। দ্বিতীয় মানচিত্রের জন্য, তখন অন্তর্নিহিত পরিসীমাটির উপরে একটি অতিরিক্ত মানচিত্র রয়েছে 0..4, যেখানে দুটি সাবস্ট্রিং সংক্ষিপ্ত হয় এবং ফলাফলগুলি পূর্বনির্ধারিত খালি স্ট্রিং ধ্রুবকের সাথে যুক্ত হয়।

⌕⁺⁺⭆…αχ﹪⊕μχα-. *+/$%ι

প্রথম অভ্যন্তরীণ মানচিত্রের জন্য, বর্ধিত অঙ্কগুলি, বড় হাতের বর্ণমালা এবং চিহ্নগুলি নিয়ে একটি স্ট্রিং তৈরি -. *+/$%করুন এবং ম্যাপযুক্ত ইনপুট চরিত্রের অবস্থানটি সন্ধান করুন। উদাহরণস্বরূপ, C++মানচিত্র করতে হবে [12, 40, 40]

⎇μ× ∨⁼›ι³⁹⁼²﹪⁻÷ι∨›ι³⁹χμ⁴¦³ω

প্রথম সাবস্ট্রিং বারগুলির আগে ফাঁকা স্থানগুলি উপস্থাপন করে। প্রথম বারের আগে এখানে কিছু নেই, তবে অন্যান্য বারগুলি ম্যাপ করা ইনপুট চরিত্রের অবস্থানের উপর নির্ভর করে: এটি 39 এর বেশি হলে কেবল একটি জায়গার একটি একক স্থান থাকতে পারে, যদি এটি 40 এর নিচে হয় তবে কেবলমাত্র এক জায়গায় তিনটি থাকে স্পেসগুলি, এবং অবস্থানটি 10 ​​দ্বারা বিভাজন করে একটি কলামে রূপান্তরিত হয় যদি কলাম এবং লুপ সূচক 2 (মডুলো 4) দ্বারা পৃথক হয় তবে এটি বিজোড় স্থান।

×█∨›ι³⁹∨§↨℅§.6':+3<-59ι²⊕μ³

দ্বিতীয় সাবস্ট্রিং বারগুলি উপস্থাপন করে। যদি পজিশনটি 39 এর বেশি হয় তবে সর্বদা একটি বার থাকে অন্যথায় অবস্থানটি অক্ষরের সাথে ম্যাপ করা বিটের অ্যারেতে দেখা হয়। উদাহরণ হিসেবে বলা যায়, অবস্থান 12 হয়, তাহলে যে বৃত্তাকারে অক্ষরে সূচীবদ্ধ করা হয় ', যা 100111বাইনারি মধ্যে, কলাম 1 এবং 2. ওয়াইড বার ইঙ্গিত (নেতৃস্থানীয় 1হয় উপেক্ষিত, এটা শুধু একটি সামঞ্জস্যপূর্ণ বিট গণনা নিশ্চিত করে।)


1

পার্ল 5 , 244 বাইট

$l="{ ,   ,...,.........}"x9;@h{$",qw($ % + - . /),0..9,'',A..Z}=(<"$l">)[q{..=9...Z.>>...J=9..j.%r1...=).[.>=-..Ux?V.^=8.>.6o+ax_.=(..B=,..Yx6..b=(..#r'p.^...G.<=,..Sx5B.\=(.V.It..z:..-z.=<6.}=~s/./ord$&/gre=~/.{6}/g];s/^|./$h{$&} /g;$\=$h{''}

এটি অনলাইন চেষ্টা করুন!

অনেকগুলি অপ্রিন্টেবল এবং উচ্চ-বাইট অক্ষর রয়েছে, টিআইও লিঙ্কটি একটি xxdউপস্থাপনা সরবরাহ করে। আমি আশা করতাম এটি আরও ছোট হয়ে গেছে এবং আমি এখনও আরও কার্যকর উপায়ে ডেটা প্যাক করতে সক্ষম হব আমি কীভাবে যাব তা আমি দেখতে পাচ্ছি। এটি " "," ","█","███"তালিকার সমস্ত সূত্রগুলি সংশ্লিষ্ট চরিত্রগুলিতে মানচিত্র তৈরি করে।


1

হাস্কেল , 275 270 বাইট

z=0:z
x!0=[]
x!n=mod n x:x!div n x
e c|Just a<-lookup c.zip"W3YZ56C$EF. 89*HM/ORU1QGNTDJ7%40LSBIP2-+XVKA".((++)<*>(reverse<$>))$take 9.(++z).(2!)<$>scanl(+)7(67!0x117CDBC49F9EEEF11C3A659CACB31236)=zipWith(\l c->c<$[1..2*l+1])(a++[0])(cycle"█ ")>>=id
f s='*':s++"*">>=e

এটি অনলাইন চেষ্টা করুন!

চালক x!n যা n এর x-বেস অঙ্কগুলি গণনা করে, কোডগুলি সংক্ষেপিত করতে দুবার ব্যবহৃত হয়। কোডগুলি প্রশস্ত = 1 এবং সংকীর্ণ = 0 দিয়ে বাইনারি স্ট্রিং হিসাবে প্রথমে সংকুচিত হয়, রঙ সম্পর্কিত কোনও বিবেচনা নেই R↔10000110↔262। বাইনারি অঙ্কের অ্যালগোরিদমের বিপরীতে সংক্ষিপ্ত আকারে [৩,66 range] সীমাতে নম্বর পেতে এই সংখ্যাগুলি বাছাই এবং আলাদা করা হয় 0x117CDBC49F9EEEF11C3A659CACB31236। এটিতে কোডগুলির অর্ধেকটি রয়েছে, বাকীগুলি এগুলির বিপরীত।

Ungolfed:

z=0:z                       -- infinite zeroes for padding
x!0=[]                      -- digits of n in base x, recursion base case
x!n=mod n x:x!div n x       -- digits of n in base x
e c | Just a                -- read upwards from (*)
  <-lookup c                -- lookup code, given letter
  . zip"W3YZ56C$EF. 89*HM/ORU1QGNTDJ7%40LSBIP2-+XVKA" 
                            -- combine codes with correct letters
  . ((++)<*>(reverse<$>))   -- concatenate list and list with reverse codes
  $ take 9                  -- take nine
  . (++z)                   -- pad with infinite zeroes on right
  . (2!)                    -- convert to binary digits – [[1,1,1],[1,0,1,1]…]
  <$> scanl (+) 7           -- cumulative sum starting from 7 – [7,13,19,22,25…]
        (67!0x117CDBC49F9EEEF11C3A659CACB31236)       
                            -- (*) digits in base 67 – [6,6,3,3,3,9,5,7…]
  = zipWith
      (\l c->c<$[1..2*l+1]) -- combine width and color, length is 2*l+1
      (a++[0])              -- list of widths as 0/1, 0 added for interchar gap
      (cycle"█ ")           -- infinite list of bar colors, leftovers are unused
  >>=id                     -- concatenate
f s='*':s++"*">>=e          -- surround string with delimiters, map e and concat
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.