Transformez le nombre en modèle d'affichage à 7 segments


28

Étant donné deux nombres arbitraires A, B. Imprimez le numéro B sous forme de motif LED numérique où A est l'échelle.

contribution:

1 2320451640799518

sortie:

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

contribution:

2 23

sortie:

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

Règles:

  • Utilisez STDIN / STDOUT pour les entrées / sorties

  • Code avec la plupart des votes positifs. En cas d'égalité, le code le plus court sera accepté

  • La réponse ayant obtenu le plus de votes sera acceptée au 01/02/2014 (a accepté cette réponse avec les 12 votes les plus élevés)


2
Quelques questions connexes, pour le vol de code / l'inspiration: " Émuler un affichage à 7 segments " et " Chiffres et lettres LED ".
Darren Stone

@Wasi Merci. J'ai vu votre montage qui m'a éclairé.
C0deH4cker

Votre 9 devrait avoir le trait de soulignement dans la dernière ligne, pour être comme inversé 6.
Tomas

1
@Tomas Merci pour la suggestion. Mais, nous avons déjà 13 réponses, il sera donc injuste de le changer davantage :-)
Wasi

OK Wasi mais j'espère que cela ne vous dérange pas que j'ai utilisé ma forme préférée de 9dans ma réponse , car je l'aime plus :-)
Tomas

Réponses:


20

Commodore 64 BASIC

Règles artistiques PETSCII :)

LISTE

Sortie:

COURIR


3
Qu'est-il arrivé au chiffre 4? oO
Timwi

C'est comme ça que j'écris le numéro 4, mais OK, j'ai corrigé ça :)
Danko Durbić

2
Fascinant - l'écrivez-vous aussi à la main? Est-ce courant en Suède, ou partout où vous êtes originaire?
stand

Je voudrais +100 si je le pouvais.
Michael Kohl

12

Python 3, 286 282 280

Oui, j'ai joué à celui-ci. Beau défi!

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



En outre, voici une version Python 2 pesant seulement 273 octets!

Ne plus mettre à jour celui-ci avec une autre source originale de golf. Cela a été créé lorsque la source d'origine était de 282 octets (version Python 3).

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

Cela peut être de la triche, donc je l'ajoute séparément. Faites-moi savoir si cela est considéré comme valide ou non.


6

Haskell (389 caractères)

La solution utilise 7 tableaux, un pour chaque segment du tableau, en utilisant les noms de cette image:

Affichage à 8 segments

. La valeur a !! 4sera le caractère qui devrait être affiché à cette position pour le chiffre 4.

Les valeurs sont multipliées par l'échelle le cas échéant (en utilisant ret rppour la réplication), et finalement imprimées.

Le code

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

Exemple d'utilisation

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

6

C, 249 226 caractères

Solution golfée en 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]);}

Avec des espaces supplémentaires:

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

Remarques:

  • Au plus 99 chiffres sont imprimés
  • Le comportement n'est pas défini si l'entrée n'est pas bien formée (par exemple contient des non-chiffres, ou l'échelle est <1)
  • Devrait être un code C89 légal

Je vais vous expliquer comment cela fonctionne, si quelqu'un s'en soucie.


1
D'après ce que j'ai lu autour de cette page sur ce qui est "OK en C", vous n'avez pas besoin d'inclure #include <stdio.h>(car il se compilera sans cela.) Vous pouvez également mettre un entier main(), par exemple main(x), raser 1 octet - bien qu'il ne soit pas valide signature, et mettre à l' scanfintérieur for: for(scanf("%d %98s", &s, &i); …)rasage d'un de plus. - Jetez un oeil ici .
Runium

@Sukminder Ce sont des conseils très utiles, merci! J'ai supprimé le #include, déplacé l' scanfintérieur du for, supprimé le inutile &dans &iet mis les intvariables dans la portée globale pour exploiter l'initialisation statique 0. Le code devrait maintenant être encore légal C89, mais je n'ai pas vérifié attentivement. Je crois que mettre un inten mainest pas légal, donc je suis parti cela.
reima

Renoncer à la conformité standard peut être très utile. Par exemple, vous pouvez omettre intpour les variables globales. %98sPeut également l' être %s(pour les chaînes plus longues, vous échouez de toute façon, est-ce important de quelle manière?)
ugoren

Bien! J'ai utilisé "une sorte de" philosophie similaire, mais plus simple - 187 caractères en PERL
Tomas

5

Ruby 2.0

Implémentation rapide et (pas si) rubis naïve.

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}

Explication rapide:

Je déclare d'abord les chaînes représentant les chiffres d'activation et de désactivation des barres horizontales et verticales.
Ensuite, j'ai lu l'échelle et les chiffres.
Je déclare ensuite un tableau de la taille nécessaire pour stocker suffisamment de lignes pour l'échelle donnée. La chaîne étrange est en fait un mappage de valeurs 7 bits représentant les LED à allumer pour chaque chiffre.
Ensuite, pour chaque chiffre, je remplis le tableau de sortie de haut en bas, en tenant compte de la mise à l'échelle horizontale.
La boucle finale consiste à remplir les lignes qui n'ont que des barres verticales, qui peuvent simplement être générées à partir des lignes du milieu et du bas en supprimant les barres horizontales.
Enfin, j'imprime le tableau de sortie!


Pouvez-vous expliquer ce qui se passe ici?
Michael Stern

5

Python 2.6 sans importation. Je dirais que l'attrait de cette solution est l'utilisation de modèles. Malheureusement, je pense que c'est pourquoi j'ai eu tellement de mal à le compacter.

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)

Et un peu plus court (308 caractères):

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

Pour info, le haut des chiffres est censé être «_» (souligné) et aucun espace entre les chiffres. J'étais confus au premier haha
C0deH4cker

5

(Modifier: cette solution n'est plus valide car la sémantique de l' instruction a changé. Je ne savais pas que j'avais déjà utilisé l'instruction lorsque je l'ai changée. Vous pouvez cependant corriger ce programme en le changeant simplement en l'instruction la plus récente .)

Sclipting - 85 caractères

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

Contribution:

1 1024856359701

Sortie:

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

Contribution:

2 47474747

Sortie:

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


Pouvez-vous réparer le programme? Laisser tout le post-AVC est assez moche.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Je pourrais bien sûr changer le en , mais cela ferait tricher cette entrée car elle a été inventée après la publication de ce défi.
Timwi

Je ne pense pas que ce soit vraiment un problème. Je ne raccourcis pas votre programme de toute façon.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1
Non, mais cela violerait une règle importante de cette communauté.
Timwi

Ne viole plus une règle: P
ASCII uniquement

4

C # ( 480 443 caractères)

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

Version étendue:

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

Mon idée était de diviser la tâche en 5 lignes horizontales, qui à leur tour sont divisées en parties gauche, droite et centrale pour chaque personnage.


Peut-être que je l'ai mal copié, mais j'ai essayé de le faire sur ideone et cela a donné une erreur. ideone.com/gQ6LH7
C0deH4cker

probablement ma faute, laissez-moi voir
Rik

1
@ C0deH4cker J'ai pris l'entrée dans deux ReadLines distinctes. Celui-ci fonctionne: ideone.com/4jTxeu
Rik

1
@ C0deH4cker J'ai fait une version qui prend l'entrée comme spécifié, et laisse tomber la partie inférieure du 9. L'entrée prend autant de caractères, le 9 coûte 1 supplémentaire.
Rik

1
Vous avez un redondant ;là-dedans (480); vous pouvez écrire Action<z,z,z,int>q=(l,m,r,n)=>{...};(470); vous pouvez faire le premier paramètre de ha charet faire l' ""+intérieur h(467); et enfin, vous pouvez déclarer et réutiliser z d="134579",b="1237"(465). C'est le plus petit que j'ai pu faire jusqu'à présent
Timwi

3

Je suppose qu'il existe des solutions très courtes, mais comme ce n'est pas du code-golf, je suis assez satisfait!

Ce script PHP prendra deux nombres a, bde STDIN et d'écho bau format LED, à la ataille.

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: En regardant l'exemple de sortie précédent, j'ai supposé à tort que l'espace entre les chiffres devrait être aussi grand que la ataille. Cela a été corrigé avec la déclaration du PO qu'aucun espace n'est nécessaire.


En fait, il ne devrait pas y avoir d'espace entre les chiffres. La seule raison pour laquelle il semble ainsi pour l'échantillon est que les espaces sont là où le '|' serait sur un 8 par exemple. Il m'a
fallu

Oh, tu as raison! Merci :)
Vereos

2

C #, 435 359 473 octets

MODIFICATIONS:

  • Suppression du code redondant. Taille d'octets réduite des comparaisons.
  • Converti en application autonome en utilisant l'entrée standard pour l'entrée.

Voici le code golfé (avec des sauts de ligne et des espaces ajoutés):

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

Ce sont des fonctions C # valides. Il n'a jamais été dit qu'il devrait s'agir d'un programme autonome. Cependant, il n'utilise pas de standard.
Hand-E-Food

@Timwi, édité pour se conformer ...
Hand-E-Food

1
Bien joué!! Je l'ai joué un peu plus et je l'ai réduit à 425 (caractères; 432 octets en UTF-8), ce qui le rend plus court que l'autre réponse 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
Utiliser l'idée de l'autre réponse C # de tout mettre dans l' Systemespace de noms le ramène à 423
Timwi

2

C ( 561 492 octets)

L'auteur est frmar. Il m'a envoyé sa réponse la semaine dernière (il n'a pas encore créé son compte).

492 octets mais un peu plus obscurci:

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

Version précédente utilisant 561 octets:

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

Version originale de frmar (623 octets):

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

Compilation:

$ gcc -std=c99 -Wall print_as_led.c

Exemples utilisant un 0123456789numéro par défaut mais des tailles différentes:

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

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

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

Autres exemples:

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

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

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

Grandes tailles:

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

1

Perl + FIGlet + BRA * : 54 caractères

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

J'ai pensé que ce serait assez facile à faire avec FIGlet , mais il ne semblait pas y avoir de polices appropriées à cet effet. J'en ai donc fait :-)

Voici à quoi cela ressemble sur le terminal:

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

* BRA: abus flagrant des règles


Ne comprenez pas pourquoi il y a un downvote pour cela. Belle astuce avec les polices!
VisioN

Je ne réduisais pas les votes, mais je comprendrais qu'utiliser un programme au lieu de le faire , c'est tricher.
Tomas

1

PERL,   261 244 187   166 caractères

Un peu de philosophie d'encodage au niveau du 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

Code avec espace ajouté:

($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 doit être invoqué avec -n:

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

Remarques:

  • Tout sur la façon dont les chiffres sont affichés est encodé dans la chaîne Gl+%<UWm7=:-) Un caractère correspond à un chiffre, encodé sont 3 positions de 3 caractères consécutifs dans la " _ _|_| |_ |"chaîne.
  • Les nombres sont construits en 3 lignes, ligne par ligne. Chacune des 3 lignes correspond à un appel à la sous-routine c, qui effectue également un zoom vertical pour la deuxième et la troisième ligne.
  • Le zoom horizontal se fait en fin de sous-routine c.

Mon sedprogramme ne peut pas zoomer, mais il est beaucoup plus joli, non? :-)

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

À peu près l'idée que mon script PERL utilise, mais dans PERL, c'est beaucoup plus laid. Notez que pour mon programme sed j'ai préféré utiliser 9ce qui a le trait de soulignement dans la dernière ligne, pour être comme inversé 6.


Je me demandais si vous pouviez expliquer comment fonctionne la mise à l'échelle, j'essaie d'implémenter ma propre version en Perl. Mais il ne semble pas que la mise à l'échelle verticale et horizontale soit correcte.
Hunter McMillen

0

C #, 386 382 364 caractères / 374 octets (UTF-8) et (beaucoup? De) place à amélioration ...

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 ... J'ai raté la partie "échelle"MERDE

Je lui donnerai un autre coup si j'y arrive ..


Ouais, la partie à l'échelle rend ça effrayant.
cjfaure

0

J - 147 95 caractères

Ajout de la mise à l'échelle requise:

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

Version annotée:

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]

Exemple:

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

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

Comment cela répond-il à la question?
Wasi

Vous avez absolument raison ... je vais le réparer
jpjacobs

Votre exemple est incorrect. Regardez la question.
Tomas

0

Ruby, 126 caractères 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}}

Chaque chiffre est donc codé sous forme de bitmap en tiers, chaque tiers étant représenté par un chiffre 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)

Comme tous les chiffres ont le bit 64 ou le bit 32, la plage est de 044 octal à 177 octal. Malheureusement, 177 est le caractère DEL non imprimable, donc la chaîne magique contient les chiffres 2 sous le code bitmap requis, et nous devons ajouter 2 dans la fonction.

Non testé dans le programme de 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]

Sortie

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

Solutions précédentes:

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)}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.