Escreva uma função ou programa que codifique uma sequência em um código de barras no formato Código 39 , em que cada caractere seja codificado como cinco barras separadas por quatro intervalos. Duas das barras e uma das lacunas são amplas e outras são estreitas (códigos 10 * 4), ou três das lacunas são amplas e nenhuma das barras é (4 códigos). Isso fornece 44 códigos diferentes, dos quais um é um código reservado usado para denotar o início e o fim da sequência codificada.
O desafio
A entrada é uma sequência que contém apenas caracteres do conjunto
1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ-. +/$%
A saída é a sequência codificada como uma sequência de código de barras. O espaço estreito e os espaços entre caracteres são um espaço único e um espaço amplo é de três espaços. A barra estreita é a sequência de bytes UTF-8 para o caractere Unicode "Bloco completo", █, ou seja, 0xE2 0x96 0x88
e a barra larga representa três dessas seqüências / caracteres de bytes ( ███
). A lista completa de códigos é:
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
As barras e os espaços são intercalados, começando em uma barra; portanto, por exemplo, Q é
bar 0 0 0 1 1
code █ █ █ ███ ███
space 0 0 0 1
Depois de codificar todos os caracteres, a cadeia é delimitada nas duas extremidades com █ █ ███ ███ █
. O espaço entre caracteres, um único espaço, é inserido entre cada letra. Sua solução pode gerar espaços à direita e uma nova linha à direita (nessa ordem).
Exemplos
"" → "█ █ ███ ███ █ █ █ ███ ███ █"
"A" → "█ █ ███ ███ █ ███ █ █ █ ███ █ █ ███ ███ █"
"C++" → "█ █ ███ ███ █ ███ ███ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ ███ ███ █"
"GOLF" → "█ █ ███ ███ █ █ █ █ ███ ███ ███ █ ███ █ █ █ ███ █ █ ███ █ ███ ███ █ █ █ █ ███ ███ █"
Formatos de entrada / saída padrão são permitidos e brechas padrão não são permitidas. Isso é código-golfe , então o código mais curto medido em bytes vence!
#
personagem, pois, por exemplo,"#"
não é o único motivo pelo qual ele pode ser usado em um idioma.Respostas:
JavaScript (ES6),
225212 bytesGuardado 4 bytes graças a @ l4m2
Experimente online!
Quão?
A tabela pode ser reorganizada de modo que a máscara binária de 9 bits do caractere seja rapidamente deduzida de sua linha e coluna usando a seguinte fórmula:
com:
fonte
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)Vermelho ,
452445 bytesExperimente online!
Vou tentar jogar mais, mas não espero muito dessa solução ingênua.
fonte
Java 10, 455 bytes
Experimente online.
Explicação:
fonte
C (gcc) ,
311, 303 bytesExperimente online!
-8 graças a ceilingcat
Usa estratégia de codificação da resposta de Arnauld. O link TIO inclui
-w
chave e clichê para remover avisos, que são desnecessários e, portanto, não estão incluídos na pontuação.Além do esquema de codificação, conforme explicado por Arnauld, o outro truque aqui é manter a
w
variável alternando entre 2 e 0 (w=2*!w
). Isso me permite escolher entre a primeira e a segunda stringb
. O primeiro é um espaço, o segundo é o retângulo preenchido.fonte
C (gcc) ,
241 239 227 213207 bytesExperimente online!
Baseado na implementação do @ LambdaBeta .
Um pouco menos golfe:
fonte
Carvão , 90 bytes
Experimente online! Nota: Espaço à direita. Link é a versão detalhada do código. Explicação:
Coloque a sequência de entrada em
*
se mapeie-a duas vezes, finalmente juntando o resultado com espaços. Para o segundo mapa, existe um mapa adicional sobre o intervalo implícito0..4
, onde duas substrings são concatenadas e esses resultados são unidos à constante de cadeia vazia predefinida.Para o primeiro mapa interno, crie uma sequência formada usando os dígitos incrementados, o alfabeto maiúsculo e os símbolos
-. *+/$%
e procure a posição do caractere de entrada mapeado. Por exemplo,C++
mapearia para[12, 40, 40]
.A primeira substring representa os espaços antes das barras. Não há nada antes da primeira barra, mas as outras barras dependem da posição do caractere de entrada mapeado: se tiver mais de 39 anos, apenas um local terá um único espaço; se estiver abaixo de 40, apenas um local terá três. espaços e a posição também é convertida em uma coluna dividindo-a por 10. Se a coluna e o índice do loop diferirem por 2 (módulo 4), esse é o local ímpar.
A segunda substring representa as barras. Se a posição estiver acima de 39, sempre haverá uma barra; caso contrário, a posição será pesquisada em uma matriz de bits mapeados para caracteres. Por exemplo, se a posição for 12, ela será indexada circularmente ao caractere
'
, que está100111
em binário, indicando barras largas nas colunas 1 e 2. (O líder1
é ignorado, simplesmente garante uma contagem consistente de bits.)fonte
Perl 5 , 244 bytes
Experimente online!
Contém muitos caracteres não imprimíveis e de bytes altos, o link TIO fornece uma
xxd
representação. Eu esperava que isso acabasse menor, e talvez ainda seja possível compactar os dados de uma maneira mais eficiente, para ver como vou. Isso cria todas as permutações de" "," ","█","███"
e depois mapeia as indicações da lista para os caracteres correspondentes.fonte
Haskell ,
275270 bytesExperimente online!
O operador
x!n
que calcula os dígitos da base x de n é usado duas vezes para descomprimir os códigos. Os códigos são compactados primeiro como cadeias binárias com largura = 1 e largura = 0, sem levar em conta a cor, por exemploR↔10000110↔262
. Esses números são classificados e diferenciados para obter números no intervalo [3,66], que são compactados com o inverso do algoritmo de dígito binário como0x117CDBC49F9EEEF11C3A659CACB31236
. Ele contém apenas metade dos códigos, o restante são reversos.Ungolfed:
fonte