Transformar número em padrão de exibição de 7 segmentos

28

Dados dois números arbitrários A, B. Imprima o número B como um padrão digital de LED, onde A é a escala.

entrada:

1 2320451640799518

saída:

 _  _  _  _     _     _     _  _  _  _  _     _ 
 _| _| _|| ||_||_   ||_ |_|| |  ||_||_||_   ||_|
|_  _||_ |_|  | _|  ||_|  ||_|  |  |  | _|  ||_|

entrada:

2 23

saída:

 __  __
   |   | 
 __| __|
|      |
|__  __|

Regras:

  • Use STDIN / STDOUT para entrada / saída

  • Código com mais vitórias positivas. Em caso de empate, o código mais curto será aceito

  • A resposta mais votada será aceita em 01/02/2014 (Aceitou esta resposta com 12 votos mais altos)

Wasi
fonte
2
Algumas perguntas relacionadas, para roubo / inspiração de código: " Emule uma tela de 7 segmentos " e " Números e letras de LED ".
Darren Stone
@ Wasi Obrigado. Vi a sua edição que esclareceu para mim.
C0deH4cker
Seu 9 deve ter o sublinhado na última linha, para ser
Tomas
1
@ Tomas Obrigado pela sugestão. Mas, já temos 13 respostas, portanto, será injusto mudar ainda mais :-) #
591 Wasi
OK Wasi mas espero que não se importe que eu usei a minha forma preferida de 9, em minha resposta , como eu gosto mais :-)
Tomas

Respostas:

20

Commodore 64 BASIC

Regras da arte PETSCII :)

LISTA

Saída:

CORRE

Danko Durbić
fonte
3
O que aconteceu com o dígito 4? oO
Timwi 24/01
É assim que eu escrever o número 4, mas OK, eu fixo que :)
Danko Durbic
2
Fascinante - você escreve assim também à mão? Isso é comum na Suécia ou de onde você é originário?
usar o seguinte comando
Eu teria +100 se pudesse.
Michael Kohl
12

Python 3, 286282 280

Sim, eu joguei esse aqui. Bom desafio!

n,x=input().split()
n=int(n)
l=lambda s:"".join(s)+"\n"
h=lambda s:s.replace(*"! ")*~-n+s.replace(*"!_")
print(l(" "+"_ "[c in"14"]*n+" "for c in x)+h(l("| "[c in"1237"]+n*"! "[c in"017"]+"| "[c in"56"]for c in x))+h(l(" |"[c in"0268"]+n*"! "[c in"1479"]+"| "[c=="2"]for c in x)))



Além disso, aqui está uma versão do Python 2 pesando apenas 273 bytes!

Não atualizando mais este com mais fontes originais de golfe. Isso foi criado quando a fonte original tinha 282 bytes (versão Python 3).

exec'eJxdzE0OgjAQhuE9pxhn1VIlFhHUpCdRQlAx1NShAYwsOLzgD4irSd758tC8UWX6SDTZe824V1mju+uQ0lQz4o5RJr0dzylUO0TvWmhiFRd4IHTy8VV5ZWZNesqYizNA7jJaSC4mOUHu2LJjwTAEFJgA7k+gCWWAsUuii5eihD5Bw0XOul07bPxVhLGgl/9OS9mXcbIOMf4BPgK037kfbv4EGUTbgVAK/SnwBAs+TpU='.decode('base64').decode('zip')

Isso pode ser trapaça, por isso estou adicionando separadamente. Deixe-me saber se isso é considerado válido ou não.

C0deH4cker
fonte
6

Haskell (389 caracteres)

A solução usa 7 matrizes, uma para cada segmento da matriz, usando os nomes desta imagem:

Exibição de 8 segmentos

. O valor a !! 4será o caractere que deve ser exibido nessa posição para o número 4.

Os valores são multiplicados pela escala, onde apropriado (usando re rppara replicação), e finalmente impressos.

O código

a="_ __ _____"
b="|||||  |||"
c="|| |||||||"
d="_ __ __ _ "
e="| |   | | "
f="|   ||| ||"
g="  _____ __"
r=replicate
cm=concatMap
s=(' ':).(++" ")
dd w n=[[t n],rp$m f b n,[o g f b n],rp$m e c n,[o d e c n]] where
 rp=r$w-1
 t=cm(s.r w.(a!!))
 q f s x y=cm(\n->x!!n:r w(f s n)++[y!!n])
 o=q(!!) 
 m=q const ' '
go a=unlines$concat$dd(read$a!!0)$map(read.(:[]))$a!!1
main=interact$go.words

Exemplo de uso

echo '1 2320451640799518' | runhaskell ./digit_led.hs
 _  _  _  _     _     _     _  _  _  _  _     _ 
 _| _| _|| ||_||_   ||_ |_|| |  ||_||_||_   ||_|
|_  _||_ |_|  | _|  ||_|  ||_|  |  |  | _|  ||_|
David Miani
fonte
6

C, 249 226 caracteres

Solução Golfed em C:

int x,y,g,s,q;main(){char*c,i[99];for(scanf("%d %98s",&s,i);y<2*s+1;++y,puts(""))for(c=i;*c;++c)for(x=0;x<s+2;++x)q=(y+s-1)/s*3+(x+s-1)/s,g=(x%(s+1))*(y%s)?7:q<3?~q%2*7:q-2,putchar("_|_||_| "["zG<lMfvH~N"[*c-48]+1>>g&1?g:7]);}

Com espaço em branco adicionado:

int x, y, g, s, q;

main() {
  char *c, i[99];
  for (scanf("%d %98s", &s, i); y < 2 * s + 1; ++y, puts(""))
    for (c = i; *c; ++c)
      for (x = 0; x < s + 2; ++x)
        q = (y + s - 1) / s * 3 + (x + s - 1) / s,
        g = (x % (s + 1)) * (y % s)
          ? 7
          : q < 3
            ? ~q % 2 * 7
            : q - 2,
        putchar("_|_||_| "["zG<lMfvH~N"[*c - 48] + 1 >> g & 1 ? g : 7]);
}

Notas:

  • No máximo 99 dígitos são impressos
  • O comportamento é indefinido se a entrada não for bem formada (por exemplo, não contém dígitos ou a escala é <1)
  • Deve ser código C89 legal

Vou fornecer uma explicação de como funciona, se alguém se importar.

reima
fonte
1
Pelo que li nesta página sobre o que é "OK em C", você não precisa incluir #include <stdio.h>(como será compilado sem ele). Você também pode inserir um int main(), por exemplo main(x), diminuindo 1 byte - embora não seja válido assinatura e colocar scanfdentro for: for(scanf("%d %98s", &s, &i); …)raspar mais uma. - Dê uma olhada aqui .
Runium 27/01
@Sukminder Essas são dicas muito úteis, obrigado! Eu removi o #include, mudou-se o scanfinterior do for, removido o desnecessário &na &i, e colocar as intvariáveis no escopo global para explorar a inicialização estática 0. O código agora ainda deve ser legal C89, mas eu não verifiquei completamente. Eu acredito que colocar um intem mainnão é legal, então eu deixei isso.
reima
Desistir da conformidade padrão pode ajudar muito. Por exemplo, você pode omitir intvariáveis ​​globais. Também %98spode ser %s(para cadeias mais longas você falhar de qualquer maneira, que importa de que maneira?)
ugoren
Boa! Eu usei "tipo de" filosofia semelhante, mas mais simples - 187 caracteres em PERL
Tomas
5

Ruby 2.0

Implementação rápida e (não tão) ingênua de ruby.

V,H = ' |',' _'
l = gets.split
s = l[0].to_i
o = Array.new 1+s*2, ''
l[1].each_char {|c|
  m = "{H=mNgwI\x7FO"[c.to_i].ord
  o[0] += " #{H[m[0]]*s} "
  o[s] += "#{V[m[1]]}#{H[m[2]]*s}#{V[m[3]]}"
  o[s*2] += "#{V[m[4]]}#{H[m[5]]*s}#{V[m[6]]}"
}
(s-1).times { |i|
  o[i+1] = o[s].gsub '_', ' '
  o[s+i+1] = o[s*2].gsub '_', ' '
}
o.each {|r| puts r}

Explicação rápida:

Primeiro declaro as strings que representam os dígitos ativados e desativados das barras horizontais e verticais.
Então eu li escala e os dígitos.
Declaro uma matriz do tamanho necessário para armazenar linhas suficientes para a escala especificada. A string estranha é, na verdade, um mapeamento de valores de 7 bits, representando quais LEDs devem ser ativados para cada dígito.
Em seguida, para cada dígito, preencho a matriz de saída de cima para baixo, levando em consideração a escala horizontal.
O loop final é preencher as linhas que possuem apenas barras verticais, que podem ser geradas apenas a partir das linhas central e inferior, removendo as barras horizontais.
Finalmente, imprimo a matriz de saída!

SirDarius
fonte
Você pode explicar o que está acontecendo aqui?
Michael Stern
5

Python 2.6 sem importações. Eu diria que a atratividade dessa solução é o uso de modelos. Infelizmente, acho que foi por isso que tive tanta dificuldade em compactá-lo.

def numbers(scale, number):

    def single(yay, wall, digit):
        walls = ('1110111', '0010010', '1011101', '1011011',
                 '0111010', '1101011', '1101111',
                 '1010010', '1111111',
                 '1111010')
        return yay if int(walls[digit][wall]) else ' '

    def expand_one(char, digit):
        characters = '_||_||_'
        translated = single(characters[char], char, digit)
        if char % 3:
            return translated
        return translated * scale

    def expand_template(template, digit):
        out = ''
        for c in template:
            if c == '.':
                out += ' ' * scale
            elif c == ' ':
                out += c
            else:
                out += expand_one(int(c), digit)
        return out

    def repeated_expand_template(template, n):
        print ''.join(expand_template(template, int(d)) for d in n)

    repeated_expand_template(' 0 ', number)
    for _ in range(scale - 1):
        repeated_expand_template('1.2', number)
    repeated_expand_template('132', number)
    for _ in range(scale - 1):
        repeated_expand_template('4.5', number)
    repeated_expand_template('465', number)


scale, number = raw_input().split()
numbers(int(scale), number)

E um pouco mais curto (308 caracteres):

s,n=raw_input().split();s=int(s)
for e in('0 0 ','11.2','0132','14.5','0465'):print '\n'.join(''.join(''.join(([' ','_||_||_'[int(c)]][int(bin(1098931065668123279354)[7*int(d)+int(c)+2])]*(s,1,1)[int(c)%3])if ord(c)>46 else c for c in e[1:].replace('.',' '*s))for d in n) for _ in range((1,s-1)[int(e[0])]))
toodooloo
fonte
Para sua informação, o topo dos dígitos deve ser '_' (sublinhado) e não há espaços entre os dígitos. Eu estava confuso à primeira haha
C0deH4cker
5

(Edit: Esta solução agora é inválida porque a semântica da instrução foi alterada. Eu não sabia que já tinha feito uso da instrução quando a mudei. Você pode, no entanto, corrigir o programa simplesmente alterando-o para as instruções mais recentes .)

Sclipting - 85 caracteres

겠合글坼銻標⓷가殲갰復묽땸민뫝뜵깉걈밂⓶各가⓵겐上⓷감嚙긇밌⓶掘⓶감嚙눖밂⓶掘⓷合⓶감嚙긇밌⓶掘⓷合⓸⓸替❶終⓶丟終❶눠替눐終①貶復⓶⓷終丟併눐替글①復終눠替뇰①復終⓶丟

Entrada:

1 1024856359701

Saída:

    _  _     _  _  _  _  _  _  _  _    
  || | _||_||_||_ |_  _||_ |_|  || |  |
  ||_||_   ||_| _||_| _| _|  |  ||_|  |

Entrada:

2 47474747

Saída:

     __      __      __      __ 
|  |   ||  |   ||  |   ||  |   |
|__|   ||__|   ||__|   ||__|   |
   |   |   |   |   |   |   |   |
   |   |   |   |   |   |   |   |

Timwi
fonte
Você pode consertar o programa? Deixar de fora todo o traçado do post é bastante feio.
N
É claro que eu poderia mudar para , mas isso faria essa entrada trapacear porque foi inventada após a publicação deste desafio.
Timwi
Eu não acho que isso seja um grande problema. Eu não diminuo seu programa de qualquer maneira.
N
1
Não, mas violaria uma regra importante desta comunidade.
Timwi
Não viola mais uma regra: P
somente ASCII
4

C # ( 480 443 caracteres)

namespace System{using z=String;using w=Console;class P{static void Main(){var t=w.ReadLine().Split(' ');var s=int.Parse(t[0]);z b="17",d=b+23,e=b+3459,f="56",g=e+2680;Action<z,z,z,int>q=(l,m,r,n)=>{for(int i=1;i<n;i++){foreach(var c in t[1]){h(c,l);for(int j=0;j<s;j++)h(c,m,"_");h(c,r);}w.Write("\n");}};q(g,"14",g,2);q(d,g,f,s);q(d,b+0,f,2);q(e,g,"2",s);q(e,b+49,"2",2);}static void h(char x,z m,z y="|"){w.Write(m.Contains(""+x)?" ":y);}}}

Versão extendida:

using System;
using System.Linq;

namespace Segments
{
    internal class Program
    {
        static void Main()
        {
            var scale = int.Parse(Console.ReadLine());
            var input = Console.ReadLine();

            PrintLine(input, "", "14", "", 2);
            PrintLine(input,"1237", "", "56", scale);
            PrintLine(input,"1237", "170", "56", 2);
            PrintLine(input,"134579", "", "2", scale);
            PrintLine(input,"134579", "147", "2", 2);
        }

        static void PrintLine(string input, string leftMatch, string middleMatch, string rightMatch, int scale)
        {
            for (int i = 1; i < scale; i++)
            {
                foreach (var c in input)
                {
                    PrintDigitLine(c, leftMatch, '|', 1);
                    PrintDigitLine(c, middleMatch, "_", scale);
                    PrintDigitLine(c, rightMatch, '|', 1);
                }
                Console.Write("\n");
            }
        }

        private static void PrintDigitLine(char digit, string match, char charToPrint, int)
        {
            for (int i = 0; i < n; i++) Console.Write(match.Contains(digit) || match == "" ? ' ' : charToPrint);
        }
    }
}

Minha idéia era dividir a tarefa em 5 linhas horizontais, que por sua vez são divididas nas partes esquerda, direita e do meio de cada personagem.

Rik
fonte
Talvez eu tenha copiado errado, mas tentei executar isso em ideone e isso deu um erro. ideone.com/gQ6LH7
C0deH4cker
provavelmente minha culpa, deixe-me ver
Rik
1
@ C0deH4cker Peguei a entrada em dois ReadLines separados. Isso funciona: ideone.com/4jTxeu
Rik
1
@ C0deH4cker Eu criei uma versão que aceita a entrada conforme especificado e solta a parte inferior do 9. A entrada aceita tantos caracteres, os 9 custam 1 extra.
Rik
1
Você tem um redundante ;lá (480); você pode escrever Action<z,z,z,int>q=(l,m,r,n)=>{...};(470); você pode fazer o primeiro parâmetro de ha chare fazer o ""+interior h(467); e, finalmente, você pode declarar e reutilizar z d="134579",b="1237"(465). Esse é o menor que eu poderia fazê-lo até agora
Timwi
3

Acho que existem soluções muito mais curtas, mas como esse não é um código-golfe, estou bastante satisfeito!

Esse script PHP terá dois números a, bde STDIN e eco bno formato LED, no atamanho.

fscanf(STDIN, "%d %d", $a, $b); //Didn't test this line, but it should be ok.
$space=str_repeat("&nbsp;", $a);

$top = $topLeft = $topRight = $mid = $botLeft = $botRight = $bot = array();
for ($i=0; $i<count($b); $i++) {
    $top[$i] = $topLeft[$i] = $topRight[$i] = $mid[$i] = $botLeft[$i] = $botRight[$i] = $bot[$i] = true;
switch ($b[$i]) {
    case 0:
        $mid[$i] = false;
    break;
    case 1:
        $top[$i] = $topLeft[$i] = $mid[$i] = $botLeft[$i] = $bot[$i] = false;
        break;
    case 2:
        $topLeft[$i] = $botRight[$i] = false;
        break;
    case 3:
        $topLeft[$i] = $botLeft[$i] = false;
        break;
    case 4:
        $top[$i] = $botLeft[$i] = $bot[$i] = false;
        break;
    case 5:
        $topRight[$i] = $botLeft[$i] = false;
        break;
    case 6:
        $topRight[$i] = false;
        break;
    case 7:
        $topLeft[$i] = $mid[$i] = $botLeft[$i] = $bot[$i] = false;
        break;
    case 9:
        $botLeft[$i] = false;
        break;
    }
}

horizontal($top);
vertical($topLeft, $topRight);
horizontal($mid);
vertical($botLeft, $botRight);
horizontal($bot);

function horizontal($position) {
    global $a, $b, $space;
    for ($i=0;$i<count($b);$i++) {
        if ($position[$i])
            echo "&nbsp;".str_repeat("-", $a)."&nbsp;";
        else
            echo "&nbsp;".$space."&nbsp;";
    }
    echo "<br />";
}

function vertical($positionLeft, $positionRight) {
    global $a, $b, $space;
    for ($j=0;$j<$a;$j++) {
        for ($i=0;$i<count($b);$i++) {
            if ($positionLeft[$i]) {
                echo "|".$space;
                if ($positionRight[$i])
                    echo "|;";
                else
                    echo "&nbsp;";
            }
            else {
                echo "&nbsp;".$space;
                if ($positionRight[$i])
                    echo "|";
                else
                    echo "&nbsp;";
            }
        }
        echo "<br />";
    }
}

EDIT: Olhando para o exemplo de saída anterior, suponho erroneamente que o espaço entre os dígitos deve ser tão grande quanto o atamanho. Isso foi corrigido com a declaração do OP de que não é necessário espaço.

Vereos
fonte
Na verdade, não deve haver espaços entre os dígitos. A única razão pela qual parece assim para a amostra é que os espaços são onde o '|' estaria em um 8 por exemplo. Levei um tempo para descobrir
C0deH4cker
Oh, você está certo! Obrigado :)
Vereos
2

C #, 435 359 473 bytes

EDITAS:

  • Código redundante removido. Tamanho reduzido de bytes das comparações.
  • Convertido em um aplicativo independente usando entrada padrão para entrada.

Aqui está o código de golfe (com quebras de linha e espaço em branco):

using C=System.Console;
class P{
    static void Main(){
        var a=C.ReadLine().Split(' ');
        D(int.Parse(a[0]),a[1]);
    }
    static void D(int r,string n){
        int i,j;
        string s="",v="|",w=" ",x=new string('_',r),y=new string(' ',r),z="\n";
        foreach(var c in n)s+=w+(F(0,c)?x:y)+w+w;
        for(j=1;j<6;j+=3)
            for(i=r;i-->0;){
                s+=z;
                foreach(var c in n)s+=(F(j,c)?v:w)+(i<1&&F(j+1,c)?x:y)+(F(j+2,c)?v:w)+w;
            }
        C.Write(s+z);
    }
    static bool F(int i,char c){
        return(new[]{1005,881,892,927,325,365,1019}[i]&1<<(int)c-48)>0;
    }
}
Mão-E-Comida
fonte
Eles são funções válidas em C #. Nunca foi afirmado que deveria ser um programa independente. No entanto, ele não usa padrão.
Hand-E-Food
@Timwi, editado para se conformar ...
Mão-E-Food
1
Bem feito!! Joguei mais e reduzi-o a 425 (caracteres; 432 bytes em UTF-8), tornando-o mais curto que a outra resposta em C #. using System;using S=System.String;class P{static void Main(){Action<S[]>D=n=>{var r=int.Parse(n[0]);Func<int,int,bool>F=(i,c)=>("ϭͱͼΟŅŭϻ"[i]&1<<c-48)>0;S s="",v="|",w=" ",x=new S('_',r),y=new S(' ',r);foreach(var c in n[1])s+=w+(F(0,c)?x:y)+w+w;for(int j=1;j<6;j+=3)for(int i=r;i-->0;){s+="\n";foreach(var c in n[1])s+=(F(j,c)?v:w)+(i<1&&F(j+1,c)?x:y)+(F(j+2,c)?v:w)+w;}Console.Write(s);};D(Console.ReadLine().Split(' '));}}
Timwi
1
Usando a idéia da outra resposta C # de colocar tudo no System espaço de nomes leva-lo para baixo para 423
Timwi
2

C ( 561 492 bytes)

Autor é frmar. Ele me enviou sua resposta na semana passada (ele ainda não criou sua conta).

492 bytes, mas um pouco mais ofuscados:

#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#define C(x) ((_[*n-'0'])>>s)&m&x
#define P putchar
unsigned _[]={476,144,372,436,184,428,492,148,508,188};
void p(int a,char*n,unsigned m,int s)
{for(;isdigit(*n);++n){P(C(1)?'|':' ');
for(int i=0;i<a;++i)P(C(4)?'_':' ');
P(C(2)?'|':' ');}
P('\n');}
void l(int a,char*b){p(a,b,7,0);int i=1;
for(;i<a;++i)p(a,b,3,3);p(a,b,7,3);i=1;
for(;i<a;++i)p(a,b,3,6);p(a,b,7,6);}
int main(int c,char**v){l(c>1?atoi(v[1]):1,c>2?v[2]:"0123456789");}

Versão anterior usando 561 bytes:

#include<stdio.h>
#include<ctype.h>
#define C(x) ((((*n-'0')[_])>>s)&m&x)
const unsigned _[]={476,144,372,436,184,428,492,148,508,188};
void p(int a,const char*n,unsigned m,int s)
{
 for(;isdigit(*n);++n) {
  putchar(C(1)?'|':' ');
  const char c=C(4)?'_':' ';
  for(int i=0;i<a;++i) putchar(c);
  putchar(C(2)?'|':' ');
 }
 putchar('\n');
}
void l(int a,const char*b)
{
 p(a,b,7,0);
 for(int i=1;i<a;++i)p(a,b,3,3);p(a,b,7,3);
 for(int i=1;i<a;++i)p(a,b,3,6);p(a,b,7,6);
}
#include<stdlib.h>
int main(int c,char**v){l(c>1?atoi(v[1]):1,c>2?v[2]:"0123456789");}

Versão original da frmar (623 bytes):

#include<stdio.h>
#include<ctype.h>
const unsigned int _[]={476,144,372,436,184,428,492,148,508,188};
void p(int a,const char*n,unsigned int m,int s)
{
  for(;isdigit(*n);++n) {
#define C(x) ((((*n-'0')[_])>>s)&m&x)
    putchar(C(1)?'|':' ');
    const char c=C(4)?'_':' ';
    for(int i=0;i<a;++i) putchar(c);
    putchar(C(2)?'|':' ');
  }
  putchar('\n');
}
void print_as_led(int a,const char*b)
{
  p(a,b,7,0);
  for(int i=1;i<a;++i)p(a,b,3,3);p(a,b,7,3);
  for(int i=1;i<a;++i)p(a,b,3,6);p(a,b,7,6);
}
#include<stdlib.h>
int main(int argc,char**argv){print_as_led(argc>1?atoi(argv[1]):1,argc>2?argv[2]:"0123456789");}

Compilação:

$ gcc -std=c99 -Wall print_as_led.c

Exemplos usando 0123456789número padrão, mas tamanhos diferentes:

$ ./a.out
 _     _  _     _  _  _  _  _
| |  | _| _||_||_ |_   ||_||_|
|_|  ||_  _|  | _||_|  ||_|  |

$ ./a.out 2
 __      __  __      __  __  __  __  __
|  |   |   |   ||  ||   |      ||  ||  |
|  |   | __| __||__||__ |__    ||__||__|
|  |   ||      |   |   ||  |   ||  |   |
|__|   ||__  __|   | __||__|   ||__|   |

$ ./a.out 3
 ___       ___  ___       ___  ___  ___  ___  ___
|   |    |    |    ||   ||    |        ||   ||   |
|   |    |    |    ||   ||    |        ||   ||   |
|   |    | ___| ___||___||___ |___     ||___||___|
|   |    ||        |    |    ||   |    ||   |    |
|   |    ||        |    |    ||   |    ||   |    |
|___|    ||___  ___|    | ___||___|    ||___|    |

Outros exemplos:

$ ./a.out 1 42
    _
|_| _|
  ||_

$ ./a.out 2 42
     __
|  |   |
|__| __|
   ||
   ||__

$ ./a.out 3 42
      ___
|   |    |
|   |    |
|___| ___|
    ||
    ||
    ||___

Tamanhos maiores:

$ ./a.out 4 42
       ____
|    |     |
|    |     |
|    |     |
|____| ____|
     ||
     ||
     ||
     ||____
$ ./a.out 5 42
        _____
|     |      |
|     |      |
|     |      |
|     |      |
|_____| _____|
      ||
      ||
      ||
      ||
      ||_____
olibre
fonte
1

Perl + FIGlet + BRA * : 54 caracteres

while(<>){($n,$x)=split;print(`figlet -f 7seg$n $x`);}

Imaginei que isso seria muito fácil com o FIGlet , mas não parecia haver fontes adequadas para esse fim. Então eu fiz alguns :-)

Veja como fica no terminal:

$ perl ./led.pl
1 234
 _  _    
 _| _||_|
|_  _|  |
2 345
 __      __ 
   ||  ||   
 __||__||__ 
   |   |   |
 __|   | __|
3 456
      ___  ___ 
|   ||    |    
|   ||    |    
|___||___ |___ 
    |    ||   |
    |    ||   |
    | ___||___|

* BRA: abuso flagrante de regras

ossifrage melindroso
fonte
Não entenda por que há um voto negativo para isso. Bom truque com fontes!
VisioN 23/01
Eu não estava com voto negativo, mas entenderia que usar um programa em vez de realmente fazê -lo é trapaça.
Tomas
1

PERL,   261 244 187   166 caracteres

Um pouco da filosofia de codificação bit a bit rulez :-)

($n,$a)=split/ /;sub c{$_=$a;y/0-9/Gl+%<UWm7=/;s/./(substr"   _ _|_| |_  |",2*ord($&)>>$_[0]&$_[1],3)=~s|.\K.|$&x$n|er/ge;print y/_/ /r x($n-1).$_}c 0,2;c 4,14;c 1,14

Código com espaço em branco adicionado:

($n,$a)=split/ /;

sub c{
$_=$a;
y/0-9/Gl+%<UWm7=/;
s/./(substr"   _ _|_| |_  |",2*ord($&)>>$_[0]&$_[1],3)=~s|.\K.|$&x$n|er/ge;
print y/_/ /r x($n-1).$_
}

c 0,2;
c 4,14;
c 1,14

O Perl deve ser chamado com -n:

$ perl -n digitize.zoom.pl
1 12304597
     _   _   _       _   _   _
  |  _|  _| | | |_| |_  |_|   |
  | |_   _| |_|   |  _|   |   |
2 0784
 __   __   __
|  |    | |  | |  |
|  |    | |__| |__|
|  |    | |  |    |
|__|    | |__|    |
3 789
 ___   ___   ___
    | |   | |   |
    | |   | |   |
    | |___| |___|
    | |   |     |
    | |   |     |
    | |___|     |

Notas:

  • Tudo sobre como os dígitos são exibidos é codificado na sequência Gl+%<UWm7=:-) Um caractere corresponde a um dígito, são codificadas 3 posições de 3 caracteres consecutivos dentro do" _ _|_| |_ |" sequência.
  • Os números são construídos em 3 linhas, linha por linha. Cada uma das 3 linhas corresponde a uma chamada para sub-rotinac , que também realiza o zoom vertical para a segunda e a terceira linha.
  • O zoom horizontal é feito no final da sub-rotina c.

Meu sedprograma não pode ampliar, mas parece muito melhor, não é? :-)

s/./\0 /g
h
s/[14]/   /g
s/[2305-9]/ _ /g
p
g
s/[17]/  |/g
s/[23]/ _|/g
s/[489]/|_|/g
s/[56]/|_ /g
s/0/| |/g
p
g
s/[147]/  |/g
s/2/|_ /g
s/[359]/ _|/g
s/[680]/|_|/g

Praticamente a idéia que meu script PERL usa, mas no PERL é muito mais feio. Observe que, para o meu programa sed, eu preferi usar o 9que tem o sublinhado na última linha, como o inverso 6.

Tomas
fonte
Fiquei me perguntando se você poderia explicar como funciona o dimensionamento, estou tentando implementar minha própria versão no Perl. Mas parece que não é possível obter a escala vertical e horizontal correta.
Hunter McMillen
0

C #, 386 382 364 caracteres / 374 bytes (UTF-8) e (lotes? De) espaço para melhorias ...

using System.Linq;using C=System.Console;class P{static void Main(string[] args){var s=C.ReadLine();for(int l=0;l<5;l++){for(int j=0;j<s.Length;j++)C.Write(string.Join("",Enumerable.Range(0,3).Select(i=>{var x=l*3+i;return((x&1)>0?((((System.Text.Encoding.Unicode.GetBytes("⑷浝欮╻潿")[(byte)s[j]-48]>>x/2)&1)==1)?(x-1%3>0?"|":"-"):" "):" ");}))+" ");C.WriteLine();}}}

Editar porcaria ... eu perdi a parte "escala"PORCARIA

Vou tentar outra vez, se eu chegar lá ..

RobIII
fonte
Sim, a parte da escala torna assustador.
Cjfaure
0

J - 147 95 caracteres

Adicionado dimensionamento necessário:

1!:2&2,./(([1 s 0 s=:1 :(':';'y#"(2-m)~(m{$y)$1,x'))"2(3 :'(y{(5 3$&,0&,.)"1@#:l)}d')@"."0@":)/".]1!:1]1[l=:>:a.i.'v#\Z9jnQ~z'[d=:' ',:5 3$' - | |'

Versão anotada:

NB. Digit array (2 x 5 x 3) first is blank, second is filled.
d=:' ',:5 3$' - | |'
NB. Bits to selector (taking into account that all "usefull" bits are separated with 0 bits, looking at the 5 x 3 grid)
bts =: 5 3 $&, (0&,.)
NB. list of character bits.
l=: 119 36 93 91 58 107 111 82 127 123
NB. golfing using ascii range
l=: >:a.i.'v#\Z9jnQ~z'

NB. scaling function
NB. scaling in 1 direction involves inserting copies of the middle segments:
NB. from y, copy the middle segments, 1 x 1 x 1 for rank 2 and 1 x 1 for rank 1
NB. Usage: scale (rank s) segment
s=: 1 : (':';'y#"(2-m)~(m{$y)$1,x')
NB. scale first along columns, then along rows, apply only to rank 2 (planes)
b=:([1 s 0 s)"2

NB. Get one number by using amend with a selection array (0 is blank, 1 is filled)
NB. get the y'th plane from the array of 10 x 5 x 3 selector bits, use those to index d with.
g=: 3 : '(y { (bts"1 #: l)) } d'
NB. from right to left: read stdin, convert number string to numbers,
NB. use the left for scaling, and split the right in digits,then apply g,
NB. then paste them together so the numbers appear next to each other.
NB. Put this result on stdout
1!:2&2,./(b g@"."0@":)/".]1!:1]

Exemplo:

1 0123456789
 -     -  -     -  -  -  -  - 
| ||    |  || ||  |    || || |
       -  -  -  -  -     -  - 
| ||  |    |  |  || |  || |  |
 -     -  -     -  -     -  - 

2 123
     --  -- 
|      |   |
|      |   |
     --  -- 
|   |      |
|   |      |
     --  -- 
jpjacobs
fonte
Como isso responde à pergunta?
Wasi
Você está absolutamente certo ... Eu vou consertar isso
jpjacobs
Seu exemplo está incorreto. Veja a pergunta.
Tomas
0

Ruby, 126 caracteres ASCII

->n,x{(n*2).downto(0){|i|x.bytes{|c|z='u"ik:[]b}{'[c-48].ord+2>>i/n*3&7
print' |'[z/2%2],(z%2>i%n ??_:' ')*n,' |'[z/4]}
puts}}

Cada dígito é codificado como um bitmap em terços, portanto, com cada terço representado por um dígito octal.

|_| 8^2 (left and right never used! only the 1's bit used!)  
|_| 8^1 (4*right+2*left+1*bottom)
|_| 8^0 (4*right+2*left+1*bottom)

Como todos os dígitos têm o bit de 64 ou o de 32, o intervalo é de 044 octal a 177 octal. Infelizmente 177 é o caractere DEL não imprimível, portanto, a sequência mágica contém os números 2 abaixo do código de bitmap necessário e precisamos adicionar 2 novamente na função.

Ungolfed in program program

f=->n,x{
  (n*2).downto(0){|i|                               #1 top line, n middle lines, n bottom lines
    x.bytes{|c|                                     #iterate through bytes
      z='u"ik:[]b}{'[c-48].ord+2>>i/n*3&7           #find octal code for current 1/3 digit
      print' |'[z/2%2],(z%2>i%n ??_:' ')*n,' |'[z/4]#print left,right and bottom
    }                                               #z%2>i%n only true on bottom row of 3rd where i%n=0 (print _'s) and octal code has 1's bit set
    puts                                            #print a newline to finish line 
  }
}

n=gets.to_i  #size
x=gets.chop  #number taken in string form
f[n,x]

Saída

C:\Users\steve>ruby 7seg.txt
4
0123456789
 ____        ____  ____        ____  ____  ____  ____  ____
|    |     |     |     ||    ||     |          ||    ||    |
|    |     |     |     ||    ||     |          ||    ||    |
|    |     |     |     ||    ||     |          ||    ||    |
|    |     | ____| ____||____||____ |____      ||____||____|
|    |     ||          |     |     ||    |     ||    |     |
|    |     ||          |     |     ||    |     ||    |     |
|    |     ||          |     |     ||    |     ||    |     |
|____|     ||____  ____|     | ____||____|     ||____| ____|
Level River St
fonte
0

Perl 6, 284 241 237

my (\a,\n)=split " ",slurp.trim;my @p=n.comb;sub g(\b,\c){for @p {my $h=:36(b);$h+>=3*$_;for ^3 {my \e=$_==1;print " |_".substr($h%2&&(c+!e)&&1+e,1)x a**e;$h+>=1}};say ""};for <52N98I 0 HMTVAD 1 AZRXEV 1> ->\s,\q{g(s,0)for 2..a*q;g(s,1)}

Soluções anteriores:

my (\a,\n)=slurp.trim.split: " ";my @p=n.comb;sub g(\b,\c){for @p {my $h=b;$h+>=3*$_;for ^3 {my \e=$_==1;print " |_".substr($h%2&&(c+!e)&&1+e,1)x a**e;$h+>=1}};say ""};for 306775170,0,1066270117,1,664751335,1 ->\s,\q{g(s,0)for 2..a*q;g(s,1)}
my (\a,\n)=slurp.trim.split: " ";my @p=n.comb;my &f={print $^b.substr(3*$_,1)~($^c??$b.substr(3*$_+1,1)!!" ")x a~$b.substr(3*$_+2,1)for @p;say ""};for (" _     _  _    "~" _ "x 5,0,"| |  | _| _||_||_ |_   ||_||_|",1,"|_|  ||_  _|  | _||_|  ||_|  |",1) ->\s,\q{f(s,0)for 2..a*q;f(s,1)}
bb94
fonte