Sayıyı 7 segmentli ekran modeline dönüştür


28

Verilen iki rasgele sayı A, B. B sayısını A olan bir Dijital LED Deseni olarak yazdırın.

giriş:

1 2320451640799518

çıkışına:

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

giriş:

2 23

çıkışına:

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

Kurallar:

  • Giriş / çıkış için STDIN / STDOUT kullanın

  • Çoğu oy kullanan kod kazanır. Kravat durumunda, en kısa kod kabul edilecektir.

  • En çok oylanan Cevap 01.02.2014 tarihinde kabul edilecektir ( Bu cevabı en yüksek 12 oyla kabul etti)


2
Kod çalma / ilham için bazı ilgili sorular: " 7 segmentli bir ekranı taklit edin " ve " LED Sayıları ve Harfleri ".
Darren Stone,

@Wasi Teşekkürler. Düzenlemeni gördüm, benim için temizledi.
C0deH4cker

9’unuz son satırda alt çizgiye sahip olmalı, tersine çevrilmiş 6.
Tomas

1
@Tomas Öneri için teşekkürler. Ancak, zaten 13 cevabımız var bu yüzden daha fazla değiştirmek haksızlık olacak :-)
Wasi

Tamam Wasi ama benim tercih şeklini kullandığını sakıncası yoktur umarım 9içinde benim cevap gibi gibi daha :-)
Tomas

Yanıtlar:



12

Python 3, 286 282 280

Evet, bunu golf oynadım. Güzel meydan okuma!

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



Ayrıca, burada sadece 273 byte ağırlığında bir Python 2 sürümü var!

Daha fazla golf oyunu olan orijinal kaynak ile bunu daha fazla güncellememek. Bu, orijinal kaynak 282 bayt olduğunda yaratıldı (Python 3 sürümü).

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

Bu aldatma olabilir, bu yüzden ayrı olarak ekliyorum. Bunun geçerli olup olmadığını bana bildirin.


6

Haskell (389 karakter)

Çözüm, bu görüntüdeki adları kullanarak, dizinin her bölümü için bir tane olan 7 diziyi kullanır:

8 segmentli ekran

. Değer a !! 4, 4 sayısı için bir konumda gösterilmesi gereken karakter olacaktır.

Değerler, uygun olduğunda ölçek ile çarpılır ( çoğaltma için rve kullanarak rp) ve son olarak yazdırılır.

Kod

a="_ __ _____"
b="|||||  |||"
c="|| |||||||"
d="_ __ __ _ "
e="| |   | | "
f="|   ||| ||"
g="  _____ __"
r=replicate
cm=concatMap
s=(' ':).(++" ")
dd w n=[[t n],rp$m f b n,[o g f b n],rp$m e c n,[o d e c n]] where
 rp=r$w-1
 t=cm(s.r w.(a!!))
 q f s x y=cm(\n->x!!n:r w(f s n)++[y!!n])
 o=q(!!) 
 m=q const ' '
go a=unlines$concat$dd(read$a!!0)$map(read.(:[]))$a!!1
main=interact$go.words

Örnek kullanım

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

6

C, 249 226 karakter

C de golf oynama çözümü:

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

Eklenen boşluk ile:

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

Notlar:

  • En fazla 99 hane basılır
  • Girdi iyi şekillenmediyse davranış belirsizdir (örneğin, rakamsızlar veya ölçek <1 ise)
  • C89 kodunun yasal olması gerekir

Kimsenin umrunda olursa olsun, nasıl çalıştığını açıklayacağım.


1
Gönderen ben ne olduğuna bu sayfayı etrafında okuduklarım "C Tamam" dahil etmek gerekmez #include <stdio.h>(onsuz derlemek olacak gibi.) 'De yapabilirsiniz ayrıca koymak bir int main()örneğin main(x)1 byte kapalı, tıraş - bu geçerli değil gerçi imza ve scanfiçeri koymak for: for(scanf("%d %98s", &s, &i); …)bir tane daha tıraş. - göz buraya .
Runium

@Sukminder Bunlar çok yardımcı ipuçları, teşekkürler! Ben kaldırıldı #includetaşındı scanfiçeride for, gereksiz kaldırıldı &in &ive koyun intstatik 0 başlatma yararlanmaya küresel kapsamda değişkenleri. Kod şimdi hala yasal olmalı C89, ama tam olarak kontrol etmedim. Ben bir tane koyarak inanıyoruz intiçinde mainO out sol yüzden, yasal değildir.
reima

Standartlara uymak çok yardımcı olabilir. Örneğin, intglobal değişkenleri ihmal edebilirsiniz . Ayrıca %98solabilir %s(yine başarısız uzun dizeleri ne şekilde olursa olsun bunu yapar?)
ugoren

İyi! "Benzer" bir felsefe kullandım, ama daha basit - PERL'de 187 karakter
Tomas

5

Yakut 2.0

Hızlı ve (öyle değil) saf yakut uygulaması.

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}

Hızlı açıklama:

İlk önce yatay ve dikey çubuklar için açık ve kapalı basamakları temsil eden dizeleri bildiririm.
Sonra ölçeği ve rakamları okudum.
Daha sonra verilen ölçek için yeterli sayıda satırı saklamak için gerekli büyüklükte bir dizi bildiririm. Tuhaf dize aslında her bir basamak için hangi LED'lerin açılacağını temsil eden 7 bitlik değerlerin bir haritasıdır.
Sonra, her basamak için, çıktı dizisini yukarıdan aşağıya doğru doldurdum, yatay ölçeklemeyi hesaba katarak.
Son döngü, yalnızca dikey çubuklara sahip satırları doldurmaktır; bunlar yatay çubuklar kaldırılarak orta ve alt sıralardan oluşturulabilir.
Sonunda çıktı dizisini basıyorum!


Burada neler olduğunu açıklayabilir misin?
Michael Stern,

5

Python 2.6 ile ithalat yapılmaz. Bu çözümün cazibesinin şablon kullanımı olduğunu söyleyebilirim. Ne yazık ki sanırım bu yüzden onu sıkıştırmakta zorlandım.

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)

Ve biraz daha kısa (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])]))

Bilginize, rakamların tepesinde '_' (alt çizgi) olduğu ve rakamlar arasında boşluk olmadığı varsayılır. İlk
haha'da

5

(Düzenleme: Bu çözüm artık geçersiz çünkü komutun semantiği değişti. Değiştirdiğimde talimatı zaten kullandığımı fark etmemiştim. Ancak, bu programı değiştirerek düzeltebilirsiniz. yeni talimat .)

Sclipting - 85 karakter

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

Giriş:

1 1024856359701

Çıktı:

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

Giriş:

2 47474747

Çıktı:

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


Programı düzeltebilir misin? Tüm vuruşları dışarıda bırakmak oldukça çirkindir.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Ben tabii ki değişebilir ait etmek , ancak çünkü bu girişin hile yapacak bu meydan okuma yayınlanmıştır sonra icat edilmiştir.
Timwi

Bunun çok fazla bir sorun olduğunu sanmıyorum. Programını zaten kısaltmıyorum.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1
Hayır, ama bu topluluğun önemli bir kuralını ihlal eder.
Timwi

Artık bir kuralı ihlal etmiyor: P
ASCII, yalnızca

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

Genişletilmiş versiyon:

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

Benim fikrim görevi sırayla her karakter için sol, sağ ve orta kısımda bölünmüş olan 5 yatay çizgiye bölmekti.


Belki yanlış kopyaladım, ancak bunu ideone üzerinde çalıştırmayı denedim ve bir hata oluştu. ideone.com/gQ6LH7
C0deH4cker

Muhtemelen benim hatam, görmeme izin ver
Rik

1
@ C0deH4cker Girişi iki ayrı ReadLines içinde aldım. Bu bir çalışır: ideone.com/4jTxeu
Rik

1
@ C0deH4cker Girdiyi belirtildigi gibi alan ve 9'un alt tarafini düşüren bir sürüm yaptim. Girdi kadar fazla karakter alır, 9 maliyeti 1 fazladır.
Rik

1
;Orada bir fazlalığınız var (480); yazabilirsiniz Action<z,z,z,int>q=(l,m,r,n)=>{...};(470); Eğer ilk parametreyi yapabilir hbir charve yapılacak ""+içini h(467); ve son olarak, ilan edebilir ve yeniden kullanabilirsiniz z d="134579",b="1237"(465). Bu şu ana kadar başarabileceğim en küçük
şeydi

3

Sanırım çok daha kısa çözümler var, ancak bu kod golf olmadığından oldukça memnunum!

Bu PHP komut dosyası iki sayıyı alacak a, bSTDIN'den ve yankı ben LED formatında aboyutu.

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: Önceki çıktı örneğine baktığımda, yanlış rakamlar arasındaki boşluğun aboyut kadar büyük olması gerektiğini düşündüm . Bu, OP'nin hiçbir yere ihtiyaç duyulmadığının beyanı ile düzeltildi.


Aslında, rakamlar arasında boşluk olmamalıdır. Örneklemin bu şekilde görünmesinin tek nedeni boşlukların '|' örneğin bir 8 olurdu.
Anlamak

Oh, haklısın! Teşekkür ederim :)
Vereos

2

C #, 435 359 473 bayt

DÜZENLEMELER:

  • Artık kod kaldırıldı. Azalan bayt boyutu karşılaştırmaları.
  • Giriş için standart kullanarak tek başına bir uygulamaya dönüştürülür.

İşte golf kodu (eklenen satır sonları ve boşluk ile):

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

Geçerli C # işlevleridir. Bağımsız bir program olması gerektiği asla söylenmedi. Ancak, standart olarak kullanmaz.
El-E-Yiyecek

@Timwi, uyumlu olacak şekilde düzenlendi ...
El-E-Yemek

1
Aferin!! Biraz daha bunu golfed ettik ve ben bunu indim 425 (karakterler; UTF-8 432 bayt) diğer C # cevabı olmadığı kadar kısa yapım. 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
Diğer C # cevabının her şeyi Systemisim alanına koyma fikrini kullanmak 423'e
düşüyor

2

C ( 561 492 bayt)

Yazar frmar. Bana geçen hafta cevabını gönderdi (henüz hesabını oluşturmadı).

492 bayt ama biraz daha karışık.

#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 bayt kullanan önceki sürüm:

#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'dan (623 bayt) orijinal sürüm:

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

Derleme:

$ gcc -std=c99 -Wall print_as_led.c

Varsayılan 0123456789numarayı ancak farklı boyutları kullanan örnekler :

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

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

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

Diğer örnekler:

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

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

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

Daha büyük boyutlar:

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

1

Perl + FIGlet + BRA * : 54 karakter

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

Bunun FIGlet ile yapması oldukça kolay olacağını düşündüm , ancak bu amaç için uygun herhangi bir font bulunmadığı ortaya çıktı. Bu yüzden biraz :-) yaptım

İşte terminalde nasıl göründüğü:

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

* BRA: açık kural kötüye kullanımı


Neden bunun için bir aşağılık olduğunu anlamıyorum. Yazı tipleri ile güzel hile!
Vision

Ben downvoting değildi, ama o anlayacak kullanarak bir programı aslında yerine yapım programı hile.
Tomas

1

PERL,   261 244 187   166 karakter

Biraz bitsel kodlama felsefesi kuralı :-)

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

Boşluk eklenmiş kod:

($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 ile çağrılmak zorundadır -n:

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

Notlar:

  • Rakamların nasıl görüntülendiğiyle ilgili her şey dizgede kodlanır Gl+%<UWm7=:-) Bir karakter bir basamağa karşılık gelir, kodlanmış " _ _|_| |_ |"dizgede 3 ardışık karakter olan 3 konumdur .
  • Sayılar 3 satır, satır satır inşa edilmiştir. 3 hattın her biri, cikinci ve üçüncü satırlar için dikey yakınlaştırma yapan bir alt rutin çağrısına karşılık gelir .
  • Yatay rutin alt rutinin sonunda yapılır c.

Benim sedprogramı zum yapamaz, ama buna, çok daha güzel görünüyor değil mi? :-)

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 betiğimin kullandığı fikir hemen hemen aynı, ancak PERL'de çok daha çirkin. Sed programımda 9son satırda alt çizgiyi vurgulamayı tercih ettim , tersine çevrilmiş 6 gibi.


Ölçeklemenin nasıl çalıştığını açıklayabilir misiniz merak ediyorum, kendi versiyonumu Perl'de uygulamaya çalışıyorum. Ancak dikey ve yatay ölçeklemeyi doğru yapamıyorum.
Hunter McMillen

0

C #, 386 382 364 karakter / 374 bayt (UTF-8) ve iyileştirme için (çok?) Oda ...

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 ... "ölçek" bölümünü kaçırdımBOK

Etrafımda dolaşırsam başka bir atış daha yapacağım ..


Evet, ölçek kısmı onu korkutuyor.
cjfaure,

0

J - 147 95 karakter

Gerekli ölçeklendirme eklendi:

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

Açıklamalı sürüm:

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]

Örnek:

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

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

Bu soruya nasıl cevap veriyor?
Wasi

Kesinlikle haklısın ... Ben düzelteceğim
jpjacobs

Örneğin yanlış. Soruyu izleyin.
Tomas

0

Ruby, 126 ASCII karakter

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

Her hane üçte bir bitmap olarak kodlanır, böylece her üçte bir sekizli hane ile gösterilir.

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

Tüm basamaklar 64 bit veya 32 bit ayarına sahip olduğundan, aralık 044 sekizlik ila 177 sekizlik arasındadır. Ne yazık ki 177, yazdırılamayan DEL karakteridir, bu nedenle sihirli dize, gerekli bitmap kodunun altındaki 2 sayılarını içerir ve işlevde tekrar 2 eklememiz gerekir.

Test programında Ungolfed

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]

Çıktı

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

Önceki çözümler:

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)}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.