Emule una pantalla de 7 segmentos

24

Tarea

La tarea es mostrar cualquiera de los 128 estados posibles de una pantalla de 7 segmentos .

Su programa debe aceptar una cadena de 7 caracteres ("bits") que son 0o 1. El primer bit de entrada corresponde al segmento A de la siguiente ilustración, el segundo a B, etc. (ignorar dp):

7seg

La forma de representar la pantalla depende de usted: un único símbolo Unicode o ASCII, arte ASCII , gráficamente o lo que sea que se le ocurra. Sin embargo, cada entrada debe tener su propia salida distinta. Si se te ocurre algo elegante, estoy seguro de que puedes cosechar votos a favor mostrando algunos ejemplos.

Los 128 estados posibles de la pantalla son:

estados

Reglas

  • Codegolf
  • Como dije, se permite cualquier tipo de salida, pero sería bueno si lo especificaras.
  • La entrada puede ser stdin o argumento de línea de comando.

Ejemplos

Entrada

1101101

Salida

Como ASCII / Unicode:
2
Diferentes tipos de arte ASCII (no soy demasiado bueno en esto)
 _   ╺┓  ╒╗   ---
 _|  ┏┛  ╔╝     |
|_   ┗╸  ╚╛   ---
              |
              ---
daniero
fuente
Estrechamente relacionado con codegolf.stackexchange.com/questions/997/… ?
DavidC
@DavidCarraher: Están relacionados, sí; Incluso lo vinculé a mí mismo. Sin embargo, esto es un poco más difícil, diría, ya que tiene 118 'números' más para generar. La mayoría (?) De las respuestas a la otra pregunta no funcionarían aquí, o tendrían que ser reescritas. Además, aquí no es necesario codificar los diferentes números, por lo que deberían ser posibles otras optimizaciones.
daniero
Estás en lo correcto. Gracias por señalar eso.
DavidC
¿Es un requisito que usemos la codificación que usted proporcionó? por ejemplo, "1101101" siempre debe representar "2"?
ardnew
@ardnew: sí. La posición de los bits en la entrada debe corresponder al orden alfabético de los segmentos A a G en la primera imagen.
daniero

Respuestas:

5

J (51)

1 2 1#"1[5 3$' #'{~,|:>0;(88707#:~7#7){>".&.>1!:1[1

salida:

1101101
 ## 
   #
 ## 
#   
 ## 
marinus
fuente
1
Esto puede ser afeitado hasta 38 Char con un poco de esfuerzo: 1 2 1#"1' #'{~5 3$,0,.502 A.".&>1!:1]1.
algorithmshark
16

C, 106

El tamaño es de 74 caracteres si se le permite cambiar el nombre del programa "W00WG5WW1GW66WG4WW2GW33WG"

main(int i,char**s){
    for(s[0]="W00WG5WW1GW66WG4WW2GW33WG";i=*s[0]++;putchar(s[1][i&7]-49?i==71?10:32:42));
}

corriendo:

./a.out 1101101
 ** 
   *
 ** 
*   
 ** 

notas:

'W' y 'G' (0x47 y 0x57) se eligen de modo que el valor & 7 = 7, es decir, indexen de forma segura el carácter nulo que termina la cadena de entrada.

conejo bebé
fuente
15

Brainfuck - 224

++++++++++[>+>+++<<-]
>>++>,>,>,>,>,>,>,
<<<<<<<.
>[<+.->-]<<.
>>
>>>>>[<<<<<+<+>>>>>>-]<<<<<<.>[<->-]<.>>[<<+.->>-]<<<.>.
>>>>>>>[<<<<<<<+.->>>>>>>-]<<<<<<<<.
>>>>>>[<<<<+<+>>>>>-]<<<<<.>[<->-]<.
>>>[<<<+.->>>-]<<<<.>.
>>>>[<<<<+.>]

Imprime utilizando puntos de Exlamación:

 ! 
! !
 !
! !
 !

No es el más legible, pero tampoco demasiado horrible.

Sorprendido de lo cerca que está de no ser el último lugar.

captncraig
fuente
13

Postscript 121 107

1 12 moveto{}5 0{0 -5 rmoveto}0 5 0 5 -5 0 0 -5 0 -5 5 0
n{49 eq{rlineto}{rmoveto}ifelse exec}forall stroke

requiere nser definido como la cadena a procesar, así que invoque como

gs -g7x14 -sn=1101101 lcd.ps

Llegar

imagen del número dos

el conjunto completo es

conjunto completo de personajes

Geoff Reedy
fuente
11

Mathematica: 135 129 118, visualización de imagen

Image[MorphologicalComponents@Import@"http://goo.gl/j3elE" /. 
      Thread[Range@7 -> IntegerDigits[#, 2, 7][[{7, 2, 6, 1, 3, 5, 4}]]]] &

espacios añadidos "para mayor claridad"

ingrese la descripción de la imagen aquí

Editar

Para aquellos usuarios exigentes del sitio: Sin usar una máscara externa:

Image[MorphologicalComponents[ColorNegate@Rasterize@8, CornerNeighbors -> False] /. 
    Thread[Range@7 ->IntegerDigits[#, 2, 7][[{7, 2, 6, 1, 3, 5, 4}]]]] &
Dr. belisario
fuente
El código parece estar incompleto. No creo que quisieras que tu programa terminara &.
DavidC
@DavidCarraher Es una función , por lo que termina con &.
Dr. belisarius
Sí, pero no se aplica a nada. ¿Cómo se obtiene salida?
DavidC
2
@belisarius Todavía no me gusta el hecho de que incorpores recursos externos.
FUZxxl
1
Creo que no tiene ningún sentido eliminar mi comentario anterior, ya que eso dificultaría mucho que alguien más siga esta discusión. Importa datos externos que son divertidos como una broma, pero que no forman parte de una respuesta seria de código de golf. -1
FUZxxl
10

APL, 58 55

' _|'[1+3 3⍴0,x[1],0,(x←1 2 2 1 2 2 1×⍞='1')[6 7 2 5 4 3]]

Entrada de ejemplo:

1101101

Salida:

 _ 
 _|
|_ 

⍞='1' toma la entrada como una matriz de caracteres y la convierte en una matriz numérica.

1 2 2 1 2 2 1×⍞='1'convierte esa matriz en: 0para espacios en blanco, 1para _, 2para|

(x←1 2 2 1 2 2 1×⍞='1')[6 7 2 5 4 3]asignar esa matriz a variable xy reordenar para representar los segmentos F, G, B, E, D, C

0,x[1],0,(x←1 2 2 1 2 2 1×⍞='1')[6 7 2 5 4 3] concatena un blanco, segmento A y otro blanco al frente

3 3⍴0,x[1],0,(x←1 2 2 1 2 2 1×⍞='1')[6 7 2 5 4 3] remodelar a una matriz 3x3

1+3 3⍴0,x[1],0,(x←1 2 2 1 2 2 1×⍞='1')[6 7 2 5 4 3] se convierte en indexación basada en 1

Finalmente usa la cadena ' _|'para convertir las indicaciones en caracteres


Editar

' _|'[1+3 3⍴(0,1 2 2 1 2 2 1×⍞='1')[1 2 1 7 8 3 6 5 4]]

Eliminó 3 caracteres concatenando a 0para enfrente de la matriz y utilizando índices duplicados, evitando una asignación variable

TwiNight
fuente
Si su APL lo admite, creo que la función from{ es 1-char más corta que la indexación de paréntesis [].
luser droog
9

PHP 66 bytes

<?for(;11>$i;)echo++$i&3?$argv[1][md5(¡æyÚ.$i)%8]?$i&1?~ƒ:_:~ß:~õ;

Una ligera mejora utilizando una md5fórmula mágica, pero requiere 3 bytes adicionales binarios:
¡, æ, y Úson caracteres 161, 230, y 218, respectivamente. Debería funcionar como está si se copia directamente y se guarda como un formato ANSI.


PHP 73 (70) bytes

<?for($s=327638584;3<$s;)echo++$i&3?$argv[1][7&$s/=8]?$i&1?'|':_:' ':'
';

Si me permite tres caracteres binarios, esto se puede reducir a 70 bytes :

<?for($s=327638584;3<$s;)echo++$i&3?$argv[1][7&$s/=8]?$i&1?~ƒ:_:~ß:~õ;

donde ƒ, ßy õson los caracteres 131, 223 y 245 respectivamente.

Recibe la entrada como un argumento de línea de comando. Uso de la muestra:

$ php seven-seg.php 1101101
 _
 _|
|_

$ php seven-seg.php 0111011

|_|
 _|
primo
fuente
Traté de ejecutar su código, pero recibo un montón de errores :( No entiendo su lógica, pero parece interesante.
D34dman
1
@ D34dman Los únicos mensajes que generará son avisos (variables indefinidas, etc.). Estos se pueden desactivar php.ini(por defecto ya lo están), o para probar, puede anteponer el siguiente código al script:<? error_reporting(E_ALL & ~E_NOTICE); ?>
primo
¡increíble! Lo tengo funcionando: D naice!
D34dman
7

JavaScript + jQuery + HTML + CSS ( 210 201)

Esta solución utiliza sprites CSS y la imagen proporcionada como ejemplo :

HTML (3)

<a>

CSS ( 82 71)

Gracias a xem por el truco " background: url ":

a{background:url(//bit.ly/VesRKL);width:13px;height:23px;display:block}

JavaScript (125 después de eliminar las nuevas líneas agregadas aquí para facilitar la lectura)

i=prompt();
x=-parseInt(i.substr(0,3),2)*23;
y=-parseInt(i.substr(3),2)*13.75;
$('a').css('background-position',y+'px '+x+'px');

Prueba en línea: http://jsfiddle.net/zhqJq/3/

Cristian Lupascu
fuente
1
Oye, pero ¿qué pasa con los 17.937 bytes de la imagen? ;)
Thomas
@ThomasW. No sé si eso debería contarse también. Dejemos esto a la OP para decidir.
Cristian Lupascu
Puede usar la <p>etiqueta y evitar display:blocken CSS para ahorrar espacio
Roberto Maldonado
imagen de fondo: url ( bit.ly/VesRKL ); => fondo: url (// bit.ly/VesRKL);
xem
@xem gracias por el consejo; He editado mi respuesta
Cristian Lupascu
6

R (65 caracteres):

plot((3^(1i*1.5:-4.5)*(1:7!=7)),col=strsplit(readline(),'')[[1]])

Se basa en algunas aproximaciones sueltas para algunos números trascendentales ...

Patrick Caldon
fuente
6

Python 2 - 65

s=raw_input()+'0\n'
for i in`0x623C239E38D2EAA1`:print s[int(i)],

Ejemplo:

echo 1101101|python2 7seg.py
0 1 0 
0 0 1 
0 1 0 
1 0 0 
0 1 0
aditsu
fuente
5

PostScript: 53 binarios, 87 ASCII 52 binarios, 86 ASCII

Hexdump del programa usando tokens binarios:

$ hexdump -C lcd_binary.ps 
00000000  28 34 34 30 34 30 38 30  34 30 34 30 30 30 30 34  |(440408040400004|
00000010  30 34 30 34 34 34 34 34  38 34 38 30 38 29 7b 7d  |0404444484808){}|
00000020  92 49 6e 7b 92 70 31 92  04 92 96 92 6b 92 63 92  |.In{.p1.....k.c.|
00000030  a7 7d 92 49                                       |.}.I|
00000034

Descargue este archivo para probarlo.

Usando tokens ASCII:

(4404080404000040404444484808){}forall
n{not 1 and setgray moveto lineto stroke}forall

El primer forallbucle pone todas las coordenadas requeridas en la pila. Las coordenadas se almacenan en una cadena para minimizar el espacio requerido. Las coordenadas están en orden inverso, es decir, los últimos 4 caracteres son para el segmento de A. Nos dibujar una línea de (0,8)a(4,8) para este segmento (en realidad, hay que añadir 48 a todas las coordenadas, ya que forallpone todos los códigos ASCII en la pila).

El segundo forallrecorre todos los 0sys 1en la cadena de entrada y los convierte en un valor gris. 0s se dibujan en blanco (valor gris 1) y1 s se dibujan en negro (valor gris 0). Luego usamos las coordenadas que foralldejó el primer bucle en la pila para dibujar las líneas.

Invoque el programa usando Ghostscript, al igual que Geoff Reedy:

gs -sn=1101101 lcd.ps

Esto muestra: Salida de muestra

Thomas W.
fuente
Creo que puedes reemplazar neg 49 add(lo cual es increíble por cierto) con 1 and.
luser droog
@luserdroog: Operadores brillantes, bit a bit, no he pensado en ellos. Pero tiene que ser not 1 and, ¿verdad? Todavía guarda un byte tanto en ASCII como en binario.
Thomas
Siento que debe haber una forma ordenada con un mapa de bits de 1 bit. pero bitshiftes una palabra tan larga
luser droog
Pero es solo un token binario de dos bytes
Thomas W.
Sí. Pero todavía me parece un truco de alguna manera. :) Siento que necesito hacer todo lo posible con una fuente legible antes de recurrir al binario.
luser droog
4

APL 101 86 73 69

m←45⍴' '⋄m[¯40+⎕av⍳(⍎∊3/' ',¨⍕⍞)/')*+16;EJOQRSAFK-27=>?']←'⎕'⋄9 5⍴m

La entrada es desde la pantalla a través de ⍞

1101101

Que produce una matriz de caracteres de 9x5 compuesta de espacios en blanco y ⎕ de la siguiente manera:

 ⎕⎕⎕
     ⎕
     ⎕
     ⎕
 ⎕⎕⎕
⎕
⎕
⎕
 ⎕⎕⎕

El número de siete dígitos se convierte en un vector de partición para seleccionar las coordenadas ⎕.

Graham
fuente
Me duele la cabeza ...
Rob
4

Mathematica 112 103 100 96 88, usando gráficas

HighlightGraph[z=GridGraph@{3,2},Pick[EdgeList[z][[{3,4,1,2,6,7,5}]],Characters@#,"1"]]&

ingrese la descripción de la imagen aquí

Using it to show a calculator display

l = {7-> 7, 1-> 6, 0-> 63, 8-> 127, 9-> 111,3 -> 79, 5-> 109,  2-> 91, 4-> 102, 6-> 125}; 
GraphicsRow[
  HighlightGraph[z = GridGraph[{3,2}, EdgeStyle-> {White}, GraphHighlightStyle-> {"Thick"}], 
    EdgeList[z][[{3, 4, 1, 2, 6, 7, 5}]][[IntegerDigits[#, 2, 7] Range@7]]] & /@
            (IntegerDigits[8736302] /. l)]

Gráficos de Mathematica

Dr. belisario
fuente
¿Qué tipo de entrada esperas? Ni [123]ni ["123"], ni IntegerDigits[123]trabajo para mí. Solo obtengo z, sin resaltar.
DavidC
@dude Pruebe `HighlightGraph [z = GridGraph @ {3, 2}, Elija [EdgeList [z] [[{3, 4, 1, 2, 6, 7, 5}]], Caracteres @ #," 1 "] ] & @ "1111111" `` :)
Dr. belisarius
3

Pitón (107)

Definitivamente más golfable.

a=map(int,raw_input())
for i in(0,6,3):print' .. '*a[i]+('\n'+' .'[a[5-i/6]]+'  '+' .'[a[1+i/6]])*(2*(i!=3))

Salida:

1101101
 .. 
   .
   .
 .. 
.   
.   
 .. 

Explicación:

a is a list of booleans extracted from the input.
When you multiply a string with a number, it will return the string repeated (number) times.
If that number happens to be zero, it returns an empty string.
i is iterated through 0 (pos A), 6 (pos G), and 3 (pos D).
' .. ' will print either section A, G, or D, depending on the value of i.
([string here])*(2*(i!=3)) will print [string here] twice only if i!=3.
Breaking down [string here]:
 - '\n' will print a newline for each repetition.
 - '  ' is the null space between horizontal sections.
 - ' .'[(bool)] will return either ' ' if (bool) is 0, and '.' if (bool) is 1.
 - 5-i/6 will return 5 if i=0 and 4 if i=6. a[5] is section F and a[4] is section E.
 - 1+i/6 will return 1 if i=0 and 2 if i=6. a[1] is section B and a[2] is section C.
beary605
fuente
3

Python 2.7 (93 caracteres):

print (' {0}\n{5} {1}\n {6}\n{4} {2}\n {3}').format(*map(lambda x:int(x)and'*'or' ',raw_input()))

Explicación:

Con la entrada stdin, use un operador ternario improvisado para dar *verdadero y un espacio para falso. Tome esos valores y conéctelos a una declaración de formato que tenga el formato de la pantalla de 7 dígitos. Sería como máximo 83 caracteres si la pantalla funcionara así:

 a
b c
 d
e f
 g

pero el pedido lo hace más largo. Alguien tiene una forma de evitar esto?

Ejemplo:

$ ./7seg.py
111000

 *
  *

  *

$ ./7seg.py


1111111

 *
* *
 *
* *
 *
Bandido
fuente
1
Agradable, pero esa lambda parece innecesaria print' {0}\n{5} {1}\n {6}\n{4} {2}\n {3}'.format(*[' *'[i=='1']for i in raw_input()]):;) Tampoco se necesitan corchetes ni espacio para la declaración de impresión.
daniero
¡Guauu! No sabía que podías poner booleanos en los indexadores. Gracias :-)
Brigante
Notario público. Además, en >'0'lugar de =='1'y input()(con backticks alrededor, pero eso no se mostrará debido al formato aquí) en lugar de raw_input().
daniero
para tu información, puedes usar triples backticks si necesitas backticks en el códigox = `input()`
Brigante
Guay. Entonces aprendí algo hoy también :)
daniero
3

Pensé que necesitábamos una respuesta lispy ...

Clojure, 159 caracteres

(print(apply str(flatten(interpose\newline(partition 3(map(fn[x](if(= x\1)\o" "))(str" "(apply str(interpose" "(map(vec(read-line))[0 5 1 6 4 2 3])))" ")))))))

Lo anterior se ejecutará en el REPL y proporcionará la respuesta correcta. Por ejemplo:

1111111
 o 
o o
 o 
o o
 o 

Lanzarle números con pequeñas modificaciones:

(doseq [i ["1111110" "0110000" "1101101" "1111001" "0110011" "1011011" "1011111" "1110000" "1111111" "1111011"]]
(println (apply str(flatten(interpose\newline(partition 3(map(fn[x](if(= x\1)\o" "))(str" "(apply str(interpose" "(map(vec i)[0 5 1 6 4 2 3])))" "))))))) 
(println))

rendimientos:

 o 
o o

o o
 o 


  o

  o


 o 
  o
 o 
o  
 o 

 o 
  o
 o 
  o
 o 


o o
 o 
  o


 o 
o  
 o 
  o
 o 

 o 
o  
 o 
o o
 o 

 o 
  o

  o


 o 
o o
 o 
o o
 o 

 o 
o o
 o 
  o
 o 

nil

No es fácil de leer, ¡pero están ahí!

Joanis
fuente
3

Javascript 123

s=prompt(i=o='');for(m=' 0516423';i++<15;i%3==0?o+='\n':1)o+=' ─│'[~i%2&(A=+s[+m[~~(i/2)]])+(A&+'110'[i%3])];console.log(o)

Puedo reducir el recuento de caracteres (101) si usamos solo un carácter para el estado "activado", pero es menos legible:

s=prompt(i=o='');for(m=' 0516423';i++<15;i%3==0?o+='\n':1)o+=' ■'[~i%2&s[+m[~~(i/2)]]];console.log(o)
Shmiddty
fuente
+1 Esto es impresionante. Todavía estoy tratando de realizar ingeniería inversa. ¡Ya me enseñó algunas cosas!
guypursey
2

Posdata 136

No ganador, sino un enfoque diferente.

15 string exch{1 and 255 mul}forall
[7 3 9 13 11 5 1]{count 1 sub index 3 1 roll exch put}forall
3 5 8[.02 0 0 .05 0 0]{}image showpage

Espera que la cadena de entrada esté en la pila:

$ echo '(1101101)'|cat - 7seg.ps |gs -sDEVICE=png16 -sOutputFile=6c.png -

Este es aún peor. 294 para hacer un mapa de bits "binario". Me tomó un tiempo recordar que cada fila está acolchada a un byte uniforme. Entonces, un mapa de bits de 3x5 es de cinco bytes con los 3 bits de msb significativos.

2#1101101
(12345)exch
2 copy 64 and 0 exch put %A
2 copy 2 and 6 bitshift 2 index 32 and or 1 exch put %F B
2 copy 1 and 6 bitshift 2 exch put %G
2 copy 4 and 5 bitshift 2 index 16 and 1 bitshift or 3 exch put %E C
2 copy 8 and 3 bitshift 4 exch put
pop
3 5 1[.02 0 0 .02 0 0]{}image showpage

La salida es tan fea como la otra. :(

Muy bien, aquí hay uno que se ve bien. 190

Editar: fue al revés y al revés. Corregido ahora.

(1101101)
{neg 49 add 255 mul
1 string dup 0 4 3 roll put}forall
(\377){@/g/f/e/d/c/b/a}{exch def}forall
@ a a @
b @ @ f
b @ @ f
@ g g @
c @ @ e
c @ @ e
@ d d @
4 7 8[.01 0 0 .01 0 0]{}image showpage
luser droog
fuente
Esto me muestra algunos patrones divertidos. ¿Todavía hay un error en alguna parte?
Thomas
hmm sí. (1111110) no parece un cero. Es solo un mapa de bytes ampliado. Supongo que las cajas están demasiado simplificadas. :(
luser droog
Creo que es algo así como la naturaleza de este enfoque de mapa de bits. No estoy seguro de cómo hacer que no sea feo.
luser droog
Algunos comentarios ligeros disponibles aquí .
luser droog
2

Mathematica 264

Hacer que la salida se vea bien requiere muchos bytes, por lo que esta vez no habrá cigarros. Pero aquí está el código detallado (264 caracteres) de todos modos.

{a, b, c, d, e, g} = {{-1, 5}, {1, 5}, {1, 3}, {1, 1}, {-1, 1}, {-1, 3}};
f@n_ := Graphics[{Yellow, Thickness[.1], CapForm["Round"],
   Line /@ {{g, c}, {g, a}, {g, e}, {e, d}, {d, c}, {c, b}, {b, a}}[[Flatten@
   Position[IntegerDigits[n, 2, 7], 1]]]}, 
   Background -> Blue, PlotRange -> {{-1, 1}, {1, 5}}, PlotRangePadding -> 1]

El conjunto completo de personajes:

GraphicsGrid[Partition[Table[f[p], {p, 0, 128}], 16]]

caracteris

Los dígitos:

{f[63], f[6], f[91], f[79], f[102], f[109], f[125], f[7], f[127], f[111]}

ingrese la descripción de la imagen aquí

DavidC
fuente
2

PHP - 155 caracteres

<?php
$y=array("   \n"," - \n","   \n","  |\n","|  \n","| |\n"); $x = $argv[1]; echo $y[$x[0]].$y[2*$x[6]+$x[2]+2].$y[$x[7]].$y[2*$x[5]+$x[3]+2].$y[$x[4]];

serían 150 caracteres si utilizamos la declaración de matriz de tipo php 5.4, pero no tengo eso instalado en mi computadora portátil, así que no pude probarlo.

Muestra de salidas.

ingrese la descripción de la imagen aquí

Explicación:

Primero dividí la pantalla de 7 segmentos en Cinco filas y 3 columnas. Con la 1ra, 3ra y 5ta fila havimg '-' en la columna del medio, y espacio de lo contrario.

La segunda y cuarta fila tiene una tubería '|' personaje en la primera y última columna. Ahora la presencia de estos caracteres debe guiarse por los valores de entrada.

Creé una tabla de búsqueda, que es básicamente dos tablas de búsqueda. Primero para el cálculo de valores para la 1ra, 3ra y 5ta fila. Y otro en el desplazamiento 2 (3er elemento) para el cálculo de las filas 2da y 4ta.

D34dman
fuente
2

Java - 204 caracteres

class A{public static void main(String[]a){char[]c=new char[7];for(int i=0;i<7;i++)c[i]=a[0].charAt(i)==49?i%3==0?95:'|'):32;System.out.printf(" %c %n%c%c%c%n%c%c%c",c[0],c[5],c[6],c[1],c[4],c[3],c[2]);}}

Salida de muestra:

 _ 
 _|
|_ 

Formateado correctamente:

class A {
    public static void main(String[] a) {
        char[] c = new char[7];
        for (int i = 0; i < 7; i++)
            c[i] = a[0].charAt(i) == 49 ? (i % 3 == 0 ? 95 : '|') : 32;
        System.out.printf(" %c %n%c%c%c%n%c%c%c", c[0], c[5], c[6], c[1], c[4], c[3], c[2]);
    }
}

Realmente desearía poder evitar eso para el bucle, pero probé algunas otras cosas y todas fueron más largas. Probablemente haya una mejor manera de hacer esto, pero este es mi primer intento de golf de código. (Y Java es el peor lenguaje para él, por eso pensé que sería interesante). Incluso Brainfuck me tiene vencido, pero al menos mi salida se ve mejor.

EDITAR: puedo deshacerme de "público" en clase, ¡me ahorra 7 caracteres!

Y gracias, daniero, por mostrarme printf! (18 caracteres guardados)

Reescribió el formato de salida, cambió los literales de caracteres a decimal, se guardaron 12 caracteres.

descifrador de códigos
fuente
Bienvenido a codegolf.se! Java introdujo un printfmétodo algunas versiones atrás, que es básicamente printlny formaten uno (como la función C); Esto te ahorrará algunos personajes,
daniero
Aquí hay otro truco: puede combinar el "cuerpo" del forbucle y la parte de actualización en uno, guardando un personaje:for(int i=7;i>0;c[--i]=a[0].charAt(i)==49?(i%3==0?95:'|'):32);
daniero
1

VBA - 263

Es feo pero funciona, creo. Tengo problemas para ver el orden de bits adecuado, así que deduzco de las respuestas de los demás. Incluso si esa pieza está mal, la longitud del código debe permanecer igual.

Sub d(b)
Dim c(1 To 7)
For a=1 To 7
c(a)=Mid(b,a,1)
Next
x=" - "
y="|"
z=" "
w="   "
v=vbCr
MsgBox IIf(c(1)=1,x,w) & v & IIf(c(6)=1,y,z) & z & IIf(c(2)=1,y,z) & v & IIf(c(7)=1,x,w) & v & IIf(c(5)=1,y,z) & z & IIf(c(3)=1,y,z) & v & IIf(c(4)=1,x,w)End Sub
Gaffi
fuente
1

VBScript - 178 caracteres

m=Split("2 7 11 10 9 5 6")
s=" _ "&vbCr&"|_|"&vbCr&"|_|"
For x=1 To 7
If Mid(WScript.Arguments.Item(0),x,1)=0 Then r=m(x-1):s=Left(s,r-1)&" "&Right(s,Len(s)-r)
Next
MsgBox s
Comintern
fuente
¡Gracias! Un par de errores de cabeza hueca me costaron 6 caracteres. Casi puedo reducir esto al tamaño del VBA incluso con la llamada absurdamente larga para obtener el argumento de la línea de función.
Comintern
A menos que su código sea funcional sin los caracteres de nueva línea, también debe contarlos. Esto tiene 178 caracteres según mi cuenta.
manatwork
1

CJam - 29

l0N]s7078571876784728737Ab\f=

CJam es un nuevo lenguaje que estoy desarrollando, similar a GolfScript - http://sf.net/p/cjam . Aquí está la explicación:

l lee una línea de la entrada
0 el número 0
Nes una variable preinicializada a la cadena de nueva línea que
]reúne los elementos de la pila en una matriz,
sconvierte un valor (la matriz) en una cadena, por lo que agrega un cero y una nueva línea a la entrada dada
7078571876784728737es una número (el mismo número que usé en python, pero estaba en hexadecimal allí)
Aes una variable preinicializada a 10 que
brealiza una conversión base, generando la matriz [7 0 7 8 ... 3 7]
\intercambia los dos últimos valores en la pila
f=aplica el =operador (aquí, acceso a matriz indexada) en la cadena de entrada (más cero y nueva línea) y cada número 7, 0, 7, ...
El índice 7 corresponde al cero añadido, y 8 corresponde a la nueva línea añadida.

Mi solución de Python hace exactamente lo mismo (excepto que la separación de dígitos se realiza mediante la conversión de cadenas)

aditsu
fuente
¿Qué estoy mirando aquí? ¿Le gustaría ofrecer una breve explicación del código?
daniero
@daniero agregué una explicación
aditsu
1

VBA, 188 caracteres

Tenga en cuenta que uno debe escribir 188 caracteres si solo incluye espacios en blanco obligatorios: el IDE lo expande cuando lo copia en el editor VBA.

Sub f(i)
Dim c() As Byte
m=Split("1 6 10 9 8 4 5")
c=StrConv(" _  |_| |_|",128)
c(3)=10
c(7)=10
For x=1 To 7
If Mid(i,x,1) = 0 Then c(m(x-1))=32
Next
MsgBox StrConv(c,64)
End Sub

Lamentablemente, VBScript no tiene una matriz de Bytes fuertemente tipada, o esa podría ser mucho más corta usando este método.

Comintern
fuente
1

Javascript (ECMAScript 2016) - 108 bytes

console.log(([a,b,c,d,e,f,g]=[...prompt()].map((x,i)=>+x?'_||'[i%3]:' '),` ${a}
${f}${g}${b}
${e}${d}${c}`))

Esto probablemente se pueda jugar más, pero no se me ocurre nada.

M Dirr
fuente
Bienvenido al sitio! Esa es una buena primera entrada :)
daniero
1

JavaScript, 148 bytes

e=>(e[0]==1?" #\n":"\n")+(e[5]==1?"#":" ")+(e[1]==1?" #\n":"\n")+(e[6]==1?" #\n":"\n")+(e[4]==1?"#":" ")+(e[2]==1?" #\n":"\n")+(e[3]==1?" #\n":"\n")

Pruébalo en línea! (El pie de página es Node.js para leer .input.tio)

Acepta la entrada de ABCDEFG en banderas binarias y devuelve:

 #
# #
 #
# #
 #
facepalm42
fuente
0

SmileBASIC, 136 bytes

DIM A[7,2]COPY A,@L@L?DATA.,1,1,3,4,3,6,1,4,0,1,0,3,1INPUT X$FOR I=0TO 6M=I MOD 3GBOX A[I,1],A[I,0],A[I,1]+!M,A[I,0]+!!M,-VAL(X$[I])NEXT

La salida es gráfica.

12Me21
fuente
0

05AB1E , 4 bytes

C₄+ç

Pruébalo en línea o verifique todas las entradas posibles .

Vea verificar todas las entradas posibles enlace de arriba para ver la asignación utilizada para cada entrada.

Explicación:

Esto abusa de las reglas donde dice:

La forma de representar la pantalla depende de usted: un único símbolo Unicode o ASCII , arte ASCII, gráficamente o lo que sea que se le ocurra. Sin embargo, cada entrada debe tener su propia salida distinta.

C       # Convert the (implicit) input from binary to integer
 ₄+     # Increase it by 1000
   ç    # Convert it to a unicode character with this value (and output implicitly)

Alternativa más en el espíritu del desafío utilizando el formato de salida:

 -
| |
 -
| |
 -

38 bytes :

Σ•L7וNè}εi" -| | "14∍2ôNèëðº]J24S5∍£»

Definitivamente se puede jugar al golf ..

Pruébelo en línea o verifique todas las entradas posibles .

Explicación:

Σ       }          # Sort the (implicit) input-digits by:
 L7וNè           #  The digit at the same index in the compressed integer 1367524
                   #   i.e. "1101101" → ["1","0","1","1","1","0","1"]
ε                  # Then map each digit to:
 i                 #  If it's a 1:
  " -| | "         #   Push string " -| | "
          14      #   Lengthen it to size 14: " -| |  -| |  -"
             2ô    #   Split it into parts of 2: [" -","| ","| "," -","| ","| "," -"]
               Nè  #   Index into it
 ë                 #  Else (it's a 0):
  ðº               #   Push "  " (two spaces) instead
    ]              # Close both the if-else and map
                   #  i.e. ["1","0","1","1","1","0","1"]
                   #   → [" -","  ","| "," -","| ","  "," -"]
J                  # Join everything together to a single string
                   #  i.e. [" -","  ","| "," -","| ","  "," -"] → " -  |  -|    -"
 24S               # Push [2,4]
    5             # Lengthened to size 5: [2,4,2,4,2]
      £            # Split the string into parts of that size
                   #  i.e. " -  |  -|    -" → [" -","  | "," -","|   "," -"]
       »           # Join by newlines (and output implicitly)
                   #  i.e. [" -","  | "," -","|   "," -"] → " -\n  | \n -\n|   \n -"

Ver este consejo 05AB1E mío ( sección Cómo comprimir grandes números enteros? ) Para entender por qué •L7וes 1367524.

Kevin Cruijssen
fuente
0

PHP 5.6, 65 bytes ASCII simple

for(;$p++<9;)echo$argn[_707561432[$p]]?"||_"[$p%3]:" ","\n"[$p%3];

o, sin un salto de línea final, pero con algo de diversión bit a bit:

for(;$p++<11;)echo$argn[_70785618432[$p]]?L|Sx[$p&1]:a^kAAA[$p&3];

Ejecutar como tubería -nRo probarlos en línea .

desglose 1

for(;$p++<9;)echo           # loop through positions
    $argn[_707561432[$p]]   # map position to input bit
        ?"||_"[$p%3]            # if set: underscore in 2nd column, pipe symbol else
        :" "                    # else space
    ,"\n"[$p%3]             # add newline every 3 columns
;

desglose 2

for(;$p++<11;)echo          # loop through positions
    $argn[_70785618432[$p]] # map position to input bit (bit 8 for EOL, never set)
        ?L|Sx[$p&1]             # if set: underscore in the middle, pipe symbol else
        :a^kAAA[$p&3]           # else: newline in 4th column, space else
Titus
fuente
1
Si el idioma es nuevo o antiguo ya no importa desde el verano de 2017 . Por lo tanto, no tendrá que mencionar que no compite.
Kevin Cruijssen
@KevinCruijssen Gracias, me perdí eso. Pero también es un buen desafío revivir versiones antiguas de PHP; a veces también ofrece una visión diferente de las características más recientes: en ocasiones, descubrí que la forma "antigua" es más eficiente (en tamaño, rendimiento, legibilidad y, a veces, las tres) que usar cosas que se agregaron a PHP más tarde Sin embargo, no hay ventaja en el golf en este caso: el primer enfoque requeriría 8 bytes adicionales, el segundo 5.
Titus