Позначити мою пошту! - штрих-коди ASCII


39

4-штатні штрих-коди

Багато поштових служб (Royal Mail UK, Canada Post, US Mail тощо) використовують 4-штатний штрих-код для кодування інформації про свою пошту. Наданий у ASCII, це може виглядати приблизно так:

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

4-штатний штрих-код - це рядок смужок. Кожна планка може бути розширена вгору, вниз або обидва, що дозволяє 4 можливості. Це означає, що кожен штрих по суті представляє базовий 4-значний розряд:

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

Цифра: 0 1 2 3

Проблема цієї символіки полягає в тому, що кожен штрих-код є дійсним, різним штрих-кодом догори ногами: різко змінюючи значення, якщо орієнтація неправильна. Отже, послідовність запуску та зупинки зазвичай реалізується, щоб сканер міг обчислити, яким саме способом його слід читати.

Для цього завдання ми будемо використовувати послідовність старту / зупинки, визначену Australia Post: кожен штрих-код починається і закінчується 1 0послідовністю.


Змагання

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

Приклад:

З огляду на ціле число 19623, ми спершу перетворимо його на його базове представлення 4 10302213.

Потім ми будемо відображати кожну цифру у відповідній смужці:

1 0 3 0 2 2 1 3

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

Нарешті, ми додамо послідовності старту / зупинки:

Початок: Кінець:
1 0 1 0

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

Отриманий штрих-код повинен бути результатом програми.


Правила:

  • Введене число буде додатним цілим числом у межах стандартного цілого розміру вашої мови.
  • Вихід:
    • Це може бути або список рядків, або рядок, що містить нові рядки.
    • Може містити провідні чи зворотні рядки / пробіли, якщо форма залишається цілою.
    • Якщо штрих-код повинен бути вказаний у наведеному вище форматі - він повинен використовувати символ "труба" ( |) та пробіл ( ) під час малювання смуг, а між кожним вертикальним штрихом повинно бути 1 пробіл.
  • Це , тому найкоротша програма (у байтах) виграє!

Випробування

4095:

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

4096:

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

7313145:

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

Дозволені провідні місця? ;)
Ерік Аутгольфер

@FlipTack Проблема з цією символікою - ви ще не бачили святих Boondock, чи не так?
Lord Farquaad

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

Інші виклики, пов’язані зі штрих-кодом: 1 , 2 , 3
FlipTack

Чи може вихід має нульові нулі?
user230118

Відповіді:



9

MATL , 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 символів unicode, як це може бути 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)

Тестові справи

Як?

Примітка . У наведеній нижче версії літерали шаблону були замінені на стандартні рядки, щоб код міг бути відступним належним чином.

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

я хотів би, щоб ця відповідь була пояснена, є деякі дивні речі: P
Брайан Х.

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


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

{~ - зашифровує базовий чотиризначний, вибираючи рядок із таблиці пошуку вище (аргумент повернений)

|: - переміщує отриманий масив з 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.

4В | Перетворити на базу 4.
  Т | Притисніть 10 до стека.
   .ø | Surrond (додайте та додайте 10 до базового 4 подання).
     S | Розділити на окремі символи / цифри.
                      + ------------------------------------------------- --------------
                      | Ця частина раніше була ¸4.ø4в˜ у попередній версії, яка
                      | означає: оточити 4, перетворити кожен на базовий 4 (4 -> [1, 0])
                      | і нарешті глибоко сплюстити список.
                      + ------------------------------------------------- --------------
      2 ‰ | Divmod 2 ([N // 2, N% 2]).
        í | Зворотний (елементний).
         1ý | Додайте 1 посередині (по мірі елементів).
           ø | Перенести.
            Т „| ‡ | Перекласти (‡) з "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є зворотним ("аверсом"?) "Дводекодування". Він кодує у двійковий стільки, скільки потрібно.
ngn

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

Додайте a ;, перетворивши його в цифрний термінатор, а не роздільник, та послідовність зупинки.

1*;
$.&

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

.+
$&¶$&¶$&

Утраяйте його.

T`13` `^.+

На першому рядку 1s і 3s (представляють 0s і 2s) стають пробілами.

T`12` `.+$

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

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

Пояснення

Спочатку розглянемо наступний код для зчитування цілого числа та виведення базової версії 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та виклику функції.

Рішення тут поширює цей базовий код-4. По-перше, m визначається як n, але такий, що в базі 4 він буде мати 10 попередніх і доданих до нього. Потім друкуємо m.

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

Щоб робота середнього рядка (завжди друкувалася "|"), ми додаємо ||!rдо умовного - якщо r дорівнює 0, воно завжди буде оцінювати як істинне та друкувати "|". Потім закликаємо f(m,0)до середньої лінії.

Нарешті, ми хочемо, щоб поводилися нові лінії. Включення додаткового 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
Тіт

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

Велика подяка овам!

Я намагався не скопіювати методи інших відповідей і ... юк.



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.