Escriba un programa que tome una cadena no vacía de los dígitos del 0 al 9 e imprima cómo se mostrarían en una pantalla de siete segmentos utilizando barras ( /
, \
).
Estas son las formas precisas de dígitos:
/\
\ \
\/
\
\
/\
/
\/
/\
/\
/
\
\/\
/
\/\
/
/
\/\
\/
/\
\
/\
\/\
\/
/\
\/\
/
Cuando un dígito ocurre después de otro, se encadenan diagonalmente hacia arriba y hacia la derecha, con un espacio diagonal en el medio. Entonces, por ejemplo, 203
se convertiría en esto:
/\
/\
/\ /
\ \
/\ \/
/
\/
Tenga en cuenta que el 1
personaje ocupa la misma cantidad de espacio que los demás. Las dos líneas 1
están en el lado derecho de la pantalla, no a la izquierda.
Entonces 159114
se convertiría en esto:
\
\/\
\
\
\
\
/\
\/\
/ /
\/\
\ /
\
Puede haber cualquier cantidad y combinación de nuevas líneas o espacios iniciales / finales en la salida, siempre que los dígitos estén en la posición correcta entre sí.
Entonces 159114
, esto también sería válido:
\
\/\
\
\
\
\
/\
\/\
/ /
\/\
\ /
\
Tome la entrada de stdin o la línea de comando, o escriba una función que tome una cadena. Imprima el resultado en stdout o puede devolverlo como una cadena si escribe una función.
Cualquier cadena no vacía de los dígitos del 0 al 9 debería funcionar, incluidas las cadenas de un solo dígito (p 8
. Ej. ) Y las cadenas con ceros a la izquierda (p. Ej. 007
, Los ceros sí necesita ser impresa).
El código más corto en bytes gana.
Respuestas:
CJam,
777170696362 bytesTodos los caracteres son imprimibles, por lo que copiar y pegar debería funcionar bien.
Pruébelo en línea en el intérprete de CJam .
Idea
Comenzamos examinando el número de dígitos n en la entrada y presionando un cuadrado de espacios lo suficientemente grande como para cubrir la salida. En la implementación, este cuadrado se codificará como una matriz bidimensional de cadenas de un carácter.
Un cuadrado de longitud 2n + 1 sería correcto (es decir, sin espacios en blanco circundantes) para una implementación sencilla, pero usaremos uno de longitud 5n para guardar un par de bytes. Afortunadamente, se permite el espacio en blanco circundante.
Si invertimos las líneas de la representación de siete barras diagonales de 8 , obtenemos lo siguiente:
La representación de todos los dígitos se puede codificar como un entero de 8 bits, donde el i- ésimo bit es 0 si el i- ésimo carácter debe reemplazarse con un espacio. Para los dígitos del 0 al 9 , los enteros resultantes son
que corresponden a los siguientes caracteres ISO-8559-1:
Para cada dígito en la entrada, después de seleccionar el entero de 8 bits correspondiente, repetimos el i- ésimo carácter de la representación de 8 exactamente a i veces, donde a i es el i th bit del entero. Esto empuja una serie de cadenas de uno o cero caracteres. Al dividir esta matriz en trozos de longitud 3, obtenemos una matriz donde cada elemento corresponde a una línea de la representación.
Ahora, calculamos el máximo vectorizado de las cadenas que representan el cuadrado y las cadenas que representan el dígito. Las cadenas
, por lo que reemplazarán los espacios en el cuadrado. Sin embargo, la cadena
vacía es más pequeña que la cadena , por lo que las cadenas vacías en la representación de dígitos preservarán los espacios en el cuadrado.
/
y\
son más grandes que la cadenaAhora rotamos las filas y columnas por dos unidades para colocar la siguiente representación de dígitos en la parte adecuada del cuadrado y repetir el proceso para los dígitos restantes en la entrada.
Finalmente, invertimos cada fila e insertamos un salto de línea entre las filas individuales.
Código
Las últimas rotaciones estropearían la salida si la longitud del lado del cuadrado fuera menor que 2n + 3 . Como 5n ≥ 2n + 3 para todos los enteros positivos n , el cuadrado es lo suficientemente grande como para evitar esto.
fuente
Pitón 3,
189183174 bytesLa compresión me parece bien, pero tengo problemas para encontrar una buena forma de deshacerme de las siete variables ...
Afortunadamente, la especificación es bastante relajada en las reglas de espacios en blanco, porque hay muchos espacios en blanco iniciales / finales.
Expandido:
Explicación
Las posiciones de segmento representadas por las variables son:
Cada segmento está codificado por un único carácter Unicode de 2 bytes. Por ejemplo,
ϻ
codificag
el segmento de esta manera:De hecho,
2
es el único dígito que no utiliza el segmento inferior derecho de una pantalla de siete segmentos.fuente
C,
1.098 mil345323319 bytesprimeroSegundoTercer intento. Finalmente decidió deshacerse del búfer de pantalla para guardar algunos bytes. Este programa toma un parámetro de dígitos e imprime los dígitos en formato de 7 segmentos.Participante por primera vez. Solo por diversión. Sé gentil.
Ampliado, sin advertencia:
fuente
JavaScript,
192178167162 bytesUso:
f("1337");
volveráUtiliza características de ES6 y puede tener un comportamiento dependiente de la implementación debido a la omisión de punto y coma y paréntesis, pero funciona en Firefox.
Expandido:
Explicación:
l
es una matriz que contiene 10 caracteres de un solo byte que corresponden a la forma de cada dígito. Por ejemplo, el dígito 0 está representado por el carácterî
:Los caracteres de entrada se utilizan como claves para la matriz que mantiene su forma que representa las contrapartes, que se leen poco a poco.
fuente
==0
y de==1
hecho son necesarios antes?
. ¿No se considera int como booleano en js? @Regret"w\x05k/\x1D>~\x07\x7F?"
con cada carácter invertido en bits se convierte en"\xee\xa0\xd6\xf4\xb8|~\xe0\xfe\xfc"
imprimible. Esto da 8 bytes más. Aunque, no lo suficiente ...f=(x)=>{}
, no son necesarios con un solo argumento.Perl - 103 bytes
Lo anterior contiene 6 caracteres no imprimibles (la fuente se puede descargar en Ideone ), y es equivalente a lo siguiente:
Cada uno
^F
puede ser reemplazado por un carácter literal 6 (ACK), y\177
reemplazado por el carácter 127 (DEL).El shebang se cuenta como 1, la segunda línea nueva no es necesaria. La entrada se toma de stdin.
Uso de muestra
Explicación
La salida se genera un byte a la vez. Cada carácter se transcribe, y esto se interpreta como una matriz de bits usando
vec
. Los bits se almacenan de la siguiente manera:La salida alterna entre 3 y 5 barras inclinadas, de modo que los bits se
56
extienden al01
siguiente dígito. El bit7
no se usa.fuente
C #,
360 355331 bytesHola, primer intento de code-golf. Espero que esto no sea tan malo para una entrada en C #.
Uso:
p("159114");
volveráExpandido:
fuente
string s(string n)
an=>
mediante el uso de una lambda. Ah, bueno, puedes dejarlo así si lo prefieres. :) Sin embargo, creé un puerto para Java acreditándote. ;)pitón 2,
317298278273.15Consideré 4 espacios como pestañas mientras contaba.
Sin comprimir y legible:
fuente
l[y+dy][x+dx]=c if r[map(int,s)[x/2]][i]=='1' else ' '
al[y+dy][x+dx]=[' ',c][r[map(int,s)[x/2]][i]=='1']
guardar 5 bytes, cambiarreturn '\n'.join(''.join(x) for x in l)
aprint'\n'.join(''.join(x)for x in l)
guardar 3 bytes, más algunos cambios más. Aquí hay un enlace a un Gist donde obtuve el conteo de bytes hasta 440 desde 508.KDB (Q),
172136bytesExplicación
1) Crear
d
mapa con todas las formas de los dígitos.2) Rellene la matriz con ceros adicionales y agréguelos juntos. es decir, "01"
3) Use el índice para mapear
" /\"
e imprimir con-1
.Prueba
Estoy seguro de que esto puede ser más corto !!
Gracias @hjk
fuente
1 2 0 2 1 2 0 2 1
con(9#1 2 0 2)
(-6).enlist
con1#
obras, entonces ese es otro -5.enlist
aunque porquecount[a 0]#0
no es un átomo :(Pip, 122 + 1 = 123 bytes
Usa la
-n
bandera. Toma entrada a través de la línea de comando argumento.Los caracteres de la cadena UTF-8 tienen los siguientes puntos de código:
11152, 19190, 12535, 12547, 17651, 11575, 11557, 12629, 11071, 11089
.Ligeramente incólume:
La estrategia básica es encontrar los caracteres constituyentes de cada número y luego sesgarlos adecuadamente. Por ejemplo, para
8
, queremos esto (espacios representados por puntos):que se convertirá en esto:
La buena característica de esta estrategia es que múltiples números pre-sesgados pueden simplemente concatenarse uno al lado del otro.
Ahora, podemos codificar
/.\\/.\\/.
en la base 3 como1200120012
. Luego podemos convertir esto a decimal y tratarlo como un punto de código UTF-8.La expresión
J"\/ "@^(A_TB3M"⮐䫶ヷ䓳ⴷⴥㅕ⬿⭑")@_.2<>2Ma
obtiene los datos previamente sesgados mediante el siguiente proceso:Una vez que hemos concatenado estas cadenas una al lado de la otra
$.
, creamos una cuadrícula de espacios (2 * n +2 cuadrados), recorremos la cuadrícula sesgada y reemplazamos los espacios correspondientes en la cuadrícula sesgada con personajes apropiados Para ver cómo sucede, se puede modificar el código para imprimir cada etapa y pausar la entrada del usuario:La cuadrícula en realidad está construida al revés, porque eso parecía facilitar las matemáticas.
Estoy seguro de que hay mejores algoritmos para usar. Pero quería tener mi propia idea en lugar de copiar la de otra persona.
Más sobre Pip
fuente
Brainfuck - 719 bytes
Solo para contexto histórico, créditos a Daniel B Cristofani. No estoy exactamente seguro de cuándo se creó, pero está disponible en Internet Archive a partir del 9 de mayo de 2003.
La salida para
9
es diferente que en la descripción del problema.fuente
Perl, 270 bytes
Realmente no debería haber perdido mi tiempo en esto.
fuente
[$1]while/(.)/g
con[$_]for/./g
para guardar 4 bytes. reemplacefor($i=0;$i<=$l;$i++)
confor$i(0..$l)
para guardar 9 bytes.JavaScript ( ES6 ), 191
206Ejecute el fragmento en Firefox para probar.
fuente
Java 8, 341 bytes
Puerto de la respuesta C # .NET de @Shion , ¡así que asegúrese de votarlo también!
Pruébalo en línea.
Explicación:
fuente