Emule uma tela de 7 segmentos

24

Tarefa

A tarefa é exibir qualquer um dos 128 estados possíveis de uma exibição de 7 segmentos .

Seu programa deve aceitar uma seqüência de 7 caracteres ("bits") que são 0ou 1. O primeiro bit de entrada corresponde ao segmento A da ilustração a seguir, o segundo a B, etc (ignorar dp):

7seg

A decisão de como você representa a exibição - um único símbolo Unicode ou ASCII, arte ASCII , graficamente, ou o que você puder criar. No entanto, cada entrada deve ter sua própria saída distinta. Se você criar algo sofisticado, tenho certeza de que pode obter votos positivos, mostrando alguns exemplos.

Todos os 128 estados possíveis da tela são:

estados

Regras

  • Codegolf
  • Como eu disse, qualquer tipo de saída é permitida, mas seria bom se você a especificasse.
  • A entrada pode ser stdin ou argumento de linha de comando.

Exemplos

Entrada

1101101

Saída

Como ASCII / Unicode:
2
Diferentes tipos de arte ASCII (não sou muito bom nisso)
 _   ╺┓  ╒╗   ---
 _|  ┏┛  ╔╝     |
|_   ┗╸  ╚╛   ---
              |
              ---
daniero
fonte
Intimamente relacionado com codegolf.stackexchange.com/questions/997/… ?
DavidC
@ DavidCarraher: Eles estão relacionados, sim; Eu mesmo vinculei a ele mesmo. No entanto, isso é um pouco mais difícil, eu diria, pois você tem mais 118 'números' para gerar. A maioria (?) Das respostas para a outra pergunta não funcionaria aqui ou teria que ser fortemente reescrita. Além disso, aqui você não precisa codificar os diferentes números; portanto, outras otimizações devem ser possíveis.
Daniero 20/12/12
Você está certo. Obrigado por apontar isso.
DavidC
é um requisito que usamos a codificação que você forneceu? por exemplo, "1101101" deve sempre representar "2"?
ardnew
@ardnew: sim. A posição dos bits na entrada deve ser mapeada para a ordem alfabética dos segmentos A a G na primeira imagem.
Daniero

Respostas:

5

J (51)

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

saída:

1101101
 ## 
   #
 ## 
#   
 ## 
marinus
fonte
11
Isto pode ser raspada até 38 de char com um pouco de esforço: 1 2 1#"1' #'{~5 3$,0,.502 A.".&>1!:1]1.
algorithmshark
16

C, 106

O tamanho é de 74 caracteres se for permitido renomear o 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));
}

corrida:

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

notas:

'W' e 'G' (0x47 e 0x57) são escolhidos de forma que o valor & 7 = 7, ou seja, eles indexem com segurança o caractere nulo que termina a string de entrada.

coelho bebê
fonte
15

Brainfuck - 224

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

Imprime usando pontos de exclamação:

 ! 
! !
 !
! !
 !

Não é o mais legível, mas também não é horrível.

Surpreso com a proximidade de não ser o último lugar.

captncraig
fonte
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

requer nque seja definido como a sequência a ser processada, para chamar como

gs -g7x14 -sn=1101101 lcd.ps

para obter

imagem do número dois

o conjunto completo é

conjunto completo de caracteres

Geoff Reedy
fonte
11

Mathematica: 135 129 118, exibição de imagem

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

espaços adicionados "para maior clareza"

insira a descrição da imagem aqui

Editar

Para os usuários exigentes do site: Sem usar uma máscara externa:

Image[MorphologicalComponents[ColorNegate@Rasterize@8, CornerNeighbors -> False] /. 
    Thread[Range@7 ->IntegerDigits[#, 2, 7][[{7, 2, 6, 1, 3, 5, 4}]]]] &
Dr. belisarius
fonte
O código parece estar incompleto. Acho que você não queria que seu programa terminasse &.
22412
@DavidCarraher É uma função , então termina com &.
Dr. belisarius
Sim, mas não é aplicado a nada. Como se obtém saída?
DavidC
2
@belisarius Eu ainda não gosto do fato de você incorporar recursos externos.
FUZxxl
11
Eu acho que não faz sentido remover meu comentário anterior, pois isso tornaria muito mais difícil para alguém seguir essa discussão. Você importa dados externos que são engraçados como uma piada, mas que não fazem parte de uma resposta séria ao código de golfe. -1
FUZxxl 27/12/12
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]]

Exemplo de entrada:

1101101

Saída:

 _ 
 _|
|_ 

⍞='1' pega a entrada como uma matriz de caracteres e a converte em uma matriz numérica.

1 2 2 1 2 2 1×⍞='1'converte essa matriz em: 0for blank, 1for _, 2for|

(x←1 2 2 1 2 2 1×⍞='1')[6 7 2 5 4 3]atribua esse array a variável xe reordene para representar os 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 um espaço em branco, segmento A e outro espaço em branco na frente

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

1+3 3⍴0,x[1],0,(x←1 2 2 1 2 2 1×⍞='1')[6 7 2 5 4 3] converte em indexação baseada em 1

Finalmente, usa a string ' _|'para converter indicações em caracteres


Editar

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

Corte 3 caracteres, concatenando a 0para frente da matriz e usando indicações duplicadas, impedindo uma atribuição de variável

TwiNight
fonte
Se o seu APL suporta, acho que a função from{ é 1 caractere menor que a indexação de colchetes [].
Luser droog 22/03/2015
9

PHP 66 bytes

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

Uma ligeira melhoria usando uma md5fórmula mágica, mas requer 3 bytes adicionais binários:
¡, æ, e Úsão caracteres 161, 230, e 218, respectivamente. Ele deve funcionar como está se for copiado diretamente e salvo como um formato ANSI.


Bytes de PHP 73 (70)

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

Se você me permitir três caracteres binários, isso poderá ser reduzido para 70 bytes :

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

onde ƒ, ße õsão caracteres 131, 223, e 245, respectivamente.

Recebe entrada como um argumento de linha de comando. Uso da amostra:

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

$ php seven-seg.php 0111011

|_|
 _|
primo
fonte
i tentou executar o código, mas estou recebendo cargas de erro :( Eu não entendo a sua lógica, mas parece interessante.
D34dman
11
@ D34dman As únicas mensagens que irá produzir são avisos (variáveis ​​indefinidas, etc). Eles podem ser desativados php.ini(por padrão, eles já estão) ou, para testar, você pode anexar o seguinte código ao script:<? error_reporting(E_ALL & ~E_NOTICE); ?>
primo
impressionante! Eu consegui: D naice!
D34dman
7

JavaScript + jQuery + HTML + CSS ( 210 201)

Esta solução usa sprites CSS e a imagem fornecida como exemplo :

HTML (3)

<a>

CSS ( 82 71)

Obrigado ao xem pelo truque " background: url ":

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

JavaScript (125 após a remoção de novas linhas adicionadas aqui para facilitar a leitura)

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');

Teste online: http://jsfiddle.net/zhqJq/3/

Cristian Lupascu
fonte
11
Ei, mas e os 17.937 bytes da imagem ?? ;)
Thomas W.
@ThomasW. Não sei se isso deve ser contado também. Vamos deixar isso para o OP para decidir.
Cristian Lupascu
Você poderia usar <p>tag e evitar display:blocka CSS para economizar espaço
Roberto Maldonado
imagem de fundo: url ( bit.ly/VesRKL ); => fundo: url (// bit.ly/VesRKL);
Xempr
@xem obrigado pela dica; Eu editei minha resposta
Cristian Lupascu 11/04
6

R (65 caracteres):

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

Baseia-se em algumas aproximações soltas para alguns números transcendentais ...

Patrick Caldon
fonte
6

Python 2-65

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

Exemplo:

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

PostScript: 53 binários, 87 ASCII 52 binários, 86 ASCII

Hexdump do programa usando tokens binários:

$ 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

Baixe este arquivo para testá-lo.

Usando tokens ASCII:

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

O primeiro forallloop coloca todas as coordenadas necessárias na pilha. As coordenadas são armazenadas em uma sequência para minimizar o espaço necessário. As coordenadas estão na ordem inversa, ou seja, os últimos 4 caracteres são do segmento A. Traçamos uma linha de (0,8)a(4,8) para este segmento (na verdade, precisamos adicionar 48 a todas as coordenadas, porque forallcoloca todos os códigos ASCII na pilha).

A segunda forallpercorre todos os 0s e 1s na cadeia de entrada e os transforma em um valor de cinza. 0s são desenhados em branco (valor cinza 1) e1 es são desenhados em preto (valor cinza 0). Em seguida, usamos as coordenadas que o primeiro forallloop deixou na pilha para desenhar as linhas.

Invoque o programa usando Ghostscript, assim como o de Geoff Reedy:

gs -sn=1101101 lcd.ps

Isso exibe: Saída de amostra

Thomas W.
fonte
Eu acho que você pode substituir neg 49 add(o que é incrível)1 and .
Luser droog 27/12/12
@luserdroog: Operadores brilhantes, bit a bit, não pensaram neles. Mas tem que sernot 1 and , certo? Ainda salva um byte em ASCII e binário.
Thomas W.
Eu sinto que deve haver uma maneira elegante com um bitmap de 1 bits. masbitshift é uma palavra tão longa.
Luser droog 27/12/12
Mas é apenas um token binário de dois bytes
Thomas W.
Sim. Mas ainda me parece uma trapaça de alguma forma. :) Eu sinto que preciso fazer o máximo possível com a fonte legível antes de recorrer ao binário.
Luser droog 27/12/12
4

APL 101 86 73 69

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

A entrada é da tela via ⍞

1101101

Que produz uma matriz de caracteres 9x5 composta por espaços em branco e ⎕ da seguinte maneira:

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

O número de sete dígitos é convertido em um vetor de partição para selecionar as coordenadas ⎕.

Graham
fonte
Minha cabeça dói ...
Rob
4

Mathematica 112 103 100 96 88, usando gráficos

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

insira a descrição da imagem aqui

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 do Mathematica

Dr. belisarius
fonte
Que tipo de entrada você espera? Nem [123][[123]], nem IntegerDigits[123]funciona para mim. Recebo apenas z, sem destaque.
12139 DavidC
@dude Tente `HighlightGraph [z = GridGraph @ {3, 2}, escolha [EdgeList [z] [[{3, 4, 1, 2, 6, 7, 5}]], caracteres @ #," 1 "] ] & @ "1111111" `` :)
Dr. belisarius
3

Python (107)

Definitivamente mais jogável.

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))

Saída:

1101101
 .. 
   .
   .
 .. 
.   
.   
 .. 

Explicação:

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
fonte
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()))

Explicação:

Com a entrada stdin, use um operador ternário improvisado para fornecer *verdadeiro e um espaço para falso. Pegue esses valores e conecte-os a uma instrução de formato no formato da tela de 7 dígitos. Seriam no máximo 83 caracteres se a tela funcionasse assim:

 a
b c
 d
e f
 g

mas a encomenda demora mais tempo. Alguém tem uma maneira de contornar isso?

Exemplo:

$ ./7seg.py
111000

 *
  *

  *

$ ./7seg.py


1111111

 *
* *
 *
* *
 *
Brigand
fonte
11
Bom, mas esse lambda parece desnecessário:;) Também não print' {0}\n{5} {1}\n {6}\n{4} {2}\n {3}'.format(*[' *'[i=='1']for i in raw_input()])há necessidade de colchetes e espaço para a declaração de impressão.
Daniero 6/01/2013
Uau! Eu não sabia que você poderia colocar booleanos em indexadores. Obrigado :-)
Brigand
Np. Além disso, em >'0'vez de =='1'e input()(com backticks ao redor, mas isso não aparecerá por causa da formatação aqui) em vez de raw_input().
Daniero
Para sua informação, você pode usar triptic backticks se precisar de backticks no códigox = `input()`
Brigand
Legal. Então eu aprendi alguma coisa hoje também :)
daniero
3

Eu pensei que precisávamos de uma resposta 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])))" ")))))))

O acima será executado no REPL e fornecerá a resposta correta. Por exemplo:

1111111
 o 
o o
 o 
o o
 o 

Jogando números nele com pequenas modificações:

(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))

rendimentos:

 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

Não é fácil de ler, mas eles estão lá!

Joanis
fonte
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)

Eu posso diminuir a contagem de caracteres (101) se usarmos apenas um caractere para o estado "on", mas é menos legível:

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
fonte
+1 Isso é impressionante. Ainda estou tentando fazer engenharia reversa. Já me ensinou algumas coisas!
guypursey
2

Postscript 136

Não vencedor, mas uma abordagem 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 a sequência de entrada esteja na pilha:

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

Este é ainda pior. 294 para criar um bitmap "binário". Demorei um pouco para lembrar que cada linha é preenchida com um byte uniforme. Portanto, um bitmap 3x5 tem cinco bytes, com os bits de 3 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

A saída é tão feia quanto a outra. :(

Tudo bem, aqui está um que parece bom. 190

Edit: Foi de cabeça para baixo e para trás. Corrigido agora.

(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
fonte
Isso me mostra alguns padrões engraçados. Ainda existe um bug em algum lugar?
Thomas W.
Hmm. sim. (1111110) não parece um zero. É apenas um mapa de bytes ampliado. Eu acho que as caixas são simplificadas demais. :(
luser droog
é da natureza dessa abordagem de bitmap, eu acho. Não sei como fazê-lo não é feio.
Luser droog 27/12/12
Alguns comentários leves disponíveis aqui .
Luser droog
2

Mathematica 264

Para que a saída pareça correta, são necessários muitos bytes, portanto, não há charuto neste momento. Mas aqui está o código detalhado (264 caracteres) de qualquer maneira.

{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]

O conjunto completo de caracteres:

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

characteris

Os dígitos:

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

insira a descrição da imagem aqui

DavidC
fonte
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]];

seria 150 caracteres se usarmos a declaração de matriz do tipo php 5.4, mas eu não tenho isso instalado no meu laptop, então não pude testá-lo.

Amostra coloca.

insira a descrição da imagem aqui

Explicação:

Primeiro, eu dividi a exibição de 7 segmentos em cinco linhas e três colunas. Com a 1ª, 3ª e 5ª linha, mantenha '-' na coluna do meio e, caso contrário, espaço.

A 2ª e 4ª linha têm um tubo '|' caractere na primeira e na última coluna. Agora a presença desses caracteres deve ser guiada pelos valores de entrada.

Criei uma tabela de pesquisa, que é basicamente duas tabelas de pesquisa. Primeiro para o cálculo dos valores da 1ª, 3ª e 5ª linha. E outro no deslocamento 2 (3º item) para o cálculo das linhas 2 e 4.

D34dman
fonte
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]);}}

Saída de amostra:

 _ 
 _|
|_ 

Formatado corretamente:

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 gostaria de poder evitar isso por loop, mas tentei algumas outras coisas e elas foram todas mais longas. Provavelmente existe uma maneira melhor de fazer isso, mas esta é a minha primeira tentativa no código de golfe. (E Java é a pior linguagem para ela, e é por isso que achei interessante.) Até o Brainfuck me derrotou, mas pelo menos minha saída parece melhor.

EDIT: pode se livrar de "público" na classe, me salva 7 caracteres!

E obrigado, daniero, por me mostrar printf! (18 caracteres salvos)

Reescreva o formato de saída, altere os literais de caracteres para decimais, 12 caracteres salvos.

quebra-código
fonte
Bem-vindo ao codegolf.se! Java introduziu um printfmétodo algumas versões anteriores, que é basicamente printlne formatem uma (como a função C); Isto vai poupar alguns caracteres,
daniero
Aqui está outro truque: Você pode combinar o "corpo" do forlaço e a parte atualização em um, salvando um caractere:for(int i=7;i>0;c[--i]=a[0].charAt(i)==49?(i%3==0?95:'|'):32);
daniero
1

VBA - 263

É feio, mas funciona, eu acho. Estou tendo problemas para visualizar a ordem de bits adequada, portanto deduzo das respostas dos outros. Mesmo que a peça esteja errada, o comprimento do código deve permanecer o mesmo.

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
fonte
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
fonte
Obrigado! Alguns erros estúpidos me custam 6 caracteres. Eu posso quase reduzir isso ao tamanho do VBA mesmo com a chamada absurdamente longa para obter o argumento da linha de função.
Comintern
A menos que seu código funcione sem os caracteres de nova linha, você também deve contá-los. Isso tem 178 caracteres, de acordo com a minha contagem.
Manatwork
1

CJam - 29

l0N]s7078571876784728737Ab\f=

CJam é uma nova linguagem que estou desenvolvendo, semelhante ao GolfScript - http://sf.net/p/cjam . Aqui está a explicação:

llê uma linha da entrada
0é o número 0
Né uma variável pré-inicializada para a nova linha string
]reúne os elementos na pilha em uma matriz
sconverte um valor (a matriz) em string, acrescentando assim um zero e uma nova linha à entrada fornecida
7078571876784728737é um number (o mesmo número que usei em python, mas estava em hexadecimal lá)
A é uma variável pré-inicializada para 10
bfaz uma conversão base, gerando a matriz [7 0 7 8 ... 3 7]
\troca os dois últimos valores na pilha
f=aplica o =operador (aqui, acesso à matriz indexada) na sequência de entrada (mais zero e nova linha) e cada número 7, 0, 7, ...
O índice 7 corresponde ao zero acrescentado e 8 corresponde à nova linha anexada.

Minha solução python faz exatamente a mesma coisa (exceto que a separação de dígitos é feita via conversão de string)

aditsu
fonte
O que eu estou olhando aqui? Gostaria de oferecer uma breve explicação do código?
Daniero
@daniero Adicionei uma explicação
aditsu 10/04
1

VBA, 188 caracteres

Observe que esse deve digitar 188 caracteres se incluir apenas espaço em branco obrigatório - o IDE o expande quando você o copia no 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

Infelizmente, o VBScript não possui uma matriz de bytes fortemente tipada, ou essa pode ser muito menor usando esse método.

Comintern
fonte
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}`))

Isso provavelmente pode ser golfed mais, mas eu não consigo pensar em nada.

M Dirr
fonte
Bem vindo ao site! Essa é uma boa primeira 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")

Experimente online! (Rodapé é Node.js para ler.input.tio )

Aceita entrada de ABCDEFG em sinalizadores binários e retorna:

 #
# #
 #
# #
 #
facepalm42
fonte
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

A saída é gráfica.

12Me21
fonte
0

05AB1E , 4 bytes

C₄+ç

Experimente online ou verifique todas as entradas possíveis .

Veja o link verificar todas as entradas possíveis acima para ver o mapeamento usado para cada entrada.

Explicação:

Isso abusa das regras em que afirma:

A decisão de como você representa a exibição - um único símbolo Unicode ou ASCII , arte ASCII, graficamente, ou o que você puder criar. No entanto, cada entrada deve ter sua própria saída 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 mais no espírito do desafio, usando o formato de saída:

 -
| |
 -
| |
 -

38 bytes :

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

Definitivamente pode ser jogado ..

Experimente online ou verifique todas as entradas possíveis .

Explicação:

Σ       }          # 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 -"

Veja este 05AB1E ponta do meu ( seção Como comprimir grandes inteiros? ) Para entender por que •L7וé 1367524.

Kevin Cruijssen
fonte
0

PHP 5.6, 65 bytes ASCII simples

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

ou, sem uma quebra de linha à direita, mas com um pouco de diversão:

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

Execute como pipe -nRou experimente-os online .

repartição 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
;

repartição 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
fonte
11
Se o idioma é novo ou antigo, não importa mais desde o verão de 2017 . Portanto, você não precisará mencionar não-concorrentes.
Kevin Cruijssen 16/10
@KevinCruijssen Obrigado, senti falta disso. Mas também é um bom desafio reviver versões antigas do PHP; às vezes, também fornece uma visão diferente dos recursos mais recentes: às vezes, descobri que a maneira "antiga" é mais eficiente (em tamanho, desempenho, legibilidade e, às vezes, as três) do que usar coisas que foram adicionadas ao PHP posteriormente Porém, nenhuma vantagem no golfe: neste caso, a primeira abordagem exigiria 8 bytes extras, a segunda 5.
Titus