Frage

Die Herausforderung

Der kürzeste Code durch Zeichenzahl eine ASCII-Darstellung eines Code 39 Barcode zu ziehen.

Wikipedia-Artikel über Code 39: http://en.wikipedia.org/wiki/Code_39

Eingabe

Die Eingabe wird eine Reihe von Recht Zeichen für Code 39 Barcodes sein. Dieses Mittel 43 Zeichen sind gültig: 0-9 A-Z (Raum) und -.$/+%. Der * Charakter wird nicht in der Eingabe erscheinen, da sie als das Start- und Stopp-Zeichen verwendet wird.

Ausgabe

codierte Jedes Zeichen in Code 39 Barcodes haben neun Elemente, fünf Bars und vier Räume. Bars mit # Zeichen dargestellt werden, und Räume werden mit dem Raumzeichen dargestellt werden. Drei der neun Elemente breit sein wird. Die schmalen Elemente werden ein Zeichen breit sein, und die breiten Elemente breit drei Zeichen lang sein. Ein Zwischenzeichenraum eines einzigen Raum sollte zwischen jedem Zeichenmuster hinzugefügt werden. Das Muster sollte so wiederholt werden, dass die Höhe des Barcodes acht Zeichen hoch ist.

Der Start / Stopp-Zeichen * (bWbwBwBwb) würde wie folgt dargestellt werden:

                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       ^ ^ ^^ ^ ^ ^ ^^^
                       | | || | | | |||
           narrow bar -+ | || | | | |||
           wide space ---+ || | | | |||
           narrow bar -----+| | | | |||
         narrow space ------+ | | | |||
             wide bar --------+ | | |||
         narrow space ----------+ | |||
             wide bar ------------+ |||
         narrow space --------------+||
           narrow bar ---------------+|
inter-character space ----------------+
  • Die Start- und Stoppzeichen * muß Ausgabe am Anfang und Ende des Strichcodes sein.
  • Kein ruhiger Raum muß vor oder nach dem Strichcode enthalten sein.
  • Keine Prüfziffer müssen berechnet werden.
  • Full ASCII Code 39 Codierung nicht erforderlich ist, sondern nur die Standard-43-Zeichen.
  • Kein Text Bedarf unterhalb der ASCII-Barcodedarstellung gedruckt werden, um die Ausgabe Inhalt zu identifizieren.
  • Das Zeichen # kann mit einem anderen Charakter höherer Dichte ersetzt werden, wenn gewünscht. Unter Verwendung der vollen Block Zeichen U + 2588, würde tatsächlich Scan des Barcodes ermöglichen, wenn gedruckt wird.

Testfälle

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

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

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

Code-Zählung umfasst Eingabe / Ausgabe (Vollprogramm).

War es hilfreich?

Lösung

J, 102 Zeichen

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

Erklärung. Lesen Sie von unten nach oben.

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!

Andere Tipps

Rubin (1,9) - 121 132 141 166 170 289 < s> 295

Hüte-off David

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'

Nur speichert die 44 Zeichen benötigt und verwendet Rubys Umschrift Funktion diese

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

auf die codierten Werte.

Python, 304 Zeichen

Keine Lust Unicode-Komprimierung. Nur Trick ist, die Zeichen neu zu ordnen Überlappung zu maximieren. Mein erstes Python-Programm.

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)

Assembler

zusammenbaut bis 220 Bytes.

    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:

Nicht viel Spielraum für tun clevere Tricks hier.

Python 3.1, ohne Unicode (213 215 223 240 248 249 Zeichen)

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)

Erklärung:

Der Code 39-Sequenz in eine Basis-4-Nummer codiert ist (am weitesten links = niedrigstwertige) mit:

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

Die Sequenz wird dann sortiert, z.

20333   Q
21233   N
21323   L
...

Die Differenz benachbarter Einträge genommen werden, eine Liste wie [48, 12, 3, …] geben. Dann wird 35 zu dieser Liste hinzugefügt die Zahlen fallen im ASCII-Bereich zu gewährleisten. Dies gibt den "))&&&,…" String.

Dieser Code wird auch advantaged des * genommen nicht in der Eingabe erscheinen, so dass wir es durch ein ungültiges Zeichen ersetzen können, einschließlich '. In CPython repr("ABC") == "'ABC'", so dass wir loswerden 2 Zeichen bekommen konnte.

Python 3.1 mit Unicode (154 158 Zeichen)

Basierend auf der J Lösung , Vorteile der Einnahme „kann der Charakter # mit einem anderen Charakter höherer Dichte ersetzt werden, wenn gewünscht“ Regel, indem sie als Bereich der dunklen Teile geteilt durch die kleinste umschließende Rechteck des Glyphen definieren Dichte . :)

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

Python (2.6) - 430 312 302 Zeichen

Dritter auf das Problem gehen, immer noch Raum für Verbesserungen. Zeichenanzahl von 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

Lua, 318 Zeichen

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

Ich erwarte keine Code-Golf Fragen mit Lua zu gewinnen, so dass ich hier meine eigene Herausforderung fühle mich nicht schlecht beantworten. Es wurde auch eine andere Codierung dachte ich könnte auf andere interessant sein.

Andere Beobachtungen

Nach einem Blick genau auf der Codierung, es sieht aus, als ob es mit Tabellennachschlag, ein Weg, um Abgabe sein kann und berechnet die Codierung des Strichcodes direkt. Allerdings fand ich, dass meine Versuche, um die Berechnungen zu bauen mehr Code nahmen als die Tabelle. (Dies kann nicht der Fall in anderen Sprachen sein.)

Nachdem die Zeichen in Gruppen aufgeteilt, die angezeigt, wo die breiten Balken und Zwischenräumen waren, sah ich einige interessante Muster. Es scheint, dass es nur einen großen Raum für 40 der Zeichen, mit $/+% Wesen Ausnahmen (sie haben jeweils drei Räume.) Die 40 Zeichen, die geteilt mit 10 in jedem Schlitz. Und gibt es zwei breite Striche für die gleichen 40 Zeichen. Die breiten Striche scheinen eine binäre Codierung mit dem letzten Takt ist ein Paritätsbit zu haben. Der Bit-Muster des Strichs wobei 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, wobei die Zahlen mit mehr als 2 Bits vermieden eingestellt werden.

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

Ich denke, es ist eine Herausforderung für einen anderen Tag zu sehen, ob die Barcodes ohne Nachschlagetabellen codiert werden.

Ich habe mit dem Code getan Code zu arbeiten 39 Barcodes auf Embedded-Systemen. Es gibt zwei Arten von Codes, die ich mir vorstellen, wie die 39 „normalen“ Codes und den vier „Käuze“. Die regulären Codes haben eine von zehn Muster von Strichbreiten (zwei breite drei schmal), und einer von vier Mustern von Raumbreiten (ein breit drei schmal). Die Käuze haben fünf schmalen Balken und einer von vier Muster von Strichbreiten (drei breite ein schmal). Zu machen, einen Barcode mit kompaktem Code, wandelt das Zeichen in eine Reihe 0-39 (für normale Codes) oder 40, 50, 60 oder 70 für "oddballs". Dann divmod 10. Die obere Ziffer eines von acht Mustern von Raumbreiten wählen wird; wenn die obere Ziffer drei oder weniger die untere Stelle ist, wird eine von zehn Mustern von Strichbreiten wählen. Wenn die obere Ziffer 4-7 ist, werden alle fünf Balken sollte eng sein.

Der Code funktioniert sehr kompakt ein paar kleine Lookup-Tabellen verwendet werden. Da Lookup-Tabellen kompakt als Strings im Quellcode dargestellt werden kann, nähert sich mit größeren Lookup-Tabellen können kürzere Quellcode (obwohl ich für Code Golf Quellcode Größe denken sollte in Bytes mit dem günstigsten Codierung gezählt werden, einen Ansatz mit einer Reihe von oddball Zeichen, die drei Bytes zum Speichern in UTF-8 und zwei Bytes für UTF-16 sollte entweder ‚aufgeladen‘ 3 Bytes für jedes Zeichen oddball nehmen würde, oder jeweils zwei Bytes für alle Zeichen, je nachdem, was eine kleinere Gesamtausbeuten). Ein Ansatz, der eine Auswahl an oddball Zeichen verwendet, die vollständig in einer bestimmten Single-Byte-Code-Seite passen sollte einen Byte pro Zeichen berechnet.

Spam Spam lovely Spam

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top