숫자를 7 세그먼트 디스플레이 패턴으로 변환


28

두 개의 임의의 숫자 A, B가 주어집니다. 숫자 B를 디지털 LED 패턴으로 인쇄하십시오. 여기서 A는 스케일입니다.

입력:

1 2320451640799518

출력 :

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

입력:

2 23

출력 :

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

규칙 :

  • 사용 STDIN / STDOUT 에 대한 입력 / 출력

  • 대부분의 투표권을 가진 코드가 승리합니다. 타이의 경우 가장 짧은 코드가 허용됩니다.

  • 대부분의 업 대답 (허용 2014년 1월 2일에서 허용됩니다 선정 이 대답 가장 높은 12 회)


2
코드 훔치기 / 영감을위한 몇 가지 관련 질문 : " 7- 세그먼트 디스플레이 에뮬레이션 "및 " LED 숫자 및 문자 ".
대런 스톤

감사합니다. 나는 당신의 편집 내용을 보았습니다.
C0deH4cker

9는 마지막 줄에 밑줄이 있어야합니다. 6과 같습니다.
Tomas

1
@Tomas 제안 해 주셔서 감사합니다. 그러나, 우리는 이미 13 개의 답변을 가지고 있으므로 그것을 더 바꾸는 것이 불공평 할 것입니다 :-)
Wasi

OK WASI하지만 난 내 선호하는 형태를 사용하는 것이 괜찮다 희망 9내 대답은 같은 I, 그것은 더 :-)
토마스

답변:


20

코모도어 64 베이직

PETSCII 예술 규칙 :)

명부

산출:

운영


3
숫자 4는 어떻게 되었습니까? oO
Timwi

내가 확인 번호 4를 쓸 수 있지만 방법의 것으로, 그 :) 고정
단코 Durbić

2
매혹적인-손으로도 그렇게 쓰십니까? 스웨덴에서 일반적입니까, 아니면 원래 어디에서 왔습니까?
boothby

내가 할 수 있다면 +100을 할 것이다.
Michael Kohl

12

파이썬 3, 286 282 280

그래, 나는 이것을 골프했다. 좋은 도전!

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



또한 273 바이트에 불과한 Python 2 버전이 있습니다!

더 골프를 치는 오리지널 소스로 더 이상 이것을 업데이트하지 않습니다. 원본 소스가 282 바이트 (Python 3 버전) 일 때 생성되었습니다.

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

이것은 부정 행위 일 수 있으므로 별도로 추가하고 있습니다. 이것이 유효한지 아닌지 알려주세요.


6

하스켈 (389 자)

솔루션은이 이미지의 이름을 사용하여 배열의 각 세그먼트에 하나씩 7 개의 배열을 사용합니다.

8 세그먼트 디스플레이

. 값 a !! 4은 숫자 4의 해당 위치에 표시되어야하는 문자입니다.

값은 적절한 경우 (사용 rrp복제에 대한) 스케일로 곱한 후 최종적으로 인쇄됩니다.

코드

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

사용법 예

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

6

C, 249226

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

공백이 추가 된 경우 :

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

노트:

  • 최대 99 자리가 인쇄됩니다
  • 입력이 제대로 구성되지 않은 경우 (예 : 숫자가 아닌 숫자를 포함하거나 스케일이 <1 인 경우) 동작이 정의되지 않습니다.
  • 합법적 인 C89 코드 여야합니다

누군가의 관심이 있다면 어떻게 작동하는지 설명하겠습니다.


1
이 페이지에서 읽은 "OK in C" 에 대해 읽지 않은 내용에 포함시킬 필요는 없습니다 #include <stdio.h>. (없이 컴파일 할 수 있습니다.) main()예를 들어 main(x)1 바이트를 깎을 수도 있습니다. 서명을 넣어 scanf내부 for: for(scanf("%d %98s", &s, &i); …)더 하나의 면도. – 여기를보세요 .
Runium

@Sukminder 다음은 매우 유용한 힌트입니다. 감사합니다! 을 제거하고 내부를 #include이동하고 불필요한 in을 제거 하고 정적 0 초기화를 활용하기 위해 전역 범위에 변수를 넣었습니다 . 코드 여전히 유효한 C89 여야 하지만 철저하게 확인하지는 않았습니다. 나는 하나 를 넣는 것이 합법적이지 않다고 믿었습니다 . scanffor&&iintintmain
reima

표준 준수를 포기하면 많은 도움이 될 수 있습니다. 예를 들어, int전역 변수를 생략 할 수 있습니다 . 또한 %98s일 수있다 %s(당신이 어쨌든 실패 긴 문자열을, 어떤 방법으로 문제를합니까?)
ugoren

좋은! 필자는 비슷한 종류의 유사한 철학을 사용했지만 PERL에서 187 자
Tomas

5

루비 2.0

빠르고 (그렇지 않은) 순진한 루비 구현.

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}

빠른 설명 :

먼저 가로 및 세로 막대의 숫자를 나타내는 문자열을 선언합니다.
그런 다음 규모와 숫자를 읽습니다.
그런 다음 주어진 스케일에 충분한 라인을 저장하는 데 필요한 크기의 배열을 선언합니다. 이상한 문자열은 실제로 각 숫자에 대해 어떤 LED를 켤지를 나타내는 7 비트 값의 매핑입니다.
다음으로, 각 자리수에 대해 수평 스케일링을 고려하여 출력 배열을 위에서 아래로 채 웁니다.
마지막 루프는 세로 막대 만있는 행을 채우는 것인데, 가로 막대를 제거하여 중간 및 아래쪽 행에서 생성 할 수 있습니다.
마지막으로 출력 배열을 인쇄합니다!


여기서 무슨 일이 일어나고 있는지 설명해 주시겠습니까?
Michael Stern

5

수입이없는 Python 2.6. 이 솔루션의 매력은 템플릿을 사용하는 것입니다. 불행히도 나는 그것이 그것을 압축하는 데 어려움을 겪은 이유라고 생각합니다.

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)

그리고 조금 더 짧은 (308 자) :

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

참고로, 숫자의 상단은 '_'(밑줄)이어야하며 숫자 사이에는 공백이 없습니다. 나는 처음에 혼란 스러웠다
C0deH4cker

5

(편집 : 명령 의 의미 가 변경 되었으므로이 솔루션은 이제 유효 하지 않습니다. 명령을 변경할 때 이미 명령을 사용했음을 알지 못했지만 프로그램을 간단히 변경하여 수정할 수는 있습니다. 최신 지침 .)

깎기 — 85 자

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

입력:

1 1024856359701

산출:

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

입력:

2 47474747

산출:

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


프로그램을 고칠 수 있습니까? 전체 포스트 스트로크를 떠나는 것은 아주 추악합니다.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̷̳̳̂

나는 물론 변경할 수의 ,하지만 때문이 항목의 부정 행위를 만들 것 이 문제가 게시 된 후 발명되었다.
Timwi

나는 그것이 큰 문제라고 생각하지 않습니다. 어쨌든 프로그램을 더 짧게 만들지는 않습니다.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1
아니요,하지만이 커뮤니티의 중요한 규칙을 위반할 것입니다.
Timwi

더 이상 규칙을 위반하지 않습니다 : P
ASCII-only

4

C 번호 ( 480 개 443 문자)

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

확장 버전 :

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

내 생각은 작업을 5 개의 수평선으로 나누고 각 문자의 왼쪽, 오른쪽 및 가운데 부분으로 나눕니다.


어쩌면 내가 잘못 복사했을 수도 있지만 이것을 아이디어로 실행하려고 시도했지만 오류가 발생했습니다. ideone.com/gQ6LH7
C0deH4cker

아마 내 잘못, 내가 보자
Rik

1
@ C0deH4cker 두 개의 별도 ReadLine으로 입력을 받았습니다. 이것은 작동합니다 : ideone.com/4jTxeu
Rik

1
@ C0deH4cker 지정된대로 입력을 가져 와서 9의 아래쪽 부분을 삭제하는 버전을 만들었습니다. 입력은 많은 문자를 취하며 9는 1이 추가됩니다.
Rik

1
이중화 ;가 있습니다 (480). 당신은 쓸 수 있습니다 Action<z,z,z,int>q=(l,m,r,n)=>{...};(470); ha 의 첫 번째 매개 변수를 만들고 내부를 char수행 할 수 ""+있습니다 h(467). 마지막으로 선언하고 재사용 할 수 있습니다 z d="134579",b="1237"(465). 그것은 내가 지금까지 만들 수있는 가장 작은 것입니다
Timwi

3

매우 짧은 솔루션이 있다고 생각하지만 이것이 코드 골프가 아니기 때문에 꽤 만족합니다!

이 PHP 스크립트는 두 개의 숫자를 취할 것입니다 a, bSTDIN에서 에코 b에, LED 형식의 a크기입니다.

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

편집 : 이전 출력 예제를 보면 숫자 사이의 공간이 a크기 만큼 커야한다고 잘못 생각했습니다 . 이것은 공간이 필요하지 않다는 OP의 선언으로 수정되었습니다.


실제로, 숫자 사이에는 공백이 없어야합니다. 샘플이 그렇게 보이는 유일한 이유는 공간이 '|' 예를 들어 8에있을 것입니다. 알아내는 데 시간이
좀 걸렸

아, 맞아! 감사합니다 :)
Vereos

2

C #을, 435 359 473 바이트

EDITS :

  • 중복 코드를 제거했습니다. 비교의 바이트 크기가 줄었습니다.
  • 입력에 표준 입력을 사용하여 독립형 응용 프로그램으로 변환되었습니다.

골프 코드는 다음과 같습니다 (줄 바꿈 및 공백 추가).

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

유효한 C # 함수입니다. 독립형 프로그램이어야한다고 언급 된 적이 없습니다. 그러나 표준을 사용하지 않습니다.
Hand-E-Food

@Timwi, 일치하도록 편집 ...
Hand-E-Food

1
잘 했어!! 좀 더 골프를 쳤고 425 (문자; UTF-8의 경우 432 바이트)로 줄어 다른 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
System네임 스페이스 에 모든 것을 넣는 다른 C # 답변의 아이디어를 사용하면 423으로
Timwi

2

C ( 561) 492 바이트)

저자는 frmar입니다. 지난주에 답을 보냈습니다 (아직 계정을 만들지 않았습니다).

492 바이트이지만 조금 더 난독 화되었습니다.

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

561 바이트를 사용하는 이전 버전 :

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

frmar의 원본 버전 (623 바이트) :

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

편집:

$ gcc -std=c99 -Wall print_as_led.c

기본 0123456789숫자를 사용하지만 크기가 다른 예 :

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

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

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

다른 예 :

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

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

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

큰 사이즈 :

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

1

Perl + FIGlet + BRA * : 54 자

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

나는 이것이 아주 쉬운 일이라고 생각했다. FIGlet 했지만,이 목적에 적합한 글꼴이없는 것으로 보입니다. 그래서 나는 몇 가지를 만들었다 :-)

터미널에서 보이는 모습은 다음과 같습니다.

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

* BRA : 명백한 규칙 남용


왜 그에 대한 공감대가 있는지 이해하지 마십시오. 글꼴이 좋은 트릭!
VisioN

나는 downvoting하지 않았지만 실제로 프로그램을 만드는 대신 프로그램사용 하는 것이 부정 행위 라는 것을 이해할 것입니다 .
Tomas

1

PERL,   261244187166   문자

약간의 비트 단위 인코딩 철학 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

공백이 추가 된 코드 :

($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은 다음과 같이 호출해야합니다 -n.

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

노트:

  • 숫자가 표시되는 방식에 대한 모든 것은 문자열로 인코딩됩니다. Gl+%<UWm7=:-) 한 문자는 한 자리에 해당하며, 인코딩은 " _ _|_| |_ |"문자열 내에서 3 개의 연속 문자의 3 ​​개 위치입니다 .
  • 숫자는 한 줄씩 3 줄로 구성됩니다. 세 줄은 각각 서브 루틴에 대한 하나의 호출에 해당합니다.c , 이는 두 번째 및 세 번째 라인에 대한 수직 줌을 수행합니다.
  • 수평 확대는 서브 루틴의 끝에서 이루어집니다 c.

sed프로그램은 확대 / 축소 할 수 없지만 훨씬 더 멋지게 보입니까? :-)

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

내 PERL 스크립트가 사용하는 아이디어와 거의 비슷하지만 PERL에서는 훨씬 더 나쁩니다. 내 sed 프로그램의 9경우 마지막 줄에 밑줄이있는 것을 선호했습니다 .


스케일링이 어떻게 작동하는지 설명 할 수 있는지 궁금합니다. Perl에서 자체 버전을 구현하려고합니다. 그러나 수직 및 수평 스케일링을 올바르게 얻을 수없는 것 같습니다.
Hunter McMillen

0

C #, 386 382 364 자 / 374 바이트 (UTF-8) 및 개선을위한 공간 (많은?) ...

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

편집 크랩 ... "스케일"부분을 놓쳤다쓰레기

내가 가면 또 다른 기회를 주겠다 ..


네, 스케일 부분이 무섭습니다.
cjfaure

0

J-147 95

필요한 스케일링 추가 :

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

주석이 달린 버전 :

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]

예:

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

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

이 질문에 어떻게 대답합니까?
Wasi

당신은 절대적으로 맞아 ... 내가 고칠

귀하의 예가 잘못되었습니다. 질문을보십시오.
Tomas

0

루비, 126 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}}

각 자릿수는 3 분의 1의 비트 맵으로 인코딩되므로 각 자릿수는 8 진수로 표시됩니다.

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

모든 숫자에 64 비트 또는 32 비트가 설정되어 있으므로 범위는 044 8 진수에서 177 8 진수입니다. 불행히도 177은 인쇄 할 수없는 DEL 문자이므로, 마법 문자열에는 필요한 비트 맵 코드 아래의 숫자 2가 포함되어 있으며 함수에 2를 다시 추가해야합니다.

테스트 프로그램에서 언 골프

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]

산출

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

0

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

이전 솔루션 :

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)}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.