ทำเครื่องหมายอีเมลของฉัน! - บาร์โค้ด ASCII


39

บาร์โค้ด 4 สถานะ

บริการไปรษณีย์หลายแห่ง (Royal Mail UK, Canada Post, US Mail และอื่น ๆ ) ใช้บาร์โค้ด 4 สถานะเพื่อเข้ารหัสข้อมูลเกี่ยวกับจดหมายของพวกเขา แสดงผลใน ASCII อาจมีลักษณะดังนี้:

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

บาร์โค้ด 4 สถานะคือแถบหนึ่งแถว แต่ละแถบสามารถขยายขึ้นลงล่างหรือทั้งสองอย่าง ซึ่งหมายความว่าแต่ละแถบนั้นหมายถึงตัวเลข 4 หลัก:

            | |
บาร์: | | | |
                | |

ตัวเลข: 0 1 2 3

ปัญหาเกี่ยวกับสัญลักษณ์นี้คือว่าบาร์โค้ดแต่ละอันมีบาร์โค้ดที่ถูกต้องและต่างกันกลับหัว: การเปลี่ยนความหมายอย่างมากหากการวางแนวไม่ถูกต้อง ดังนั้นโดยปกติแล้วลำดับการเริ่มและหยุดจะถูกนำไปใช้เพื่อสแกนเนอร์สามารถคำนวณได้ว่าควรจะอ่านวิธีใด

สำหรับจุดประสงค์ของการท้าทายนี้เราจะใช้ลำดับเริ่มต้น / หยุดที่ระบุโดย Australia Post: บาร์โค้ดแต่ละอันจะเริ่มต้นและสิ้นสุดด้วย1 0ลำดับ


ความท้าทาย

งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่ได้รับเป็นจำนวนเต็มบวกN, แปลงไปยัง ASCII บาร์โค้ด 4 รัฐที่แต่ละบาร์ (ยกเว้นลำดับเริ่มต้น / หยุด) หมายถึงหลักในฐาน-4 Nตัวแทนของ

ตัวอย่าง:

ได้รับจำนวนเต็ม19623ครั้งแรกที่เราจะแปลงเป็นของฐาน-4 10302213แทน

จากนั้นเราจะแมปแต่ละหลักไปยังแถบที่เกี่ยวข้อง:

1 0 3 0 2 2 1 3

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

สุดท้ายเราจะเพิ่มลำดับการเริ่ม / หยุด:

เริ่ม: สิ้นสุด:
1 0 1 0

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

บาร์โค้ดที่ได้ควรเป็นผลลัพธ์ของโปรแกรม


กฎ:

  • ข้อมูลที่ป้อนจะเป็นจำนวนเต็มบวกภายในช่วงขนาดมาตรฐานของภาษาของคุณ
  • ผลลัพธ์:
    • อาจเป็นรายการของบรรทัดหรือสตริงที่มีการขึ้นบรรทัดใหม่
    • อาจมีการขึ้นบรรทัดใหม่หรือเว้นวรรคบรรทัดใหม่หรือตามหลังตราบใดที่รูปร่างยังคงไม่เปลี่ยนแปลง
    • ควรแสดงบาร์โค้ดด้วยรูปแบบข้างต้น - ต้องใช้อักขระไพพ์ ( |) และอักขระเว้นวรรค ( ) เมื่อวาดแท่งและควรมีช่องว่าง 1 ช่องระหว่างแต่ละแถบตั้งตรง
  • นี่คือดังนั้นโปรแกรมที่สั้นที่สุด (เป็นไบต์) ชนะ!

กรณีทดสอบ

4095:

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

4096:

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

7313145:

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

อนุญาตให้นำพื้นที่ว่าง ;)
Erik the Outgolfer

@FlipTack มีปัญหากับสัญลักษณ์นี้ - คุณยังไม่เห็น The Boondock Saints ใช่ไหม?
ลอร์ด Farquaad

@EriktheOutgolfer ตราบใดที่บาร์โค้ดที่เกิดขึ้นจริงเช่นเดียวกับเมทริกซ์ 2 มิติของตัวอักษรยังคงอยู่มันสามารถมีช่องว่างได้มากเท่าก่อนหรือหลังตามความจำเป็น
FlipTack

ความท้าทายที่เกี่ยวข้องกับบาร์โค้ดอื่น ๆ : 1 , 2 , 3
FlipTack

เอาท์พุทสามารถมีศูนย์นำหน้า?
230118

คำตอบ:



9

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

8

เยลลี่ , 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.

สายนี้มีความยาว 15 ตัวอักษร Unicode จะเป็น 15 ไบต์ได้อย่างไร
jmster


@jmster ตัวละครเหล่านี้ไม่ใช่ตัวจริง โปรแกรมคือ 15 ไบต์เฉพาะซึ่งมีตัวช่วยจำเหล่านี้ เปรียบเทียบกับ Bubblegum ดูเหมือนว่าส่วนใหญ่.......แต่แต่ละจุดย่อมาจากไบต์ที่แตกต่างกัน
FrownyFrog

ทำไม bitwise หรือแทนที่จะเพิ่ม?
FrownyFrog

@FrownyFrog ทั้งสองจะทำงาน เนื่องจากขั้นตอนต่อไปคือการแปลงเป็นไบนารีฉันจึงไปพร้อมกับโอเปอเรเตอร์บิต
Dennis


7

อ็อกเทฟ , 78 77 75 74 70 69 ไบต์

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

ลองออนไลน์!

แตกต่างจากวิธีการดั้งเดิมวิธีนี้ใช้ตารางการค้นหาอย่างง่ายในการแมปค่าฐาน 4 ลงบนสิ่งที่เทียบเท่า ตารางการค้นหายังเพิ่มระยะห่างระหว่างแต่ละแถบด้วยการเพิ่มศูนย์ในระหว่างแต่ละหมายเลข (ซึ่งแมปไปยังแถบของช่องว่างทั้งหมด)

ตารางการค้นหาจะแมปกับบาร์โดยตรงดังนี้

   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]

ลองออนไลน์!

ฟังก์ชั่นไม่ระบุชื่อซึ่งส่งคืนบาร์โค้ดเป็นสตริง

นี่คือความจริงที่ว่าถ้าเราเพิ่ม 4 หลักหลัก 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'|'/' '


1
@ LuisMendo ฉลาด! ขอบคุณ
Tom Carpenter

7

JavaScript (ES6), 89 87 83 ไบต์

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

กรณีทดสอบ

อย่างไร?

หมายเหตุ : ในเวอร์ชันด้านล่างตัวอักษรเทมเพลตถูกแทนที่ด้วยสตริงมาตรฐานเพื่อให้สามารถเยื้องรหัสได้อย่างถูกต้อง

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

ฉันชอบที่จะเห็นคำตอบนี้อธิบายมีบางสิ่งแปลก ๆ เกิดขึ้น: P
Brian H.

@BrianH ฉันได้เพิ่มคำอธิบายแล้ว
Arnauld

4

R , 154 109 ไบต์

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รวมทั้ง 6 จากการแปลงที่แตกต่างกันเล็กน้อยเป็นฐาน 4 พิมพ์ด้วยช่องว่างนำในแต่ละแถวและไม่มีการขึ้นบรรทัดใหม่

การจัดทำดัชนีเกิดขึ้นโดยใช้การคำนวณแบบแยกส่วนบางส่วนไม่เหมือนกับคำตอบอื่น ๆ แต่เนื่องจาก 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


3

ถ่าน 50 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

Nθ

ใส่ตัวเลข

F²⊞υι

กดลำดับหยุดไปที่รายการว่างที่กำหนดไว้ล่วงหน้า

¿θ

ถ้าจำนวนเป็นบวก

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

ใช้ divmod ซ้ำ ๆ เพื่อแปลงเป็นฐานที่กลับด้าน

  ⊞υθ

มิฉะนั้นเพียงแค่ผลักดันมัน

F²⊞υι

กดลำดับการเริ่มต้นไปที่รายการ

E⟦ |¦|¦  ||⟧

แม็พสามสตริง แต่ละสตริงแสดงถึงการแปลบาร์โค้ดสำหรับตัวเลข0123สำหรับแต่ละแถว

⪫E⮌υ§ιλω

แม็พเหนือตัวเลข (ย้อนกลับเป็นคำสั่งปกติ) แปลงเป็นแท่งหรือช่องว่างโดยใช้การแปลจากนั้นเข้าร่วมผลลัพธ์เป็นสามสายซึ่งจะถูกพิมพ์โดยปริยายบนบรรทัดแยก


3

Japt , 32 31 ไบต์

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

ทดสอบออนไลน์!

ยังไม่พอใจกับสิ่งนี้จริงๆ แต่มันเป็นการเริ่มต้น ...

คำอธิบาย

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 ไบต์ของคุณทำให้ฉันรู้สึกดีขึ้นเล็กน้อยเกี่ยวกับความยุ่งเหยิงนี้ ! ฉันไม่ควรลองเล่นกอล์ฟในขณะที่ให้บริการและดื่มไพน์!
Shaggy

3

Haskell , 91 90 ไบต์

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

ลองออนไลน์! ส่งคืนรายการบรรทัด


จำนวนไบต์เดียวกันแทนทางเลือกสำหรับบรรทัดแรก:

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

3

J , 57 49 47 47 ไบต์

10 ไบต์ขอบคุณ FrownyFrog!

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

มันทำงานอย่างไร:

1 0,4&#.inv,1,0: - แปลงตัวเลขเป็นรายการของฐาน 4 หลักเพิ่ม 1 0 ไปยังจุดเริ่มต้นและจุดสิ้นสุดของรายการ

((#:2 6 3 7){' |') - ตารางการค้นหาสำหรับการเข้ารหัสไบนารี 0 สอดคล้องกับพื้นที่ 1 ถึง '|'

{~ - เข้ารหัส 4 หลักฐานโดยการเลือกสตริงจากตารางการค้นหาด้านบน (อาร์กิวเมนต์กลับด้าน)

|: - สลับอาร์เรย์ผลลัพธ์จาก 3 คอลัมน์เป็น 3 แถว

[: - หมวกส้อม

,.2{."0 - ใส่ช่องว่างระหว่างแท่ง

ลองออนไลน์!


@FrownyFrog ขอขอบคุณ!
Galen Ivanov

2

APL + WIN, 63 ไบต์

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

คำอธิบาย:

(⍉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 ไบต์

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

ลองออนไลน์!

นี่เป็นวิธีครึ่งหนึ่งของวิธีการของ Dennis ซึ่งสั้นกว่าวิธีที่ฉันใช้ก่อนหน้านี้เพียงหนึ่งไบต์ (ซึ่งฉันมีความสุขมาก):

05AB1E , 20 ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร?

4BT.øS2‰í1ýøT“| ‡€ S » | โปรแกรมเต็มรูปแบบ รับอินพุตจาก STDIN เอาต์พุตไปยัง STDOUT

4B | แปลงเป็นฐาน 4
  T | กด 10 ลงในสแต็ก
   .ø | Surrond (เพิ่มและผนวก 10 เข้ากับการแสดงฐาน 4)
     S | แบ่งออกเป็นอักขระ / ตัวเลขแต่ละตัว
                      + ------------------------------------------------- --------------
                      | ส่วนนี้เคยเป็น ¸4.ø4в˜ ในรุ่นก่อนหน้าซึ่ง
                      | หมายถึง: ล้อมรอบด้วย 4 ของแปลงเป็นฐาน 4 (4 -> [1, 0])
                      | และในที่สุดก็ทำให้รายการนั้นเรียบ
                      + ------------------------------------------------- --------------
      2 ‰ | Divmod 2 ([N // 2, N% 2])
        í | ย้อนกลับ (องค์ประกอบฉลาด)
         1ý | เพิ่ม 1 ตรงกลาง (องค์ประกอบที่ฉลาด)
           ø | ไขว้
            T“| ‡ | แปล (‡) จาก "10" (T) ถึง "|" („ |)
                 € S » | จัดรูปแบบเป็นกริด
                 € S | ผลักดันตัวละครของแต่ละคน
                   » | เข้าร่วมโดยการขึ้นบรรทัดใหม่ในขณะที่เข้าร่วมรายการภายในด้วยช่องว่าง

ฉันได้ถามAdnan (ผู้สร้างของ 05AB1E) เกี่ยวกับสิ่งที่เป็นตารางในการแชทและพวกเขาช่วยฉันประหยัด 2 ไบต์โดยชี้ให้เห็นคุณลักษณะของ 05AB1E: เมื่อเข้าร่วมรายการหลายมิติโดยการขึ้นบรรทัดใหม่รายการภายในจะเข้าร่วมโดยใช้ช่องว่างด้วย ดังนั้นจึงðýไม่จำเป็น


2

APL (Dyalog Classic) , 33 ไบต์

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

ลองออนไลน์!


โอ้นั่นคือวิธีที่คุณควรจะล้อมรอบด้วย 1 0 ...
FrownyFrog

ดังนั้น2⊥⍣¯1วิธีที่คุณจะได้รับรายชื่อไบนารี?
FrownyFrog

@FrownyFrog ไม่มีทางจริงที่จะล้อม ใช่2⊥⍣¯1การผกผัน ("ผิวหน้า" หรือไม่) ของ "two-decode" มันเข้ารหัสเป็นเลขฐานสองที่มีบิตได้มากเท่าที่จำเป็น
ngn

2

J , 42 40 39 ไบต์

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

โกนได้ 2 ไบต์ด้วย Dennis 1 ไบต์ต้องขอบคุณ ngn

ลองออนไลน์!

มันทำงานอย่างไร

                                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 ไบต์

ใช้. toString เพื่อแปลงตัวเลขเป็นเบส 4 จากนั้นทำการ casework กับแต่ละบรรทัดและ bitwise OR เพื่อสร้างเอาต์พุตบรรทัดต่อบรรทัด แสดงรายการของบรรทัด

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
วิธีการเยี่ยมยอดด้วยแผนที่และ bitwise OR! คุณสามารถบันทึกได้ทั้งไบต์โดยใช้`10${n.toString(4)}10`:)
Chris M

2

Bash + coreutils, 71 67 ไบต์

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

ลองออนไลน์!

คำอธิบาย

dcบิตแปลงไปยังฐานที่ 4 prepending และต่อท้ายด้วย4(ผลัดกันเข้ามา10ในการส่งออก) และการใช้nเพื่อให้ทุกอย่างในหนึ่งบรรทัด

ส่วนที่เหลือเกิดขึ้นใน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
การแปลงส่วนหลังจาก dc ทั้งหมดเป็น sed ช่วยประหยัดไม่กี่ไบต์tio.run/##S0oszvj/PyVZQTfVJCUlP88@r6CmODVFQb1YX09fTUE/…
Kritixi Lithos

ดีมาก! ฉันลองอะไรแบบนั้น แต่ฉันก็พยายามใช้วิธีต่าง ๆ ในการเป็นคนฉลาดด้วยxการเว้นช่องว่างการถือ / รูปแบบไว้รอบ ๆ เพื่อปรับเปลี่ยนแล้วทำsทุกอย่างในครั้งเดียวและไม่มีอะไรจบลงเลย
Sophia Lechner

@ Cowquack ฉันสามารถจัดการรับอีกสองไบต์ตามความคิดของคุณ!
Sophia Lechner

แนวคิดที่ดีในการรวมตัวแปล, +1
Kritixi Lithos

1

เรติน่า 83 ไบต์

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

ลองออนไลน์! ลิงค์นั้นรวมถึงกรณีทดสอบที่เร็วกว่า คำอธิบาย:

.+
$*

แปลงเป็นเอก

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

แปลงเป็นเบส 4 โดยแยกเป็นตัวเลขโดยคั่นด้วย;s

^
1;;

เตรียมลำดับการเริ่มต้น

$
;1;;

ผนวก a ;, เปลี่ยนให้เป็นเทอร์มิเนเตอร์หลักแทนที่จะเป็นตัวคั่นและลำดับการหยุด

1*;
$.&

แปลงเป็นทศนิยม แต่เพิ่ม 1 ถึงแต่ละหลัก

.+
$&¶$&¶$&

เพิ่มขึ้นสามเท่า

T`13` `^.+

ในแถวแรก1s และ3s (แทน0s และ2s) กลายเป็นช่องว่าง

T`12` `.+$

ในแถวสุดท้าย1s และ2s (แทน0s และ1s) กลายเป็นช่องว่าง

\d
|

เลขอื่น ๆ ทั้งหมดกลายเป็นแท่ง


1

Pip , 33 31 29 27 26 bytes

รหัส 25 ไบต์ +1 สำหรับการ-Sตั้งค่าสถานะ

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

ลองออนไลน์!

คำอธิบาย

เราสังเกตรูปแบบในแถบสี่ประเภท:

  • แถวแรกคือช่องว่างหากตัวเลขเป็นเลขคู่ให้ไพพ์หากคี่
  • แถวที่สองเป็นท่อเสมอ
  • แถวที่สามเป็นช่องว่างหากตัวเลขคือ 0 หรือ 1, ไพพ์หาก 2 หรือ 3

ดังนั้น:

                           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 ไบต์

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

ลองออนไลน์!

รูปแบบที่น้อยกว่าเล็กน้อยมาก (ตีกอล์ฟน้อยลง):

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

คำอธิบาย

ก่อนอื่นให้พิจารณารหัสต่อไปนี้เพื่ออ่านจำนวนเต็มและส่งออกเวอร์ชันฐาน 4:

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

วิธีนี้ใช้การเรียกซ้ำหางเพื่อกลับลำดับของเอาต์พุต แต่ละบิตซ้ำขั้นตอนจะเปลี่ยนเป็น 2 (ตัดออกจาก 2 บิตสุดท้ายและหารด้วย 4) มันส่งออกผลลัพธ์ bitmasked ด้วย 3 (0b11) ซึ่งจะแสดงเฉพาะสองบิตสุดท้ายซึ่งเป็นฐานหลักสุดท้าย 4

การเรียกใช้ฟังก์ชั่นรวมอยู่ในprintfเป็นอาร์กิวเมนต์ต่อท้าย (ไม่พิมพ์ออกมา แต่ได้รับการประเมิน) เพื่อหลีกเลี่ยงการจำเป็นต้องใช้ {} (+2 ไบต์) เพื่อจัดกลุ่มprintfและการเรียกใช้ฟังก์ชัน

ทางออกที่นี่ขยายรหัส base-4 นี้ อย่างแรก m ถูกกำหนดเป็น n แต่เช่นนั้นในฐาน 4 จะมี 10 แบบต่อท้ายและต่อท้าย จากนั้นเราพิมพ์ m

ในการพิมพ์ฐาน 4 เป็นประจำเราใช้ bitmask 3 เพื่อรับตัวเลข ในเมลโค้ดบรรทัดบนสุดคือบิตลำดับต่ำสุดของหลัก (บิตมาสค์ 1) และบรรทัดล่างคือบิตลำดับสูง (บิตมาสค์ 2) ดังนั้นrin f(n,r)คือ bitmask - ฟังก์ชั่นหลักของเราเรียกf(m,1)หาบรรทัดแรกและf(m,2)บรรทัดสุดท้าย

ในการทำให้เส้นกลางทำงาน (พิมพ์ทุกครั้ง "|") เราเพิ่ม||!rเงื่อนไข - ถ้า r เป็น 0 มันจะประเมินค่าเป็นจริงเสมอและพิมพ์ "|" จากนั้นเราเรียกf(m,0)หาเส้นกลาง

ในที่สุดเราต้องการให้บรรทัดใหม่ทำงาน รวมถึงเป็นพิเศษprintfมีราคาแพงเท่าที่ไบต์ของรหัสที่มาไปดังนั้นแทนที่จะเราเพิ่มอีก c% printfระบุจากที่มีอยู่ n?32:10พิมพ์ขึ้นบรรทัดใหม่ถ้า n เป็น 0 (false) และเว้นวรรคเป็นอย่างอื่น ใช้ 32 และ 10 แทน '\ n' และ '' เพื่อบันทึกไบต์


1
คุณสามารถทำให้มันลดลงเหลือ 146 ถ้าคุณไม่รังเกียจคำเตือน: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

PHP, 99 + 1 ไบต์

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

"[$c*3+$y];

ต้องการ PHP> = 5.5 สำหรับการจัดทำดัชนีสตริงตามตัวอักษรและ <7.1 สำหรับการจัดทำดัชนีเพื่อไม่ให้คำเตือน

ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์

แทรกขึ้นบรรทัดใหม่อีกหนึ่งรายการเพื่อรับการติดตาม


คำเตือน: พบค่าที่ไม่ใช่ตัวเลขใน [... ] [... ] ที่บรรทัด 7
RedClover

@Soaku PHP ต้องมีเวอร์ชันตั้งแต่ 5.5 ถึง 7.0
Titus

1

Python 2, 142 126 bytes

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

ขอบคุณมากที่ ovs!

ฉันพยายามที่จะไม่คัดลอกวิธีการอื่น ๆ ของคำตอบและ ... yuck



1

C # (. NET Core) 160 ไบต์

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

ลองออนไลน์!

ฉันแน่ใจว่าฉันพลาดการปรับปรุงบางอย่าง

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 ตรวจสอบว่าถ่านไม่ใช่ '3' ไม่ใช่แถวที่สองจากนั้นมีเวทมนตร์ไบนารีเพื่อดูว่าแถวแรกหรือแถวที่สามควรมีช่องว่างหรือไม่





0

C, 120 ไบต์

น่าเศร้าที่ใช้งานได้บน Windows เท่านั้นเนื่องจากitoaความสะดวกสบายเกินมาตรฐาน

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);}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.