Mi primer Puzzles de programación y Golf de código es la pantalla Seven-Slash . Aquí está mi primer desafío, también basado en una pantalla de 7 segmentos.
A menudo pienso, además de los números, en qué tipo de letras puedo mostrar usando una pantalla simple de 7 segmentos. Resulta que se pueden mostrar muchas letras. De hecho, todas menos las letras K, M, V, W, X se pueden mostrar usando una sola pantalla de 7 segmentos. Esto se debe a que puede mostrar minúsculas o mayúsculas de una letra. p.ej
"abcdef" se puede mostrar como
_ _ _ _
!_!!_ ! _!!_ !_
! !!_!!_ !_!!_ !
Tenga en cuenta que cada carácter es una matriz 3x3 compuesta por !
y _
.
Por supuesto, la pantalla de 7 segmentos se puede usar para mostrar números y símbolos:
_ _ _ _ _ _ _
! _ !_ !_ ! _! !!_ !_!! !_!!_!
! _!!_ !_! !_! ! _!! !_ ! ! _!
Algunas letras pueden tener mayúsculas y minúsculas:
_ _
! _ !_!!_ ! ! ! _ ! !
!_ !_ ! !! ! ! !!_!!_!!_!!_!
Aquí está el conjunto completo de personajes:
_ _ _ _ _ _ _ _ _
! ! ! _! _!!_!!_ !_ !!_!!_! _ !_ _ _ _!
!_! !!_ _! ! _!!_! !!_! _! !_ ! ! !!_!!_! !
_ _ _ _ _ _ _ _ _ _
!_!!_ ! _!!_ !_ ! !_! ! !! _ ! !!_!!_! _ !_ !_ ! !!_! _!
! !!_!!_ !_!!_ ! !_!! ! !!_!!_ ! !!_!! !! _!!_ !_! _!!_
Tenga en cuenta que hay un espacio en blanco ( ), un guión (
-
) y un signo de interrogación ( ?
). La carta I
, O
yZ
son los mismos que los números 1
, 0
y 2
respectivamente.
En este desafío, escribirá un programa o una función para mostrar una cadena usando el formato de visualización de 7 segmentos anterior.
Reglas
Puedes escribir un programa o una función
Este es el código de golf, gana el código más corto en bytes
Su programa o función debe recibir información de STDIN o como parámetro. Y genera una cadena en STDOUT o como una cadena en 3 líneas sin espacios iniciales pero terminada con nueva línea. Manejar mayúsculas / minúsculas de
CHIOU
correctamente.Opcionalmente, puede imprimir espacios en blanco al final
Debe seguir el formato anterior. Usando guión bajo
_
y signo de exclamación!
para formar su pantalla de 7 segmentos.Debe admitir espacios en blanco (
), guión (
-
) y signo de interrogación (?
)Si la cadena contiene caracteres no admitidos (k, m, v, w, x), se muestra un solo carácter de error (línea de 3 horizontes, ver ejemplo). Además de los 5 caracteres no admitidos, puede suponer que la entrada está compuesta solo por un conjunto de caracteres admitidos.
Opté por no tener una letra para L minúscula (
l
) debido a confusiones, pero si está tan inclinado, puede mostrarla como1
a la derecha o a la izquierda.
Ejemplos
$./a.out Start
_ _
!_ !_ !_! _ !_
_!!_ ! !! !_
$./a.out "7-seg dIsplay"
_ _ _ _ _ _ _
! _ !_ !_ ! _! !!_ !_!! !_!!_!
! _!!_ !_! !_! ! _!! !_ ! ! _!
$./a.out "0123456789 chiou-?"
_ _ _ _ _ _ _ _ _
! ! ! _! _!!_!!_ !_ !!_!!_! _ !_ _ _ _!
!_! !!_ _! ! _!!_! !!_! _! !_ ! ! !!_!!_! !
$./a.out "ABCDEFGHIJLNOPQRSTUZ"
_ _ _ _ _ _ _ _ _ _
!_!!_ ! _!!_ !_ ! !_! ! !! _ ! !!_!!_! _ !_ !_ ! ! _!
! !!_!!_ !_!!_ ! !_!! ! !!_!!_ ! !!_!! !! _!!_ !_!!_
$./a.out "abcdefghijlnopqrstuz"
_ _ _ _ _ _ _ _
!_!!_ _ _!!_ !_ ! !_ !! _ _ !_!!_! _ !_ !_ _!
! !!_!!_ !_!!_ ! !_!! ! !!_!!_ ! !!_!! !! _!!_ !_!!_
$./a.out "Bad Form"
_
_
_
$./a.out "Hello"
_
!_!!_ ! ! _
! !!_ !_ !_ !_!
$./a.out "World"
_
_
_
k, m, v, w, x
no se muestren.\r
) con el avance de línea (LF,\n
). * nix usa LF y Windows usa CRLF. Solo ciertos sistemas heredados usan CR por sí mismo. Más información aquí: en.wikipedia.org/wiki/NewlineRespuestas:
CJAM,
123114112110 bytesLo anterior usa notación de intercalación, ya que el código contiene caracteres no imprimibles. Uno de ellos es un byte nulo (
^@
), lo que significa que este código solo se puede ejecutar desde la línea de comandos.A costa de solo dos bytes más (para un total de 112 ), podemos solucionar esto.
Esta vez, todos los personajes son imprimibles. Pruébelo en línea en intérprete de CJam .
Ejecución de ejemplo
Idea (versión imprimible)
Cada personaje se puede mostrar en la pantalla de 9 segmentos
mediante la sustitución de algunos de sus personajes personajes con espacios.
Podemos convertir un carácter específico en un entero reemplazando cada segmento mostrado, en orden de lectura natural, con un 1 , cada segmento no mostrado con un 0 y considerando los dígitos binarios resultantes.
El primer y el tercer segmento nunca se muestran, por lo que esto producirá números enteros en los rangos [0,64) y [128,192) .
Podemos codificar cada uno de estos enteros como un solo byte, pero la mitad dará como resultado caracteres no imprimibles. Por lo tanto, agregamos 64 a cada número entero antes de convertirlos en caracteres, lo que garantiza que los puntos de código estén en los rangos [64,128) y [192,256) .
El único carácter no imprimible en estos dos rangos es DEL (punto de código 127), que corresponde a la siguiente configuración de visualización no utilizada:
Podemos revertir la codificación anterior agregando 448 == 512 - 64 a cada punto de código, convirtiendo a la base 2 y eliminando el primer dígito binario.
Todo lo que queda por encontrar es una manera eficiente de asociar estos segmenets codificados con sus caracteres ASCII correspondientes.
Si asignamos los caracteres de
" -chiou"
a los caracteres de";=KMVWX"
y convertimos toda la entrada a mayúsculas, simplemente podemos almacenar la codificación para todos los caracteres entre0
(punto de código 48) yZ
(punto de código 90), dando un rango de 43.La indexación de matriz es modular en CJam, por lo que si
A
es una cadena de longitud 43A86=
,A43=
yA0=
todos producen los mismos resultados. El carácter con el punto de código 86 esV
, por lo que simplemente almacenamos los segmentos codificados de V - Z y 0 - U , en orden.En el código real, seleccionamos el signo at como carácter de "forma incorrecta", reemplazamos toda la entrada con la cadena
"@"
si contiene una letra prohibida e invierte los pasos de arriba.Código (versión imprimible)
fuente
Perl,
475469424390280272 bytesmultilínea con comentarios:
Los patrones de bits que codifican los segmentos se almacenan en una cadena (escapando de 3 caracteres no imprimibles usando
\x
y usando\0
para el espacio) y se asignan a los caracteres de entrada usando el operador de transliteración Perl.Para 5 de los 7 segmentos, un bit a bit y se usa junto con el operador ternario para generar un espacio o el carácter del segmento. Para los dos segmentos inferiores a la izquierda (codificados por 2 y 4 en el conjunto de bits), se utiliza una búsqueda de subcadenas en una cadena de 8 caracteres para guardar 2 bytes.
Gracias a Dom Hastings por sus consejos de golf de Perl.
Versión anterior (usando expresiones regulares para codificar los patrones), 390 bytes:
multilínea con comentarios:
La cadena se lee y se verifica en busca de caracteres no válidos utilizando una expresión regular, saliendo si se encuentra alguno. Luego, los caracteres en minúscula permitidos se sustituyen por los caracteres no válidos y toda la cadena se convierte en minúsculas.
Las filas se generan de una en una, con 1 segmento por letra en la primera fila y 3 en las otras dos. Para cada fila, la cadena se procesa un carácter a la vez y el carácter se compara con una expresión regular para cada segmento para verificar si a! o _ debe mostrarse. El uso de una expresión regular significa que para los caracteres en los que el segmento no está configurado, se requieren cero bits por segmento por carácter para codificar si se establece, y para aquellos en los que está, toma un poco menos de 8 bits en promedio porque los rangos de caracteres de expresión regular pueden ser usado. Por lo tanto, resulta en alrededor de 3 o 4 bits por segmento por carácter en el conjunto, o alrededor de 21-24 bits por carácter.
No maneja el ajuste de línea.
fuente
' '
puede ser reemplazado con$"
y' '
puede ser el$"x3
que recorta algunos, sus\n
s pueden ser literalmente nuevas líneas para deshacerse de algunos más. Tu salida anticipada también se puede acortar, usando morir, para que seif(/[kmvwx]/i){print" -\n"x3;exit}
conviertadie" - "x3if(/[kmvwx]/i)
. Con un poco más de fudging también, puede reorganizar el bucle para evitar los corchetes y ¡no debería necesitar$z
guardar algunos más!$_=lc<>
no funciona, porque el código no puede discriminar entre mayúsculas y minúsculas CHIOULisp común,
488416Ejemplo
Con
"abcdefg'hijklnopqrstuz"
impresiones:Observaciones
Los caracteres y sus representaciones están codificados en este número en la base 36:
La representación binaria de este dígito se divide en grupos de 17 bits.
Por ejemplo, el último grupo de 17 bits es
110000111101010
, que se descompone aquí en dos partes:110000
, el código de carácter del personaje0
111101010
, una codificación del dibujo, mejor representada de la siguiente manera:Los bits en la primera y última "columna" son para los
!
personajes, los de la columna central para el_
personaje. Cuando es necesario, se almacenan las versiones en mayúsculas y minúsculas de un personaje.La función itera tres veces sobre la cadena de entrada, una para cada línea de salida, busca un carácter coincidente en la tabla (o el valor predeterminado es 146, también conocido como tres barras) e imprime la representación en la fila actual.
fuente
'
personaje, lo cual es bueno; sin embargo, se mostrará fuera de lo que puede hacer una pantalla de 7 segmentos. Si mueve la línea!
hacia abajo 1 línea, sería perfecto.'
carácter y editaré la preguntaK
porque, de hecho, puse elK
lugar incorrecto en la cadena de entrada ("... jlKn ...") ;-) Puedes ver las barras triples (error) solo después de la L. Gracias por notarlo.JavaScript (ES6),
380352324 bytes( Nota: el código utiliza la notación de intercalación, ya que contiene algunos caracteres no imprimibles. Para obtener el código original, haga clic aquí y seleccione los datos sin procesar. Y no,
h
no es un programa CJam.;)Llamado
d("7-seg display")
o similar. Funciona en Firefox 40, pero puede que no en otros navegadores. Por alguna razón, el fragmento HTML / JS no guarda los no imprimibles, pero puede copiar y pegar los datos sin procesar desde aquí .Sin golf:
( Nota:
g
yh
se han rellenado con espacios para que coincida con8
,-
,ÿ
yspace
con sus correspondientes valores Unicode).Explicación:
Inmediatamente noté que los 7 segmentos, convertidos en
0
/1
bits, irían bien con los primeros 128 caracteres Unicode. El problema con esta idea es que 1/4 de estos caracteres son caracteres de control no imprimibles. Usarlos en mi código lo haría ver increíblemente desordenado (o increíblemente inteligente; no he decidido cuál). Para resolver esto manteniendo el resto del código simple, se me ocurrió esta idea:Con la excepción de
-
, espacio , y el error , ninguno de los personajes que faltaban los dos segmentos verticales inferiores. Así que para asegurarnos de que todos esos personajes permanecieron entre0020
y007f
, simplemente asigné los 64 y 32 bits a estos segmentos, así:Los números de los otros 5 segmentos no son demasiado importantes; podrían organizarse de cualquier otra manera y seguir teniendo los mismos caracteres "dentro de los límites".
Como ejemplo, aquí está la versión codificada de A :
Luego rellené la versión codificada de cada personaje de 7 seg
h
. Sin embargo,8
resultó en007f
(el código de control de eliminación ; constante sin importar cómo estén organizados los segmentos), el espacio resultó en0000
(el código nulo ; también constante),-
resultó0002
y el error resultó0007
. Puedo copiar-pegar los bytes sin procesar en la posición correcta para8
,-
y el error ; el espacio se logró fácilmente con\0
.Después de toda esta codificación, todo lo que tuve que hacer fue usarlo para decodificar la cadena y generarla en un formato legible de 7 seg. He utilizado una de bucle y tres variables (
x
,y
, yz
, cada uno correspondiente a una línea de salida) para ir a través de cada carácter en la cadena y añadir su equivalente 7-seg a la salida. Elegíÿ
el carácter de error porque AFAIK, no está en ningún teclado, y es el último carácter en elu+0000-u+00ff
rango. Quizás podría haber sido ingenioso y elegidoΞ
(letra griega xi) en su lugar ...;)Editar 1: ahorrado un montón de espacio mediante la creación de mini-funciones para determinar si
!
,_
ose necesita.
Edición 2: ahorré un montón más de espacio usando los trucos que aprendí desde la última vez que visité esta publicación.
Como siempre, ¡las sugerencias son muy apreciadas!
fuente