Codegolf — Пометить Мою Почту! - Штрих-Коды Ascii

  • Автор темы Maggaver
  • Обновлено
  • 22, Oct 2024
  • #1

4-позиционные штрих-коды

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

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

| | | |     | | | |      

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

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

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

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

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

| | | | | |    
sequence.


Вызов

Ваша задача — написать программу или функцию, которая по положительному целому числу

Start:              End:
1 0                 1 0

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

|   | |   |
, converts it to an ASCII 4-state barcode, where each bar (except for the start/stop sequences) represents a digit in the base-4 representation of
1 0 3 0 2 2 1 3

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

|   | |   |
.

Пример:

Учитывая целое число


|       |
Bar:    |   |   |   |

|   |

Digit:  0   1   2   3
, we would first convert it to its base-4 representation,
|   | |   | | | |   |     |   |
| | | | | | | | | | | | | | | | |

| |   |   | | |   |     |
.

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

|

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

10302213

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


Правила:

  • Ввод будет положительным целым числом в пределах стандартного целочисленного размера вашего языка.
  • Вывод:
    • Может быть либо списком строк, либо строкой, содержащей символы новой строки.
    • Может содержать начальные или конечные символы новой строки/пробелы, если форма остается неизменной.
    • Должен отображаться штрих-код в указанном выше формате — он должен использовать символ вертикальной черты ( 19623 ) and space character () when drawing bars, and there should be 1 space in between each upright bar.
  • Это , поэтому побеждает самая короткая программа (в байтах)!

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

4095:

N

4096:

N

7313145:

1 0

#code-golf #code-golf #string #ascii-art #base-conversion

Maggaver


Рег
30 Jun, 2007

Тем
77

Постов
195

Баллов
590
  • 26, Oct 2024
  • #2

Питон 3, 103 99 96 байт

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4BT.øS2‰э1ýøT„| ‡€S»  | Full program. Takes input from STDIN, outputs to STDOUT.

4B                    | Convert to base 4.

T                   | Push a 10 to the stack.

.ø                 | Surrond (prepend and append the 10 to the base 4 representation).

S                | Split into individual characters/digits.

+---------------------------------------------------------------

| This part used to be ¸4.ø4в˜ in the previous version, which

| means: surround with 4's, convert each to base 4 (4 -> [1, 0])

| and finally deep-flatten the list.

+---------------------------------------------------------------

2‰              | Divmod 2 ([N // 2, N % 2]).

?             | Reverse (element-wise).

1ý           | Add a 1 in the middle (element-wise).

ø          | Transpose.

T„| ‡     | Translate (‡) from "10" (T) to "| " („| ).

€S»  | Format as a grid.

€S   | Push the characters of each.

»  | Join by newlines, while joining inner lists by spaces.

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

 

Dzamirov


Рег
12 Apr, 2014

Тем
63

Постов
173

Баллов
528
  • 26, Oct 2024
  • #3

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

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

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

Объяснение

itoa ||answer||

Желе, 16 15 байт

jjL;CmXX1jk_d1`T"| ".DR2sj[4Q4)4

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

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

s4 +A iA)d1"|| "0" | "2" ||"3'|³ ò3 miR ·y ||answer||

Желе, 19 байт

$x

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

-1 спасибо г-н Кскодер.

 

Александр Сторожок


Рег
23 Oct, 2020

Тем
83

Постов
210

Баллов
655
  • 26, Oct 2024
  • #4

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

y(){for i (${(s//)$(echo 10$(([##4]x))10)});printf "$a[(i+1)] ";echo};a=(' ' '|' ' ' '|');y;a[1]='|';a[3]='|';y;a=(' ' ' ' '|' '|');y

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

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

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

t<51 & y != 1 & t-(y>>1) != 49

Преобразование из двоичного кода в 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 } and is now done by indexing into a string of those two characters - basically the same principle as the lookup table for binary conversion.


* Сэкономлен 1 байт, спасибо @LuisMendo.


Оригинал:

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:"";}

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

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

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

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

Сложным моментом с точки зрения игры в гольф является добавление промежутков между решетками и преобразование из -nR to for($n=10 .base_convert($argn,10,4). 104;(~$c=$n[$i++])||3>$y+=$i=1;)echo" | || ||||| "[$c*3+$y]; .

 

Kansky


Рег
25 Apr, 2006

Тем
66

Постов
148

Баллов
498
  • 26, Oct 2024
  • #5

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

(lambda(n &aux(k`(1 0,@((lambda(n &aux r f)(do()((= n 0)f)(setf(values n r)(floor n 4))(push r f)))n)1 0)))(format t"~3{~{~:[ ~;| ~]~}~%~}"`(,(mapcar'oddp k),k,(mapcar(lambda(c)(> c 1))k))))

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

n?32:10

Как?

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

printf ||answer||

Р, 154 109 байт

printf

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

Сэкономил целую кучу байт путем индексации и использования f(m,0) rather than constructing a matrix and using ||!r , а также 6 из немного другого преобразования в основание 4. Печатает с начальным пробелом в каждой строке и без завершающих символов новой строки.

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

Объяснение:

f(m,2) ||answer||

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

f(m,1)

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

f(n,r)

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

r

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

printf

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

printf

повторно примените divmod, чтобы преобразовать его в обратную базу 4,

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

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

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

Добавьте стартовую последовательность в список.

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

Сопоставьте три строки. Каждая строка представляет собой перевод цифр штрих-кода. 4─10¹:h++{»1F2%¹{Ƨ| W}¹∑ā}⁰H for each row.

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)

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

 

Leonas


Рег
30 Dec, 2006

Тем
69

Постов
198

Баллов
583
  • 26, Oct 2024
  • #6

Япт, 32 31 байт

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

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

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

Объяснение

-S ||answer||

Хаскелл, 91 90 байт

\d |

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


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

1 ||answer||

Дж, 57 49 47 байт

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

0

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

2 - converts the number to a list of base-4 digits, adds 1 0 to the beginning and the end of the list

1 - lookup table for the encryption, binary 0 corresponds to space, 1 to '|'

T`12` `.+$ - encrypts the base 4 digit by selecting a string from the lookup table above (argument reversed)

2 - transposes the resulting array from 3 columns to 3 rows

0 - caps the fork

3 - puts spaces between the bars

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

 

Ooo_nat83


Рег
14 Apr, 2020

Тем
77

Постов
196

Баллов
611
  • 26, Oct 2024
  • #8

05AB1E, 19 байт

1*; $.&

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

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

05AB1E, 20 байт

;

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

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

$ ;1;;

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

 

Ilshat243


Рег
20 Jan, 2024

Тем
69

Постов
191

Баллов
556
  • 26, Oct 2024
  • #10

Дж, 42 40 39 байт

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

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

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

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

.+ $* ||answer||

JavaScript (ES6) 79 байт

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

.+ $* +`(1+)\1{3} ${1}; ^ 1;; $ ;1;; 1*; $.& .+ $&¶$&¶$& T`13` `^.+ T`12` `.+$ \d | 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
 

ZesdentClendy44


Рег
11 Sep, 2014

Тем
81

Постов
235

Баллов
660
  • 26, Oct 2024
  • #11

Баш+coreutils, 71 67 байт

sed

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

Объяснение

n bit converts to base 4, prepending and appending with a 10 (превращается в 4 in the output) and using dc чтобы все было в одной строке.

Остальное происходит в dc -e4ddon?np|sed 's/./& /g;h;y/01/23/;G;y/12/21/;H;x;y/0123/ | |/' :

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

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

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

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

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

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

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

Преобразование в базу 4 как унарные числа, разделенные ' |'[≠\2/2⊖1⍪2 2⊤1 0(,,⊣)4⊥⍣¯1⊢⎕] s.

ðý

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

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

Добавить 4BT.øS4~bT„| ‡øÁ€S» , turning it into a digit terminator rather than a separator, and the stop sequence.

c=a=0,1 n=input() while n:c+=n%4,;n/=4 for l in zip(*[' |'[n%2]+'|'+' |'[n/2]for n in c+a][::-1]):print' '.join(l)

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

(⍉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

Утройте это.

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

В первом ряду, ,.2{."0 s and [: s (представляющие |: s and {~ s) становятся пространствами.

((#:2 6 3 7){' |')

В последнем ряду 1 0,4&#.inv,1,0: s and [:,.2{."0[:|:' |'{~#:@2 6 3 7{~1 0,4&#.inv,1,0: s (представляющие h s=[do a<-4%s++0%0;" | | ||||"!!(x+a):" "|x<-[0,6,4]] s and h s=[do a<-4%s++0%0;x!!a:" "|x<-[" | |","||||"," ||"]] _%0=[1,0] b%n=b%div n b++[mod n b] s) становятся пространствами.

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

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

 

Kungurusha


Рег
22 Nov, 2010

Тем
57

Постов
211

Баллов
516
  • 26, Oct 2024
  • #12

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

25 байт кода, +1 за A¤i2Us4)¬®n s|iS)ù2 w i|1ÃqR² y flag.

⪫E⮌υ§ιλω

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

Объяснение

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

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

Так:

0123 ||answer||

СОГЛ V0.12, 28 байты

E⟦ |¦|¦ ||⟧

Попробуйте здесь!

 

SigaiE


Рег
16 Nov, 2006

Тем
68

Постов
213

Баллов
553
  • 26, Oct 2024
  • #13

С (ГКК), 176 байт

F²⊞υι

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

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

⊞υθ

Объяснение

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

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

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

Вызов функции включен в ¿θ as a trailing argument (it isn't printed, but it is evaluated) to avoid needing to use {} (+2 bytes) to group the F²⊞υι и вызов функции.

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

При регулярной печати базы 4 мы использовали битовую маску 3 для получения цифры. В почтовом коде верхняя строка — это младший бит этой цифры (битовая маска 1), а нижняя строка — старший бит (битовая маска 2). Соответственно, Nθ in NθF²⊞υι¿θWθ«⊞υ﹪θ⁴≧÷⁴θ»⊞υθF²⊞υιE⟦ |¦|¦ ||⟧⪫E⮌υ§ιλω это битовая маска — наши основные вызовы функций 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 for the first line and write для последней строки.

Чтобы средняя строка работала (всегда печатайте «|»), мы добавляем cat to the conditional - if r is 0, it will always evaluate to true and print a "|". Then we call 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)]) для средней линии.

Наконец, мы хотим, чтобы символы новой строки вели себя хорошо. Включая доп. 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 is expensive as far as bytes of source code goes, so instead we add another %c specifier to the existing let f = n=>`| ${(g=(a,k=n)=>k?g(a,k>>2)+(k&a?'| ':' '):' ')(1)}| | |${g(~0)}| | `+g(2) console.log(f(4095)) console.log(f(4096)) console.log(f(7313145)) . n=>`| ${(g=(a,k=n)=>k?g(a,k>>2)+(k&a?'| ':' '):' ')(1)}| | |${g(~0)}| | `+g(2) prints a newline if n is 0 (false), and a space otherwise. 32 and 10 are used instead of '\n' and ' ' to save bytes.

 

Mikegord


Рег
09 Nov, 2011

Тем
65

Постов
181

Баллов
516
  • 26, Oct 2024
  • #15

PHP, 99+1 байт

0/1

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

Запустить как трубу с 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 or попробуй онлайн.

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

 

Arenda2


Рег
14 Apr, 2020

Тем
84

Постов
220

Баллов
670
  • 26, Oct 2024
  • #16

Питон 2, 142 126 байт

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

Огромное спасибо ovs!

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

 

Silver_hawk


Рег
29 Mar, 2011

Тем
60

Постов
174

Баллов
514
  • 26, Oct 2024
  • #17

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

|

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

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

ДеГольфед

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

@(x)' |'(dec2bin([2 6 3 7;~(1:4)](:,[2 1 dec2base(x,4)-47 2 1]))-47)' checks that the char isn't '3', not the second row, and then some binary magic to see if the first or third row should contain the space.

 

Skameika


Рег
01 Jan, 2012

Тем
67

Постов
216

Баллов
591
  • 26, Oct 2024
  • #18

Зш, 156 154 151 133 байт

;4⁺;b4Fd2Uj€1Zị⁾| G

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

Принимает входные данные по основанию 10 из var 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.

 

EdmundoKi


Рег
11 Jun, 2014

Тем
64

Постов
198

Баллов
528
  • 26, Oct 2024
  • #20

Пиф, 32 байта

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

Попробуйте здесь!

 

Javlon


Рег
21 Jan, 2005

Тем
89

Постов
183

Баллов
668
  • 26, Oct 2024
  • #21

С, 120 байт

К сожалению, работает только в Windows, так как TFiK_YAyhhH&\EQE+t~vB!P'|'*c is too much of a convenience to be standard.

def f(i,r=[]): while i:r=[' | ||||| ||'[i%4::4]]+r;i//=4 k='|| ',' | ';[*map(print,*k,*r,*k)]
 

Kupec


Рег
01 Apr, 2011

Тем
69

Постов
196

Баллов
551
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно