数字を7セグメント表示パターンに変換する


28

任意の2つの数値A、Bが与えられます。AがスケールであるデジタルLEDパターンとして番号Bを印刷します。

入力:

1 2320451640799518

出力:

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

入力:

2 23

出力:

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

ルール:

  • 入出力にSTDIN / STDOUTを使用します

  • ほとんどのアップ投票でコードが勝ちます。タイの場合、最短のコードが受け入れられます

  • 最も多く投票された回答は2014 年1月2日に受け付けられます(最高12票でこの回答を受け付けました)


2
コードの盗難/インスピレーションに関するいくつかの関連する質問:「7セグメントディスプレイのエミュレート」と「LED番号と文字」。
ダレンストーン14年

@Wasiありがとう。私がそれをクリアしたあなたの編集を見ました。
C0deH4cker 14年

あなたの9は逆6.ようになり、最後の行にアンダースコアを持たなければならない
トマス

1
@Tomas提案をありがとう。しかし、私たちはすでに13の答えを持っているので、それをさらに変更することは不公平です:
ワシ14年

OK Wasiのが、私は私のれる好ましい形状を使用することをあなたが気にしないことを望む9私の答えのようなIとして、それより:-)
トマス

回答:


20

Commodore 64 BASIC

PETSCIIアートルール:)

リスト

出力:

走る


3
数字4はどうなりましたか?オブジェクト指向
Timwi

それが私が4番を書く方法ですが、OK、私はそれを修正しました:)
DankoDurbić14年

2
魅力的です-あなたもそれを手で書いていますか?それはスウェーデンでは一般的ですか、それとも元々どこから来たのですか?
ブースビー14年

できれば+100にします。
マイケルコール14年

12

Pythonの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

Haskell(389文字)

ソリューションでは、このイメージの名前を使用して、配列の各セグメントに1つずつ、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内部forfor(scanf("%d %98s", &s, &i); …)より多くの1のシェービング。– こちらをご覧ください
ルニウム14年

@Sukminderこれらは非常に役立つヒントです、ありがとう!を削除し#includescanf内部を移動しfor、不要な&inを削除し&iint変数をグローバルスコープに入れて静的0初期化を活用しました。コード今でもC89として合法であるはずです、徹底的にチェックしませんでした。私はそれを入れることは合法intmainはないと思うので、私はそれを省いた。
レイマ14年

標準準拠を放棄することは大いに役立ちます。たとえばint、グローバル変数の場合は省略できます。また、%98s可能性があります%s(とにかく長い文字列の場合、どのように問題になりますか?)
ugoren 14年

良い!-私は同様の哲学「のようなもの」が、単純に使用PERLで187の文字
トマス

5

Ruby 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をオンにするLEDを表す7ビット値のマッピングです。
次に、各桁について、水平方向のスケーリングを考慮して、出力配列を上から下に埋めていきます。
最後のループは、垂直バーのみを持つ行を埋めることです。これは、水平バーを削除することにより、中央と下の行から生成できます。
最後に、出力配列を出力します!


ここで何が起こっているのか説明できますか?
マイケル・スターン

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

Fyi、数字の先頭は '_'(アンダースコア)であり、数字の間にスペースはありません。最初の
ハハ

5

(編集:命令のセマンティクスが変更されたため、このソリューションは無効になりました。変更したときに命令をすでに使用していることに気づきませんでした。ただし、単にプログラムを変更するだけでプログラムを修正できます。新しい命令。)

スクリプティング — 85文字

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

入力:

1 1024856359701

出力:

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

入力:

2 47474747

出力:

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


プログラムを修正できますか?ポストストローク全体を除外するのは非常に面倒です。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 14年

もちろんtoを変更することもできますが、このチャレンジが投稿された後に発明されたため、このエントリは不正になります。
ティムウィ14年

それほど問題ではないと思います。とにかくあなたのプログラムを短くしません。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 14年

1
いいえ。ただし、このコミュニティの重要なルールに違反します。
ティムウィ14年

ルールに違反しなくなりました:P
ASCIIのみ

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で実行しようとするとエラーが発生しました。ideone.com/gQ6LH7
C0deH4cker

おそらく私のせい、私を見てみましょう
リック14年

1
@ C0deH4cker入力を2つの別々のReadLineで受け取りました。これは動作します:ideone.com/4jTxeu
リック

1
@ C0deH4cker指定されたとおりに入力を取得し、9の下部を削除するバージョンを作成しました。入力には多くの文字が必要で、9の追加費用は1つです。
リック14年

1
;そこに冗長性があります(480)。書くことができますAction<z,z,z,int>q=(l,m,r,n)=>{...};(470); ha の最初のパラメーターを作成charし、""+内部を実行できますh(467)。最後に、宣言して再利用できますz d="134579",b="1237"(465)。それは私がこれまでに作ることができる最小です
Timwi 14年

3

非常に短い解決策があると思いますが、これはコードゴルフではないので、私は非常に満足しています!

このPHPスクリプトは、2つの数値を取るabSTDINやエコーから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になります。把握するために私にしばらく時間がかかった
C0deH4cker

ああ、あなたは正しいです!ありがとう:)
ヴェレオス14年

2

C#、435 359 473バイト

編集:

  • 冗長コードを削除しました。比較のバイトサイズの削減。
  • 入力に標準入力を使用してスタンドアロンアプリケーションに変換されます。

これがゴルフのコードです(改行と空白が追加されています):

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 14年

合致するように編集@Timwi、...
手-E-食品

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(' '));}}
ティムウィ14年

1
System名前空間にすべてを入れるという他のC#の答えのアイデアを使用すると、423になります
Timwi 14年

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 14年

私はダウン投票していませんでしたが、実際にプログラムを作成する代わりにプログラム使用することは不正行為であること理解するでしょう。
トマス14年

1

PERL、  261の244 187   166文字

ビット単位のエンコードの哲学のルールの少し:-)

($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=:-) 1文字は1桁に対応し、エンコードされるのは" _ _|_| |_ |"文字列内の3つの連続した文字の3つの位置です。
  • 番号は、行ごとに3行で構成されます。3行のそれぞれは、subroutineの1回の呼び出しに対応しc、2行目と3行目の垂直方向のズームも実行します。
  • サブルーチンの終わりに水平ズームが行われ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で自分のバージョンを実装しようとしています。しかし、垂直および水平のスケーリングを適切に行うことはできないようです。
ハンターマクミレン14

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 14年

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

これは質問にどのように答えますか?
ワシ14年

あなたは絶対的に正しいです...私はそれを修正します
jpjacobs

あなたの例は間違っています。質問を見てください。
トマス

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のビットマップとしてエンコードされ、各3桁は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ビットのいずれかが設定されているため、範囲は8進数で044から177までです。残念ながら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

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

以前のソリューション:

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.