4 상태 바코드
많은 우편 서비스 (Royal Mail UK, Canada Post, US Mail 등)는 4 가지 상태 바코드를 사용하여 메일 정보를 인코딩합니다. ASCII로 렌더링하면 다음과 같이 보일 수 있습니다.
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
4 상태 바코드는 일련의 막대입니다. 각 막대를 위, 아래 또는 둘 다 확장하여 4 가지 가능성을 허용합니다. 즉, 각 막대는 기본적으로 기본 4 자리를 나타냅니다.
| | 바 : | | | | | | 자리 : 012 3
이 기호의 문제점은 각 바코드가 유효하고 다른 바코드가 거꾸로되어 있다는 것입니다. 방향이 잘못된 경우 의미를 크게 변경합니다. 따라서 시작 및 중지 순서는 일반적으로 구현되므로 스캐너는 읽을 방향을 계산할 수 있습니다.
이 과제를 위해 Australia Post에서 지정한 시작 / 중지 시퀀스를 사용합니다. 각 바코드는 1 0
시퀀스로 시작하고 끝납니다 .
도전
당신의 임무는 양의 정수가 주어지면 N
ASCII 4 상태 바코드로 변환 하는 프로그램이나 함수를 작성하는 것입니다. 여기서 각 막대 (시작 / 정지 시퀀스 제외)는의 기본 4 표현에서 숫자를 나타냅니다 N
.
예:
integer가 주어지면 19623
먼저이를 기본 4 표현으로 변환합니다 10302213
.
그런 다음 각 숫자를 해당 막대에 매핑합니다.
1,030 2 1 3 | | | | | | | | | | | | | | | |
마지막으로 시작 / 중지 시퀀스를 추가합니다.
시작 : 끝 : 1,010 | | | | | | | | | | | | | | | | | | | | | |
결과 바코드는 프로그램의 출력이어야합니다.
규칙 :
- 입력은 언어의 표준 정수 크기 범위 내에서 양의 정수가됩니다.
- 출력 :
- 행 목록이거나 개행을 포함하는 문자열 일 수 있습니다.
- 모양이 그대로 유지되는 경우 선행 또는 후행 줄 바꿈 / 공백이 포함될 수 있습니다.
- 위의 형식으로 바코드를 표시해야합니다. 막대를 그릴 때 파이프 문자 (
|
)와 공백 문자 ()를 사용해야하며 각 수직 막대 사이에 1 개의 공백이 있어야합니다.
- 이것은 code-golf 이므로 가장 짧은 프로그램 (바이트)이 이깁니다!
테스트 사례
4095 :
| | | | | | | | | | | | | | | | | | | | | | | |
4096 :
| | | | | | | | | | | | | |
7313145 :
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
답변
파이썬 3 , 103 99 96 바이트
def f(i,r=[]):
while i:r=[' | ||||| ||'[i%4::4]]+r;i//=4
k='|| ',' | ';[*map(print,*k,*r,*k)]
답변
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
답변
젤리 , 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.
답변
답변
옥타브 , 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 값을 이진 값으로 매핑합니다. 또한 룩업 테이블은 각 숫자 사이에 0을 추가하여 각 막대 사이의 간격을 추가합니다 (모든 공간의 막대에 매핑 됨).
조회 테이블은 다음과 같이 막대에 직접 매핑됩니다.
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]
바코드를 문자열로 반환하는 익명 함수
이것은 우리가 base4 숫자에 4를 더하면 비트 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
로 변환하는 것 '|'/' '
입니다.
답변
자바 스크립트 (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
답변
R , 154109 바이트
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
기본 4 로의 약간 다른 변환에서 6을 사용하는 대신 전체 바이트 수를 절약했습니다.
인덱싱은 다른 답변과 달리 모듈 식 산술을 사용하여 수행되지만 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