Domanda

La sfida

Il codice più breve dal conteggio dei caratteri per disegnare una rappresentazione ASCII di un codice 39 codice a barre.

articolo di Wikipedia su Code 39: http://en.wikipedia.org/wiki/Code_39

ingresso

L'ingresso sarà una stringa di caratteri legali per il codice 39 codici a barre. Questo significa 43 caratteri sono validi: 0-9 A-Z (spazio) e -.$/+%. Il personaggio * non apparirà nella ingresso come è usato come caratteri di inizio e di arresto.

Output

Ogni carattere codificato nel codice 39 codici a barre hanno nove elementi, cinque bar e quattro spazi. Bar saranno rappresentati con i caratteri #, e gli spazi saranno rappresentati con il carattere di spazio. Tre dei nove elementi sarà ampia. Gli elementi stretti sarà un carattere di larghezza, e gli elementi larghi saranno larghe tre caratteri. Uno spazio tra caratteri di un unico spazio dovrebbe essere aggiunto tra ogni modello personaggio. Il modello deve essere ripetuta in modo che l'altezza del codice a barre è alta otto caratteri.

Il * carattere di start / stop (bWbwBwBwb) sarà rappresentato in questo modo:

                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       #   # ### ### # 
                       ^ ^ ^^ ^ ^ ^ ^^^
                       | | || | | | |||
           narrow bar -+ | || | | | |||
           wide space ---+ || | | | |||
           narrow bar -----+| | | | |||
         narrow space ------+ | | | |||
             wide bar --------+ | | |||
         narrow space ----------+ | |||
             wide bar ------------+ |||
         narrow space --------------+||
           narrow bar ---------------+|
inter-character space ----------------+
  • L'avvio e l'arresto carattere * dovrà essere uscita all'inizio e alla fine del codice a barre.
  • Nessun spazio tranquillo dovrà essere inserito prima o dopo il codice a barre.
  • Nessun cifra di controllo dovrà essere calcolato.
  • Non è richiesta la codifica
  • completa ASCII Code39, solo gli standard di 43 caratteri.
  • Non ci sono esigenze di testo da stampare sotto la rappresentazione ASCII del codice a barre per identificare il contenuto di uscita.
  • Il # carattere può essere sostituito con un altro personaggio di maggiore densità, se voleva. Utilizzando il carattere blocco completo U + 2588, consentirebbe il codice a barre a scansione effettivamente stampato.

Casi di test

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

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

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

count Codice comprende ingresso uscita (programma completo) /.

È stato utile?

Soluzione

J, 102 caratteri

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

Spiegazione. Leggere dal bottom:.

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!

Altri suggerimenti

Rubino (1.9) - 121 132 141 166 170 289 < s> 295

Cappelli-off a 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'

memorizza solo il 44 caratteri richiesti e usa la funzione traslitterazione di Ruby per mappare questi

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

ai valori codificati.

Python, 304 caratteri

No fantasia compressione Unicode. Solo trucco è quello di riordinare i personaggi per massimizzare la sovrapposizione. Il mio primo programma Python.

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

monta a 220 byte.

    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:

Non c'è molto spazio per fare i trucchi intelligenti qui.

Python 3.1, senza Unicode (213 215 223 240 248 249 caratteri)

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)

Spiegazione:

La sequenza di codice 39 è codificato in un numero base-4 (più a sinistra = meno significativo) con:

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

La sequenza viene quindi ordinato, per es.

20333   Q
21233   N
21323   L
...

La differenza di voci adiacenti sono prese, dando una lista come [48, 12, 3, …]. Poi 35 viene aggiunto a questa lista per garantire i numeri cadono nel range ASCII. Questo dà la stringa "))&&&,…".

Questo codice ha preso anche avvantaggiati della * non apparirà nel ingresso, così possiamo sostituirlo con qualsiasi carattere non valido, compreso '. In CPython repr("ABC") == "'ABC'", così abbiamo potuto sbarazzarsi di 2 caratteri.

Python 3.1, con Unicode (154 158 caratteri)

In base alla J soluzione , approfittando del "la # personaggio può essere sostituito con un altro personaggio di maggiore densità, se voleva" regola, definendo la densità come della parti scure diviso per il più piccolo rettangolo di delimitazione del glifo . :)

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 caratteri

In terzo luogo va il problema, ancora margini di miglioramento. conteggio dei caratteri da 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 caratteri

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

non mi aspetto di vincere tutte le domande in codice di golf con Lua, quindi non mi sento male rispondere alla mia propria sfida qui. E 'stato anche utilizzando una codifica diversa ho pensato che potrebbe essere interessante per gli altri.

Altre osservazioni

Dopo aver esaminato attentamente la codifica, sembra come se ci può essere un modo di fare a meno look-up table, e calcolare direttamente la codifica del codice a barre. Tuttavia, ho scoperto che i miei tentativi di costruire i calcoli sono voluti più di codice rispetto alla tabella. (Questo non può essere il caso in altre lingue).

Dopo aver diviso i personaggi in gruppi che indicavano dove gli ampi bar e spazi erano, ho visto alcuni modelli interessanti. Sembra che v'è un solo ampio spazio per 40 dei caratteri, con $/+% benessere eccezioni (ciascuno hanno tre spazi.) Il 40 caratteri essendo diviso con 10 in ciascuno slot. E, ci sono due barre larghe per gli stessi 40 caratteri. Le barre larghe sembrano avere una codifica binaria con l'ultima barra essendo un bit di parità. modelli di bit della barra in 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 dove i numeri aventi più di 2 bit impostati sia evitato.

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

Credo che sia una sfida per un altro giorno per vedere se i codici a barre possono essere codificati senza tabelle di.

Ho fatto il codice per lavorare con il codice 39 codici a barre su sistemi embedded. Ci sono due tipi di codici, che penso come i 39 codici "normali" e quattro "stravaganti". I codici regolari hanno uno dei dieci modelli di barre larghezze (due di larghezza tre stretto), e uno dei quattro modelli di larghezze spaziali (una vasta tre stretto). I oddballs hanno cinque barre strette e uno dei quattro modelli di larghezze barre (tre largo stretto). Per rendere un codice a barre con codice compatto, convertire il carattere in un numero 0-39 (per i codici normali), oppure 40, 50, 60, o 70 per "eccentrici". Poi divmod 10. La cifra superiore si seleziona una delle otto modelli di larghezze spaziali; se la cifra superiore è tre o meno la cifra più bassa si seleziona uno dei modelli di dieci larghezze bar. Se la cifra superiore è 4-7, tutti e cinque i bar dovrebbero essere stretti.

Il codice funziona in modo molto compatto con un paio di tabelle di ricerca di piccole dimensioni. Poiché le tabelle di ricerca possono essere compatto rappresentati come stringhe in codice sorgente, si avvicina con tabelle di ricerca più grandi possono avere il codice sorgente più breve (anche se credo che per il codice Golf dimensioni codice sorgente devono essere conteggiati in byte utilizzando il più favorevole di codifica, un approccio con una serie di personaggi eccentrici che portano tre byte da memorizzare in UTF-8 e due byte per UTF-16 dovrebbe essere 'pagano' 3 byte ciascuno per eccentrici personaggi, o due byte ciascuno per tutti i caratteri, se si ottiene un totale inferiore). Un approccio che utilizza una selezione di personaggi stravaganti che si adattano interamente all'interno una particolare pagina di codice singolo byte dovrebbe essere addebitato un byte per carattere.

spam spam spam spam bella di spam

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top