내 메일 표시! -ASCII 바코드 | 4 상태 바코드는 일련의 막대입니다. 각 막대를

4 상태 바코드

많은 우편 서비스 (Royal Mail UK, Canada Post, US Mail 등)는 4 가지 상태 바코드를 사용하여 메일 정보를 인코딩합니다. ASCII로 렌더링하면 다음과 같이 보일 수 있습니다.

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

4 상태 바코드는 일련의 막대입니다. 각 막대를 위, 아래 또는 둘 다 확장하여 4 가지 가능성을 허용합니다. 즉, 각 막대는 기본적으로 기본 4 자리를 나타냅니다.

            | |
바 : | | | |
                | |

자리 : 012 3

이 기호의 문제점은 각 바코드가 유효하고 다른 바코드가 거꾸로되어 있다는 것입니다. 방향이 잘못된 경우 의미를 크게 변경합니다. 따라서 시작중지 순서는 일반적으로 구현되므로 스캐너는 읽을 방향을 계산할 수 있습니다.

이 과제를 위해 Australia Post에서 지정한 시작 / 중지 시퀀스를 사용합니다. 각 바코드는 1 0시퀀스로 시작하고 끝납니다 .


도전

당신의 임무는 양의 정수가 주어지면 NASCII 4 상태 바코드로 변환 하는 프로그램이나 함수를 작성하는 것입니다. 여기서 각 막대 (시작 / 정지 시퀀스 제외)는의 기본 4 표현에서 숫자를 나타냅니다 N.

예:

integer가 주어지면 19623먼저이를 기본 4 표현으로 변환합니다 10302213.

그런 다음 각 숫자를 해당 막대에 매핑합니다.

1,030 2 1 3

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

마지막으로 시작 / 중지 시퀀스를 추가합니다.

시작 : 끝 :
1,010

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

결과 바코드는 프로그램의 출력이어야합니다.


규칙 :

  • 입력은 언어의 표준 정수 크기 범위 내에서 양의 정수가됩니다.
  • 출력 :
    • 행 목록이거나 개행을 포함하는 문자열 일 수 있습니다.
    • 모양이 그대로 유지되는 경우 선행 또는 후행 줄 바꿈 / 공백이 포함될 수 있습니다.
    • 위의 형식으로 바코드를 표시해야합니다. 막대를 그릴 때 파이프 문자 ( |)와 공백 문자 ( )를 사용해야하며 각 수직 막대 사이에 1 개의 공백이 있어야합니다.
  • 이것은 이므로 가장 짧은 프로그램 (바이트)이 이깁니다!

테스트 사례

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.


답변

젤리 , 19 바이트

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

온라인으로 사용해보십시오!

Xcoder 씨께 -1 감사합니다 .


답변

옥타브 , 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