Tandai Email Saya! - Barcode ASCII

39

Barcode 4-negara

Banyak layanan pos (Royal Mail UK, Canada Post, US Mail, dll) menggunakan barcode 4-negara untuk menyandikan informasi tentang email mereka. Diberikan dalam ASCII, mungkin terlihat seperti ini:

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

Barcode 4-negara adalah deretan bar. Setiap bilah dapat diperpanjang ke atas, ke bawah, atau keduanya, memungkinkan 4 kemungkinan. Ini berarti bahwa setiap bilah pada dasarnya mewakili basis 4 digit:

            | |
Bar: | | | |
                | |

Digit: 0 1 2 3

Masalah dengan simbologi ini adalah bahwa setiap barcode adalah barcode terbalik yang valid dan berbeda: secara drastis mengubah makna jika orientasinya salah. Oleh karena itu, urutan mulai dan berhenti biasanya diterapkan sehingga pemindai dapat menghitung ke mana seharusnya dibaca.

Untuk tujuan tantangan ini, kami akan menggunakan urutan start / stop yang ditentukan oleh Australia Post: setiap barcode dimulai dan diakhiri dengan 1 0urutan.


Tantangan

Tugas Anda adalah menulis sebuah program atau fungsi yang, diberi bilangan bulat positif N, mengubahnya menjadi barcode ASCII 4-state, di mana setiap bilah (kecuali untuk urutan start / stop) mewakili angka dalam representasi basis-4 dari N.

Contoh:

Dengan bilangan bulat 19623, pertama-tama kita akan mengubahnya menjadi representasi basis-4 10302213,.

Kami kemudian akan memetakan setiap digit ke bilah yang sesuai:

1 0 3 0 2 2 1 3

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

Akhirnya, kami akan menambahkan urutan start / stop:

Mulai: Akhir:
1 0 1 0

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

Barcode yang dihasilkan harus menjadi output program.


Aturan:

  • Input akan berupa bilangan bulat positif, dalam kisaran ukuran bilangan bulat standar bahasa Anda.
  • Hasil:
    • Bisa berupa daftar baris, atau string yang berisi baris baru.
    • Dapat berisi baris / spasi depan atau akhir, asalkan bentuknya tetap utuh.
    • Harus memperlihatkan kode batang dengan format di atas - harus menggunakan karakter pipa ( |) dan karakter spasi ( ) saat menggambar bilah, dan harus ada 1 spasi di antara setiap bilah tegak.
  • Ini adalah , jadi program terpendek (dalam byte) menang!

Uji Kasus

4095:

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

4096:

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

7313145:

| | | | | | | | | |  
| | | | | | | | | | | | | | | |
      | | | | | | | |      
FlipTack
sumber
Ruang pemimpin diizinkan? ;)
Erik the Outgolfer
@FlipTack Masalah dengan simbologi ini - Anda belum melihat The Boondock Saints, bukan?
Lord Farquaad
@EriktheOutgolfer Selama barcode yang sebenarnya, sebagai matriks 2D karakter, masih utuh, ia dapat memiliki banyak ruang sebelum atau sesudahnya sesuai kebutuhan.
FlipTack
Tantangan terkait barcode lainnya: 1 , 2 , 3
FlipTack
Bisakah output memiliki angka nol di depan?
user230118

Jawaban:

9

Python 3 , 103 99 96 byte

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

Cobalah online!

ovs
sumber
9

MATL , 34 30 29 28 byte

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

Cobalah online!

Penjelasan

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
Luis Mendo
sumber
8

Jelly , 16 15 byte

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

Cobalah online!

Bagaimana itu bekerja

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.
Dennis
sumber
String ini panjangnya 15 karakter unicode, bagaimana bisa 15 byte?
jmster
2
@jmster Jelly memiliki codepage sendiri
Tn. Xcoder
@ jmster Ini bukan karakter yang sebenarnya. Program ini 15 byte spesifik, yang memiliki mnemonik ini. Bandingkan dengan Bubblegum, sebagian besar kelihatannya .......tetapi setiap titik mewakili byte yang berbeda.
FrownyFrog
Mengapa bitwise ATAU bukannya menambahkan?
FrownyFrog
@ FrownyFrog Keduanya akan bekerja. Karena langkah selanjutnya adalah konversi ke biner, saya pergi dengan operator bitwise.
Dennis
7

Jelly , 19 byte

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

Cobalah online!

-1 terima kasih kepada Tn . Xcoder .

Erik the Outgolfer
sumber
7

Oktaf , 78 77 75 74 70 69 byte

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

Cobalah online!

Berbeda dengan pendekatan asli, yang satu ini menggunakan tabel pencarian sederhana untuk memetakan nilai basis-4 ke dalam persamaan binernya. Tabel pencarian juga menambahkan spasi antara setiap bilah dengan menambahkan nol di antara setiap bilangan (yang memetakan ke bilah semua spasi).

Tabel pencarian langsung memetakan ke bar sebagai:

   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

Konversi dari biner ke |dan  sekarang dilakukan dengan mengindeks ke dalam string dari dua karakter - pada dasarnya prinsip yang sama dengan tabel pencarian untuk konversi biner.


* Disimpan 1 byte, terima kasih @LuisMendo


Asli:

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

Cobalah online!

Fungsi anonim yang mengembalikan kode batang sebagai string.

Ini didasarkan pada fakta bahwa jika kita menambahkan 4 ke angka base4, maka kita dapat mewakili bar / spasi dengan jumlah yang dikonversi menjadi biner dengan bit 1 dan 2 yang ditukar:

   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

Bagian yang sulit dari perspektif golf adalah menambahkan spasi di antara bar dan mengubah dari 0/1menjadi '|'/' '.

Tom Carpenter
sumber
1
@LuisMendo pintar! Terima kasih.
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)

Uji kasus

Bagaimana?

NB : Dalam versi di bawah ini, literal template telah diganti dengan string standar sehingga kode dapat diindentasi dengan benar.

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
Arnauld
sumber
Saya ingin melihat jawaban ini menjelaskan, ada beberapa hal aneh yang terjadi: P
Brian H.
@BrianH. Saya telah menambahkan penjelasan.
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)])

Cobalah online!

Menyimpan sejumlah byte dengan mengindeks dan menggunakan cat daripada membangun matriks dan menggunakan write, serta 6 dari konversi yang sedikit berbeda ke basis 4. Mencetak dengan ruang terdepan di setiap baris dan tidak mengikuti baris baru.

Pengindeksan berlangsung menggunakan beberapa aritmatika modular, tidak seperti beberapa jawaban lain, tetapi karena R menggunakan pengindeksan berbasis 1, aritmatika agak berbeda.

Penjelasan:

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

Giuseppe
sumber
3

Arang , 50 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

Nθ

Masukkan nomor.

F²⊞υι

Dorong urutan berhenti ke daftar kosong yang telah ditentukan.

¿θ

Jika angkanya positif,

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

berulang kali terapkan divmod untuk mengubahnya menjadi basis 4 yang dibalik,

  ⊞υθ

kalau tidak, cukup dorong saja.

F²⊞υι

Dorong urutan mulai ke daftar.

E⟦ |¦|¦  ||⟧

Petakan lebih dari tiga string. Setiap string mewakili terjemahan barcode untuk digit0123 untuk setiap baris.

⪫E⮌υ§ιλω

Peta di atas digit (dibalik kembali menjadi urutan yang biasa), ubah menjadi bar atau spasi menggunakan terjemahan, kemudian gabungkan hasilnya menjadi tiga string yang kemudian dicetak secara tersirat pada baris yang berbeda.

Neil
sumber
3

Japt , 32 31 byte

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

Uji secara online!

Belum benar-benar puas dengan ini, tapi ini awal ...

Penjelasan

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
Produksi ETH
sumber
32 byte Anda membuat saya merasa sedikit lebih baik tentang kekacauan lengkap ini ! Saya benar-benar tidak boleh mencoba bermain golf sambil menyajikan dan minum bir!
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]

Cobalah online! Mengembalikan daftar garis.


Alternatif jumlah byte yang sama untuk baris pertama:

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

J , 57 49 47 byte

10 byte berkat FrownyFrog!

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

Bagaimana itu bekerja:

1 0,4&#.inv,1,0: - Mengonversi angka menjadi daftar digit basis-4, menambahkan 1 0 ke awal dan akhir daftar

((#:2 6 3 7){' |') - tabel pencarian untuk enkripsi, biner 0 sesuai dengan ruang, 1 hingga '|'

{~ - mengenkripsi digit basis 4 dengan memilih string dari tabel pencarian di atas (argumen dibalik)

|: - transpos array yang dihasilkan dari 3 kolom ke 3 baris

[: - tutup garpu

,.2{."0 - Menempatkan spasi di antara bar

Cobalah online!

Galen Ivanov
sumber
@FrownyFrog Terima kasih!
Galen Ivanov
2

APL + WIN, 63 byte

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

Penjelasan:

(⍉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
Graham
sumber
2

Python 2 , 116 114 byte

-2 byte terima kasih kepada notjagan

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)

Cobalah online!

tongkat
sumber
114 byte.
notjagan
2

05AB1E , 19 byte

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

Cobalah online!

Ini adalah setengah port dari pendekatan Dennis, yang hanya satu byte lebih pendek dari metode yang saya gunakan sebelumnya (yang saya cukup senang):

05AB1E , 20 byte

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

Cobalah online!

Bagaimana itu bekerja?

4BT.øS2 ‰ í1ýøT „| ‡ € S »| Program lengkap. Mengambil input dari STDIN, output ke STDOUT.

4B | Konversikan ke basis 4.
  T | Dorong 10 ke tumpukan.
   .ø | Surrond (tambahkan dan tambahkan representasi 10 ke basis 4).
     S | Dibagi menjadi beberapa karakter / digit.
                      + ------------------------------------------------- --------------
                      | Bagian ini dulunya adalah ¸4.ø4в˜ di versi sebelumnya, yang mana
                      | berarti: mengelilingi dengan 4, konversikan ke basis 4 (4 -> [1, 0])
                      | dan akhirnya meratakan daftar.
                      + ------------------------------------------------- --------------
      2 ‰ | Divmod 2 ([N // 2, N% 2]).
        í | Terbalik (elemen-bijaksana).
         1 tahun | Tambahkan 1 di tengah (elemen-bijaksana).
           ø | Mengubah urutan.
            T „| ‡ | Terjemahkan (‡) dari "10" (T) ke "|" („|).
                 € S »| Memformat sebagai kisi.
                 € S | Dorong masing-masing karakter.
                   »| Bergabunglah dengan baris baru, sementara bergabung dengan daftar dalam dengan spasi.

Saya telah bertanya kepada Adnan (pembuat 05AB1E) tentang grid thingy dalam obrolan , dan mereka membantu saya menghemat 2 byte, dengan menunjukkan fitur 05AB1E: ketika bergabung dengan daftar multi-dimenisional oleh baris baru, daftar dalam digabung menggunakan spasi juga , jadi ðýtidak perlu.

Tuan Xcoder
sumber
2

APL (Dyalog Classic) , 33 byte

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

Cobalah online!

ngn
sumber
Oh, begitulah seharusnya kamu dikelilingi dengan 1 0 ...
FrownyFrog
Jadi, 2⊥⍣¯1bagaimana Anda akan mendapatkan daftar biner?
FrownyFrog
@FrownyFrog Tidak ada cara yang benar untuk mengelilingi. Ya, 2⊥⍣¯1apakah kebalikan ("terbalik"?) Dari "dua-decode". Ini dikodekan ke dalam biner dengan bit yang diperlukan.
ngn
2

J , 42 40 39 byte

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

Bercukur 2 byte berkat Dennis. 1 byte berkat ngn.

Cobalah online!

Bagaimana itu bekerja

                                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
FrownyFrog
sumber
2

JavaScript (ES6) 79 byte

Menggunakan .toString untuk mengonversi angka menjadi basis 4, dan kemudian bekerja dengan masing-masing baris dan bitwise ATAU untuk membangun garis keluaran demi baris. Menghasilkan daftar garis.

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

Kuilin Li
sumber
1
Pendekatan keren dengan peta dan bitwise ATAU! Anda dapat menyimpan seluruh byte dengan menggunakan `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/ | |/'

Cobalah online!

Penjelasan

The dcbit bertobat ke basis 4, mengawali dan menambahkan dengan 4(bergantian ke 10dalam output) dan menggunakann untuk menjaga semuanya dalam satu baris.

Sisanya terjadi di 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
Sophia Lechner
sumber
1
Konversi bagian setelah dc sepenuhnya untuk menghemat beberapa byte, tio.run/##S0oszvj/PyVZQTfVJCUlP88@r6CmODVFQb1YX09fTUE/…
Kritixi Lithos
Sangat bagus! Saya mencoba sesuatu seperti itu tetapi saya terus mencoba berbagai cara untuk menjadi pintar dengan xruang palka / pola di sekitarnya untuk memodifikasinya dan kemudian melakukan ssemuanya sekaligus, dan tidak ada yang berakhir lebih pendek.
Sophia Lechner
@Cowsquack Saya bahkan berhasil mendapatkan dua byte lagi berdasarkan ide Anda!
Sophia Lechner
Ide bagus untuk menggabungkan transliterasi, +1
Kritixi Lithos
1

Retina , 83 byte

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

Cobalah online! Tautan termasuk kasus uji lebih cepat. Penjelasan:

.+
$*

Konversikan ke unary.

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

Konversikan ke basis 4 sebagai angka unary yang dipisahkan oleh ;s.

^
1;;

Tambahkan urutan mulai.

$
;1;;

Tambahkan a ;, mengubahnya menjadi digit terminator daripada separator, dan urutan berhenti.

1*;
$.&

Konversikan ke desimal, tetapi tambahkan 1 ke setiap digit.

.+
$&¶$&¶$&

Rangkap tiga itu.

T`13` `^.+

Di baris pertama, 1s dan 3s (mewakili 0s dan 2s) menjadi spasi.

T`12` `.+$

Di baris terakhir, 1s dan 2s (mewakili 0s dan 1s) menjadi spasi.

\d
|

Semua digit lainnya menjadi bilah.

Neil
sumber
1

Pip , 33 31 29 27 26 byte

25 byte kode, +1 untuk -Sbendera.

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

Cobalah online!

Penjelasan

Kami mengamati pola dalam empat jenis batang:

  • Baris pertama adalah spasi jika digit genap, pipa jika ganjil.
  • Baris kedua selalu berupa pipa.
  • Baris ketiga adalah spasi jika digitnya 0 atau 1, pipa jika 2 atau 3.

Begitu:

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

Cobalah online!

Sedikit kurang terformat (kurang golf):

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

Penjelasan

Pertama, pertimbangkan kode berikut untuk membaca integer dan mengeluarkan versi basis 4:

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

Ini menggunakan rekursi ekor untuk membalik urutan output. Setiap langkah rekursif bithifts oleh 2 (memotong 2 bit terakhir dan membaginya dengan 4). Ini output hasil bitmasked dengan 3 (0b11), yang hanya menunjukkan dua bit terakhir, yang merupakan basis digit terakhir 4.

Panggilan fungsi termasuk dalam printfargumen sebagai trailing (tidak dicetak, tetapi dievaluasi) untuk menghindari keharusan menggunakan {} (+2 byte) untuk mengelompokkanprintf dan panggilan fungsi.

Solusi di sini memperluas kode base-4 ini. Pertama, m didefinisikan sebagai n, tetapi sedemikian rupa sehingga pada basis 4 ia akan memiliki 10 prepended dan ditambahkan padanya. Kami kemudian mencetak m.

Dalam mencetak basis 4 secara teratur, kami menggunakan bitmask 3 untuk mendapatkan digit. Dalam kode email, baris teratas adalah bit orde rendah digit itu (bitmask 1) dan intinya adalah bit orde tinggi (bitmask 2). Oleh karena itu, rin f(n,r)adalah bitmask - fungsi utama kami memanggil f(m,1)untuk baris pertama danf(m,2) baris terakhir.

Untuk membuat garis tengah berfungsi (selalu cetak "|"), kami menambahkan ||!rke kondisi - jika r adalah 0, itu akan selalu mengevaluasi ke true dan mencetak "|". Kemudian kita memanggil f(m,0)garis tengah.

Akhirnya, kami ingin baris baru berperilaku. Termasuk tambahan printfitu mahal sejauh byte kode sumber berjalan, jadi alih-alih kita tambahkan% c specifier ke yang sudah ada printf. n?32:10mencetak baris baru jika n adalah 0 (false), dan spasi jika tidak. 32 dan 10 digunakan sebagai ganti '\ n' dan '' untuk menyimpan byte.

Billy Graydon
sumber
1
Anda bisa menurunkannya menjadi 146 jika Anda tidak keberatan dengan peringatan: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

Common Lisp, 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))))

Cobalah online!

Renzo
sumber
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];

membutuhkan PHP> = 5.5 untuk pengindeksan string literal dan <7.1 agar pengindeksan tidak menghasilkan peringatan.

Jalankan sebagai pipa dengan -nRatau coba online .

Masukkan satu baris lagi untuk mendapatkan baris tambahan.

Titus
sumber
Peringatan: Nilai non-numerik yang dijumpai di [...] [...] pada baris 7
RedClover
@Soaku Versi PHP harus dari 5,5 hingga 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') 

Terima kasih banyak untuk teman-teman!

Saya mencoba untuk tidak menyalin metode jawaban lain dan ... huek.

Daniel
sumber
128 bytes
ovs
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:"";}

Cobalah online!

Saya yakin saya telah melewatkan beberapa peningkatan.

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 memeriksa apakah char bukan '3', bukan baris kedua, dan kemudian beberapa binary magic untuk melihat apakah baris pertama atau ketiga harus berisi spasi.

Ayb4btu
sumber
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

Cobalah online!

Mengambil input basis-10 dari var $x

Noskcaj
sumber
0

Japt , 42 byte

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

Cobalah online!

Oliver
sumber
harus ada 1 ruang di antara setiap bar tegak
Erik the Outgolfer
0

C, 120 byte

Sayangnya hanya berfungsi pada Windows, karena itoaterlalu nyaman untuk menjadi standar.

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