Преобразование числа в 7-сегментный шаблон отображения


28

Даны два произвольных числа A, B. Напечатайте число B как Цифровой светодиодный образец, где A - масштаб.

вход:

1 2320451640799518

Ouput:

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

вход:

2 23

Ouput:

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

Правила:

  • Используйте STDIN / STDOUT для ввода / вывода

  • Код с большинством голосов "за" выигрывает. В случае Tie будет принят самый короткий код

  • Ответ, получивший наибольшее количество голосов, будет принят 01/02/2014 (принят этот ответ с наибольшим количеством голосов 12)


2
Некоторые связанные вопросы для кражи кода / вдохновения: « Эмулируйте 7-сегментный дисплей » и « Цифры и буквы светодиодов ».
Даррен Стоун

@ Васи Спасибо. Я видел ваши изменения, которые прояснили для меня.
C0deH4cker,

Ваши 9 должны иметь подчеркивание в последней строке, чтобы быть похожим на перевернутый 6.
Томас

1
@ Томас Спасибо за предложение. Но у нас уже есть 13 ответов, поэтому будет несправедливо менять их дальше :-)
Васи

Хорошо, Васи, но я надеюсь, что вы не возражаете, что я использовал мою предпочтительную форму 9в своем ответе , так как мне это нравится больше :-)
Томас

Ответы:


20

Коммодор 64 Бейсик

ПЕТСКИИ по искусству правила :)

СПИСОК

Выход:

БЕГ


3
Что случилось с цифрой 4? oO
Тимви

Вот как я пишу номер 4, но хорошо, я исправил это :)
Данко Дурбич

2
Захватывающе - ты тоже так пишешь от руки? Это распространено в Швеции или откуда вы родом?
Boothby

Я бы +100, если бы мог.
Майкл Коля

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); …)бритье еще одного. - Посмотрите здесь .
Runium

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

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

Хорошо! Я использовал «своего рода» похожую философию, но проще - 187 символов в PERL
Томас

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}

Быстрое объяснение:

Сначала я объявляю строки, представляющие цифры включения и выключения для горизонтальных и вертикальных полос.
Затем я читаю шкалу и цифры.
Затем я объявляю массив необходимого размера, чтобы хранить достаточно строк для данного масштаба. Странная строка на самом деле является отображением 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])]))

К вашему сведению, верхняя часть цифр должна быть '_' (подчеркивание) и без пробелов между цифрами. Сначала я запутался, ха-ха
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); вы можете сделать первый параметр и сделать внутреннюю (467); и, наконец, вы можете объявить и повторно использовать (465). Это самое маленькое, что я мог сделать до сих порhchar""+hz d="134579",b="1237"
Тимви

3

Я думаю, что есть очень короткие решения, но так как это не код-гольф, я вполне доволен!

Этот скрипт PHP будет принимать два числа a, bот STDIN и echo bв формате LED, в aразмере.

fscanf(STDIN, "%d %d", $a, $b); //Didn't test this line, but it should be ok.
$space=str_repeat("&nbsp;", $a);

$top = $topLeft = $topRight = $mid = $botLeft = $botRight = $bot = array();
for ($i=0; $i<count($b); $i++) {
    $top[$i] = $topLeft[$i] = $topRight[$i] = $mid[$i] = $botLeft[$i] = $botRight[$i] = $bot[$i] = true;
switch ($b[$i]) {
    case 0:
        $mid[$i] = false;
    break;
    case 1:
        $top[$i] = $topLeft[$i] = $mid[$i] = $botLeft[$i] = $bot[$i] = false;
        break;
    case 2:
        $topLeft[$i] = $botRight[$i] = false;
        break;
    case 3:
        $topLeft[$i] = $botLeft[$i] = false;
        break;
    case 4:
        $top[$i] = $botLeft[$i] = $bot[$i] = false;
        break;
    case 5:
        $topRight[$i] = $botLeft[$i] = false;
        break;
    case 6:
        $topRight[$i] = false;
        break;
    case 7:
        $topLeft[$i] = $mid[$i] = $botLeft[$i] = $bot[$i] = false;
        break;
    case 9:
        $botLeft[$i] = false;
        break;
    }
}

horizontal($top);
vertical($topLeft, $topRight);
horizontal($mid);
vertical($botLeft, $botRight);
horizontal($bot);

function horizontal($position) {
    global $a, $b, $space;
    for ($i=0;$i<count($b);$i++) {
        if ($position[$i])
            echo "&nbsp;".str_repeat("-", $a)."&nbsp;";
        else
            echo "&nbsp;".$space."&nbsp;";
    }
    echo "<br />";
}

function vertical($positionLeft, $positionRight) {
    global $a, $b, $space;
    for ($j=0;$j<$a;$j++) {
        for ($i=0;$i<count($b);$i++) {
            if ($positionLeft[$i]) {
                echo "|".$space;
                if ($positionRight[$i])
                    echo "|;";
                else
                    echo "&nbsp;";
            }
            else {
                echo "&nbsp;".$space;
                if ($positionRight[$i])
                    echo "|";
                else
                    echo "&nbsp;";
            }
        }
        echo "<br />";
    }
}

РЕДАКТИРОВАТЬ: Глядя на предыдущий пример вывода, я ошибочно предположил, что расстояние между цифрами должно быть aразмером с размер. Это было исправлено в объявлении OP о том, что места не требуется.


На самом деле, между цифрами не должно быть пробелов. Единственная причина, по которой этот пример выглядит так, это пробелы, где '|' будет на 8, например. Мне
потребовалось

О, ты прав! Спасибо :)
Vereos

2

C #, 435 359 473 байта

правок:

  • Удален лишний код. Уменьшенный размер байта сравнений.
  • Преобразован в автономное приложение с использованием стандартного ввода.

Вот код для игры в гольф (с добавлением разрывов строк и пробелов):

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пространство имен
сводит

2

C ( 561 492 байта)

Автор Фрмар. Он прислал мне свой ответ на прошлой неделе (он еще не создал свой аккаунт).

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 символов

Немного битовой философии кодирования рулез :-)

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

РЕДАКТИРОВАТЬ Дерьмо ... Я пропустил "масштаб" частьДЕРЬМО

Я сделаю еще один снимок, если доберусь до этого ..


Да, часть масштаба делает это страшным.
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
     --  -- 
|      |   |
|      |   |
     --  -- 
|   |      |
|   |      |
     --  -- 

Как это отвечает на вопрос?
Васи

Вы абсолютно правы ... Я исправлю это
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 обратно в функцию.

Неуправляемый в тестовой программе

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)}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.