Trasforma il numero in un modello di visualizzazione a 7 segmenti


28

Dati due numeri arbitrari A, B. Stampa il numero B come modello LED digitale dove A è la scala.

ingresso:

1 2320451640799518

ouput:

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

ingresso:

2 23

ouput:

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

Regole:

  • Utilizzare STDIN / STDOUT per input / output

  • Il codice con il maggior numero di voti positivi vince. In caso di parità, verrà accettato il codice più breve

  • La risposta più votata sarà accettata il 01/02/2014 (Ha accettato questa risposta con il massimo dei 12 voti)


2
Alcune domande correlate, per il furto / ispirazione del codice: " Emula un display a 7 segmenti " e " Numeri e lettere a LED ".
Darren Stone,

@Wasi Grazie. Ho visto la tua modifica che mi ha chiarito.
C0deH4cker,

Il tuo 9 dovrebbe avere il carattere di sottolineatura nell'ultima riga, per essere come il contrario 6.
Tomas,

1
@Tomas Grazie per il suggerimento. Ma abbiamo già 13 risposte, quindi sarà ingiusto modificarlo ulteriormente :-)
Wasi,

OK Wasi ma spero non ti dispiaccia che ho usato la mia forma preferita 9nella mia risposta , perché mi piace di più :-)
Tomas

Risposte:



12

Python 3, 286282 280

Sì, ho giocato a golf questo. Bella sfida!

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



Inoltre, ecco una versione di Python 2 che pesa solo 273 byte!

Non aggiornando più questo con ulteriore fonte originale giocata a golf. Questo è stato creato quando l'origine originale era di 282 byte (versione di Python 3).

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

Questo potrebbe essere un imbroglio, quindi lo sto aggiungendo separatamente. Fammi sapere se questo è considerato valido o meno.


6

Haskell (389 caratteri)

La soluzione utilizza 7 array, uno per ogni segmento dell'array, usando i nomi di questa immagine:

Display a 8 segmenti

. Il valore a !! 4sarà il carattere che dovrebbe essere visualizzato in quella posizione per il numero 4.

I valori vengono moltiplicati per la scala ove appropriato (usando re rpper la replica) e infine stampati.

Il codice

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

Esempio di utilizzo

echo '1 2320451640799518' | runhaskell ./digit_led.hs
 _  _  _  _     _     _     _  _  _  _  _     _ 
 _| _| _|| ||_||_   ||_ |_|| |  ||_||_||_   ||_|
|_  _||_ |_|  | _|  ||_|  ||_|  |  |  | _|  ||_|

6

C, 249 226 caratteri

Soluzione golfizzata in 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]);}

Con spazi bianchi aggiunti:

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

Gli appunti:

  • Vengono stampate al massimo 99 cifre
  • Il comportamento non è definito se l'ingresso non è ben formato (ad esempio contiene non cifre o la scala è <1)
  • Dovrebbe essere il codice C89 legale

Fornirò una spiegazione di come funziona, se qualcuno dovesse interessarsene.


1
Da quello che ho letto in questa pagina su ciò che è "OK in C" non è necessario includerlo #include <stdio.h>(poiché verrà compilato senza di esso.) Puoi anche inserire un int in main(), ad esempio main(x), radere via 1 byte - anche se non è valido firma e messo scanfdentro for: for(scanf("%d %98s", &s, &i); …)rasatura di un altro. - Dai un'occhiata qui .
Runium,

@Sukminder Questi sono suggerimenti molto utili, grazie! Ho rimosso il #include, spostato il scanfdentro for, rimosso il non necessario &in &ie messo le intvariabili in ambito globale per sfruttare l'inizializzazione 0 statica. Il codice ora dovrebbe essere ancora legale C89, ma non ho controllato a fondo. Credo mettere uno intin mainnon è legale, così ho lasciato che fuori.
Reima,

Rinunciare alla conformità standard può essere di grande aiuto. Ad esempio, è possibile omettere le intvariabili globali. Inoltre %98spuò essere %s(per stringhe più lunghe che fallisci comunque, importa in che modo?)
ugoren,

Buono! Ho usato un "tipo di" filosofia simile, ma più semplice - 187 caratteri in PERL
Tomas

5

Ruby 2.0

Implementazione rubino rapida e (non così ingenua).

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}

Spiegazione veloce:

Dichiaro innanzitutto le stringhe che rappresentano le cifre di attivazione e disattivazione per le barre orizzontali e verticali.
Poi ho letto la scala e le cifre.
Dichiaro quindi un array delle dimensioni necessarie per memorizzare abbastanza righe per la scala data. La strana stringa è in realtà una mappatura di valori a 7 bit che rappresentano i LED da accendere per ogni cifra.
Successivamente, per ogni cifra, riempio l'array di output dall'alto verso il basso, tenendo conto del ridimensionamento orizzontale.
Il ciclo finale è quello di riempire le righe che hanno solo barre verticali, che possono essere generate solo dalle file centrali e inferiori rimuovendo le barre orizzontali.
Infine, stampo l'array di output!


Puoi spiegare cosa sta succedendo qui?
Michael Stern,

5

Python 2.6 senza importazioni. Direi che l'attrattiva di questa soluzione è l'uso di modelli. Sfortunatamente penso che sia per questo che ho avuto difficoltà a compattarlo.

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 un po 'più breve (308 caratteri):

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

Cordiali saluti, la parte superiore delle cifre dovrebbe essere '_' (caratteri di sottolineatura) e nessuno spazio tra le cifre. Ero confuso all'inizio haha
C0deH4cker,

5

(Modifica: questa soluzione non è più valida perché la semantica dell'istruzione è cambiata. Non mi ero reso conto che avevo già usato l'istruzione quando l'ho cambiata. Puoi, tuttavia, correggere questo programma semplicemente cambiandolo in l'istruzione più recente .)

Sclipting - 85 caratteri

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

Ingresso:

1 1024856359701

Produzione:

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

Ingresso:

2 47474747

Produzione:

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


Puoi sistemare il programma? Lasciare l'intero colpo post è piuttosto brutto.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Ovviamente, potrei cambiare in , ma questo renderebbe questa voce barare perché è stata inventata dopo che questa sfida è stata pubblicata.
Timwi,

Non penso che sia un grosso problema. Non accorgo il tuo programma comunque.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳,

1
No, ma violerebbe un'importante regola di questa comunità.
Timwi,

Non viola più una regola: P
ASCII l'

4

C # ( 480 443 caratteri)

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

Versione estesa:

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

La mia idea era quella di dividere il compito in 5 linee orizzontali, che a loro volta sono divise in una parte sinistra, destra e centrale per ogni personaggio.


Forse l'ho copiato in modo sbagliato, ma ho provato a eseguirlo su ideone e ha dato un errore. ideone.com/gQ6LH7
C0deH4cker,

probabilmente è colpa mia, fammi vedere
Rik

1
@ C0deH4cker Ho preso l'input in due file ReadLine separati. Questo funziona: ideone.com/4jTxeu
Rik

1
@ C0deH4cker Ho realizzato una versione che accetta l'input come specificato e rilascia la parte inferiore del 9. L'input richiede il maggior numero di caratteri, il 9 costa 1 in più.
Rik,

1
Hai un ridondante ;lì dentro (480); puoi scrivere Action<z,z,z,int>q=(l,m,r,n)=>{...};(470); puoi fare il primo parametro di ha chare fare l' ""+interno h(467); e infine, puoi dichiarare e riutilizzare z d="134579",b="1237"(465). Questo è il più piccolo che ho potuto fare finora
Timwi,

3

Immagino che ci siano soluzioni molto più brevi, ma dal momento che non si tratta di code-golf sono abbastanza soddisfatto!

Questo script PHP prenderà due numeri a, bda STDIN ed eco bin formato LED, a adimensioni.

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: guardando l'esempio di output precedente, ho erroneamente supposto che lo spazio tra le cifre dovrebbe essere grande quanto la adimensione. Ciò è stato risolto con la dichiarazione del PO che non era necessario spazio.


In realtà, non dovrebbero esserci spazi tra le cifre. L'unica ragione per cui sembra così per il campione è che gli spazi sono dove '|' sarebbe su un 8 per esempio. Mi ci è
voluto

Oh, hai ragione! Grazie :)
Vereos,

2

C #, 435 359 473 byte

Modifiche:

  • Codice ridondante rimosso. Dimensione in byte ridotta dei confronti.
  • Convertito in un'applicazione autonoma utilizzando standard in per l'input.

Ecco il codice golf (con interruzioni di riga e spazi bianchi aggiunti):

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;
    }
}

Sono funzioni C # valide. Non è mai stato affermato che dovrebbe essere un programma autonomo. Tuttavia, non usa lo standard in.
Hand-E-Food

@Timwi, modificato per conformarsi ...
Hand-E-Food

1
Molto bene!! L'ho giocato ancora un po 'e l'ho portato a 425 (caratteri; 432 byte in UTF-8), rendendolo più breve dell'altra risposta 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
Usare l'idea dell'altra risposta C # di mettere tutto nello Systemspazio dei nomi lo porta a 423
Timwi,

2

C ( 561 492 byte)

L'autore è frmar. Mi ha inviato la sua risposta la scorsa settimana (non ha ancora creato il suo account).

492 byte ma un po 'più offuscato:

#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");}

Versione precedente utilizzando 561 byte:

#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");}

Versione originale di frmar (623 byte):

#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");}

Compilazione:

$ gcc -std=c99 -Wall print_as_led.c

Esempi che utilizzano il 0123456789numero predefinito ma dimensioni diverse:

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

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

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

Altri esempi:

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

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

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

Taglie più grandi:

$ ./a.out 4 42
       ____
|    |     |
|    |     |
|    |     |
|____| ____|
     ||
     ||
     ||
     ||____
$ ./a.out 5 42
        _____
|     |      |
|     |      |
|     |      |
|     |      |
|_____| _____|
      ||
      ||
      ||
      ||
      ||_____

1

Perl + FIGlet + BRA * : 54 caratteri

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

Ho pensato che questo sarebbe abbastanza facile da fare con FIGlet , ma non sembravano esserci caratteri adatti per questo scopo. Quindi ne ho fatti un po ':-)

Ecco come appare sul terminale:

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

* BRA: palese abuso di regole


Non capisco perché esiste un downvote per questo. Bel trucco con i caratteri!
VisioN,

Non stavo effettuando il downvoting, ma avrei capito che usare un programma invece di realizzarlo è un imbroglio.
Tomas,

1

PERL,   261 244 187   166 caratteri

Un po 'di filosofia di codifica 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

Codice con spazi bianchi aggiunti:

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

Perl deve essere invocato con -n:

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

Gli appunti:

  • Tutto sulla modalità di visualizzazione delle cifre è codificato nella stringa Gl+%<UWm7=:-) Un carattere corrisponde a una cifra, codificato sono 3 posizioni di 3 caratteri consecutivi all'interno della " _ _|_| |_ |"stringa.
  • I numeri sono costruiti in 3 righe, riga per riga. Ciascuna delle 3 linee corrisponde a una chiamata alla sub-routine c, che esegue anche lo zoom verticale per la seconda e la terza linea.
  • Lo zoom orizzontale viene eseguito al termine della sub-routine c.

Il mio sedprogramma non può eseguire lo zoom, ma sembra molto più bello, vero? :-)

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 l'idea che usa il mio script PERL, ma in PERL è molto più brutta. Nota che per il mio programma sed ho preferito usare 9il carattere di sottolineatura nell'ultima riga, per essere come il contrario 6.


Mi chiedevo se potessi spiegare come funziona il ridimensionamento, sto cercando di implementare la mia versione in Perl. Ma non riesco a ottenere il ridimensionamento verticale e orizzontale giusto.
Hunter McMillen,

0

C #, 386 382 364 caratteri / 374 byte (UTF-8) e (molti? Di) margini di miglioramento ...

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

EDIT Crap ... Ho perso la parte "scala"UNA SCHIFEZZA

Ci proverò ancora se ci provo ..


Sì, la parte in scala lo rende spaventoso.
cjfaure,

0

J - 147 95 caratteri

Aggiunto ridimensionamento richiesto:

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$' - | |'

Versione annotata:

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]

Esempio:

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

2 123
     --  -- 
|      |   |
|      |   |
     --  -- 
|   |      |
|   |      |
     --  -- 

Come risponde alla domanda?
Wasi,

Hai assolutamente ragione ... Lo aggiusterò
jpjacobs il

Il tuo esempio non è corretto. Guarda la domanda.
Tomas,

0

Rubino, 126 caratteri 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}}

Ogni cifra è codificata come una bitmap in terzi quindi, con ogni terzo rappresentato da una cifra ottale.

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

Poiché tutte le cifre hanno il bit 64 o il bit 32 impostato, l'intervallo è compreso tra 044 ottali e 177 ottali. Sfortunatamente 177 è il carattere DEL non stampabile, quindi la stringa magica contiene i numeri 2 sotto il codice bitmap richiesto e dobbiamo aggiungere 2 di nuovo nella funzione.

Non registrato nel programma di test

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]

Produzione

C:\Users\steve>ruby 7seg.txt
4
0123456789
 ____        ____  ____        ____  ____  ____  ____  ____
|    |     |     |     ||    ||     |          ||    ||    |
|    |     |     |     ||    ||     |          ||    ||    |
|    |     |     |     ||    ||     |          ||    ||    |
|    |     | ____| ____||____||____ |____      ||____||____|
|    |     ||          |     |     ||    |     ||    |     |
|    |     ||          |     |     ||    |     ||    |     |
|    |     ||          |     |     ||    |     ||    |     |
|____|     ||____  ____|     | ____||____|     ||____| ____|

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

Soluzioni precedenti:

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)}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.