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 que String
é equivalente a{#Char}