Пометить мою почту! - ASCII штрих-коды


39

Штрих-коды 4 штатов

Многие почтовые службы (Royal Mail UK, Canada Post, US Mail и т. Д.) Используют штрих-код из 4 штатов для кодирования информации о своей почте. Визуализированный в ASCII, он может выглядеть примерно так:

| | | | | | | | | |
| | | | | | | | | | | | | | | | |
    | | | | | | | |

Штрих-код с 4 состояниями - ряд строк. Каждый стержень может быть расширен вверх, вниз или оба, что позволяет 4 варианта. Это означает, что каждый столбец представляет собой основную цифру 4:

            | |
Бар: | | | |
                | |

Цифра: 0 1 2 3

Проблема с этой символикой состоит в том, что каждый штрих-код является действительным, другим штрих-кодом вверх ногами: радикально меняя значение, если ориентация неверна. Следовательно, последовательность запуска и остановки обычно реализуется, чтобы сканер мог рассчитать, каким образом он должен быть прочитан.

Для этой задачи мы будем использовать последовательность запуска / остановки, указанную Австралийской почтой: каждый штрих-код начинается и заканчивается 1 0последовательностью.


Соревнование

Ваша задача - написать программу или функцию, которая при наличии положительного целого числа Nпреобразует его в штрих-код ASCII с 4 состояниями, где каждая полоса (кроме последовательностей начала / остановки) представляет цифру в представлении base-4 для N.

Пример:

Учитывая целое число 19623, мы бы сначала преобразовать его в представление базовых 4 10302213.

Затем мы сопоставили бы каждую цифру с соответствующей полосой:

1 0 3 0 2 2 1 3

| | | |
| | | | | | | |
    | | | |

Наконец, мы бы добавили последовательности start / stop:

Начать конец:
1 0 1 0

| | | | | |
| | | | | | | | | | | |
        | | | |

Полученный штрих-код должен быть выходом программы.


Правила:

  • Входные данные будут положительным целым числом в диапазоне стандартного целочисленного размера вашего языка.
  • Выход:
    • Может быть либо списком строк, либо строкой, содержащей новые строки.
    • Может содержать начальные или конечные символы новой строки / пробелы, если форма остается неизменной.
    • Должен отображать штрих-код в указанном выше формате - он должен использовать символ трубы ( |) и символ пробела ( ) при рисовании полос, и между каждой вертикальной полосой должен быть один пробел.
  • Это , поэтому выигрывает самая короткая (в байтах) программа!

Тестовые случаи

4095:

| | | | | | | |  
| | | | | | | | | |
    | | | | | |    

4096:

| | |  
| | | | | | | | | | |

7313145:

| | | | | | | | | |  
| | | | | | | | | | | | | | | |
      | | | | | | | |      

Ведущие пробелы разрешены? ;)
Эрик Outgolfer

@FlipTack Проблема с этой символикой - вы не видели Святых из Бундока, не так ли?
Лорд Фаркваад

@EriktheOutgolfer Пока фактический штрих-код, как двумерная матрица символов, не поврежден, он может иметь столько пробелов до или после него, сколько необходимо.
FlipTack

Другие проблемы, связанные со штрих-кодом: 1 , 2 , 3
FlipTack

Может ли вывод иметь начальные нули?
user230118

Ответы:



9

МАТЛ , 34 30 29 28 байт

TFiK_YAyhhH&\EQE+t~vB!P'|'*c

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

объяснение

TF      % Push array [1 0] (start sequence)
i       % Push input
K_YA    % Convert to base 4. Gives an array of 4-ary digits
y       % Duplicate from below: pushes [1 0] again (stop sequence)
hh      % Concatenate horizontally twice. Gives array of 4-ary digits
        % including start and stop sequences
H&\     % Two-output modulo 2: pushes array with remainders and array
        % with quotients of dividing by 2
EQE     % Times 2, plus 1, times 2, element-wise. This effectively
        % multiplies each entry by 4 and adds 2
+       % Add element-wise to the array of remainders. The stack now 
        % contains an array of numbers 2, 3, 6 or 7. Each number
        % encodes, in binary form, a column of the output. The
        % previous multiplication of the quotients by 4 will have the
        % effect of shifting one row down (one binary digit upwards),
        % to make room for the central row. The addition of 2 will
        % create the central row, which is always full
t~      % Duplicate, logical negate. Gives an array of zeros of the
        % same length
v       % Concatenate vertically into a 2-row matrix
B       % Convert to binary. Gives a matrix, where each row is the
        % binary representation of one of the numbers of the input
        % matrix, read in column-major order
!P      % Transpose, flip vertically
'|'*    % Multiply by '|'. This transforms 1 into 124 (ASCII code of
        % '|') and leaves 0 as is
c       % Convert to char. Char 0 is shown as space. Implicitly display

8

Желе , 16 15 байт

4;jƓb|ṃ⁾| ẎZṙ2G

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

Как это работает

4;jƓb|ṃ⁾| ẎZṙ2G  Main link. No arguments.

4                Set the argument and the return value to 4.
 ;               Concatenate the return value with the argument, yielding [4, 4].
   Ɠ             Read an integer n from STDIN.
  j              Join, yielding [4, n, 4].
    b            Convert 4, n, and 4 to base 4. Note that 4 is [1, 0] in base 4.
     |           Perform bitwise OR of each resulting quaternary digit and 4.
                 This pads the binary representation of a digit d to three digits: 
                 [1, d:2, d%2]
      ṃ⁾|        Convert the results to base " |", i.e., binary where ' '
                 represents 0 and '|' represents 1.
          Ẏ      Concatenate the resulting arrays that correspond to 4, n, and 4.
           Z     Zip; transpose rows and columns.
            ṙ2   Rotate 2 units yo the left, correcting the order of [1, d:2, d%2]
                 to [d%2, 1, d:2].
              G  Grid; separate columns by spaces, rows by linefeeds.

Эта строка имеет длину 15 символов Юникод, как это может быть 15 байтов?
Jmster


@jmster Это не настоящие персонажи. Программа имеет 15 конкретных байтов, которые имеют эту мнемонику. Сравните его с Bubblegum, он выглядит примерно так, .......но каждая точка обозначает отдельный байт.
FrownyFrog

Почему побитовое ИЛИ вместо добавления?
FrownyFrog

@FrownyFrog Оба будут работать. Поскольку следующим шагом является преобразование в двоичный файл, я пошел с побитовым оператором.
Деннис


7

Октава , 78 77 75 74 70 69 байт

@(x)' |'(dec2bin([2 6 3 7;~(1:4)](:,[2 1 dec2base(x,4)-47 2 1]))-47)'

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

В отличие от оригинального подхода, этот использует простую справочную таблицу для отображения значений base-4 в их двоичный эквивалент. Справочная таблица также добавляет интервал между каждой полосой, добавляя ноль между каждой цифрой (которая отображается на полосу всех пробелов).

Таблица соответствия напрямую отображается на столбцы как:

   base4:  0 1 2 3 -

  lookup:  2 6 3 7 0

  binary:  0 1 0 1 0
           1 1 1 1 0
           0 0 1 1 0

Преобразование из двоичного в |и  теперь выполняется путем индексации в строку этих двух символов - в основном тот же принцип, что и в таблице поиска для двоичного преобразования.


* Сохранено 1 байт, спасибо @LuisMendo


Оригинал:

@(x)['' circshift(dec2bin([a=[5 4 dec2base(x,4)-44 5 4];a*0](:))'*92,1)-4384]

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

Анонимная функция, которая возвращает штрих-код в виде строки.

Это основано на том факте, что если мы добавим 4 к цифрам base4, то мы можем представить бар / пробел числом, преобразованным в двоичный файл с замененными битами 1 и 2:

   base4:  0 1 2 3

    add4:  4 5 6 7

  binary:  0 1 0 1
           0 0 1 1
           1 1 1 1

swap 2/1:  0 1 0 1
           1 1 1 1
           0 0 1 1

Сложно с точки зрения игры в гольф добавить пространство между барами и конвертировать из 0/1в '|'/' '.


1
@ LuisMendo умный! Спасибо.
Том Карпентер

7

JavaScript (ES6), 89 87 83 байта

n=>`|  ${(g=(a,k=n)=>k?g(a,k>>2)+(k&a?'| ':'  '):' ')(1)}|
| |${g(~0)}| |
   `+g(2)

Контрольные примеры

Как?

NB . В приведенной ниже версии литералы шаблонов были заменены стандартными строками, чтобы код мог быть правильно вставлен.

n =>                        // given the input n
  '|  ' +                   // append the top leading pattern
  (g = (a,                  // g is a recursive function taking a = mask
           k = n) =>        // and using k = value, initially set to n
    k ?                     //   if k is not zero:
      g(a, k >> 2) +        //     do a recursive call for the next group of 2 bits
      (k & a ? '| ' : '  ') //     append '| ' if the bit is set or '  ' otherwise
    :                       //   else:
      ' '                   //     append an extra leading space and stop the recursion
  )(1) +                    // invoke g() with mask = 0b01
  '|\n' +                   // append the top leading pattern and a linefeed
  '| |' +                   // append the middle leading pattern
  g(~0) +                   // invoke g() with all bits set in the mask
  '| |\n' +                 // append the middle trailing pattern and a linefeed
  '   ' +                   // append the bottom leading pattern
  g(2)                      // invoke g() with mask = 0b10

Мне бы очень хотелось, чтобы этот ответ был объяснен, происходят странные вещи: П
Брайан Х.

@BrianH. Я добавил объяснение.
Арно

4

R , 154 109 байт

function(n,d=c(1,0,n%/%4^floor(log(n,4):0)%%4,1,0),o=c(" ","|"))cat("",o[1+d%%2],"
",o[2+0*d],"
",o[1+(d>1)])

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

Сохранена целая куча байтов путем индексации и использования, catа не построения матрицы и использованияwrite , а также 6 из немного другого преобразования в основание 4. Печатает с начальным пробелом в каждой строке и без завершающих строк.

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

Объяснение:

function(n,
 d=c(1,0,                         # d contains the padding and 
   n%/%4^floor(log(n,4):0)%%4,   # the base 4 digits
   1,0),                         # 
 o=c("|"," ")                    # the vector to index into
 cat("",                         # cat separates things with spaces by default
                                 # so the empty string will print a leading space
  o[1+d%%2],"                    # odds have a | above
",                               # literal newline, a space will follow it (hence leading spaces)
 o[2+0*d],"                      # array of 2s since the middle is always |
",                               # another literal newline
 o[1+(d>1)])                     # digits greater than 1 have a | below


3

Древесный уголь , 50 байтов

NθF²⊞υι¿θWθ«⊞υ﹪θ⁴≧÷⁴θ»⊞υθF²⊞υιE⟦ |¦|¦  ||⟧⪫E⮌υ§ιλω

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

Nθ

Введите число.

F²⊞υι

Нажмите последовательность остановки в предварительно определенный пустой список.

¿θ

Если число положительное,

  Wθ«⊞υ﹪θ⁴≧÷⁴θ»

повторно применять divmod для преобразования его в обратную базу 4,

  ⊞υθ

в противном случае просто нажмите его.

F²⊞υι

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

E⟦ |¦|¦  ||⟧

Карта на три строки. Каждая строка представляет перевод штрих-кода для цифр 0123для каждой строки.

⪫E⮌υ§ιλω

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


3

Japt , 32 31 байт

A¤i2Us4)¬®n s|iS)ù2 w i|1ÃqR² y

Проверьте это онлайн!

Пока не очень доволен, но это только начало ...

объяснение

A¤  i2Us4)¬ ®   n s |iS)ù2 w i |1Ã qR²  y
As2 i2Us4)q mZ{Zn s'|iS)ù2 w i'|1} qRp2 y
                                           Implicit: U = input, A = 10, R = newline, S = space
As2                                        Convert 10 to a binary string.
    i2   )                                 At index 2, insert
      Us4                                    the input converted to base 4.
          q                                Split into chars.
            mZ{                  }         Map each char Z to
               Zn                            Z converted to a number,
                  s'|iS)                     converted to base " |" (binary using ' ' as 0 and '|' as 1),
                        ù2                   left-padded to length 2 with spaces,
                           w                 reversed,
                             i'|1            with another pipe inserted at index 1.
                                   q       Join the resulting list on
                                    Rp2      a newline repeated twice (adds in blank columns).
                                        y  Transpose the entire string.
                                           Implicit: output result of last expression

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

3

Haskell , 91 90 байт

h s=[do a<-4%s++0%0;x!!a:" "|x<-[" | |","||||","  ||"]]
_%0=[1,0]
b%n=b%div n b++[mod n b]

Попробуйте онлайн! Возвращает список строк.


Тот же вариант подсчета байтов для первой строки:

h s=[do a<-4%s++0%0;" | |  ||||"!!(x+a):" "|x<-[0,6,4]]

3

J , 57 49 47 байт

10 байтов благодаря FrownyFrog!

[:,.2{."0[:|:' |'{~#:@2 6 3 7{~1 0,4&#.inv,1,0:

Как это работает:

1 0,4&#.inv,1,0: - преобразует число в список из 4 цифр, добавляет 1 0 к началу и концу списка

((#:2 6 3 7){' |') - таблица поиска для шифрования, двоичный 0 соответствует пробелу, 1 к '|'

{~ - шифрует основную цифру 4, выбирая строку из таблицы поиска выше (аргумент обратный)

|: - транспонирует полученный массив из 3 столбцов в 3 строки

[: - закрывает вилку

,.2{."0 - ставит пробелы между решетками

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


@FrownyFrog Спасибо!
Гален Иванов

2

APL + WIN, 63 байта

(⍉5 3⍴' | ||  |||||   ')[;,⍉(2 1,(1+((⌈4⍟n)⍴4)⊤n←⎕),2 1),[.1]5]

Объяснение:

(⍉5 3⍴' | ||  |||||   ') create a matrix where columns represent bars plus one for separator spaces

(1+((⌈4⍟n)⍴4)⊤n←⎕) prompt for screen input and convert to base 4 and add 1 to convert to index origin 1

2 1,...,2 1 concatenate start stop

,[.1]5 concatenate separator space indices

(.....)[.....] index into bar matrix to display


2

05AB1E , 19 байтов

4BT.øS4~bT„| ‡øÁ€S»

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

Это половина подхода Денниса, который всего на один байт короче, чем метод, который я использовал ранее (которым я вполне доволен):

05AB1E , 20 байтов

4BT.øS2‰í1ýøT„| ‡€S»

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

Как это работает?

4BT.øS2 ‰ í1ýøT «| ‡ € S »| Полная программа. Принимает ввод из STDIN, выводит в STDOUT.

4B | Конвертировать в базу 4.
  T | Нажмите 10 в стек.
   .ø | Surrond (добавьте 10 и добавьте 10 к основному 4 представлению).
     S | Разделить на отдельные символы / цифры.
                      + ------------------------------------------------- --------------
                      | Эта часть была 4.ø4 ˜ в предыдущей версии, которая
                      | означает: окружить 4, преобразовать каждый в основание 4 (4 -> [1, 0])
                      | и, наконец, глубоко сгладить список.
                      + ------------------------------------------------- --------------
      2 ‰ | Divmod 2 ([N // 2, N% 2]).
        í | Обратное (поэлементное).
         1ý | Добавьте 1 посередине (поэлементно).
           Ш | Транспонирование.
            T «| ‡ | Переведите (‡) из «10» (T) в «|» („|).
                 € S »| Формат в виде сетки.
                 € S | Нажмите символы каждого.
                   »| Присоединяйтесь по новым строкам, а внутренние списки соединяйте пробелами.

Я спросил Аднана (создателя 05AB1E) о сетке в чате , и они помогли мне сэкономить 2 байта, указав на особенность 05AB1E: при соединении многомерных списков с помощью новых строк, внутренние списки также соединяются пробелами так ðýненужно.


2

APL (Dyalog Classic) , 33 байта

' |'[≠\2/212 21 0(,,⊣)4⊥⍣¯1⊢⎕]

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


О, это то, что вы должны окружить с 1 0 ...
FrownyFrog

Так 2⊥⍣¯1как вы получите список двоичных файлов?
FrownyFrog

@FrownyFrog Нет единственно верного способа окружить. Да, 2⊥⍣¯1является ли обратный ("лицевой"?) "Двух декодирования". Он кодирует в двоичный файл с таким количеством битов, сколько необходимо.
нгн

2

J , 42 40 39 байт

' |'{~[:#:4#.2|.0|:4#:@+1 0(,,[)4#.inv]

Побрился на 2 байта благодаря Денису. 1 байт благодаря ngn.

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

Как это работает

                                4#.inv]      to base 4
                        1 0(,,[)             append (1 0) on both sides
                   4#:@+                     add 4 to each digit and convert to binary
                0|:                          transpose
             2|.                             rotate the rows
      [:#:4#.             from base 4 to base 2, it's supposed to separate the columns
' |'{~                                       to characters

2

JavaScript (ES6) 79 байт

Использует .toString, чтобы преобразовать число в основание 4, а затем работает с каждой строкой и побитовым ИЛИ, чтобы построить выход за строкой. Выводит список строк.

n=>[2,3,1].map(d=>[...'10'+n.toString(4)+'10'].map(q=>(q|d)>2?"|":" ").join` `)

f = n=>[2,3,1].map(d=>[...'10'+n.toString(4)+'10'].map(q=>(q|d)>2?"|":" ").join` `)

console.log(f(19623))
console.log(f(4095))
console.log(f(4096))
console.log(f(7313145))


1
Классный подход с картой и побитовым ИЛИ! Вы можете сохранить целый байт, используя `10${n.toString(4)}10`:)
Chris M

2

Bash + coreutils, 71 67 байт

dc -e4ddon?np|sed 's/./& /g;h;y/01/23/;G;y/12/21/;H;x;y/0123/ | |/'

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

объяснение

В dcразрядных обращенных к основанию 4, Предварение и добавления с 4(оборотов в 10на выходе) и используяn , чтобы держать все в одной строке.

Остальное происходит в sed:

s/./& /g;     Add a space after each digit
h;            Make a copy in hold space
y/01/23/;     Prepare up the second row (2/3 will turn to pipes)
G;y/12/21/;   Append what will be the third row and prep it (1/3 will turn to pipes)
H;x;          Prepend hold space
y/0123/ | |/  Make 1 and 3 pipes, 0 and 2 spaces

1
Преобразование части после dc полностью в sed экономит несколько байтов, tio.run/##S0oszvj/PyVZQTfVJCUlP88@r6CmODVFQb1YX09fTUE/…
Kritixi Lithos,

Очень хорошо! Я пробовал что-то подобное, но я продолжал пробовать разные способы быть умным, xиспользуя пространство удержания / паттерна, чтобы модифицировать их, а затем делать sвсе сразу, и ничто не заканчивалось короче.
София Лехнер,

@ Cowsquack Мне даже удалось сократить еще два байта, основываясь на твоей идее!
София Лехнер,

Хорошая идея объединения транслитераций, +1
Kritixi Lithos

1

Сетчатка , 83 байта

.+
$*
+`(1+)\1{3}
${1};
^
1;;
$
;1;;
1*;
$.&
.+
$&¶$&¶$&
T`13` `^.+
T`12` `.+$
\d
|

Попробуйте онлайн!Ссылка включает в себя более быстрые тесты. Объяснение:

.+
$*

Преобразовать в одинарный.

+`(1+)\1{3}
${1};

Преобразовать в базу 4 в виде одинарных чисел, разделенных ; s.

^
1;;

Подготовьте начальную последовательность.

$
;1;;

Добавить ; , превратив его в разделитель цифр, а не в разделитель, и последовательность остановки.

1*;
$.&

Преобразование в десятичное число, но с добавлением 1 к каждой цифре.

.+
$&¶$&¶$&

Утроить его

T`13` `^.+

В первом ряду 1s и 3s (представляющие 0s и2 s) становятся пробелами.

T`12` `.+$

В последнем ряду 1s и 2s (представляющие 0s и1 s) становятся пробелами.

\d
|

Все остальные цифры становятся барами.


1

Пип , 33 31 29 27 26 байт

25 байтов кода, +1 за -Sфлаг.

Y^aTB4WRt" |"@[y%2oMyy/2]

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

объяснение

Мы наблюдаем закономерность в четырех типах баров:

  • Первая строка - это пробел, если цифра четная, труба, если нечетная.
  • Второй ряд - это всегда труба.
  • Третья строка - это пробел, если цифра 0 или 1, труба, если 2 или 3.

Так:

                           a is cmdline arg; o is 1; t is 10 (implicit)
  aTB4                     Convert a to base 4
      WRt                  Wrap it before and after with 10
 ^                         Split into a list of digits
Y                          and yank into y
              [         ]  List of:
               y%2          0 if even, 1 if odd for each item in y
                  oMy       1 mapped to y, i.e. constant 1 for each item in y
                     y/2    Each item in y divided by 2 (0, 0.5, 1, or 1.5)
         " |"@             Use the elements of that list as indices into this string
                           Note that indices are truncated to integers!
                           Autoprint, separating rows with newline and elements of
                           each row with space (-S flag)


1

C (gcc) , 176 байт

#include<stdio.h>
int n,m;f(n,r){if(n)f(n>>2);printf("%c%c",n?32:10,(n&r||!r)&&n?'|':32);}main(){scanf("%d",&n);m=(n+(4<<(32-__builtin_clz(n)/2*2)))*16+4;f(m,1);f(m,0);f(m,2);}

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

Чуть менее ужасно отформатирован (меньше в гольфе):

#include<stdio.h>
int n,m;
f(n,r) {
    if(n)
        f(n>>2);
    printf("%c%c",n?32:10,(n&r||!r)&&n?'|':32);
}

main() {
    scanf("%d",&n);
    m=(n+(4<<2*(16-__builtin_clz(n)/2)))*16+4;
    f(m,1);
    f(m,0);
    f(m,2);
}

объяснение

Сначала рассмотрим следующий код для чтения целого числа и вывода версии base 4:

#include <stdio.h>
int n;
f(n) {if(n)printf("%d\n",n&3,f(n>>2));}
main(){scanf("%d",&n);f(n);}

Это использует хвостовую рекурсию, чтобы изменить порядок вывода. Сдвиг битов каждого рекурсивного шага на 2 (обрезает последние 2 бита и делит на 4). Он выводит результат, замаскированный с помощью 3 (0b11), который показывает только последние два бита, которые являются последними цифрами основания 4.

Вызов функции включен в printfкачестве завершающего аргумента (он не печатается, но оценивается), чтобы избежать необходимости использовать {} (+2 байта) для группировки printfвызова функции и.

Решение здесь расширяет этот код base-4. Во-первых, m определяется как n, но так, что в базе 4 к нему будет добавлено 10 добавленных и добавленных символов. Затем мы печатаем m.

В печатной базе 4 регулярно мы использовали битовую маску 3, чтобы получить цифру. В почтовом коде верхняя строка - это бит младшего разряда этой цифры (битовая маска 1), а нижняя строка - бит старшего разряда (битовая маска 2). Соответственно, rin f(n,r)является битовой маской - наша основная функция вызывает f(m,1)первую и f(m,2)последнюю строки.

Чтобы заставить работать среднюю строку (всегда печатать «|»), мы добавляем ||!rк условию - если r равно 0, оно всегда будет иметь значение true и печатать «|». Затем мы призываем f(m,0)к средней линии.

Наконец, мы хотим, чтобы переводы строки вели себя правильно. Включение extra обходится printfдорого, поскольку байты исходного кода идут, поэтому вместо этого мы добавляем еще один спецификатор% c к существующему printf. n?32:10печатает новую строку, если n равно 0 (false), и пробел в противном случае. 32 и 10 используются вместо '\ n' и '' для сохранения байтов.


1
Вы можете уменьшить его до 146, если не возражаете против предупреждений:f(n,r){n&&f(n>>2);printf("%c%c",n?32:10,(n&r|!r)&&n?'|':32);}main(n){scanf("%d",&n);f(n=(n+(4<<(32-__builtin_clz(n)/2*2)))*16+4,1);f(n,0);f(n,2);}
gastropner


1

PHP, 99 + 1 байт

for($n=10 .base_convert($argn,10,4). 104;(~$c=$n[$i++])||3>$y+=$i=1;)echo" | ||  |||||

"[$c*3+$y];

требует PHP> = 5.5 для индексации литеральной строки и <7.1 для индексации, чтобы не выдавать предупреждение.

Запустите как трубу с -nRили попробуйте онлайн .

Вставьте еще одну новую строку, чтобы получить последний.


Предупреждение: нечисловое значение, встречающееся в [...] [...] в строке 7
RedClover

@Soaku Версия PHP должна быть от 5,5 до 7,0
Titus

1

Python 2, 142 126 байт

B=lambda n:n<4and`n`or B(n/4)+`n%4`
def F(i):
 for r in 0,1,2:print' '.join(" |"[(int(x)%2,1,x>'1')[r]]for x in'10'+B(i)+'10') 

Большое спасибо ovs!

Я пытался не копировать методы других ответов и ... чёрт.



1

C # (.NET Core) , 160 байт

i=>{string s=$"10{B(i)}10",a="";for(int y=0;y<3;y++,a+="\n")foreach(var t in s)a+=t<51&y!=1&t-(y>>1)!=49?"  ":"| ";return a;string B(int n)=>n>0?B(n/4)+n%4:"";}

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

Я уверен, что пропустил некоторые улучшения.

DeGolfed

i=>{
    string s = $"10{B(i)}10", // prepend and append 10 to the base 4 number
           a="";

    for (int y=0; y<3; y++, a+="\n") // go through each row
        foreach (var t in s)         // go through each char digit
            a += t<51 & y != 1 & t-(y>>1) != 49 ? "  " : "| "; // check if bar or space occurs

    return a;

    string B(int n) => n>0? B(n/4) + n%4 : ""; // convert int to base 4
}

t<51 & y != 1 & t-(y>>1) != 49 проверяет, что символ не '3', не вторая строка, а затем некоторая двоичная магия, чтобы увидеть, должен ли первый или третий ряд содержать пробел.





0

C, 120 байтов

К сожалению, работает только на Windows, так как itoaэто слишком удобно для стандартного.

char*p,s[21]="10";g(a){for(p=s;*p;)printf(!a|*p++&a?" |":"  ");puts(p);}f(n){strcat(itoa(n,s+2,4),"10");g(1);g(0);g(2);}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.