Seven Slash Display


99

Напишите программу, которая принимает непустую строку из цифр от 0 до 9 и печатает, как они будут отображаться на семисегментном дисплее, используя косую черту ( /, \).

Вот точные цифры:

/\  
\ \
 \/

 \
  \


/\
 /
 \/

/\
 /\
  /

 \
\/\

/
\/\
  /

/
\/\
 \/

/\
  \

/\
\/\
 \/

/\
\/\
  /

Когда одна цифра появляется за другой, они соединяются по диагонали вверх и вправо с диагональным интервалом между ними. Так, например, 203стало бы так:

    /\
     /\
  /\  /
  \ \
/\ \/
 / 
 \/

Обратите внимание, что 1персонаж занимает столько же места, сколько остальные. Две строки 1находятся на правой стороне дисплея, а не слева.

Так 159114стало бы так:

           \
          \/\
         \
          \
       \
        \
    /\
    \/\
  /   /
  \/\
 \  /
  \

Может быть любое количество и комбинация начальных / конечных новых строк или пробелов в выходных данных, если цифры находятся в правильном положении по отношению друг к другу.

Так что 159114, это также будет действительным:



          \        
         \/\     
        \
         \
      \    
       \          
   /\     
   \/\
 /   /
 \/\         
\  /
 \    


Возьмите ввод из stdin или командной строки, или напишите функцию, которая принимает строку. Выведите результат в stdout или вы можете вернуть его в виде строки, если напишите функцию.

Любая непустая строка из цифр от 0 до 9 должна работать, в том числе отдельных цифр строк (например 8) и строки с ведущими нулями (например, 007нули этого должны быть напечатаны).

Самый короткий код в байтах побеждает.


41
Совершенно оффтоп: это выглядит потрясающе!
Мартин

4
Это действительно очень круто. Однако я не уверен, что колмогоровская сложность подходит для этого вопроса - я думал, что для этого нужен постоянный вывод?
Александр-Бретт

1
@ alexander-brett iirc, который был первоначальным намерением, однако, в последнее время он использовался для задач, где большая часть кода, вероятно, будет жестко задана.
подземный

Это заставило меня пойти как ... ВАУ! Просто вау!
Рене Лидер

Вопрос: Нужно ли обрабатывать пустые строки или строки с нецифровыми символами?
Фредерик

Ответы:


9

CJam, 77 71 70 69 63 62 байта

r_,5*_Sa*a*\{~"÷Ðëúܾ¿ðÿþ"=i2bS"\/"4*W<+.*3/..e>2fm>2m>}/Wf%N*

Все символы пригодны для печати, поэтому копирование и вставка должны работать нормально.

Попробуйте онлайн в интерпретаторе CJam .

идея

Мы начинаем с изучения количества цифр n на входе и помещаем квадрат пробелов, достаточно большой, чтобы покрыть вывод. В реализации этот квадрат будет закодирован как двумерный массив односимвольных строк.

Квадрат длины 2n + 1 будет правильным (т. Е. Не будет окружающего пробела) для простой реализации, но мы будем использовать один длиной 5n для сохранения пары байтов. К счастью, окружающие пробелы разрешены.

Если мы поменяем линии на семь слэш представления 8 , мы получим следующее:

 \/
\/\
/\

Представление всех цифр может быть закодировано как 8-битное целое число, где i- й бит равен 0, если i- й символ должен быть заменен пробелом. Для цифр от 0 до 9 получаются целые числа

247 208 235 250 220 190 191 240 255 254

которые соответствуют следующим символам ISO-8559-1:

÷Ðëúܾ¿ðÿþ

Для каждой цифры на входе, после выбора соответствующего 8-разрядного целого числа, мы повторяем i- й символ представления 8 ровно a i раз, где a i - i- й бит целого числа. Это выдвигает массив строк из одного или нулевого символа. Разделив этот массив на куски длиной 3, мы получим массив, в котором каждый элемент соответствует строке представления.

Теперь мы вычисляем векторизованный максимум строк, представляющих квадрат, и строк, представляющих цифру. Строки /и \больше, чем строка  , поэтому они заменят пробелы в квадрате. Однако пустая строка меньше, чем строка  , поэтому пустые строки в цифровом представлении сохранят пробелы в квадрате.

Теперь мы повернем строки и столбцы на две единицы, чтобы разместить следующее представление цифр в правильной части квадрата и повторим процесс для оставшихся цифр на входе.

Наконец, мы переворачиваем каждую строку и вставляем перевод строки между отдельными строками.

Код

r_,      e# Read a token from STDIN and push the length of a copy.
5*_      e# Multiply the length by 5 and push a copy.
Sa*      e# Repeat the array [" "] that many times.
a*       e# Repeat the array [[" " ... " "]] that many times.
\{       e# For each character C in the input:
  ~      e#   Push eval(C), i.e., the digit the character represents.

  "÷Ðëúܾ¿ðÿþ"

         e#   Push the encodings of all 10 seven slash representations.

  =      e#   Select the proper one.
  i2b    e#   Push the resulting characters code point in base 2, i.e., its bits.
  S      e#   Push " ".
  "\/"4* e#   Push "\/\/\/\/".
  +W<    e#   Concatenate and eliminate the last character.
  .*     e#   Vectorized repetition.

         e#   For the digit 5, e.g., we have [1 0 1 1 1 1 1 0] and  " \/\/\/\" on
         e#   the stack, so .* yields [" " "" "/" "\" "/" "\" "/" ""].

  3/     e#   Divide the representation into chunks of length 3, i.e., its lines.
  ..e>   e#   Compute the twofold vectorized maximum, as explained above.
  2fm>   e#   Rotate each line to characters to the right.
  2m>    e#   Rotate the lines two units down.
}/
Wf%      e# Reverse each line.
N*       e# Place linefeeds between them.

Последние повороты испортили бы результат, если бы длина стороны квадрата была меньше, чем 2n + 3 . Поскольку 5n ≥ 2n + 3 для всех натуральных чисел n , квадрат достаточно велик, чтобы предотвратить это.


Было бы разумно опубликовать здесь версию вашего кода для base64?
TRiG

1
+1, но если честно, я надеялся CJam et al. сидел бы вот этот: p
primo

@primo: я чувствую то же самое в отношении вопросов Pyth и математики. : P Я немного опоздал на вечеринку, потому что меня перехитрили, переставляя Слова . Я не вспомнил этот вопрос до тех пор, пока вы не отредактировали это утро.
Деннис

Проблемы @Dennis, кажется, проходят намного быстрее, чем они привыкли. Я все еще работаю над одной из двух недель назад: p
primo

1
Я всегда сначала ищу CJam, ожидая, что у него будет самое низкое число байтов. Я еще не разочарован.
Инженер Тост

25

Python 3, 189 183 174 байта

s="a%sa"%input()
while s[1:]:b,a,c,d,e,f,g=[c*(ord(n)>>int(s[~(n>"Ͱ")],16)&1)or" "for c,n in zip("\/"*4,"ΟϭŅͭͱͼϻ")];S=len(s)*"  ";print(S+a+b,c+d+"\n"+S+e+f+g);*s,_=s

Сжатие выглядит хорошо для меня, но у меня возникают проблемы с хорошим способом расставить семь переменных ...

К счастью, спецификация довольно смягчена на правилах пробелов, потому что есть много начальных / конечных пробелов.

Expanded:

s="a%sa"%input()
while s[1:]:
  b,a,c,d,e,f,g=[c*(ord(n)>>int(s[~(n>"Ͱ")],16)&1)or" "
                 for c,n in zip("\/"*4,"ΟϭŅͭͱͼϻ")]
  S=len(s)*"  "
  print(S+a+b,c+d+"\n"+S+e+f+g)
  *s,_=s

объяснение

Позиции сегмента, представленные переменными:

    ab               /\
    efg               /\
  ab cd            /\  /
  efg              \ \
ab cd            /\ \/
efg               /
 cd               \/

Каждый сегмент кодируется одним 2-байтовым символом Unicode. Например, ϻкодирует gсегмент так:

bin(ord("ϻ")) = bin(1019) = "0b1111111011"
                               ^^^^^^^^^^
                               9876543210

Действительно, 2это единственная цифра, которая не использует нижний правый сегмент семисегментного дисплея.


19

C 1098 345 323 319 байт

Первая Вторая Третья попытка. Наконец-то решил угробить экранный буфер, чтобы сохранить несколько байтов. Эта программа принимает параметр цифр и печатает цифры в 7-сегментном формате.

Первый раз участник. Просто для удовольствия. Быть нежным.

a[]={100489,2056,98569,67849,2440,67969,100737,2057,100745,67977},i,j,k,n,m;char*c=" /\\";
#define f(q,r) for(q=0;q<(r);q++)
#define P(w) putchar(w)
#define Q(d,i,j) P(c[a[v[1][d]-48]>>(i*3+j)*2&3])
main(w,char**v){f(i,n=strlen(v[1]))f(k,(m=n-i-1)?2:3){f(j,m*2)P(32);f(w,3)Q(m,k,w);if(!k&&i)f(w,2)Q(m+1,2,w+1);P(10);}}

Расширенный, без предупреждения:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int a[]={100489,2056,98569,67849,2440,67969,100737,2057,100745,67977};
char *c=" /\\";
#define f(q,r) for(q=0;q<(r);q++)
#define P(w) putchar(w)
#define Q(d,i,j) P(c[a[v[1][d]-48]>>(i*3+j)*2&3])
int main(int w, char **v)
{
    int i,j,k,n,m;
    f(i,n=strlen(v[1])) {
        m=n-i-1;
        f(k,m?2:3) {
            f(j,m*2) P(32);
            f(w,3) Q(m,k,w);
            if (!k&&i) f(w,2) Q(m+1,2,w+1);
            P(10);
        }
    }
}

Самый быстрый пистолет на западе. Я сжимаю мой сейчас.
Алексей Бурдин

15
Привет! Добро пожаловать в Code Golf. Цель этой задачи - сделать ваш код как можно более коротким, поэтому вы должны сделать некоторые оптимизации в отношении удаления пробелов, закорачивающих операторов и т. Д., А затем сообщить количество байтов в верхней части вашего сообщения на языке. Отличный первый пост! Просто для справки, ваш начальный пост имеет длину 1 098 байт.
Каде

Благодарю. Просто добавил язык и количество байтов. Мой оригинал даже имеет комментарии и использование. :)
некий пользователь

Совет: Измените все имена переменных на отдельные символы. Кроме того, вы используете `for (i = 0; i <digits` много, возможно, замените его на макрос?
Joshpbarron

Хорошая работа здесь. Чтобы сделать ваш счет более конкурентоспособным, вы можете взглянуть на наши советы по игре в гольф в Си .
Алекс А.

14

JavaScript, 192 178 167 162 байта

f=x=>{n=b="\n";for(k in x)for(i=0;i<8;)b+=("î\xA0Öô¸|~àþü".charCodeAt(x[k])>>i++&1?i%2?"/":"\\":" ")+(i%3?"":n+"  ".repeat(k));return b.split(n).reverse().join(n)}

Использование: f("1337");вернется

      /\
        \
    /\   
     /\
  /\  /
   /\
 \  /
  \

Он использует функции ES6 и может иметь некоторое поведение, зависящее от реализации, из-за пропуска точек с запятой и скобок и тому подобного, но он работает в Firefox.

Expanded:

f=x=>
{
    n = b = "\n";

    for (k in x)
        for (i=0; i<8;)
            b += ("î\xA0Öô¸|~àþü".charCodeAt(x[k]) >> i++ & 1? i%2? "/" : "\\" : " ") + (i%3? "" : n+"  ".repeat(k));

    return b.split(n).reverse().join(n)
}

Объяснение:

lявляется массивом, содержащим 10 однобайтовых символов, которые соответствуют форме каждой цифры. Например, цифра 0 представлена ​​символом î:

/\        11
\ \  -->  101  --> 11 101 110 = î
 \/       011

Входные символы используются в качестве ключей для массива, содержащего их фигуры, представляющие аналоги, которые читаются по битам


2
Есть ==0и ==1действительно необходимо раньше ?. Разве int не считается логическим в js? @Regret
Алексей Бурдин

1
@Regret: "w\x05k/\x1D>~\x07\x7F?"с каждым побитовым символом становится обратным "\xee\xa0\xd6\xf4\xb8|~\xe0\xfe\xfc", каждый из них для печати. Это дает еще 8 байтов. Хотя, не достаточно ...
Алексей Бурдин

1
Вы можете сбрить 2 байта, убрав круглые скобки f=(x)=>{}- они не нужны только с одним аргументом.
Scimonster

Вы абсолютно правы, @Alexey. Я изменю это.
Сожаление

Это работает? Я получаю еще 6 строк с ложными персонажами.
edc65

10

Perl - 103 байта

#!perl -n
print$i+$%2?U^(u,$i--%2?v9:z)[$i<4+$%2&vec$_,4*$-3-$i,1]:$/.!($i=$--)
while$+=2*y/0-9/wPkz\\>?p~/

Вышеприведенное содержит 6 непечатаемых символов (источник можно скачать на Ideone ) и эквивалентно следующему:

#!perl -n
print$i+$^F%2?U^(u,$i--%2?v9:z)[$i<4+$^F%2&vec$_,4*$^F-3-$i,1]:$/.!($i=$^F--)
while$^F+=2*y/0-9/wPkz\\>?p\177~/

Каждый ^Fможет быть заменен буквенным символом 6 (ACK) и \177заменен символом 127 (DEL).

Шебанг считается как 1, второй символ новой строки не нужен. Ввод взят из стандартного ввода.


Образец использования

$ echo 0123 | perl seven-slash.pl

      /\
       /\
    /\  /
     /
   \ \/
    \
/\
\ \
 \/

$ echo 456789 | perl seven-slash.pl

          /\
          \/\
        /\  /
        \/\
      /\ \/
        \
    /
    \/\
  /  \/
  \/\
 \  /
\/\

объяснение

Выход генерируется по одному байту за раз. Каждый символ транслитерируется, и это затем интерпретируется как использование битового массива vec. Биты хранятся следующим образом:

   /\           56 
   \/\          234
 /\ \/   ->   56 01
 \/\          234 
  \/           01

Выход чередуется от 3 до 5 слэшей, так что биты 56перетекают в 01следующую цифру. Бит 7не используется.


8

C #, 360 355 331 байт

Привет, первая попытка кода-гольфа. Надеюсь, что это не так уж плохо для C # -вступления.

string p(string n){var l=new string[n.Length*2+1];var i=l.Length-1;for(;i>0;){var x=@"/\\ \\/ \  \  /\ / \//\ /\ / \\/\  / \/\ // \/\\//\  \  /\\/\\//\\/\ /".Substring((n[0]-48)*7,7);for(var j=i-3;j>=0;){l[j--]+="  ";}l[i--]+=" "+x[5]+x[6];l[i--]+=""+x[2]+x[3]+x[4];l[i]+=""+x[0]+x[1];n=n.Remove(0, 1);}return string.Join("\n",l);}

Использование: p("159114");вернется

          \
         \/\
        \
         \
      \
       \
   /\
   \/\
 /   /
 \/\
\  /
 \

Expanded:

string p(string n)
    {
        var l = new string[n.Length * 2 + 1];
        var i = l.Length - 1;
        for (; i > 0; )
        {
            var x = @"/\\ \\/ \  \  /\ / \//\ /\ / \\/\  / \/\ // \/\\//\  \  /\\/\\//\\/\ /".Substring((n[0] - 48) * 7, 7);

            for (var j = i - 3; j >= 0; )
            {
                l[j--] += "  ";
            }
            l[i--] += " " + x[5] + x[6];
            l[i--] += "" + x[2] + x[3] + x[4];
            l[i] += "" + x[0] + x[1];

            n = n.Remove(0, 1);
        }

        return string.Join("\n", l);
    }

1
Я знаю, что прошло почти три года, но вы можете сыграть в гольф 30 байт: попробуйте онлайн. 301 байт . Хороший ответ, хотя +1 от меня.
Кевин Круйссен

Здорово. Не стесняйтесь опубликовать это как собственный ответ :)
Шион

1
Нет, это твой код Я только немного сократил, удалив скобки цикла for и объединив переменные. И изменения string s(string n)в n=>с помощью лямбда. Ах, ну, вы можете просто оставить это так, если хотите. :) Однако я создал порт для Java, зачисляя вас. ;)
Кевин Круйссен

4

питон 2, 317 298 278 273,15

def f(s):
    r=range;n=len(s)*2;l=[[' ']*-~n for x in r(-~n)]
    for x in r(0,n,2):
        for i,[d,y,c]in enumerate(zip('0112012','1021012',r'\\\\///')):l[n-2-x+int(y)][x+int(d)]=[' ',c][('%7s'%(bin(ord('}(7/jO_,\x7fo'[map(int,s)[x/2]])))[2:])[i]=='1']
    for x in l:print''.join(x)

Я считал 4 пробела табуляцией при подсчете.
Несжатый и читаемый:

def f(s):
    r=['1111101','0101000','0110111','0101111','1101010','1001111','1011111','0101100','1111111','1101111']
    ''.join(map(lambda x:chr(eval('0b'+x)),r))
    n=len(s)*2
    l=[[' ']*(n+1) for x in xrange(n+1)]
    shifts=[(0,1,'\\'),(1,0,'\\'),(1,2,'\\'),(2,1,'\\'),(0,0,'/'),(1,1,'/'),(2,2,'/')]
    for x in xrange(0,n,2):
        y=n-2-x
        for i,[dx,dy,c] in enumerate(shifts):
            l[y+dy][x+dx]=c if r[map(int,s)[x/2]][i]=='1' else ' '
    return '\n'.join(''.join(x) for x in l)

Привет! Отличный ответ, но вы можете сделать несколько изменений, чтобы сделать его еще короче. Изменение l[y+dy][x+dx]=c if r[map(int,s)[x/2]][i]=='1' else ' 'на l[y+dy][x+dx]=[' ',c][r[map(int,s)[x/2]][i]=='1']сохранение 5 байтов, изменение return '\n'.join(''.join(x) for x in l)на print'\n'.join(''.join(x)for x in l)сохранение 3 байта, плюс еще несколько изменений. Вот ссылка на Gist, где я сократил число байтов до 440 с 508.
Kade

6
Кельвин был бы очень доволен этим счетом.
Кристиан Лупаску

3
Ваш ответ на самом деле 272 байта, но вы можете сохранить еще один, потому что пробел короче табуляции. Смотрите здесь . Как вы могли бы иметь 273,15 байтов в любом случае?
mbomb007

1
273,15 байт означает, что @AlexeyBurdin разобрался в аналоговых вычислениях на цифровой платформе. Почему в мире вы опубликовали это здесь, а не в науке? ;-)
hBy2Py

1
Это означает только то, что решение заморожено в абсолютном нуле, т.е. я не хочу сосредотачиваться на том, что уже потеряно . :)
Алексей Бурдин

3

KDB (Q), 172 136 байт

{d:(9#1 2 0 2)*/:-9#'0b vs'427 136 403 409 184 313 315 392 443 441;
 -1" /\\"{m+(c,/:y),c:(count[m:0 0,x,\:0 0]-3)#0}/[3 3#/:d"J"$'(),x];}

объяснение

1) Создайте dкарту со всеми фигурами цифр.

2) Заполните матрицу дополнительными нулями и сложите их вместе. то есть "01"

0           0 0 0 2 0   
0           0 0 0 0 2
1 2 0 0 0 + 0 0 0 0 0
2 0 2 0 0   0
0 2 1 0 0   0

3) Используйте индекс для сопоставления " /\"и печати -1.

Контрольная работа

q){d:(9#1 2 0 2)*/:-9#'0b vs'427 136 403 409 184 313 315 392 443 441;-1" /\\"{m+(c,/:y),c:(count[m:0 0,x,\:0 0]-3)#0}/[3 3#/:d"J"$'(),x];}"0123456789"
                  /\
                  \/\
                /\  /
                \/\
              /\ \/
                \
            /
            \/\
          /  \/
          \/\
         \  /
        \/\
      /\
       /\
    /\  /
     /
   \ \/
    \
/\
\ \
 \/

Я уверен, что это может быть короче!

Спасибо @hjk


1
Единственное сокращение, которое я заметил, это заменить 1 2 0 2 1 2 0 2 1на (9#1 2 0 2)(-6).
HJK

1
Да, и замена enlistна 1#работы, так что это еще -5.
HJK

1
ты звезда! Я обновлю! но не могу заменить, enlistхотя, потому что count[a 0]#0не атом :(
WooiKent Lee

ах странно, это сработало для меня, хотя ... должно быть странно. ;)
hjk

1
на самом деле, список плюс атом будет расширять атом до правильной длины в любом случае! ты напомнил мне такой механизм! : D
WooiKent Ли

2

Пип, 122 + 1 = 123 байта

Использует -nфлаг. Принимает ввод через аргумент командной строки.

l:$.(J"\/ "@^(A_TB3M"⮐䫶ヷ㄃䓳ⴷⴥㅕ⬿⭑")@_.2<>2Ma)z:2*#ap:sXz+2RLz+2Fi,5Fj,z{c:[4-ii]//2+j(pc@0c@1):(lij)}RVp

Символы в строке UTF-8 имеют следующие кодовые точки: 11152, 19190, 12535, 12547, 17651, 11575, 11557, 12629, 11071, 11089.

Слегка разгульный

t:[120022001 222022202 122012021 122012201 220012202 120212201 120212001 122022202 120012001 120012201]
l:$.({J"\/ "@^t@a.2<>2}Ma)
z:2*#a+2
p:sXzRLz
Fi,5
 Fj,2*#a {
  x:i//2+j
  y:(4-i)//2+j
  p@y@x:l@i@j
 }
P RVp

Основная стратегия состоит в том, чтобы найти составные символы каждого числа, а затем искажать их соответствующим образом. Например, для 8, мы хотим это (пробелы представлены точками):

/.
\\
/.
\\
/.

который превратится в это:

 .  
/\. 
\/\.
 \/ 

Приятной особенностью этой стратегии является то, что несколько предварительно искаженных чисел можно просто объединить рядом.

Теперь мы можем кодировать /.\\/.\\/.в базе 3 как 1200120012. Затем мы можем преобразовать это в десятичное число и рассматривать его как кодовую точку UTF-8.

Выражение J"\/ "@^(A_TB3M"⮐䫶ヷ㄃䓳ⴷⴥㅕ⬿⭑")@_.2<>2Maполучает предварительно искаженные данные следующим процессом:

                            Ma   Map this lambda function to each character in input:
        (A_TB3M"...")            Create list of the code points of each character in UTF-8
                                   string, converted to base 3
                     @_          Index into that list using the input character
                       .2        Concatenate 2 to the end of the base-3 value (all of the
                                   pre-skewed number grids end in 2, i.e. space)
       ^                         Split the number into a list of its digits
 "\/ "@                          Index into this string with those digits, giving a list
                                   of slashes & spaces
J                                Join the list together into a string
                         <>2     Group string two characters at a time

Как только мы соединили эти строки бок о бок, используя их $., мы создадим сетку из пробелов (2 * n + 2 квадрат), пройдемся по предварительно перекошенной сетке и заменим соответствующие пробелы в перекошенной сетке на соответствующие персонажи. Чтобы увидеть, как это происходит, можно изменить код для печати каждого этапа и сделать паузу для ввода пользователя:

Алгоритм в процессе

Сетка фактически построена с ног на голову, потому что это, казалось, облегчало математику.

Я уверен, что есть лучшие алгоритмы для использования. Но я хотел придумать свою идею, а не копировать чужую.

Больше на Пипе


2

Brainfuck - 719 байтов

Только для исторического контекста, кредиты Даниэлю Б. Кристофани. Я не совсем уверен, когда это было создано, но оно доступно из Интернет-архива уже 9 мая 2003 года.

Вывод для 9отличается от описания проблемы.

>>>>+>+++>+++>>>>>+++[
  >,+>++++[>++++<-]>[<<[-[->]]>[<]>-]<<[
    >+>+>>+>+[<<<<]<+>>[+<]<[>]>+[[>>>]>>+[<<<<]>-]+<+>>>-[
      <<+[>]>>+<<<+<+<--------[
        <<-<<+[>]>+<<-<<-[
          <<<+<-[>>]<-<-<<<-<----[
            <<<->>>>+<-[
              <<<+[>]>+<<+<-<-[
                <<+<-<+[>>]<+<<<<+<-[
                  <<-[>]>>-<<<-<-<-[
                    <<<+<-[>>]<+<<<+<+<-[
                      <<<<+[>]<-<<-[
                        <<+[>]>>-<<<<-<-[
                          >>>>>+<-<<<+<-[
                            >>+<<-[
                              <<-<-[>]>+<<-<-<-[
                                <<+<+[>]<+<+<-[
                                  >>-<-<-[
                                    <<-[>]<+<++++[<-------->-]++<[
                                      <<+[>]>>-<-<<<<-[
                                        <<-<<->>>>-[
                                          <<<<+[>]>+<<<<-[
                                            <<+<<-[>>]<+<<<<<-[
                                              >>>>-<<<-<-
  ]]]]]]]]]]]]]]]]]]]]]]>[>[[[<<<<]>+>>[>>>>>]<-]<]>>>+>>>>>>>+>]<
]<[-]<<<<<<<++<+++<+++[
  [>]>>>>>>++++++++[<<++++>++++++>-]<-<<[-[<+>>.<-]]<<<<[
    -[-[>+<-]>]>>>>>[.[>]]<<[<+>-]>>>[<<++[<+>--]>>-]
    <<[->+<[<++>-]]<<<[<+>-]<<<<
  ]>>+>>>--[<+>---]<.>>[[-]<<]<
]
[Enter a number using ()-./0123456789abcdef and space, and hit return.
Daniel B Cristofani (cristofdathevanetdotcom)
http://www.hevanet.com/cristofd/brainfuck/]

2
Я, вероятно, написал это в 2002 году. В интернет-архиве говорится, что Пану Каллиокоски добавил его в свой репозиторий brainfuck в августе 2002 года. Что касается 9, я думаю, что я использовал шаблоны из второго издания Microprocessors and Interfacing , стр. 4.
Daniel Cristofani

1

Perl, 270 байт

Я действительно не должен был тратить свое время на это.

$e="\\";$g=" ";$_=reverse<>;$l=length;push@a,(119,18,107,91,30,93,125,19,127,95)[$1]while/(.)/g;for($i=0;$i<=$l;$i++){$j=2*($l-$i);$b=$a[$i];$c=$i&&$a[$i-1];print" "x$j,$b&1?"/":$g,$b&2?$e:$g,$g,$c&32?$e:$g,$c&64?"/":$g,"
"," "x$j,$b&4?$e:$g,$b&8?"/":$g,$b&16?$e:$g,"
"}

заменить [$1]while/(.)/gна, [$_]for/./gчтобы сохранить 4 байта. заменить for($i=0;$i<=$l;$i++)на, for$i(0..$l)чтобы сохранить 9 байтов.
Хоббс

1

JavaScript ( ES6 ), 191 206

Запустите сниппет в Firefox для проверки.

F=m=>(
  a='    \\/  /\\/\\ /  /\\  \\\\ \\'.match(/.../g),
  o=f='',r=' ',
  [for(d of m)(
    n=1e3+'¯B\x91ÿ$ê\x86A\x87ë'.charCodeAt(d)+'', // here there are 3 valid characters tha the evil stackoverflow editor just erase off, so I had to put them as hex escape
    o='\n'+f+' '+a[n[2]]+'\n'+r+a[n[1]]+o,
    r=f+a[n[3]],
    f+='  ')],
  r+o
)


//TEST

go=_=>O.innerHTML =(v=I.value)+'\n'+F(v)

go()
<input id=I value='0123456789'><button onclick='go()'>-></button>
<pre id=O></pre>


0

Java 8, 341 байт

n->{int i=n.length*2,j=i+1,k=0,t;String l[]=new String[j],x;for(;j-->0;l[j]="");for(;i>0;l[i--]+=" "+x.substring(5,7),l[i--]+=x.substring(2,5),l[i]+=x.substring(0,2))for(x="/~~ ~~/ ~  ~  /~ / ~//~ /~ / ~~/~  / ~/~ // ~/~~//~  ~  /~~/~~//~~/~ /".replace('~','\\').substring(t=(n[k++]-48)*7,t+7),j=i-2;j-->0;)l[j]+="  ";return"".join("\n",l);}

Порт ответа @Shion на C # .NET , так что постарайтесь также поддержать его!

Попробуйте онлайн.

Объяснение:

n->{                       // Method with character-array parameter and String return-type
  int i=n.length*2,        //  Two times the length of the input array
      j=i+1,               //  Index integer, starting at `i+1`
      k=0,t;               //  Temp integers
  String l[]=new String[j],//  String-array for the rows, default filled with `null`
         x;                //  Temp-String
  for(;j-->0;l[j]="");     //  Replace all `null` with empty Strings
  for(;i>0                 //  Loop `i` downwards in the range [`n.length*2`, 0)
      ;                    //   After every iteration:
       l[i--]+=            //    Append the row at index `i` with:
                           //    (and decrease `i` by 1 afterwards with `i--`)
         " "               //     A space
         +x.substring(5,7),//     And the 6th and 7th characters of temp-String `x`
       l[i--]+=            //    Append the row at index `i` with:
                           //    (and decrease `i` by 1 afterwards with `i--`)
         x.substring(2,5), //     The 3rd, 4th and 5th characters of temp-String `x`
       l[i]+=              //    Append the row at index `i` with:
         x.substring(0,2)) //     The 1st and 2nd characters of the temp-String `x`
    for(x="/~~ ~~/ ~  ~  /~ / ~//~ /~ / ~~/~  / ~/~ // ~/~~//~  ~  /~~/~~//~~/~ /".replace('~','\\')
                           //   String containing all digit-parts
          .substring(t=(n[k++]-48)*7,t+7),
                           //   and take the substring of 7 characters at index
                           //   `n[k]` as integer multiplied by 7
        j=i-2;j-->0;)      //   Inner loop `j` in the range (`i`-2, 0]
      l[j]+="  ";          //    And append the rows at index `j` with two spaces
  return"".join("\n",l);}  //  Return the rows delimited with new-lines
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.