¡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 queString
es equivalente a{#Char}
Respuestas:
Jalea , 18 bytes
Pruébalo en línea!
fuente
Casco , 16 bytes
Pruébalo en línea!
La entrada es una lista de líneas (el enlace TIO utiliza una cadena de varias líneas para mayor claridad). Las líneas deben tener la misma longitud y no debe haber espacios finales adicionales.
Explicación
fuente
SOGL V0.12 ,
4032 bytesPruébalo aquí!
fuente
Python 2 ,
113105bytesPruébalo en línea!
fuente
Python 2 , 96 bytes
Pruébalo en línea!
fuente
Retina , 71 bytes
Pruébalo en línea! El enlace incluye casos de prueba más pequeños. Requiere que la primera y la última línea se rellenen con espacio a lo largo de la línea media. Explicación:
Eliminar los espacios innecesarios.
Invierta los caracteres en el código, pero si el código de barras comienza con a
|
, seleccione el código completo, de lo contrario, divídalo en caracteres. Luego, inviértelas. Esto voltea el código si comienza con a0
.Elimine la secuencia de inicio / parada y la fila central (que no nos sirve).
Convierta los espacios
|
ys de la base 4 a unario.Dobla la última línea.
Convierte a decimal.
fuente
Java (OpenJDK 8) ,
181160 bytesNo está nada mal para una solución de Java, estoy seguro de que hay optimizaciones que puedo hacer, pero ya he estado mirando esto durante demasiado tiempo.
Reduzca algunos bytes acortando el bucle en lugar de usar la subcadena.
Golfed
Pruébalo en línea!
Sin golf
fuente
l+~i
lugar del-1-i
Java 8 ,
208166157151 bytesProbando, probablemente puede ser mejor, reducido 42 debido a controles innecesarios, -9 eliminando variables, -6 gracias a Luke Stevens
La entrada es un
char[][3]
sin golf:
fuente
Limpio ,
191...161144 bytesPruébalo en línea!
fuente
Pip ,
464342 bytesToma las líneas del código de barras como tres argumentos de línea de comandos. Las líneas primera y tercera deben rellenarse a la longitud de la segunda línea con espacios. Pruébalo en línea!
Explicación
Primero algunos preparativos:
Ahora observe que si ignoramos la fila del medio y tratamos
como 0, cada barra es solo un número binario de 2 bits:
|
como 1 yfuente
Casco ,
3938 bytesToma datos como una lista de cadenas: ¡ Pruébelo en línea o pruebe el conjunto de pruebas!
Explicación
fuente
Perl 5 , 152 + 2 (
-F
) bytesPruébalo en línea!
fuente
Octava ,
807568 bytesPruébalo en línea!
Curiosamente,
bi2de
es por defecto MSB a la derecha en vez de la izquierda, lo que lleva a algunos dolores de cabeza, mientras que hice esto ... creo que debería tener la forma óptima en el lanzamiento de la matriz antes de la indexación, pero hay muy muchas maneras de hacerlo ( ya sea en la primera indexación, o conflipud
,fliplr
,rot90
,'
(transposición), la indexación última ...). Toma una matriz rectangular con espacios|
ys (por lo tanto, se requieren espacios finales)fuente
JavaScript (ES6),
184181 bytesNo soy un golfista experimentado, estoy seguro de que esto se puede mejorar, ¡pero me encantó este desafío! Siempre me he preguntado acerca de esas marcas.
La función
f
toma una lista de cadenas con los espacios finales necesarios. Se agregaron nuevas líneas al código siguiente para mayor claridad (no incluido en el recuento de bytes).Uso
Versión sin golf con explicación
fuente