แปลงตัวเลขเป็นรูปแบบการแสดงผล 7 ส่วน


28

ให้สองตัวเลข A, B พิมพ์หมายเลข B เป็นรูปแบบ LED ดิจิตอลโดยที่ A เป็นสเกล

การป้อนข้อมูล:

1 2320451640799518

ouput:

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

การป้อนข้อมูล:

2 23

ouput:

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

กฎ:

  • ใช้STDIN / STDOUTสำหรับอินพุต / เอาต์พุต

  • รหัสที่ได้คะแนนมากที่สุดจะเป็นผู้ชนะ ในกรณีที่มีการผูกรหัสที่สั้นที่สุดจะได้รับการยอมรับ

  • คำตอบที่ได้รับการโหวตมากที่สุดจะได้รับการยอมรับเมื่อ 01/02/2014 ( ตอบคำตอบนี้ด้วยคะแนนโหวตสูงสุด 12)


2
คำถามที่เกี่ยวข้องบางส่วนสำหรับการขโมยรหัส / การดลใจ: " จำลองการแสดงผล 7 ส่วน " และ " ตัวเลขและตัวอักษร LED "
Darren Stone

@ Wasi ขอบคุณ ฉันเห็นการแก้ไขของคุณซึ่งทำให้ฉันเรียบร้อยแล้ว
C0deH4cker

9 ของคุณควรมีขีดในบรรทัดสุดท้ายที่จะเป็นเหมือนตรงกันข้าม 6.
โทมัส

1
@ Tomas ขอบคุณสำหรับคำแนะนำ แต่เรามี 13 คำตอบดังนั้นจึงไม่ยุติธรรมที่จะเปลี่ยนเพิ่มเติม :-)
Wasi

ตกลง Wasi แต่ฉันหวังว่าคุณจะไม่รังเกียจที่ฉันใช้รูปร่างที่ต้องการของฉัน9ในคำตอบของฉันเพราะฉันชอบมันมากขึ้น :-)
โทมัส

คำตอบ:


20

พลเรือจัตวา 64 พื้นฐาน

กฎของPETSCII :)

รายการ

เอาท์พุท:

วิ่ง


3
เกิดอะไรขึ้นกับตัวเลข 4 oO
Timwi

นั่นเป็นวิธีที่ผมเขียนจำนวน 4 แต่ตกลงฉันคงว่า :)
Danko Durbić

2
ที่น่าสนใจ - คุณเขียนด้วยมือเช่นกัน? มันเป็นเรื่องธรรมดาในสวีเดนหรือไม่ว่าคุณจะทักทายจากที่ใด
บูธโดย

ฉันจะ 100 ถ้าฉันทำได้
Michael Kohl

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



นอกจากนี้ยังเป็น Python 2 version ที่ชั่งน้ำหนักเพียง 273 ไบต์!

ไม่ได้อัปเดตข้อมูลนี้อีกต่อไปพร้อมกับต้นฉบับต้นฉบับที่มีการตีกอล์ฟเพิ่มเติม สิ่งนี้ถูกสร้างขึ้นเมื่อแหล่งดั้งเดิมคือ 282 ไบต์ (เวอร์ชัน Python 3)

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

นี่อาจเป็นการโกงดังนั้นฉันจึงเพิ่มมันแยกต่างหาก แจ้งให้เราทราบว่าสิ่งนี้ถือว่าถูกต้องหรือไม่


6

Haskell (389 ตัวอักษร)

วิธีการแก้ปัญหาใช้ 7 อาร์เรย์หนึ่งสำหรับแต่ละส่วนของอาร์เรย์โดยใช้ชื่อจากภาพนี้:

8 ส่วนการแสดงผล

. ค่าa !! 4จะเป็นอักขระที่ควรแสดงที่ตำแหน่งสำหรับหมายเลข 4

ค่าจะถูกคูณด้วยสเกลที่เหมาะสม (การใช้rและrpสำหรับการจำลอง) และพิมพ์ออกมาในที่สุด

รหัส

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, 249 226 ตัวอักษร

สารละลาย Golfed ใน 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 ใน C"คุณไม่จำเป็นต้องรวมไว้#include <stdio.h>(เพราะมันจะคอมไพล์โดยไม่มีมัน) คุณยังสามารถใส่หนึ่ง int ในmain()เช่นการmain(x)โกน 1 ไบต์ - แม้ว่ามันจะไม่ถูกต้อง ลายเซ็นและใส่scanfข้างในfor: for(scanf("%d %98s", &s, &i); …)โกนอีกหนึ่ง - มีลักษณะที่นี่
Runium

@Sukminder คำแนะนำเหล่านี้มีประโยชน์มากขอบคุณ! ฉันออก#include, ย้ายscanfที่อยู่ภายในforออกไม่จำเป็น&ใน&iและใส่intตัวแปรในขอบเขตทั่วโลกที่จะใช้ประโยชน์แบบคงที่ 0 เริ่มต้น รหัสควรเป็น C89 ที่ถูกกฎหมาย แต่ฉันไม่ได้ตรวจสอบอย่างละเอียด ฉันเชื่อว่าการใส่intเข้าไปmainนั้นไม่ถูกกฎหมายดังนั้นฉันจึงทิ้งมันไว้
reima

การยอมแพ้การปฏิบัติตามมาตรฐานสามารถช่วยได้มาก ตัวอย่างเช่นคุณสามารถละเว้นintตัวแปรส่วนกลางได้ นอกจากนี้ยัง%98sสามารถ%s(สำหรับสตริงที่คุณล้มเหลวอีกต่อไปแล้วมันมีความสำคัญในทางใดบ้าง)
ugoren

ดี! ฉันใช้ปรัชญาที่คล้ายกัน "ชนิด" แต่เรียบง่าย - 187 chars ใน PERL
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}

คำอธิบายอย่างรวดเร็ว:

ฉันก่อนประกาศสตริงที่เป็นตัวแทนในการเปิดและปิดตัวเลขสำหรับแถบแนวนอนและแนวตั้ง
จากนั้นฉันก็อ่านมาตราส่วนและตัวเลข
จากนั้นฉันประกาศอาร์เรย์ที่มีขนาดที่จำเป็นเพื่อจัดเก็บเส้นที่เพียงพอสำหรับมาตราส่วนที่กำหนด สตริงที่แปลกประหลาดจริง ๆ แล้วคือการแม็พค่า 7 บิตซึ่งเป็น LED ที่จะเปิดสำหรับแต่ละหลัก
ถัดไปสำหรับแต่ละหลักฉันเติมอาร์เรย์เอาต์พุตจากบนลงล่างโดยคำนึงถึงการปรับสเกลแนวนอน
ลูปสุดท้ายคือการเติมแถวที่มีแถบแนวตั้งเท่านั้นซึ่งสามารถสร้างได้จากแถวกลางและแถวล่างโดยการลบแถบแนวนอนออก
ในที่สุดฉันจะพิมพ์อาร์เรย์ผลลัพธ์!


คุณช่วยอธิบายสิ่งที่เกิดขึ้นที่นี่ได้ไหม?
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])]))

Fyi ตัวเลขบนสุดควรเป็น '_' (ขีดล่าง) และไม่มีช่องว่างระหว่างตัวเลข ฉันสับสนในตอนแรกฮ่าฮ่า
C0deH4cker

5

(แก้ไข: ตอนนี้วิธีนี้ไม่ถูกต้องเนื่องจากความหมายของคำสั่งเปลี่ยนไปฉันไม่ได้ตระหนักว่าฉันได้ใช้คำสั่งไปแล้วเมื่อฉันเปลี่ยนมันอย่างไรก็ตามคุณสามารถแก้ไขโปรแกรม ths ได้โดยเพียงแค่เปลี่ยนเป็น คำแนะนำที่ใหม่กว่า)

Sclipting - 85 ตัวอักษร

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

การป้อนข้อมูล:

1 1024856359701

เอาท์พุท:

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

การป้อนข้อมูล:

2 47474747

เอาท์พุท:

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


คุณสามารถแก้ไขโปรแกรมได้หรือไม่ ออกจากการโพสต์จังหวะทั้งหมดออกมาน่าเกลียดมาก
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

ฉันสามารถของหลักสูตรเปลี่ยนไปแต่ที่จะทำให้รายการนี้โกงเพราะถูกคิดค้นหลังจากที่ท้าทายนี้ถูกโพสต์
Timwi

ฉันไม่คิดว่ามันเป็นปัญหามากนัก ฉันไม่ได้ทำให้โปรแกรมของคุณสั้นลง
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1
ไม่ แต่จะเป็นการละเมิดกฎสำคัญของชุมชนนี้
Timwi

ไม่ละเมิดกฎอีกต่อไป: 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

อาจเป็นความผิดของฉันให้ฉันดู
Rik

1
@ C0deH4cker ฉันรับอินพุตในสองบรรทัดแยกกัน อันนี้ใช้งานได้: 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, bจาก STDIN และสะท้อน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

โอ้คุณพูดถูก! ขอบคุณ :)
Vereos

2

C #, 435 359 473 ไบต์

การแก้ไข:

  • ลบรหัสซ้ำซ้อน ลดขนาดไบต์เปรียบเทียบ
  • แปลงเป็นแอปพลิเคชันแบบสแตนด์อโลนโดยใช้มาตรฐานในสำหรับอินพุต

นี่คือรหัส golfed (ด้วยการเพิ่มตัวแบ่งบรรทัดและช่องว่าง):

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 (ตัวอักษร; 432 ไบต์ใน UTF-8) ทำให้สั้นกว่าคำตอบ 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
การใช้ความคิดของ C # คำตอบอื่น ๆ ในการวางทุกอย่างในSystemเนมสเปซจะลดลงเหลือ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: การละเมิดกฎที่โจ่งแจ้ง


อย่าเข้าใจว่าทำไมถึงมี downvote สำหรับเรื่องนั้น เคล็ดลับดีกับแบบอักษร!
VisioN

ฉันไม่ได้ downvoting แต่ผมจะเข้าใจว่าการใช้โปรแกรมแทนจริงทำให้โปรแกรมโกง
โทมัส

1

PERL,   261 244 187   166 ตัวอักษร

ปรัชญาการเข้ารหัสบิตบิตกฎ 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 บรรทัดทีละบรรทัด แต่ละบรรทัด 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ซึ่งมีขีดล่างในบรรทัดสุดท้ายจะกลับเป็นเหมือน 6


ฉันสงสัยว่าคุณสามารถอธิบายวิธีการปรับขนาดได้หรือไม่ฉันกำลังพยายามใช้เวอร์ชันของฉันเองใน 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

คุณพูดถูก ... ฉันจะแก้ไขมัน
jpjacobs

ตัวอย่างของคุณไม่ถูกต้อง ดูคำถาม
โทมัส

0

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

แต่ละหลักจะถูกเข้ารหัสเป็นบิตแมปในหน่วยที่สามดังนั้นโดยแต่ละส่วนจะแทนด้วยเลขฐานแปด

|_| 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 ฐานแปดถึง 177 ฐานแปด น่าเสียดายที่ 177 เป็นอักขระ DEL ที่ไม่สามารถพิมพ์ได้ดังนั้นสายเวทย์จึงมีหมายเลข 2 ด้านล่างรหัสบิตแมปที่ต้องการและเราต้องเพิ่ม 2 กลับเข้าไปในฟังก์ชั่น

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]

เอาท์พุต

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.