Перетворіть номер у 7-сегментну схему відображення


28

Дано два довільні числа A, B. Друкуйте номер B як цифровий світлодіодний візерунок, де A - масштаб.

вхід:

1 2320451640799518

вихід:

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

вхід:

2 23

вихід:

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

Правила:

  • Використовуйте STDIN / STDOUT для введення / виводу

  • Код з найбільшою кількістю виграшів. У разі краватки буде прийнято найкоротший код

  • Відповідь, що найбільше проголосувала, буде прийнята 02.02.2014 (Прийнято цю відповідь найвищим рівнем 12 голосів)


2
Деякі пов'язані запитання щодо крадіжки коду / натхнення: " Емуляція 7-сегментного дисплея " та " Світлодіодні цифри та літери ".
Даррен Стоун

@Wasi Дякую Я бачив твою редакцію, яка очистила її для мене.
C0deH4cker

У вашому 9 має бути підкреслення в останньому рядку, щоб бути схожим на перевернутий 6.
Томаш

1
@Tomas Дякую за пропозицію. Але у нас вже є 13 відповідей, тому було б несправедливіше змінити його далі :-)
Wasi

Гаразд Васі, але я сподіваюся, ви не заперечуєте, що я використовував свою перевагу 9у своїй відповіді , як це мені більше подобається :-)
Томаш

Відповіді:



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



Крім того, ось версія Python 2 вагою всього 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 символів

Рішення для гольфу на 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
З того, що я читав на цій сторінці про те, що є "ОК в С", вам не потрібно включати #include <stdio.h>(як це складеться без нього.) Ви також можете помістити один інт main(), наприклад main(x), відголити 1 байт - хоча це не вірно підпис і ставити scanfвсередину for: for(scanf("%d %98s", &s, &i); …)гоління ще одного. - Погляньте сюди .
Руніум

@Sukminder Це дуже корисні підказки, дякую! Я видалив #include, перемістив scanfвсередині for, видалені непотрібні &ін &i, і помістити intзмінні в глобальній області для використання ініціалізації статичного 0. Код тепер повинен бути легальним C89, але я не ретельно перевіряв. Я вважаю , поклавши один intв mainце не законно, так що я залишив це.
reima

Дотримання стандартних норм може допомогти чимало. Наприклад, ви можете опустити intглобальні змінні. Також %98sможе бути %s(для довших рядків ви все одно не вдається, чи важливо, яким чином?)
ugoren

Добре! Я використав "подібну" подібну філософію, але простіше - 187 символів у PERL
Томаш,

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-бітових значень, що представляють, які світлодіоди слід увімкнути для кожної цифри.
Далі для кожної цифри я заповнюю вихідний масив зверху вниз з урахуванням горизонтального масштабування.
Остаточний цикл - це заповнення рядків, у яких є лише вертикальні смуги, які можна просто генерувати з середнього та нижнього рядків, видаляючи горизонтальні смуги.
Нарешті, я друкую вихідний масив!


Чи можете ви пояснити, що тут відбувається?
Майкл Стерн

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

(Редагувати: Це рішення зараз недійсне, оскільки семантика інструкції змінилася. Я не усвідомлював, що я вже скористався інструкцією, коли змінив її. Однак ви можете виправити цю програму, просто змінивши її на новіша інструкція .)

Сліптінг - 85 символів

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

Вхід:

1 1024856359701

Вихід:

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

Вхід:

2 47474747

Вихід:

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


Чи можете ви виправити програму? Залишати весь пост обрисом досить потворно.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Я, звичайно, міг би змінити на , але це зробило б цей підступ обманом, оскільки він був винайдений після публікації цього виклику.
Тімві

Я не думаю, що це велика проблема. Я все одно не роблю вашої програми.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1
Ні, але це порушило б важливе правило цієї громади.
Тімві

Більше не порушує правило: 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

Мабуть, моя вина, дозвольте мені побачити
Рік

1
@ C0deH4cker Я взяв дані у двох окремих ReadLines. Цей працює: ideone.com/4jTxeu
Рік

1
@ C0deH4cker Я зробив версію, яка приймає введення, як зазначено, і опускає нижню частину 9. Вхід займає стільки символів, 9 коштує 1 додатковий.
Рік

1
У вас ;там зайве (480); можна написати Action<z,z,z,int>q=(l,m,r,n)=>{...};(470); ви можете зробити перший параметр ha charі зробити ""+всередині h(467); і нарешті, ви можете декларувати та повторно використовувати z d="134579",b="1237"(465). Це найменший, що я міг зробити це поки що
Тімві

3

Я думаю, є дуже короткі рішення, але оскільки це не код-гольф, я цілком задоволений!

Цей сценарій PHP буде мати два числа a- bвід STDIN та відлуння bу світлодіодному форматі 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 />";
    }
}

EDIT: Переглядаючи попередній приклад виводу, я помилково вважав, що проміжок між цифрами повинен бути таким же величиною, як і aрозмір. Це було зафіксовано декларацією ОП про те, що місця не потрібно.


Насправді між цифрами не повинно бути пробілів. Єдиною причиною, яка виглядає таким чином для вибірки, є пробіли, де знаки '|' буде на 8 наприклад.
Знадобився

О, ти маєш рацію! Дякую :)
Vereos

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

@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(' '));}}
Тімві

1
Використовуючи іншу відповідь C # про те, щоб все розмістити в Systemпросторі імен, це зменшиться до 423
Тімві

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, але я розумію , що з допомогою в програму замість того , щоб на самому ділі робить програма обману.
Томаш

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. Але здається, що вертикальне та горизонтальне масштабування не може бути правильним.
Мисливець Макміллен

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

EDIT Crack ... Я пропустив "масштабну" частинуCRAP

Я дам йому ще один вистріл, якщо обійдусь до нього ..


Так, масштабна частина робить це страшно.
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
     --  -- 
|      |   |
|      |   |
     --  -- 
|   |      |
|   |      |
     --  -- 

Як це відповідає на питання?
Васі

Ви абсолютно праві ... я це
виправлю

Ваш приклад невірний. Подивіться на запитання.
Томаш

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

Кожна цифра кодується у вигляді бітової карти в третинах, при цьому кожна третя представлена ​​восьмигральною цифрою.

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

Перл 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)}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.