Chuyển đổi số thành mẫu hiển thị 7 đoạn


28

Cho hai số tùy ý A, B. In số B dưới dạng Mẫu LED kỹ thuật số trong đó A là tỷ lệ.

đầu vào:

1 2320451640799518

thông báo:

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

đầu vào:

2 23

thông báo:

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

Quy tắc:

  • Sử dụng STDIN / STDOUT cho đầu vào / đầu ra

  • Mã với hầu hết các phiếu tăng chiến thắng. Trong trường hợp Tie, mã ngắn nhất sẽ được chấp nhận

  • Hầu hết các câu trả lời được bình chọn sẽ được chấp nhận vào ngày 01/02/2014 (Đã chấp nhận câu trả lời này với 12 phiếu cao nhất)


2
Một số câu hỏi liên quan, để đánh cắp mã / cảm hứng: " Giả lập màn hình 7 đoạn " và " Số và chữ LED ".
Darren Stone

@ Cảm ơn. Tôi thấy chỉnh sửa của bạn đã xóa nó cho tôi.
C0deH4cker

Số 9 của bạn nên có dấu gạch dưới ở dòng cuối cùng, giống như đảo ngược 6.
Tomas

1
@Tomas Cảm ơn bạn đã gợi ý. Nhưng, chúng tôi đã có 13 câu trả lời nên sẽ không công bằng khi thay đổi nó thêm :-)
Wasi

OK Wasi nhưng tôi hy vọng bạn không bận tâm rằng tôi đã sử dụng hình dạng ưa thích của mình 9trong câu trả lời của mình , vì tôi thích nó hơn :-)
Tomas

Câu trả lời:


20

Hàng hóa 64 CƠ BẢN

Quy tắc nghệ thuật của PETSCII :)

DANH SÁCH

Đầu ra:

CHẠY


3
Điều gì đã xảy ra với chữ số 4? oO
Timwi

Đó là cách tôi viết số 4, nhưng OK, tôi đã sửa nó :)
Danko Durbić

2
Hấp dẫn - bạn có viết nó theo cách đó quá không? Điều đó có phổ biến ở Thụy Điển, hoặc bất cứ nơi nào bạn đến từ ban đầu không?
gian hàng

Tôi sẽ +100 nếu tôi có thể.
Michael Kohl

12

Trăn 3, 286 282 280

Vâng, tôi đã đánh gôn này. Thử thách tốt đẹp!

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



Ngoài ra, đây là phiên bản Python 2 có trọng lượng chỉ 273 byte!

Không cập nhật cái này nữa với nguồn gốc được đánh gôn thêm. Điều này đã được tạo khi nguồn ban đầu là 282 byte (phiên bản Python 3).

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

Điều này có thể là gian lận, vì vậy tôi đang thêm nó một cách riêng biệt. Hãy cho tôi biết liệu điều này được coi là hợp lệ hay không.


6

Haskell (389 ký tự)

Giải pháp sử dụng 7 mảng, một mảng cho mỗi phân đoạn của mảng, sử dụng tên từ hình ảnh này:

Màn hình 8 đoạn

. Giá trị a !! 4sẽ là ký tự sẽ được hiển thị tại vị trí đó cho số 4.

Các giá trị được nhân với tỷ lệ khi thích hợp (sử dụng rrpnhân rộng), và cuối cùng được in ra.

Mật mã

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

Ví dụ sử dụng

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

6

C, 249 226 ký tự

Giải pháp đánh gôn trong 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]);}

Với khoảng trắng được thêm vào:

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

Ghi chú:

  • Nhiều nhất là 99 chữ số được in
  • Hành vi không được xác định nếu đầu vào không được hình thành tốt (ví dụ: không chứa chữ số hoặc tỷ lệ là <1)
  • Nên mã C89 hợp pháp

Tôi sẽ cung cấp một lời giải thích về cách nó hoạt động, bất cứ ai nên quan tâm.


1
Từ những gì tôi đọc xung quanh trang này về "OK trong C" là gì bạn không cần đưa vào #include <stdio.h>(Vì nó sẽ biên dịch mà không có nó.) Bạn cũng có thể đặt một int vào main(), ví dụ: main(x)cạo đi 1 byte - mặc dù nó không hợp lệ chữ ký, và đặt scanfbên trong for: for(scanf("%d %98s", &s, &i); …)cạo thêm một cái nữa. - Có một cái nhìn ở đây .
Runium

@Sukminder Đây là những gợi ý rất hữu ích, cảm ơn! Tôi đã gỡ bỏ các #include, di chuyển scanfbên trong for, loại bỏ các không cần thiết &trong &i, và đặt các intbiến trong phạm vi toàn cầu để khai thác khởi tĩnh 0. Mã này nên bây giờ vẫn được C89 quy phạm pháp luật, nhưng tôi đã không kiểm tra kỹ lưỡng. Tôi tin rằng đưa một cái intvào mainlà không hợp pháp, vì vậy tôi đã bỏ nó ra.
reima

Đưa ra sự tuân thủ tiêu chuẩn có thể giúp đỡ rất nhiều. Ví dụ, bạn có thể bỏ qua intcác biến toàn cục. Cũng %98scó thể là %s(đối với các chuỗi dài hơn dù sao bạn cũng thất bại, điều đó có quan trọng theo cách nào không?)
ugoren

Tốt Tôi đã sử dụng "loại" triết lý tương tự, nhưng đơn giản hơn - 187 ký tự trong PERL
Tomas

5

Ruby 2.0

Nhanh chóng và (không phải) thực hiện ruby ​​ngây thơ.

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}

Giải thích nhanh:

Trước tiên tôi khai báo các chuỗi đại diện cho các chữ số bật và tắt cho các thanh ngang và dọc.
Sau đó tôi đọc tỷ lệ và các chữ số.
Sau đó tôi khai báo một mảng có kích thước cần thiết để lưu trữ đủ các dòng cho tỷ lệ đã cho. Chuỗi kỳ lạ thực sự là một ánh xạ của các giá trị 7 bit đại diện cho đèn LED nào được bật cho mỗi chữ số.
Tiếp theo, với mỗi chữ số, tôi điền vào mảng đầu ra từ trên xuống dưới, có tính đến tỷ lệ ngang.
Vòng lặp cuối cùng là điền vào các hàng chỉ có các thanh dọc, chỉ có thể được tạo từ các hàng giữa và dưới bằng cách loại bỏ các thanh ngang.
Cuối cùng, tôi in mảng đầu ra!


Bạn có thể giải thích những gì đang xảy ra ở đây?
Michael Stern

5

Python 2.6 không có nhập khẩu. Tôi muốn nói rằng sự hấp dẫn của giải pháp này là việc sử dụng các mẫu. Thật không may, tôi nghĩ đó là lý do tại sao tôi gặp khó khăn trong việc nén nó.

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)

Và ngắn hơn một chút (308 ký tự):

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, đầu các chữ số được cho là '_' (dấu gạch dưới) và không có khoảng cách giữa các chữ số. Tôi đã bối rối lúc đầu haha
C0deH4cker

5

(Chỉnh sửa: Giải pháp này hiện không hợp lệ vì ngữ nghĩa của hướng dẫn đã thay đổi. Tôi không nhận ra rằng tôi đã sử dụng hướng dẫn khi tôi thay đổi. Tuy nhiên, bạn có thể sửa chương trình của mình bằng cách thay đổi nó thành hướng dẫn mới hơn .)

Sclipting - 85 ký tự

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

Đầu vào:

1 1024856359701

Đầu ra:

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

Đầu vào:

2 47474747

Đầu ra:

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


Bạn có thể sửa chữa chương trình? Rời khỏi toàn bộ bài viết ra là khá xấu xí.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Tất nhiên tôi có thể thay đổi thành , nhưng điều đó sẽ khiến mục này gian lận vì được phát minh sau khi thử thách này được đăng.
Timwi

Tôi không nghĩ đó là vấn đề lớn. Tôi không làm cho chương trình của bạn ngắn hơn nữa.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1
Không, nhưng nó sẽ vi phạm một quy tắc quan trọng của cộng đồng này.
Timwi

Không còn vi phạm quy tắc: P
ASCII - chỉ

4

C # ( 480 443 ký tự)

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

Phiên bản mở rộng:

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

Ý tưởng của tôi là chia nhiệm vụ thành 5 dòng ngang, lần lượt được chia thành một phần bên trái, bên phải và giữa cho mỗi nhân vật.


Có thể tôi đã sao chép sai, nhưng tôi đã thử chạy nó trên ideone và nó đã báo lỗi. ideone.com/gQ6LH7
C0deH4cker

có lẽ là lỗi của tôi, hãy để tôi xem
Rik

1
@ C0deH4cker Tôi đã nhập dữ liệu vào hai ReadLines riêng biệt. Công cụ này hoạt động: ideone.com/4jTxeu
Rik

1
@ C0deH4cker Tôi đã tạo một phiên bản lấy đầu vào như được chỉ định và bỏ phần dưới cùng của 9. Đầu vào mất càng nhiều ký tự, 9 chi phí thêm 1.
Rik

1
Bạn có một dự phòng ;trong đó (480); bạn có thể viết Action<z,z,z,int>q=(l,m,r,n)=>{...};(470); bạn có thể tạo tham số đầu tiên của ha charvà thực hiện ""+bên trong h(467); và cuối cùng, bạn có thể khai báo và sử dụng lại z d="134579",b="1237"(465). Đó là nhỏ nhất tôi có thể làm cho đến nay
Timwi

3

Tôi đoán có những giải pháp rất ngắn, nhưng vì đây không phải là môn đánh gôn nên tôi khá hài lòng!

Tập lệnh PHP này sẽ lấy hai số a, btừ STDIN và echo bở định dạng LED, ở akích thước.

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: Nhìn vào ví dụ đầu ra trước đó, tôi đã sai khi cho rằng khoảng trắng giữa các chữ số phải lớn bằng akích thước. Điều này đã được khắc phục với tuyên bố của OP rằng không cần dung lượng.


Trên thực tế, không nên có bất kỳ khoảng cách giữa các chữ số. Lý do duy nhất có vẻ như vậy cho mẫu là các khoảng trắng là nơi '|' sẽ là trên 8 chẳng hạn. Mất một lúc để tìm hiểu
C0deH4cker

Ồ, bạn nói đúng! Cảm ơn bạn :)
Vereos

2

C #, 435 359 473 byte

CHỈNH SỬA:

  • Đã xóa mã dự phòng. Giảm kích thước byte của so sánh.
  • Chuyển đổi sang một ứng dụng độc lập bằng cách sử dụng tiêu chuẩn cho đầu vào.

Đây là mã được đánh gôn (có thêm dấu ngắt dòng và khoảng trắng):

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

Chúng là các hàm C # hợp lệ. Nó không bao giờ được tuyên bố rằng nó nên là một chương trình độc lập. Tuy nhiên, nó không sử dụng tiêu chuẩn trong.
Thực phẩm điện tử

@Timwi, được chỉnh sửa để tuân thủ ...
Hand-E-Food

1
Làm tốt!! Tôi đã đánh gôn thêm một chút nữa và tôi đã giảm xuống còn 425 (ký tự; 432 byte trong UTF-8), làm cho nó ngắn hơn câu trả lời C # khá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
Sử dụng ý tưởng của câu trả lời C # khác về việc đặt mọi thứ vào Systemkhông gian tên sẽ giảm xuống còn 423
Timwi

2

C ( 561 492 byte)

Tác giả là frmar. Anh ấy đã gửi cho tôi câu trả lời của anh ấy vào tuần trước (anh ấy chưa tạo tài khoản của mình).

492 byte nhưng bị xáo trộn hơn một chút:

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

Phiên bản trước sử dụng 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");}

Phiên bản gốc từ 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");}

Tổng hợp:

$ gcc -std=c99 -Wall print_as_led.c

Ví dụ sử dụng 0123456789số mặc định nhưng kích thước khác nhau:

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

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

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

Những ví dụ khác:

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

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

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

Kích thước lớn hơn:

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

1

Perl + FIGlet + BRA * : 54 ký tự

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

Tôi cho rằng điều này sẽ khá dễ thực hiện với FIGlet , nhưng dường như không có bất kỳ phông chữ phù hợp nào cho mục đích này. Vì vậy, tôi đã thực hiện một số :-)

Đây là giao diện của thiết bị đầu cuối:

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

* BRA: lạm dụng quy tắc trắng trợn


Đừng hiểu tại sao có một downvote cho điều đó. Thủ thuật đẹp với phông chữ!
VisioN

Tôi đã không hạ thấp, nhưng tôi sẽ hiểu rằng sử dụng một chương trình thay vì thực sự làm cho chương trình là gian lận.
Tomas

1

PERL,   261 244 187   166 ký tự

Một chút quy tắc triết lý mã hóa bitwise :-)

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

Mã với khoảng trắng được thêm vào:

($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 phải được gọi với -n:

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

Ghi chú:

  • Tất cả mọi thứ về cách hiển thị các chữ số được mã hóa trong chuỗi Gl+%<UWm7=:-) Một ký tự tương ứng với một chữ số, được mã hóa là 3 vị trí của 3 ký tự liên tiếp trong " _ _|_| |_ |"chuỗi.
  • Số được xây dựng trong 3 dòng, từng dòng. Mỗi trong số 3 dòng tương ứng với một lệnh gọi đến thường trình con c, cũng thực hiện thu phóng dọc cho dòng thứ hai và thứ ba.
  • Thu phóng ngang được thực hiện ở cuối quy trình con c.

sedChương trình của tôi không thể phóng to, nhưng nó trông đẹp hơn rất nhiều, phải không? :-)

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

Khá nhiều ý tưởng kịch bản PERL của tôi sử dụng, nhưng trong PERL thì nó xấu hơn rất nhiều. Lưu ý rằng đối với chương trình sed của tôi, tôi thích sử dụng 9phần gạch dưới ở dòng cuối cùng, giống như đảo ngược 6.


Tôi đã tự hỏi nếu bạn có thể giải thích cách mở rộng quy mô hoạt động, tôi đang cố gắng thực hiện phiên bản của riêng tôi trong Perl. Nhưng dường như không thể có được tỷ lệ dọc và ngang đúng.
Hunter McMillen

0

C #, 386 382 364 ký tự / 374 byte (UTF-8) và (rất nhiều) phòng để cải thiện ...

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 ... Tôi đã bỏ lỡ phần "quy mô"CRAP

Tôi sẽ cho nó một phát nữa nếu tôi tiếp cận nó ..


Vâng, phần quy mô làm cho nó đáng sợ.
cjfaure

0

J - 147 95 ký tự

Đã thêm tỷ lệ yêu cầu:

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

Phiên bản chú thích:

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]

Thí dụ:

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

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

Làm thế nào để trả lời câu hỏi này?
Wasi

Bạn hoàn toàn đúng ... Tôi sẽ sửa nó
jpjacobs

Ví dụ của bạn không chính xác. Xem câu hỏi.
Tomas

0

Ruby, 126 ký tự 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}}

Mỗi chữ số được mã hóa dưới dạng bitmap trong phần ba, do đó, mỗi phần ba được biểu thị bằng một chữ số bát phân.

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

Vì tất cả các chữ số đều có bit 64 hoặc 32 bit, phạm vi là 044 bát phân đến 177 bát phân. Thật không may, 177 là ký tự DEL không thể in được, do đó, chuỗi ma thuật chứa các số 2 bên dưới mã bitmap cần thiết và chúng ta phải thêm 2 trở lại trong hàm.

Ungolfed trong chương trình thử nghiệm

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]

Đầu ra

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

Giải pháp trước đây:

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)}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.