سؤال

التحدي

أقصر رمز حسب عدد الأحرف لرسم تمثيل ASCII للرمز الشريطي 39.

مقالة ويكيبيديا حول الرمز 39: http://en.wikipedia.org/wiki/Code_39

مدخل

سيكون الإدخال سلسلة من الأحرف القانونية لرموز الشريط الكود 39. هذا يعني أن 43 حرفًا صالحة: 0-9 A-Z (الفضاء) و -.$/+%. ال * لن تظهر الحرف في الإدخال حيث يتم استخدامه كحرف بدء وإيقاف.

انتاج |

تحتوي كل حرف مشفر في الرموز الكود 39 على تسعة عناصر وخمس أشرطة وأربعة مسافات. سيتم تمثيل الحانات مع # سيتم تمثيل الشخصيات والمسافات مع حرف الفضاء. ثلاثة من العناصر التسعة ستكون واسعة. ستكون العناصر الضيقة ذات شخصية واحدة ، وستكون العناصر الواسعة ثلاثة أحرف. يجب إضافة مساحة بين الأشرطة لمساحة واحدة بين كل نمط حرف. يجب تكرار النمط بحيث يكون ارتفاع الرمز الشريطي ثمانية أحرف.

شخصية البدء/التوقف * (BWBWBWBWB) سيتم تمثيله على هذا النحو:

                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       ^ ^ ^^ ^ ^ ^ ^^^
                       | | || | | | |||
           narrow bar -+ | || | | | |||
           wide space ---+ || | | | |||
           narrow bar -----+| | | | |||
         narrow space ------+ | | | |||
             wide bar --------+ | | |||
         narrow space ----------+ | |||
             wide bar ------------+ |||
         narrow space --------------+||
           narrow bar ---------------+|
inter-character space ----------------+
  • شخصية البداية والتوقف * سوف تحتاج إلى الإخراج في بداية ونهاية الرمز الشريطي.
  • لن تحتاج إلى إدراج مساحة هادئة قبل أو بعد الرمز الشريطي.
  • لن تحتاج إلى حساب رقم فحص.
  • الترميز الكامل ASCII Code39 غير مطلوب ، فقط 43 حرفًا قياسيًا.
  • لا يجب طباعة أي نص أسفل تمثيل رمز الشريطي ASCII لتحديد محتويات الإخراج.
  • الشخصية # يمكن استبدالها بطابع آخر ذي كثافة أعلى إذا أراد. باستخدام حرف Block الكامل U+2588 ، سيسمح للرمز الشريطي بالمسح الضوئي عند طباعته.

حالات تجريبية

Input:
ABC
Output:
#   # ### ### # ### # #   # ### # ### #   # ### ### ### #   # # #   # ### ### # 
#   # ### ### # ### # #   # ### # ### #   # ### ### ### #   # # #   # ### ### # 
#   # ### ### # ### # #   # ### # ### #   # ### ### ### #   # # #   # ### ### # 
#   # ### ### # ### # #   # ### # ### #   # ### ### ### #   # # #   # ### ### # 
#   # ### ### # ### # #   # ### # ### #   # ### ### ### #   # # #   # ### ### # 
#   # ### ### # ### # #   # ### # ### #   # ### ### ### #   # # #   # ### ### # 
#   # ### ### # ### # #   # ### # ### #   # ### ### ### #   # # #   # ### ### # 
#   # ### ### # ### # #   # ### # ### #   # ### ### ### #   # # #   # ### ### # 

Input:
1/3
Output:
#   # ### ### # ### #   # # ### #   #   # #   # ### ###   # # # #   # ### ### # 
#   # ### ### # ### #   # # ### #   #   # #   # ### ###   # # # #   # ### ### # 
#   # ### ### # ### #   # # ### #   #   # #   # ### ###   # # # #   # ### ### # 
#   # ### ### # ### #   # # ### #   #   # #   # ### ###   # # # #   # ### ### # 
#   # ### ### # ### #   # # ### #   #   # #   # ### ###   # # # #   # ### ### # 
#   # ### ### # ### #   # # ### #   #   # #   # ### ###   # # # #   # ### ### # 
#   # ### ### # ### #   # # ### #   #   # #   # ### ###   # # # #   # ### ### # 
#   # ### ### # ### #   # # ### #   #   # #   # ### ###   # # # #   # ### ### # 

Input:
- $     (minus space dollar)
Output:
#   # ### ### # #   # # ### ### #   ### # ### # #   #   #   # # #   # ### ### # 
#   # ### ### # #   # # ### ### #   ### # ### # #   #   #   # # #   # ### ### # 
#   # ### ### # #   # # ### ### #   ### # ### # #   #   #   # # #   # ### ### # 
#   # ### ### # #   # # ### ### #   ### # ### # #   #   #   # # #   # ### ### # 
#   # ### ### # #   # # ### ### #   ### # ### # #   #   #   # # #   # ### ### # 
#   # ### ### # #   # # ### ### #   ### # ### # #   #   #   # # #   # ### ### # 
#   # ### ### # #   # # ### ### #   ### # ### # #   #   #   # # #   # ### ### # 
#   # ### ### # #   # # ### ### #   ### # ### # #   #   #   # # #   # ### ### # 

يتضمن عدد الكود الإدخال/الإخراج (البرنامج الكامل).

هل كانت مفيدة؟

المحلول

J ، 102 حرف

8#,:' #'{~,0,.~#:(3 u:'䝝啕啕啕䑅儑啕啕啕啕䗝䔑啕䕷煝䑑凝瑗屗眕凗瑵屵具瑝屝啕啕啕啕啕啕啕甗崗睅圗病巅呷甝崝圝畇嵇睑均痑巑嗇畱嵱坱煗䝗燕䗗煵䝵'){~32-~a.i.'*'(,,[)

تفسير. قراءة من أسفل إلى أعلى.:

8#,:         NB. Copy 8 times
' #'{~       NB. Turn binary 0 and 1 into space and #
,            NB. Link the array into a list
0,.~         NB. Append a 0 to the end of each row of the array.
#:           NB. Turn the list of numbers into a binary array where each row is the base-2 representation of the corresponding number
(3 u:'䝝啕啕啕䑅儑啕啕啕啕䗝䔑啕䕷煝䑑凝瑗屗眕凗瑵屵具瑝屝啕啕啕啕啕啕啕甗崗睅圗病巅呷甝崝圝畇嵇睑均痑巑嗇畱嵱坱煗䝗燕䗗煵䝵') NB. Turn this wchar string into a list of ints in range 0-65535.
{~           NB. Select numbers from the string-list whose indices are...
32-~         NB. ... 32 less than ...
a.i.         NB. ... the ascii values of ...
'*'(,,[)     NB. ... the input string with a '*' on either side!

نصائح أخرى

روبي (1.9) - 121 132 141 166 170 289 295

قبعة ديفيد

puts"*#{$_}*
".tr(" --9*$+%A-Z","䝝䕷煝䑑凝瑗屗眕凗瑵屵具瑝屝䗝䑅䔑儑甗崗睅圗病巅呷甝崝圝畇嵇睑均痑巑嗇畱嵱坱煗䝗燕䗗煵䝵").gsub(/./){|c|c.ord.to_s(2).tr"01"," #"}*8


echo "ABC" | ruby -ne 'puts"*#{$_}*
".tr(" --9*$+%A-Z","䝝䕷煝䑑凝瑗屗眕凗瑵屵具瑝屝䗝䑅䔑儑甗崗睅圗病巅呷甝崝圝畇嵇睑均痑巑嗇畱嵱坱煗䝗燕䗗煵䝵").gsub(/./){|c|c.ord.to_s(2).tr"01"," #"}*8'

يخزن فقط 44 حرفًا مطلوبًا ويستخدم وظيفة ترجمة Ruby لتعيين هذه

<space>
<-> to <9>
<*>
<$>
<+>
<%>
<A> to <Z>

إلى القيم المشفرة.

بيثون ، 304 حرفًا

لا ضغط يونيكود يتوهم. الحيلة فقط هي إعادة ترتيب الشخصيات لزيادة التداخل إلى الحد الأقصى. برنامج بيثون الأول.

b="BWbwbwBwbWBwbwbwBWbwBwbwbWBwbwBwbWbwBwbwBWbwbwBWBwbwbwbWBwBwbwbWbwBwBwbWbwbwBwBWbwbwbwBWBwbWbWbWbwbWbWbWb"
s=t=""
for x in"*"+raw_input()+"*":
 i=".NI5VRD9YLH4 OB8XSE2?J6WKG0ZMA7*PC1-TF3UQ????$/+%".find(x)*2
 s+=b[i:i+9]+"w"
for x in s:t+=["#"," ","###","   "]["bwBW".find(x)]
for k in b[-8:]:print(t)

التجميع

يجمع إلى 220 بايت.

    mov di,ds
    mov al,42
    call a3
    mov dh,[80h]
    mov si,82h
 a1:lodsb
    call a3
    dec dh
    jnz a1
    mov al,42
    call a3
    mov ax,2573
    stosw
    mov al,36
    stosb
    mov cl,8
 a2:mov dx,ds
    mov ah,9
    int 21h
    loop a2
 a3:sub al,97
    cmp al,26
    ja a4
    sub al,32
 a4:mov bx,a6-3
 a8:add bx,3
    cmp bx,a7
    jae ret
    cmp al,[bx]
    jne a8
    mov bp,[bx+1]
 a5:rcr bp,1
    mov al,36
    sbb al,0
    and al,35
    stosb
    or bp,bp
    jnz a5
    mov al,32
    stosb
    ret
 a6:dd 0D05DC5CFh,01DD17517h,05477D275h,0D475C5D3h,01DD55717h,07745D657h,0D85D17D7h,057E05D1Dh
    dd 0745DE174h,0E35177E2h,0D7E47475h,051DDE551h,0E77715E6h,05DE85C57h,05C75E95Ch,0EB7157EAh
    dd 077EC715Dh,07175ED45h,0EF45D7EEh,0D5F045DDh,04757F171h,0F3475DF2h,047F44775h,07571F575h
    dd 0F755C7F6h,047F875D1h,05771F957h,0CD7751CCh,071BF5D47h,05111C35Dh,0CA4511CEh,045C44451h
    dd 05DD1C944h
 a7:

ليس هناك نطاق كبير لعمل الحيل الذكية هنا.

Python 3.1 ، بدون Unicode (213 215 223 240 248 249 chars)

o=""
for c in"%r"%input():
 u="W3YZ56C$EF. 89'0HIJM/OP+%RSTUV12X4ABD-7GKLNQ".find(c);n=sum(b"))&&&,(*&2&&&)),&/8(*&1)<&/V&&&)),&/5);D&/S"[u:])-930+35*u
 while n:o+="###"[n%2*2:]+"   "[n&2:];n>>=2
print((o+"\n")*8)

تفسير:

يتم ترميز تسلسل الكود 39 إلى رقم BASE-4 (يسار أكثر = أقل أهمية) مع:

  • bw → 3
  • Bw → 2
  • bW → 1
  • BW → 0

ثم يتم فرز التسلسل ، على سبيل المثال

20333   Q
21233   N
21323   L
...

يتم أخذ اختلاف الإدخالات المجاورة ، مع إعطاء قائمة مثل [48, 12, 3, …]. ثم 35 يضاف إلى هذه القائمة لضمان انخفاض الأرقام في نطاق ASCII. هذا يعطي "))&&&,…" سلسلة.

وقد استغرق هذا الرمز أيضا مزايا من * لن يظهر في المدخلات ، لذلك قد نستبدلها بأي حرف غير صالح ، بما في ذلك '. في cpython repr("ABC") == "'ABC'", ، حتى نتمكن من التخلص من شخصين.

Python 3.1 ، مع Unicode (154 158 chars)

على أساس حل J., الاستفادة من "الشخصية # يمكن استبدالها بطابع آخر ذي كثافة أعلى إذا أراد " القاعدة ، من خلال تحديد الكثافة كما مساحة الأجزاء المظلمة مقسومًا على أصغر مستطيل من الرسول الرسومية. :)

print((''.join(" #"[int(c)]for d in"%r"%input()for c in bin(2*ord("䝝啕啕啕䑅儑啕䗝啕啕啕䔑啕䕷煝䑑凝瑗屗眕凗瑵屵具瑝屝啕啕啕啕啕啕啕甗崗睅圗病巅呷甝崝圝畇嵇睑均痑巑嗇畱嵱坱煗䝗燕䗗煵䝵"[ord(d)-32]))[2:])+"\n")*8)

بيثون (2.6) - 430 312 302 حرفًا

ثالث الذهاب في المشكلة ، لا يزال مجالا للتحسين. عدد الشخصيات من قبل wc -m.

#coding:UTF8
k=""
for c in"*%s*"%raw_input():
 i=" $*.02468BDFHJLNPRTVXZ%+-/13579ACEGIKMOQSUWY".find(c)*2
 for j in"%05d%s"%tuple(map(ord,u"ಊҺ௖ூ௄Һ姢ҺЈҺӎϴЈϴӐϲ刦ҺҺ௄ϴ௄Ҽூ划ಊϴಊҺЈϴЈҼІ划ӎϴӎಊϴ௄ϴಌϲІ௖ூ௖ூҼ௖І刦ϴ勮ϲ刨ϲІҼӎҺ划௄勚ூ刔ூϲಌҺಊ划Ј勚І刔ІϲӐҺӎ姢ϴ媪ϲ姤ϲ"[i:i+2])):k+=["#"," ","###","   "][int(j)]
 k+=" "
exec"print k;"*8

لوا ، 318 حرفًا

z={"1358ACEHKMORUWY.","UVWXYZ-. $/+*","2369BCFILMPSVWZ ","0123456789$/%","0456DEFJNOPTXYZ*","ABCDEFGHIJ$+%","0789GHIJQRST-. *","KLMNOPQRST/+%","1247ABDGKLNQUVX-",""}i="*"..(...).."*"o=""for c in i:gfind(".")do for j=1,10 do o=o..((j%2==0 and" "or"#"):rep(z[j]:find(c,1,true)and 3 or 1))end end for j=1,8 do print(o)end

لا أتوقع الفوز بأي أسئلة في لعبة الكود مع لوا ، لذلك لا أشعر بالسوء في الإجابة على التحدي الخاص بي هنا. كان يستخدم أيضًا ترميزًا مختلفًا اعتقدت أنه قد يكون مثيرًا للاهتمام للآخرين.

ملاحظات أخرى

بعد النظر عن كثب في الترميز ، يبدو أنه قد يكون هناك طريقة للاستغناء عن طريق البحث عن الجدول ، وحساب ترميز الرمز الشريطي مباشرة. ومع ذلك ، وجدت أن محاولاتي لبناء الحسابات استغرقت رمزًا أكثر من الجدول. (قد لا يكون هذا هو الحال بلغات أخرى.)

بعد تقسيم الشخصيات إلى مجموعات تشير إلى مكان وجود الأشرطة والمساحات العريضة ، رأيت بعض الأنماط المثيرة للاهتمام. يبدو أن هناك مساحة واسعة واحدة فقط لـ 40 من الشخصيات $/+% كونها استثناءات (لكل منها ثلاثة مسافات.) يتم تقسيم 40 حرفًا مع 10 في كل فتحة. وهناك شريطان عريضان لنفس 40 حرفًا. يبدو أن القضبان الواسعة لديها تشفير ثنائي مع وجود شريط آخر هو جزء التكافؤ. أنماط بت الشريط هي 1 ، 2 ، 3 ، 4 ، 5 ، 6 ، 8 ، 9 ، 10 ، 12 حيث يتم تجنب الأرقام التي تحتوي على أكثر من 2 بت.

1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ-._*
1 3 5  8  A C E  H  K M O  R  U W Y  .   1010100100
 23  6  9  BC  F  I  LM  P  S  VW  Z  _  0110010010
   456   0   DEF   J   NOP   T   XYZ   * 0001110001
      7890      GHIJ      QRST      -._* 0000001111
12 4  7   AB D  G   KL N  Q   UV X  -    1101001000 --> Parity

أعتقد أنه من الصعب أن يكون يوم آخر لمعرفة ما إذا كان يمكن تشفير رموز الشريط دون طاولات البحث.

لقد فعلت رمز للعمل مع الرموز الباركودية 39 على الأنظمة المدمجة. هناك نوعان من الرموز ، والتي أفكر فيها كأدوان "منتظمة" 39 و "kodballs" الأربعة. تحتوي الرموز العادية على واحدة من عشرة أنماط من عرض الشريط (اثنان ثلاثة ضيقة) ، وواحد من أربعة أنماط من عرض المساحة (ثلاثة ضيقة واسعة). تحتوي الكرات الغريبة على خمسة أشرطة ضيقة وواحدة من أربعة أنماط من عرض الشريط (ثلاثة ضيقة واسعة واحدة). لتقديم رمز باركي مع رمز مضغوط ، قم بتحويل الحرف إلى رقم 0-39 (للرموز العادية) ، أو 40 ، 50 ، 60 ، أو 70 لـ "Oddballs". ثم DivMod 10. سيختار الرقم العلوي واحدًا من ثمانية أنماط لعرض المساحة ؛ إذا كان الرقم العلوي هو ثلاثة أو أقل ، فسيقوم الرقم السفلي باختيار واحد من عشرة أنماط من عرض الشريط. إذا كان الرقم العلوي هو 4-7 ، فيجب أن تكون جميع القضبان الخمسة ضيقة.

يعمل الرمز بشكل مضغوط باستخدام عدد قليل من جداول البحث الصغيرة. نظرًا لأنه قد يتم تمثيل جداول البحث بشكل مضغوط كسلاسل في التعليمات البرمجية المصدر ، فقد يكون للمناهج ذات جداول البحث الأكبر رمز مصدر أقصر (على الرغم من أنني أعتقد أنه يجب حساب حجم رمز مصدر الجولف في البايتات باستخدام الترميز الأكثر ملاءمة ؛ نهج مع سلسلة من يجب أن تكون شخصيات Oddball التي ستستغرق ثلاثة بايت لتخزينها في UTF-8 واثنين من البايتات لـ UTF-16 إما "مشحونة" 3 بايت لكل شخصيات Oddball ، أو بايت كل منهما لجميع الشخصيات ، أيهما يعطي إجمالي أصغر). يجب أن يتم فرض رسوم على نهج يستخدم مجموعة مختارة من شخصيات OddBall التي تتناسب تمامًا مع بعض صفحة رمز بايت أحادية البلاغة.

البريد العشوائي غير المرغوب فيه البريد العشوائي العشوائي جميل الرسائل غير المرغوب فيها

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top