Ubah angka menjadi pola tampilan 7-segmen


28

Diberi dua nomor acak A, B. Cetak angka B sebagai Pola LED Digital dengan A adalah skalanya.

memasukkan:

1 2320451640799518

ouput:

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

memasukkan:

2 23

ouput:

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

Aturan:

  • Gunakan STDIN / STDOUT untuk input / output

  • Kode dengan kemenangan terbanyak menang. Dalam kasus Tie, kode terpendek akan diterima

  • Jawaban terbanyak akan diterima pada 01/02/2014 (Menerima jawaban ini dengan 12 suara terbanyak)


2
Beberapa pertanyaan terkait, untuk pencurian / inspirasi kode: " Emulasikan tampilan 7-segmen " dan " Angka dan Huruf LED ".
Darren Stone

@Wasi Terima kasih. Saya melihat hasil edit Anda yang menjelaskannya untuk saya.
C0deH4cker

9 Anda harus memiliki garis bawah pada baris terakhir, untuk menjadi seperti terbalik 6.
Tomas

1
@ Thomas Terima kasih atas sarannya. Namun, kami sudah memiliki 13 jawaban sehingga tidak adil untuk mengubahnya lebih lanjut :-)
Wasi

OK Wasi tapi saya harap Anda tidak keberatan bahwa saya menggunakan bentuk pilihan saya9 dalam jawaban saya , karena saya lebih menyukainya :-)
Tomas

Jawaban:


20

Commodore 64 BASIC

Aturan seni PETSCII :)

DAFTAR

Keluaran:

MENJALANKAN


3
Apa yang terjadi pada digit 4? oO
Timwi

Begitulah cara saya menulis nomor 4, tapi OK, saya memperbaikinya :)
Danko Durbi

2
Menarik - apakah Anda menulisnya dengan tangan juga? Apakah itu biasa di Swedia, atau di mana pun Anda berasal?
stan

Saya akan +100 jika saya bisa.
Michael Kohl

12

Python 3, 286 282 280

Ya saya bermain golf yang satu ini. Tantangan yang bagus!

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



Juga, inilah versi Python 2 dengan berat hanya 273 byte!

Tidak memperbarui yang ini lagi dengan sumber asli golf lebih lanjut. Ini dibuat ketika sumber aslinya 282 byte (versi Python 3).

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

Ini mungkin curang, jadi saya menambahkannya secara terpisah. Beri tahu saya apakah ini dianggap valid atau tidak.


6

Haskell (389 karakter)

Solusinya menggunakan 7 array, satu untuk setiap segmen array, menggunakan nama-nama dari gambar ini:

8 segmen tampilan

. Nilai a !! 4akan menjadi karakter yang harus ditampilkan pada posisi itu untuk nomor 4.

Nilai-nilai dikalikan dengan skala mana yang sesuai (menggunakan rdan rpuntuk replikasi), dan akhirnya dicetak.

Kode

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

Contoh penggunaan

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

6

C, 249 226 karakter

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

Dengan spasi kosong ditambahkan:

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

Catatan:

  • Paling banyak 99 digit dicetak
  • Perilaku tidak terdefinisi jika input tidak terbentuk dengan baik (misalnya mengandung non-digit, atau skala <1)
  • Harus kode hukum C89

Saya akan memberikan penjelasan tentang cara kerjanya, jika ada yang peduli.


1
Dari apa yang saya baca di halaman ini tentang apa yang "OK dalam C" Anda tidak perlu memasukkan #include <stdio.h>(Karena akan dikompilasi tanpa itu.) Anda juga dapat memasukkan satu int main(), misalnya main(x), mencukur 1 byte - meskipun tidak valid tanda tangan, dan dimasukkan ke scanfdalam for: for(scanf("%d %98s", &s, &i); …)mencukur satu lagi. - Coba lihat di sini .
Runium

@Sukminder Ini adalah petunjuk yang sangat membantu, terima kasih! Saya dihapus #include, pindah scanfdi dalam for, dihapus yang tidak perlu &di &i, dan menempatkan intvariabel dalam lingkup global untuk mengeksploitasi statis 0 inisialisasi. Kode sekarang seharusnya masih legal C89, tetapi saya tidak memeriksanya dengan seksama. Saya percaya menempatkan satu intdi maintidak sah, jadi saya ditinggalkan itu.
reima

Menyerahkan kepatuhan standar dapat banyak membantu. Misalnya, Anda dapat menghilangkan intvariabel global. Juga %98sbisa %s(untuk string yang lebih lama Anda gagal, apakah itu penting dengan cara apa?)
ugoren

Baik! Saya menggunakan "semacam" filosofi yang serupa, tetapi lebih sederhana - 187 karakter dalam PERL
Tomas

5

Ruby 2.0

Implementasi ruby ​​naif yang cepat dan (tidak begitu).

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}

Penjelasan cepat:

Saya pertama-tama mendeklarasikan string yang mewakili dan mematikan digit untuk bilah horizontal dan vertikal.
Kemudian saya membaca skala dan angka.
Saya kemudian mendeklarasikan array ukuran yang diperlukan untuk menyimpan garis yang cukup untuk skala yang diberikan. String aneh sebenarnya adalah pemetaan nilai 7-bit yang mewakili LED mana yang harus dihidupkan untuk setiap digit.
Selanjutnya, untuk setiap digit, saya mengisi array output dari atas ke bawah, dengan mempertimbangkan penskalaan horisontal akun.
Loop terakhir adalah untuk mengisi baris yang hanya memiliki bar vertikal, yang hanya dapat dihasilkan dari baris tengah dan bawah dengan menghapus bar horisontal.
Akhirnya, saya mencetak array keluaran!


Bisakah Anda jelaskan apa yang terjadi di sini?
Michael Stern

5

Python 2.6 tanpa impor. Saya akan mengatakan bahwa daya tarik dari solusi ini adalah penggunaan template. Sayangnya saya pikir itu sebabnya saya kesulitan memadatkannya.

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)

Dan sedikit lebih pendek (308 karakter):

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

Fyi, bagian atas digit seharusnya '_' (garis bawah), dan tidak ada spasi di antara digit. Awalnya saya bingung haha
C0deH4cker

5

(Sunting: Solusi ini sekarang tidak valid karena semantik instruksi telah berubah. Saya tidak menyadari bahwa saya sudah menggunakan instruksi ketika saya mengubahnya. Namun, Anda dapat memperbaiki program ini dengan hanya mengubahnya ke instruksi yang lebih baru .)

Memotong - 85 karakter

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

Memasukkan:

1 1024856359701

Keluaran:

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

Memasukkan:

2 47474747

Keluaran:

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


Bisakah Anda memperbaiki programnya? Membiarkan seluruh post stroke keluar cukup buruk.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Tentu saja saya dapat mengubah ke , tapi itu akan membuat entri ini curang karena ditemukan setelah tantangan ini diposting.
Timwi

Saya pikir itu bukan masalah besar. Saya tidak membuat program Anda lebih pendek.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1
Tidak, tapi itu akan melanggar aturan penting komunitas ini.
Timwi

Tidak lagi melanggar aturan: P
ASCII-only

4

C # ( 480 443 karakter)

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

Versi diperpanjang:

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

Ide saya adalah untuk membagi tugas menjadi 5 garis horizontal, yang pada gilirannya dibagi menjadi bagian kiri, kanan dan tengah untuk setiap karakter.


Mungkin saya salah menyalin, tetapi saya mencoba menjalankan ini pada ideone dan itu memberikan kesalahan. ideone.com/gQ6LH7
C0deH4cker

mungkin salahku, biarkan aku melihat
Rik

1
@ C0deH4cker Saya mengambil input dalam dua ReadLines terpisah. Yang ini berfungsi: ideone.com/4jTxeu
Rik

1
@ C0deH4cker Saya membuat versi yang mengambil input seperti yang ditentukan, dan menjatuhkan bagian bawah 9. Masukan mengambil banyak karakter, 9 biaya 1 ekstra.
Rik

1
Anda memiliki redundan ;di sana (480); Anda dapat menulis Action<z,z,z,int>q=(l,m,r,n)=>{...};(470); Anda dapat membuat parameter pertama dari ha chardan melakukan bagian ""+dalam h(467); dan akhirnya, Anda dapat mendeklarasikan dan menggunakan kembali z d="134579",b="1237"(465). Itu yang terkecil yang bisa saya lakukan sejauh ini
Timwi

3

Saya kira ada solusi yang sangat singkat, tetapi karena ini bukan kode-golf saya cukup puas!

Script PHP ini akan mengambil dua angka a, bdari STDIN dan gema bdalam format LED, pada aukuran.

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: Melihat contoh output sebelumnya, saya salah mengira bahwa ruang antara digit harus sebesar aukuran. Ini telah diperbaiki dengan deklarasi OP bahwa tidak ada ruang yang dibutuhkan.


Sebenarnya, seharusnya tidak ada spasi di antara digit. Satu-satunya alasan terlihat seperti itu untuk sampel adalah ruang di mana '|' akan berada di 8 misalnya. Butuh beberapa saat untuk mencari tahu
C0deH4cker

Oh kamu benar! Terima kasih :)
Vereos

2

C #, 435 359 473 byte

EDIT:

  • Kode redundan yang dihapus. Mengurangi ukuran byte perbandingan.
  • Dikonversi ke aplikasi yang berdiri sendiri menggunakan input standar untuk.

Berikut kode golf (dengan jeda baris tambahan dan spasi putih):

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

Mereka adalah fungsi C # yang valid. Tidak pernah dinyatakan bahwa itu harus menjadi program yang berdiri sendiri. Namun, itu tidak menggunakan standar masuk.
Hand-E-Food

@Timwi, diedit agar sesuai ...
Hand-E-Food

1
Sudah selesai dilakukan dengan baik!! Saya telah memainkannya lagi dan saya mendapatkannya hingga 425 (karakter; 432 byte dalam UTF-8), membuatnya lebih pendek daripada jawaban C # lainnya. 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
Menggunakan ide C # answer lainnya untuk meletakkan segala sesuatu di Systemnamespace membawanya ke 423
Timwi

2

C ( 561 492 byte)

Penulis frmar. Dia mengirimi saya jawabannya minggu lalu (dia belum membuat akunnya).

492 byte tetapi sedikit lebih dikaburkan:

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

Versi sebelumnya menggunakan 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");}

Versi asli dari 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");}

Kompilasi:

$ gcc -std=c99 -Wall print_as_led.c

Contoh menggunakan 0123456789nomor standar tetapi ukuran berbeda:

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

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

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

Contoh lain:

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

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

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

Ukuran yang lebih besar:

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

1

Perl + FIGlet + BRA * : 54 karakter

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

Saya pikir ini akan sangat mudah dilakukan dengan FIGlet , tetapi tampaknya tidak ada font yang cocok untuk tujuan ini. Jadi saya membuat beberapa :-)

Begini tampilannya di terminal:

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

* BRA: penyalahgunaan aturan terang-terangan


Jangan mengerti mengapa ada downvote untuk itu. Trik yang bagus dengan font!
VisioN

Aku tidak downvoting, tapi saya akan mengerti bahwa menggunakan suatu program yang bukan benar-benar membuat program adalah kecurangan.
Tomas

1

PERL,   261 244 187   166 karakter

Sedikit filosofi pengkodean bitwise 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

Kode dengan spasi ditambahkan:

($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 harus dipanggil dengan -n:

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

Catatan:

  • Segala sesuatu tentang bagaimana digit ditampilkan ditampilkan dikodekan dalam string Gl+%<UWm7=:-) Satu karakter sesuai dengan satu digit, dikodekan adalah 3 posisi 3 karakter berturut-turut dalam " _ _|_| |_ |"string.
  • Bilangan dibangun dalam 3 baris, baris demi baris. Masing-masing dari 3 baris sesuai dengan satu panggilan ke sub-rutinc , yang juga melakukan pembesaran vertikal untuk saluran kedua dan ketiga.
  • Zoom horizontal dilakukan pada akhir sub-rutin c.

sedProgram saya tidak dapat melakukan zoom, tetapi tampilannya jauh lebih bagus, bukan? :-)

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

Cukup banyak ide yang digunakan skrip PERL saya, tetapi dalam PERL itu jauh lebih jelek. Perhatikan bahwa untuk program sed saya, saya lebih suka menggunakan 9yang memiliki garis bawah pada baris terakhir, seperti terbalik 6.


Saya bertanya-tanya apakah Anda dapat menjelaskan bagaimana penskalaan bekerja, saya mencoba menerapkan versi saya sendiri di Perl. Tapi sepertinya tidak bisa mendapatkan penskalaan vertikal dan horizontal dengan benar.
Hunter McMillen

0

C #, 386 382 364 karakter / 374 byte (UTF-8) dan (banyak?) Ruang untuk peningkatan ...

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 ... Saya melewatkan bagian "skala"SAMPAH

Saya akan mencobanya lagi jika saya bisa melakukannya ..


Ya, bagian skala membuatnya menakutkan.
cjfaure

0

J - 147 95 karakter

Menambahkan penskalaan yang dibutuhkan:

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

Versi beranotasi:

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]

Contoh:

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

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

Bagaimana ini menjawab pertanyaan?
Wasi

Anda benar sekali ... Saya akan memperbaikinya
jpjacobs

Contoh Anda salah. Perhatikan pertanyaannya.
Tomas

0

Ruby, 126 karakter 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}}

Setiap digit dikodekan sebagai bitmap dalam sepertiga demikian, dengan masing-masing ketiga diwakili oleh digit oktal.

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

Karena semua digit memiliki bit 64-an atau 32-bit, kisarannya adalah 044 oktal hingga 177 oktal. Sayangnya 177 adalah karakter DEL yang tidak dapat dicetak, jadi string ajaib berisi angka 2 di bawah kode bitmap yang diperlukan, dan kita harus menambahkan 2 kembali pada fungsinya.

Tidak terkurung dalam program uji

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]

Keluaran

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

Solusi sebelumnya:

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)}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.