Đánh dấu thư của tôi! - Mã vạch ASCII


39

Mã vạch 4 trạng thái

Nhiều dịch vụ bưu chính (Royal Mail UK, Canada Post, US Mail, v.v.) sử dụng mã vạch 4 trạng thái để mã hóa thông tin về thư của họ. Được hiển thị trong ASCII, nó có thể trông giống như thế này:

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

Mã vạch 4 trạng thái là một hàng thanh. Mỗi thanh có thể được mở rộng lên trên, xuống dưới hoặc cả hai, cho phép 4 khả năng. Điều này có nghĩa là mỗi thanh cơ bản đại diện cho một chữ số 4 cơ sở:

            | |
Thanh: | | | |
                | |

Chữ số: 0 1 2 3

Vấn đề với hệ thống ký hiệu này là mỗi mã vạch là một mã vạch hợp lệ, khác nhau lộn ngược: thay đổi mạnh mẽ ý nghĩa nếu định hướng không chính xác. Do đó, một chuỗi bắt đầudừng thường được triển khai để máy quét có thể tính toán được đọc theo cách nào.

Với mục đích của thử thách này, chúng tôi sẽ sử dụng chuỗi bắt đầu / dừng được chỉ định bởi Australia Post: mỗi mã vạch bắt đầu và kết thúc bằng một 1 0chuỗi.


Các thách thức

Nhiệm vụ của bạn là viết một chương trình hoặc hàm, với một số nguyên dương N, chuyển đổi nó thành mã vạch 4 trạng thái ASCII, trong đó mỗi thanh (ngoại trừ các chuỗi bắt đầu / dừng) biểu thị một chữ số trong biểu diễn cơ sở-4 của N.

Thí dụ:

Với số nguyên 19623, trước tiên chúng ta sẽ chuyển đổi nó thành biểu diễn cơ sở 4 của nó , 10302213.

Sau đó chúng tôi sẽ ánh xạ từng chữ số vào thanh tương ứng:

1 0 3 0 2 2 1 3

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

Cuối cùng, chúng tôi sẽ thêm các chuỗi bắt đầu / dừng:

Bắt đầu: Kết thúc:
1 0 1 0

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

Mã vạch kết quả phải là đầu ra của chương trình.


Quy tắc:

  • Đầu vào sẽ là một số nguyên dương, trong phạm vi kích thước số nguyên tiêu chuẩn của ngôn ngữ của bạn.
  • Đầu ra:
    • Có thể là một danh sách các dòng hoặc một chuỗi chứa các dòng mới.
    • Có thể chứa dòng mới / dấu cách hàng đầu hoặc dấu, miễn là hình dạng vẫn còn nguyên.
    • Phải hiển thị mã vạch với định dạng trên - nó phải sử dụng ký tự ống ( |) và ký tự khoảng trắng ( ) khi vẽ các thanh và phải có 1 khoảng trắng ở giữa mỗi thanh thẳng đứng.
  • Đây là , vì vậy chương trình ngắn nhất (tính bằng byte) sẽ thắng!

Các trường hợp thử nghiệm

4095:

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

4096:

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

7313145:

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

Không gian hàng đầu được phép? ;)
Erik the Outgolfer

@FlipTack Vấn đề với hệ thống ký hiệu này - bạn chưa thấy The Boondock Saints, phải không?
Lord Farquaad

@EriktheOutgolfer Miễn là mã vạch thực tế, như một ma trận 2D của các ký tự, còn nguyên vẹn, nó có thể có nhiều khoảng trắng trước hoặc sau khi cần thiết.
FlipTack

Các thử thách liên quan đến mã vạch khác: 1 , 2 , 3
FlipTack

Đầu ra có thể có số không hàng đầu?
dùng230118

Câu trả lời:



9

MATL , 34 30 29 28 byte

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

Hãy thử trực tuyến!

Giải trình

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

Thạch , 16 15 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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.

Chuỗi này dài 15 ký tự unicode, làm sao nó có thể là 15 byte?
jmster

2
@jmster Jelly có codepage riêng
Ông Xcoder

@jmster Đây không phải là nhân vật thực tế. Chương trình là 15 byte cụ thể, trong đó có các ký hiệu này. So sánh nó với Bubblegum, nó trông giống như .......nhưng mỗi dấu chấm là một byte khác nhau.
FrownyFrog

Tại sao bitwise HOẶC thay vì thêm?
FrownyFrog

@FrownyFrog Cả hai sẽ làm việc. Vì bước tiếp theo là chuyển đổi sang nhị phân, tôi đã sử dụng toán tử bitwise.
Dennis


7

Octave , 78 77 75 74 70 69 byte

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

Hãy thử trực tuyến!

Không giống như cách tiếp cận ban đầu, cách này sử dụng bảng tra cứu đơn giản để ánh xạ các giá trị cơ sở 4 lên tương đương nhị phân của chúng. Bảng tra cứu cũng thêm khoảng cách giữa mỗi thanh bằng cách thêm một số 0 ở giữa mỗi số (ánh xạ tới một thanh của tất cả các khoảng trắng).

Bảng tra cứu trực tiếp ánh xạ tới các thanh như:

   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

Chuyển đổi từ nhị phân sang | hiện được thực hiện bằng cách lập chỉ mục thành một chuỗi gồm hai ký tự đó - về cơ bản giống như bảng tra cứu chuyển đổi nhị phân.


* Đã lưu 1 byte, cảm ơn @LuisMendo


Nguyên:

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

Hãy thử trực tuyến!

Hàm ẩn danh trả về mã vạch dưới dạng chuỗi.

Điều này dựa trên thực tế là nếu chúng ta thêm 4 vào các chữ số cơ sở 4, thì chúng ta có thể biểu diễn thanh / dấu cách bằng số được chuyển đổi thành nhị phân với các bit 1 và 2 được hoán đổi:

   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

Một chút khó khăn từ góc độ chơi gôn là thêm khoảng cách giữa các thanh và chuyển đổi từ 0/1sang '|'/' '.


1
@LuisMendo thông minh! Cảm ơn.
Tom Carpenter

7

JavaScript (ES6), 89 87 83 byte

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

Các trường hợp thử nghiệm

Làm sao?

Lưu ý : Trong phiên bản bên dưới, các mẫu chữ đã được thay thế bằng các chuỗi tiêu chuẩn để mã có thể được thụt lề đúng cách.

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

Tôi rất muốn thấy câu trả lời này được giải thích, có một số điều kỳ lạ đang diễn ra: P
Brian H.

@BrianH. Tôi đã thêm một lời giải thích.
Arnauld

4

R , 154 109 byte

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

Hãy thử trực tuyến!

Đã lưu cả đống byte bằng cách lập chỉ mục và sử dụng catthay vì xây dựng ma trận và sử dụng write, cũng như 6 từ một chuyển đổi hơi khác nhau sang cơ sở 4. In với một khoảng trắng ở mỗi hàng và không có dòng mới.

Việc lập chỉ mục diễn ra bằng cách sử dụng một số số học mô-đun, không giống như một số câu trả lời khác, nhưng vì R sử dụng lập chỉ mục dựa trên 1, nên số học có phần khác nhau.

Giải trình:

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

Than , 50 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

Nθ

Nhập một số.

F²⊞υι

Đẩy chuỗi dừng vào danh sách trống được xác định trước.

¿θ

Nếu số dương,

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

liên tục áp dụng divmod để chuyển đổi nó thành cơ sở 4 đảo ngược,

  ⊞υθ

Nếu không thì chỉ cần đẩy nó.

F²⊞υι

Đẩy trình tự bắt đầu vào danh sách.

E⟦ |¦|¦  ||⟧

Bản đồ trên ba chuỗi. Mỗi chuỗi đại diện cho dịch mã vạch cho các chữ số 0123cho mỗi hàng.

⪫E⮌υ§ιλω

Ánh xạ qua các chữ số (đảo ngược trở lại theo thứ tự thông thường), chuyển đổi chúng thành các thanh hoặc khoảng trắng bằng cách sử dụng bản dịch, sau đó nối các kết quả thành ba chuỗi sau đó được in ngầm trên các dòng riêng biệt.


3

Japt , 32 31 byte

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

Kiểm tra nó trực tuyến!

Chưa thực sự hài lòng với điều này, nhưng đó là một khởi đầu ...

Giải trình

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 byte của bạn làm cho tôi cảm thấy tốt hơn một chút về mớ hỗn độn này ! Tôi thực sự không nên cố gắng chơi golf trong khi cả phục vụ và uống rượu!
Shaggy

3

Haskell , 91 90 byte

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

Hãy thử trực tuyến! Trả về một danh sách các dòng.


Thay thế số byte tương tự cho dòng đầu tiên:

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

3

J , 57 49 47 byte

10 byte nhờ FrownyFrog!

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

Làm thế nào nó hoạt động:

1 0,4&#.inv,1,0: - chuyển đổi số thành danh sách gồm 4 chữ số cơ bản, thêm 1 0 vào đầu và cuối danh sách

((#:2 6 3 7){' |') - bảng tra cứu mã hóa, nhị phân 0 tương ứng với khoảng trắng, 1 đến '|'

{~ - mã hóa 4 chữ số cơ bản bằng cách chọn một chuỗi từ bảng tra cứu ở trên (đảo ngược đối số)

|: - hoán chuyển mảng kết quả từ 3 cột thành 3 hàng

[: - mũ ngã ba

,.2{."0 - đặt khoảng trống giữa các thanh

Hãy thử trực tuyến!


@FrownyFrog Cảm ơn bạn!
Galen Ivanov

2

APL + THẮNG, 63 byte

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

Giải trình:

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

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

Hãy thử trực tuyến!

Đây là một nửa cổng theo cách tiếp cận của Dennis, chỉ ngắn hơn một byte so với phương pháp tôi đã sử dụng trước đây (mà tôi khá hài lòng):

05AB1E , 20 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động?

4BT.øS2 ‰ í1ýøT „| ‡ € S »| Chương trình đầy đủ. Lấy đầu vào từ STDIN, đầu ra thành STDOUT.

4B | Chuyển đổi sang cơ sở 4.
  T | Đẩy một số 10 vào ngăn xếp.
   .ø | Surrond (thêm và thêm 10 vào đại diện cơ sở 4).
     S | Chia thành các ký tự / chữ số riêng lẻ.
                      + ------------------------------------------------- --------------
                      | Phần này từng là ¸4.ø4в trong phiên bản trước, phần này
                      | có nghĩa là: bao quanh với 4, chuyển đổi từng cơ sở thành 4 (4 -> [1, 0])
                      | và cuối cùng làm phẳng danh sách.
                      + ------------------------------------------------- --------------
      2 | Divmod 2 ([N // 2, N% 2]).
        í | Đảo ngược (yếu tố khôn ngoan).
         1ý | Thêm 1 ở giữa (yếu tố khôn ngoan).
           ø | Chuyển vị.
            T „| ‡ | Dịch (‡) từ "10" (T) sang "|" („|).
                 € S »| Định dạng như một lưới.
                 € S | Đẩy các nhân vật của mỗi.
                   »| Tham gia theo dòng mới, trong khi tham gia danh sách bên trong theo không gian.

Tôi đã hỏi Adnan (người tạo ra 05AB1E) về vấn đề lưới trong trò chuyện và họ đã giúp tôi tiết kiệm 2 byte, bằng cách chỉ ra một tính năng của 05AB1E: khi tham gia các danh sách đa chiều theo dòng mới, các danh sách bên trong cũng được nối bằng cách sử dụng khoảng trắng , như vậy ðýlà không cần thiết.


2

APL (Dyalog Classic) , 33 byte

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

Hãy thử trực tuyến!


Ồ, đó là cách bạn phải vây quanh với 1 0 ...
FrownyFrog

Vì vậy, 2⊥⍣¯1làm thế nào bạn có được một danh sách nhị phân?
FrownyFrog

@FrownyFrog Không có cách nào thực sự để bao quanh. Có, 2⊥⍣¯1là nghịch đảo ("đối diện"?) Của "hai giải mã". Nó mã hóa thành nhị phân với càng nhiều bit càng cần thiết.
ngn

2

J , 42 40 39 byte

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

Cạo 2 byte nhờ Dennis. 1 byte nhờ ngn.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

                                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 byte

Sử dụng .toString để chuyển đổi số thành cơ sở 4, sau đó casework với từng dòng và theo chiều bit HOẶC để xây dựng dòng đầu ra theo dòng. Xuất ra một danh sách các dòng.

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
Cách tiếp cận tuyệt vời với bản đồ và bitwise HOẶC! Bạn có thể lưu toàn bộ byte bằng cách sử dụng `10${n.toString(4)}10`:)
Chris M

2

Bash + coreutils, 71 67 byte

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

Hãy thử trực tuyến!

Giải trình

Các dccải chút để cơ sở 4, thêm vào trước và phụ thêm với một 4(lần lượt vào 10trong đầu ra) và sử dụng nđể giữ cho mọi thứ trên cùng một dòng.

Phần còn lại xảy ra trong 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
Chuyển đổi phần sau dc hoàn toàn thành sed tiết kiệm một vài byte, tio.run/##S0oszvj/PyVZQTfVJCUlP88@r6CmODVFQb1YX09fTUE/ của
Kritixi Lithos

Rất đẹp! Tôi đã thử một cái gì đó tương tự nhưng tôi tiếp tục thử nhiều cách thông minh khác nhau bằng cách sử dụng khoảng cách xgiữ / mẫu xung quanh để sửa đổi chúng và sau đó làm stất cả cùng một lúc, và không có gì kết thúc ngắn hơn.
Sophia Lechner

@Cowsquack Tôi thậm chí còn quản lý để giảm thêm hai byte dựa trên ý tưởng của bạn!
Sophia Lechner

Ý tưởng tuyệt vời về việc kết hợp các phiên âm, +1
Kritixi Lithos

1

Võng mạc , 83 byte

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm nhanh hơn. Giải trình:

.+
$*

Chuyển đổi sang unary.

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

Chuyển đổi sang cơ sở 4 dưới dạng số đơn nguyên cách nhau bởi ;s.

^
1;;

Chuẩn bị trình tự bắt đầu.

$
;1;;

Nối một ;, biến nó thành một dấu kết thúc chữ số chứ không phải là dấu phân cách và chuỗi dừng.

1*;
$.&

Chuyển đổi thành số thập phân, nhưng thêm 1 vào mỗi chữ số.

.+
$&¶$&¶$&

Tăng gấp ba lần nó.

T`13` `^.+

Trên hàng đầu tiên, 1s và 3s (đại diện cho 0s và 2s) trở thành khoảng trắng.

T`12` `.+$

Trên hàng cuối cùng, 1s và 2s (đại diện cho 0s và 1s) trở thành khoảng trắng.

\d
|

Tất cả các chữ số khác trở thành thanh.


1

Pip , 33 31 29 27 26 byte

25 byte mã, +1 cho -Scờ.

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

Hãy thử trực tuyến!

Giải trình

Chúng tôi quan sát một mô hình trong bốn loại thanh:

  • Hàng đầu tiên là khoảng trắng nếu chữ số chẵn, ống nếu lẻ.
  • Hàng thứ hai luôn là một đường ống.
  • Hàng thứ ba là khoảng trắng nếu chữ số là 0 hoặc 1, ống nếu 2 hoặc 3.

Vì thế:

                           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 byte

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

Hãy thử trực tuyến!

Hơi ít định dạng khủng khiếp (ít chơi gô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);
}

Giải trình

Trước tiên, hãy xem xét đoạn mã sau để đọc một số nguyên và xuất phiên bản cơ sở 4:

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

Điều này sử dụng đệ quy đuôi để đảo ngược thứ tự đầu ra. Mỗi bước bit đệ quy tăng thêm 2 (bỏ 2 bit cuối cùng và chia cho 4). Nó đưa ra kết quả bitmasked với 3 (0b11), chỉ hiển thị hai bit cuối cùng, là chữ số cơ sở 4 cuối cùng.

Lệnh gọi hàm được bao gồm trong printfđối số theo dõi (nó không được in, nhưng nó được ước tính) để tránh phải sử dụng {} (+2 byte) để nhóm printfvà gọi hàm.

Giải pháp ở đây mở rộng mã cơ sở 4 này. Đầu tiên, m được định nghĩa là n, nhưng như vậy trong cơ sở 4, nó sẽ có 10 được thêm vào và gắn vào nó. Chúng tôi sau đó in m.

Trong cơ sở in 4 thường xuyên, chúng tôi đã sử dụng bitmask 3 để lấy chữ số. Trong mã thư, dòng trên cùng là bit thứ tự thấp của chữ số (bitmask là 1) và dòng dưới cùng là bit thứ tự cao (bitmask là 2). Theo đó, rin f(n,r)là bitmask - hàm chính của chúng ta gọi f(m,1)cho dòng đầu tiên và f(m,2)cho dòng cuối cùng.

Để làm cho dòng giữa hoạt động (luôn in "|"), chúng tôi thêm ||!rvào điều kiện - nếu r bằng 0, nó sẽ luôn luôn đánh giá là đúng và in "|". Sau đó, chúng tôi gọi f(m,0)cho đường giữa.

Cuối cùng, chúng tôi muốn dòng mới để hành xử. Bao gồm một phần bổ sung printfrất tốn kém theo byte của mã nguồn, vì vậy thay vào đó chúng tôi thêm một công cụ xác định% c khác vào hiện tại printf. n?32:10in một dòng mới nếu n bằng 0 (sai) và khoảng trắng khác. 32 và 10 được sử dụng thay vì '\ n' và '' để lưu byte.


1
Bạn có thể giảm xuống còn 146 nếu bạn không 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);}
bận

1

Lisp thông thường, 191 byte

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

Hãy thử trực tuyến!


1

PHP, 99 + 1 byte

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

"[$c*3+$y];

yêu cầu PHP> = 5.5 để lập chỉ mục chuỗi bằng chữ và <7.1 cho việc lập chỉ mục để không đưa ra cảnh báo.

Chạy như ống với -nRhoặc thử trực tuyến .

Chèn thêm một dòng mới để có được một dấu.


Cảnh báo: Một giá trị không phải là số gặp phải trong [...] [...] trên dòng 7
RedClover

Phiên bản @Soaku PHP phải từ 5.5 đến 7.0
Titus

1

Python 2, 142 126 byte

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

Cảm ơn rất nhiều đến những quả trứng!

Tôi đã cố gắng không sao chép các phương pháp của câu trả lời khác và ... yuck.



1

C # (.NET Core) , 160 byte

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

Hãy thử trực tuyến!

Tôi chắc chắn tôi đã bỏ lỡ một số cải tiến.

Khói

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 kiểm tra xem char không phải là '3', không phải hàng thứ hai, và sau đó một số phép thuật nhị phân để xem hàng thứ nhất hoặc thứ ba có nên chứa khoảng trắng không.


1

Zsh , 156 154 151 133 byte

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

Hãy thử trực tuyến!

Lấy đầu vào cơ sở 10 từ var $x




0

C, 120 byte

Đáng buồn là chỉ hoạt động trên Windows, vì itoaquá nhiều tiện lợi là tiêu chuẩn.

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);}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.