Graças à sua ajuda no desafio Marcar meu e-mail , o PPCG-Post carimbou com sucesso todos os seus pacotes com os códigos de barras gerados!
Agora, é hora de decodificá-los.
Nesse desafio, seu programa, com um código de barras gerado a partir do desafio Mark My Mail , decodificará e retornará o número inteiro codificado.
Mas cuidado! O código de barras pode estar de cabeça para baixo ...
Códigos de barras de 4 estados
No caso de você ter perdido o desafio da codificação, precisará saber de que tipo de código de barras estamos falando. Um código de barras de 4 estados é uma linha de barras com quatro estados possíveis, cada um representando um número inteiro de base 4:
| |
Bar: | | | |
| |
Digit: 0 1 2 3
Renderizados em ASCII, os códigos de barras ocupam três linhas de texto, usando o |
caractere pipe ( ) para representar parte de uma barra e um espaço ( ) para representar uma seção vazia. Haverá um espaço único entre cada barra. Um exemplo de código de barras pode ser assim:
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
Para converter um código de barras de volta no número inteiro que codifica, mapeie cada barra para o dígito base-4 correspondente, concatene-os e converta-o em decimal.
Como cada código de barras também representa um código de barras diferente quando invertido, implementamos uma sequência de início / parada para que a orientação possa ser calculada. Para o objetivo deste desafio, usaremos a sequência de início / parada especificada pelo Australia Post: cada código de barras começa e termina com uma 1 0
sequência.
O desafio
Sua tarefa é, dado um código de barras ASCII de 4 estados, analisá-lo e retornar o número inteiro que ele codifica - essencialmente o inverso do Mark My Mail .
Mas, para apimentar as coisas, há um problema - o código de barras pode ser dado de cabeça para baixo. Como no mundo real, ele será deixado ao leitor de código de barras (seu programa) para determinar a orientação correta usando a sequência de início / parada.
Exemplo:
Dado o seguinte código de barras:
| | | | | | | | | | | | | | | | | | | |
Podemos ver claramente que o primeiro e o último par de dígitos são 0, 2
e não 1, 0
. Isso significa que o código de barras está de cabeça para baixo - portanto, devemos rotacioná-lo 180 graus (não apenas virar cada barra) para obter a orientação correta:
| | | | | | | | | | | | | | | | | | | |
Agora, podemos começar a decodificação. Mapeamos cada barra para o dígito base-4 correspondente, ignorando as seqüências de início / parada, pois elas não codificam os dados.
| | | | | | | | | | | | | | | | | | | | - - 2 1 0 3 0 2 3 - -
Concatenamos isso no número inteiro base-4 2103023
e depois o convertemos em sua representação decimal 9419
para o resultado final.
Regras
- A entrada sempre será um código de barras válido de quatro estados, renderizado em ASCII, conforme definido acima, com a sequência de início / parada descrita.
- Você pode solicitar espaços à direita ou linhas despojadas, bem como uma nova linha à direita - o que for mais adequado ao seu formato de golfe.
- Pode ou não estar na orientação correta - seu programa deve determinar se deve lê-lo de cabeça para baixo, usando a sequência de início / parada.
- Ele não codificará os dígitos zero iniciais no número inteiro base-4.
- Você pode considerar a entrada como uma lista de linhas ou uma string com novas linhas.
- A saída deve ser um número inteiro na base inteira padrão do seu idioma, representando os dados que foram codificados pelo código de barras.
- Como os selos postais são pequenos e podem caber muito pouco código neles, seu código precisará ser o mais curto possível: este é um código-golfe - para que o programa mais curto (em bytes) vença!
Casos de teste
| | | | | | | | | | | | | |
= 4096 (invertido)
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
= 7313145 (invertida)
| | | | | | | | | | | | | | | | | | | |
= 9419 (invertido)
| | | | | | | | | | | | | | | | | | |
= 990 (não invertido)
| | | | | | | | | | | | | | | | | | |
= 12345 (não invertido)
[String]
,[{#Char}]
,[{Char}]
,[[Char]]
?, Dado queString
é equivalente a{#Char}
Respostas:
Gelatina , 18 bytes
Experimente online!
fonte
Casca , 16 bytes
Experimente online!
Entrada é uma lista de linhas (o link TIO usa uma sequência de linhas múltiplas para maior clareza). As linhas devem ter comprimentos iguais e não deve haver espaços extras à direita.
Explicação
fonte
SOGL V0.12 ,
4032 bytesExperimente aqui!
fonte
Python 2 ,
113105 bytesExperimente online!
fonte
Python 2 , 96 bytes
Experimente online!
fonte
Retina , 71 bytes
Experimente online! O link inclui casos de teste menores. Requer que a primeira e a última linhas sejam preenchidas com espaço ao comprimento da linha do meio. Explicação:
Exclua os espaços desnecessários.
Inverta os caracteres no código, mas se o código de barras começar com a
|
, selecione o código inteiro, caso contrário, divida-o em caracteres. Então, inverta-os. Isso inverte o código se começar com a0
.Exclua a sequência de início / parada e a linha do meio (que não nos serve).
Converta os espaços
|
es da base 4 em unário.Duplique a última linha.
Converta para decimal.
fonte
Java (OpenJDK 8) ,
181160 bytesNão é tão ruim para uma solução java, tenho certeza de que há otimizações que posso fazer, mas já estou encarando isso há muito tempo.
Corte alguns bytes encurtando o loop em vez de usar substring.
Golfe
Experimente online!
Ungolfed
fonte
l+~i
vez del-1-i
Java 8 ,
208166157151 bytesTentá-lo, provavelmente pode ser melhor, reduziu 42 devido a verificações desnecessárias, -9 removendo variáveis, -6 graças a Luke Stevens
Entrada é um
char[][3]
ungolfed:
fonte
Limpo ,
191...161144 bytesExperimente online!
fonte
Pip ,
464342 bytesToma as linhas do código de barras como três argumentos da linha de comando. A primeira e a terceira linhas devem ser preenchidas com o comprimento da segunda linha com espaços. Experimente online!
Explicação
Primeiro um pouco de preparação:
Agora observe que, se ignorarmos a linha do meio e tratarmos
0, cada barra será apenas um número binário de 2 bits:
|
1 efonte
Casca ,
3938 bytesAceita entrada como uma lista de strings: Experimente on-line ou tente a suíte de testes!
Explicação
fonte
Perl 5 , 152 + 2 (
-F
) bytesExperimente online!
fonte
Oitava ,
807568 bytesExperimente online!
Curiosamente,
bi2de
é MSB padrão à direita em vez da esquerda, levando a algumas dores de cabeça enquanto eu fiz isso ... Eu acho que eu deveria ter a melhor maneira de lançar a matriz antes de indexando-lo, mas há muito muitas maneiras de fazê-lo ( seja no primeiro indexação, ou comflipud
,fliplr
,rot90
,'
(transposição), a indexação final, ...). Toma uma matriz retangular com espaços|
es (portanto, são necessários espaços à direita)fonte
JavaScript (ES6),
184181 bytesNão sou um jogador experiente - tenho certeza de que isso pode ser melhorado, mas adorei esse desafio! Eu sempre me perguntei sobre essas marcas.
A função
f
obtém uma lista de cadeias de caracteres com espaços à direita necessários. Novas linhas adicionadas ao código abaixo para maior clareza (não incluídas na contagem de bytes).Uso
Versão ungolfed com explicação
fonte