¡Gracias a su ayuda en el desafío Mark My Mail , PPCG-Post ha estampado con éxito todos sus paquetes con los códigos de barras generados!
Ahora es tiempo de decodificarlos.
En este desafío, su programa, dado un código de barras generado por el desafío Mark My Mail , lo decodificará y devolverá el entero codificado.
Pero ten cuidado! El código de barras podría estar al revés ...
Códigos de barras de 4 estados
En caso de que se haya perdido el desafío de codificación, necesitará saber de qué tipo de códigos de barras estamos hablando. Un código de barras de 4 estados es una fila de barras con cuatro estados posibles, cada uno de los cuales representa un entero de base 4:
| |
Bar: | | | |
| |
Digit: 0 1 2 3
Representados en ASCII, los códigos de barras ocuparán tres líneas de texto, utilizando el |
carácter de barra vertical ( ) para representar parte de una barra y un espacio ( ) para representar una sección vacía. Habrá un solo espacio entre cada barra. Un ejemplo de código de barras puede verse así:
El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El |
Para volver a convertir un código de barras al número entero que codifica, asigne cada barra a su correspondiente dígito de base 4, concatene estos y conviértalo a decimal.
Como cada código de barras también representará un código de barras diferente cuando esté al revés, implementamos una secuencia de inicio / parada para que se pueda calcular la orientación. Para el propósito de este desafío, utilizaremos la secuencia de inicio / parada especificada por Australia Post: cada código de barras comienza y termina con una 1 0
secuencia.
El reto
Su tarea es, dado un código de barras ASCII de 4 estados, analizarlo y devolver el número entero que codifica, esencialmente el reverso de Mark My Mail .
Pero para animar las cosas, hay un problema: el código de barras puede darse al revés. Como en el mundo real, se dejará al lector de código de barras (su programa) determinar la orientación correcta usando la secuencia de inicio / parada.
Ejemplo:
Dado el siguiente código de barras:
El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El |
Podemos ver claramente que el primer y el último par de dígitos son 0, 2
y no 1, 0
. Esto significa que el código de barras está al revés, por lo que debemos rotarlo 180 grados (no solo voltear cada barra) para lograr la orientación correcta:
El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El |
Ahora, podemos comenzar la decodificación. Asignamos cada barra a su correspondiente dígito de base 4, ignorando las secuencias de inicio / parada, ya que no codifican los datos.
El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | - - 2 1 0 3 0 2 3 - -
Concatenamos esto al entero base 4 2103023
, luego lo convertimos a su representación decimal 9419
para el resultado final.
Reglas
- La entrada siempre será un código de barras válido de 4 estados, representado en ASCII como se establece anteriormente, con la secuencia de inicio / parada descrita.
- Puede solicitar espacios finales, o líneas despojadas, así como una nueva línea final, cualquiera que sea el formato que se adapte a su juego de golf.
- Puede o no estar en la orientación correcta: su programa debe determinar si leerlo al revés, utilizando la secuencia de inicio / parada.
- No codificará los dígitos cero iniciales en el entero de base 4.
- Puede tomar la entrada como una lista de líneas o una cadena con nuevas líneas.
- El resultado debe ser un entero en la base de enteros estándar de su idioma, que represente los datos codificados por el código de barras.
- Como los sellos postales son pequeños y pueden contener muy poco código, su código deberá ser lo más corto posible: este es un código de golf , ¡por lo que gana el programa más corto (en bytes)!
Casos de prueba
El | El | El | El | El | El | El | El | El | El | El | El | El | El |
= 4096 (volteado)
El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El |
= 7313145 (volteado)
El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El |
= 9419 (volteado)
El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El |
= 990 (no invertido)
El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El | El |
= 12345 (no invertido)
[String]
, [{#Char}]
, [{Char}]
, [[Char]]
?, Teniendo en cuenta que String
es equivalente a{#Char}