Przekształć liczbę w 7-segmentowy wzór wyświetlania

28

Biorąc pod uwagę dwie dowolne liczby A, B. Wydrukuj numer B jako cyfrowy wzór LED, gdzie A oznacza skalę.

wkład:

1 2320451640799518

wyjście:

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

wkład:

2 23

wyjście:

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

Zasady:

  • Użyj STDIN / STDOUT dla wejścia / wyjścia

  • Kod z największą liczbą głosów wygranych. W przypadku remisu zostanie zaakceptowany najkrótszy kod

  • Najczęściej głosowana odpowiedź zostanie zaakceptowana 01.02.2014 (Zaakceptowano tę odpowiedź, otrzymując najwyższe 12 głosów)

Czy byłem
źródło
2
Kilka powiązanych pytań dotyczących kradzieży kodu / inspiracji: „ Emuluj wyświetlacz 7-segmentowy ” oraz „ Liczby i litery LED ”.
Darren Stone
@Wasi Thanks. Widziałem twoją edycję, która wyjaśniła mi to.
C0deH4cker
Twoja 9 powinna mieć podkreślenie w ostatnim wierszu, tak jak odwrócona 6.
Tomas
1
@Tomas Dzięki za sugestię. Ale mamy już 13 odpowiedzi, więc niesprawiedliwe będzie dalsze zmienianie :-)
Wasi
OK, Wasi, ale mam nadzieję, że nie masz nic przeciwko, że użyłem mojego preferowanego kształtu 9w mojej odpowiedzi , ponieważ bardziej mi się podoba :-)
Tomas

Odpowiedzi:

20

Commodore 64 BASIC

Zasady sztuki PETSCII :)

LISTA

Wydajność:

BIEGAĆ

Danko Durbić
źródło
3
Co się stało z cyfrą 4? oO
Timwi
Tak piszę numer 4, ale OK, naprawiłem to :)
Danko Durbić
2
Fascynujące - czy piszesz to również ręcznie? Czy jest to powszechne w Szwecji, czy skądkolwiek pochodzisz?
stoisko
Dałbym +100, gdybym mógł.
Michael Kohl
12

Python 3, 286 282 280

Tak, grałem w golfa. Niezłe wyzwanie!

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



Ponadto, oto wersja Python 2 ważąca zaledwie 273 bajty!

Nie aktualizuję już tego z dalszym oryginalnym źródłem gry w golfa. Zostało to utworzone, gdy pierwotne źródło miało 282 bajty (wersja Python 3).

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

To może być oszustwo, więc dodaję to osobno. Daj mi znać, czy jest to uważane za ważne, czy nie.

C0deH4cker
źródło
6

Haskell (389 znaków)

Rozwiązanie wykorzystuje 7 tablic, po jednej dla każdego segmentu tablicy, używając nazw z tego obrazu:

8 segmentowy wyświetlacz

. Wartością a !! 4będzie znak, który powinien być wyświetlany w tej pozycji dla liczby 4.

W razie potrzeby wartości są mnożone przez skalę (przy użyciu ri rpdo replikacji), a na końcu drukowane.

Kod

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

Przykładowe użycie

echo '1 2320451640799518' | runhaskell ./digit_led.hs
 _  _  _  _     _     _     _  _  _  _  _     _ 
 _| _| _|| ||_||_   ||_ |_|| |  ||_||_||_   ||_|
|_  _||_ |_|  | _|  ||_|  ||_|  |  |  | _|  ||_|
David Miani
źródło
6

C, 249 226 znaków

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

Z dodaną białą spacją:

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

Uwagi:

  • Drukowanych jest maksymalnie 99 cyfr
  • Zachowanie jest niezdefiniowane, jeśli dane wejściowe nie są dobrze uformowane (np. Zawierają cyfry lub skala jest <1)
  • Powinien być legalnym kodem C89

Przedstawię wyjaśnienie, jak to działa, jeśli kogokolwiek to obchodzi.

reima
źródło
1
Z tego, co przeczytałem na tej stronie, o tym, co jest „OK w C” , nie musisz uwzględniać #include <stdio.h>(ponieważ będzie się kompilować bez niego.) Możesz także wstawić jedną wartość int main(), np. main(x)Zgolić 1 bajt - chociaż to nie jest poprawne podpis i włóż do scanfśrodka for: for(scanf("%d %98s", &s, &i); …)golenie jeszcze jednego. - Spójrz tutaj .
Runium
@Sukminder Są to bardzo pomocne wskazówki, dzięki! Usunąłem #include, przeniósł scanfsię wewnątrz for, usunięciu niepotrzebnego &in &i, i umieścić intzmiennych w zasięgu globalnym wykorzystać statyczny 0 inicjalizacji. Kod powinien być teraz zgodny z C89, ale nie sprawdziłem go dokładnie. Uważam, że włożenie jednego intz nich mainjest niezgodne z prawem, więc to pominąłem.
reima
Rezygnacja ze standardowej zgodności może bardzo pomóc. Na przykład możesz pominąć intzmienne globalne. Również %98smoże być %s(dla dłuższych ciągów nie uda tak, to ma znaczenie w jaki sposób?)
ugoren
Dobry! Stosowałem „podobną” podobną filozofię, ale prostszą - 187 znaków w PERL
Tomas
5

Ruby 2.0

Szybka i (nie taka) naiwna implementacja 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}

Szybkie wyjaśnienie:

Najpierw deklaruję ciągi znaków przedstawiające cyfry włączone i wyłączone dla poziomych i pionowych pasków.
Potem czytam skalę i cyfry.
Następnie deklaruję tablicę o niezbędnym rozmiarze do przechowywania wystarczającej liczby linii dla danej skali. Dziwny ciąg jest w rzeczywistości odwzorowaniem 7-bitowych wartości reprezentujących, które diody LED należy włączyć dla każdej cyfry.
Następnie dla każdej cyfry wypełniam tablicę wyjściową od góry do dołu, biorąc pod uwagę skalowanie w poziomie.
Ostatnią pętlą jest wypełnienie wierszy, które mają tylko pionowe paski, które można wygenerować ze środkowego i dolnego rzędu poprzez usunięcie poziomych pasków.
Na koniec wypisuję tablicę wyjściową!

SirDarius
źródło
Czy możesz wyjaśnić, co się tutaj dzieje?
Michael Stern
5

Python 2.6 bez importu. Powiedziałbym, że atrakcyjność tego rozwiązania polega na użyciu szablonów. Niestety myślę, że właśnie dlatego tak trudno mi było go zagęścić.

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)

I nieco krótszy (308 znaków):

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
źródło
Fyi, górna część cyfr powinna być „_” (podkreślenia) i bez spacji między cyframi. Byłem zdezorientowany na początku haha
C0deH4cker
5

(Edycja: To rozwiązanie jest teraz nieprawidłowe, ponieważ zmieniła się semantyka instrukcji. Nie zdawałem sobie sprawy, że już skorzystałem z instrukcji, gdy ją zmieniłem. Możesz jednak naprawić ten program, po prostu zmieniając go na nowsza instrukcja ).

Sclipting - 85 znaków

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

Wkład:

1 1024856359701

Wydajność:

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

Wkład:

2 47474747

Wydajność:

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

Timwi
źródło
Czy możesz naprawić program? Pozostawienie całego pociągnięcia posta jest dość brzydkie.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨d̷̰̀ĥ̷̳
Mógłbym oczywiście zmienić się , ale to by uczynić ten wpis oszukiwania, ponieważ został wymyślony po to wyzwanie została wysłana.
Timwi
Nie sądzę, żeby to był taki problem. I tak nie skracam twojego programu.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨d̷̰̀ĥ̷̳
1
Nie, ale naruszyłoby to ważną zasadę tej społeczności.
Timwi
Nie narusza już reguły: P
tylko ASCII,
4

C # ( 480 443 znaków)

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

Rozszerzona wersja:

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

Moim pomysłem było podzielenie zadania na 5 poziomych linii, które z kolei są podzielone na lewą, prawą i środkową część dla każdej postaci.

Rik
źródło
Być może źle to skopiowałem, ale próbowałem uruchomić to na ideone i wystąpił błąd. ideone.com/gQ6LH7
C0deH4cker
prawdopodobnie moja wina, pozwól mi zobaczyć
Rik
1
@ C0deH4cker Wziąłem dane wejściowe w dwóch oddzielnych wierszach odczytu. Ten działa: ideone.com/4jTxeu
Rik
1
@ C0deH4cker Zrobiłem wersję, która pobiera dane wejściowe zgodnie ze specyfikacją i upuszcza dolną część 9. Dane wejściowe zabierają tyle znaków, 9 kosztuje 1 dodatkowy.
Rik
1
Masz tam zbędne ;(480); możesz pisać Action<z,z,z,int>q=(l,m,r,n)=>{...};(470); możesz zrobić pierwszy parametr ha chari zrobić ""+wnętrze h(467); i wreszcie możesz zadeklarować i ponownie użyć z d="134579",b="1237"(465). To najmniejszy, jaki udało mi się do tej pory zrobić
Timwi
3

Wydaje mi się, że istnieją bardzo krótsze rozwiązania, ale ponieważ nie jest to golf kodowy, jestem bardzo zadowolony!

Ten skrypt PHP przyjmie dwie liczby a, bod STDIN i echa bw formacie LED, w arozmiarze.

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

EDYCJA: Patrząc na poprzedni przykład wyjściowy, błędnie przypuszczałem, że odstęp między cyframi powinien być tak duży, jak arozmiar. Zostało to naprawione w deklaracji PO, że nie jest potrzebne miejsce.

Vereos
źródło
W rzeczywistości między cyframi nie powinno być żadnych spacji. Jedynym powodem, dla którego tak to wygląda w przypadku próbki, są spacje, w których „|” będzie na przykład na 8. Zajęło mi trochę czasu, żeby się dowiedzieć
C0deH4cker
Masz rację! Dziękuję :)
Vereos
2

C #, 435 359 473 bajtów

EDYCJE:

  • Usunięto zbędny kod. Zmniejszony rozmiar bajtów porównań.
  • Przekształcony w samodzielną aplikację przy użyciu standardowego wejścia.

Oto kod do gry w golfa (z dodanymi podziałami linii i białymi spacjami):

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;
    }
}
Hand-E-Food
źródło
Są to prawidłowe funkcje C #. Nigdy nie stwierdzono, że powinien to być samodzielny program. Jednak nie używa standardowego w.
Hand-E-Food
@ Timwi, zredagowane w celu dostosowania ...
Hand-E-Food
1
Dobra robota!! Grałem jeszcze trochę w golfa i zmniejszyłem go do 425 (znaków; 432 bajtów w UTF-8), co czyni go krótszym niż inne odpowiedzi w języku 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
Użycie drugiej odpowiedzi C # polegającej na umieszczeniu wszystkiego w Systemprzestrzeni nazw sprowadza się do 423
Timwi
2

C ( 561 492 bajtów)

Autor jest frmar. Wysłał mi swoją odpowiedź w zeszłym tygodniu (jeszcze nie założył konta).

492 bajty, ale nieco bardziej zaciemnione:

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

Poprzednia wersja wykorzystująca 561 bajtów:

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

Oryginalna wersja z frmar (623 bajty):

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

Kompilacja:

$ gcc -std=c99 -Wall print_as_led.c

Przykłady z użyciem domyślnej 0123456789liczby, ale o różnych rozmiarach:

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

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

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

Inne przykłady:

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

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

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

Większe rozmiary:

$ ./a.out 4 42
       ____
|    |     |
|    |     |
|    |     |
|____| ____|
     ||
     ||
     ||
     ||____
$ ./a.out 5 42
        _____
|     |      |
|     |      |
|     |      |
|     |      |
|_____| _____|
      ||
      ||
      ||
      ||
      ||_____
olibre
źródło
1

Perl + FIGlet + BRA * : 54 znaków

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

Uznałem, że byłoby to dość łatwe w przypadku FIGlet , ale nie wydaje się, aby były odpowiednie czcionki do tego celu. Więc zrobiłem trochę :-)

Oto jak to wygląda na terminalu:

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

* BRA: rażące nadużycie zasad

piskliwy kostuch
źródło
Nie rozumiem, dlaczego jest na to głosowanie negatywne. Fajna sztuczka z czcionkami!
VisioN
I nie był downvoting, ale chciałbym zrozumieć, że korzystając z programu zamiast faktycznie czyni program jest oszustwem.
Tomas
1

PERL,   261 244 187   166 znaków

Trochę bitowej zasady kodowania :-)

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

Kod z dodanymi spacjami:

($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 należy wywoływać za pomocą -n:

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

Uwagi:

  • Wszystko o sposobie wyświetlania cyfr jest zakodowane w ciągu Gl+%<UWm7=:-) Jeden znak odpowiada jednej cyfrze, zakodowane są 3 pozycje 3 kolejnych znaków w " _ _|_| |_ |"ciągu.
  • Liczby są zbudowane w 3 liniach, linia po linii. Każda z 3 linii odpowiada jednemu wywołaniu podprogramu c, który zapewnia także przybliżenie pionowe dla drugiej i trzeciej linii.
  • Powiększanie w poziomie odbywa się na końcu podprogramu c.

Mój sedprogram nie może powiększyć, ale wygląda o wiele ładniej, prawda? :-)

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

Prawie pomysł, z którego korzysta mój skrypt PERL, ale w PERL jest o wiele brzydszy. Zauważ, że dla mojego programu sed wolałem używać, 9który ma podkreślenie w ostatnim wierszu, aby być jak odwrócona 6.

Tomas
źródło
Zastanawiałem się, czy możesz wyjaśnić, jak działa skalowanie, próbuję zaimplementować własną wersję w Perlu. Ale wydaje się, że nie można prawidłowo skalować w pionie i poziomie.
Hunter McMillen
0

C #, 386 382 364 znaków / 374 bajtów (UTF-8) i (wiele?) Miejsca na ulepszenia ...

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 ... Brakowało mi części „skali”BZDURY

Dam mu kolejny strzał, jeśli się do tego zabiorę ...

RobIII
źródło
Tak, część skali przeraża.
cjfaure
0

J - 147 95 znaków

Dodano wymagane skalowanie:

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

Wersja z adnotacjami:

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]

Przykład:

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

2 123
     --  -- 
|      |   |
|      |   |
     --  -- 
|   |      |
|   |      |
     --  -- 
jpjacobs
źródło
Jak to odpowiada na pytanie?
Wasi
Masz absolutną rację ... Naprawię to
jpjacobs,
Twój przykład jest niepoprawny. Zobacz pytanie.
Tomas
0

Ruby, 126 znaków 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}}

Każda cyfra jest kodowana w postaci mapy bitowej w jednej trzeciej, a każda trzecia reprezentowana jest przez cyfrę ósemkową.

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

Ponieważ wszystkie cyfry mają ustawiony bit 64-bitowy lub 32-bitowy, zakres wynosi od 044 do 177 ósemki. Niestety 177 jest niedrukowalnym znakiem DEL, więc magiczny ciąg znaków zawiera liczby 2 poniżej wymaganego kodu bitmapowego i musimy ponownie dodać 2 w funkcji.

Niegolfowany w programie testowym

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]

Wydajność

C:\Users\steve>ruby 7seg.txt
4
0123456789
 ____        ____  ____        ____  ____  ____  ____  ____
|    |     |     |     ||    ||     |          ||    ||    |
|    |     |     |     ||    ||     |          ||    ||    |
|    |     |     |     ||    ||     |          ||    ||    |
|    |     | ____| ____||____||____ |____      ||____||____|
|    |     ||          |     |     ||    |     ||    |     |
|    |     ||          |     |     ||    |     ||    |     |
|    |     ||          |     |     ||    |     ||    |     |
|____|     ||____  ____|     | ____||____|     ||____| ____|
Level River St
źródło
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)}

Poprzednie rozwiązania:

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
źródło