Postalarımı İşaretle! - ASCII Barkodları


39

4 durumlu barkodlar

Pek çok posta hizmeti (Royal Mail İngiltere, Kanada Posta, ABD Posta vb.), Postalarıyla ilgili bilgileri kodlamak için 4 durumlu bir barkod kullanır. ASCII'de oluşturulmuş, şuna benzer bir şey olabilir:

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

4 durumlu barkod, bir satır çubuktur. Her çubuk, 4 olasılık sağlayacak şekilde yukarı, aşağı veya her ikisine de genişletilebilir. Bu, her bir çubuğun temel olarak 4 basamaklı bir basamağı temsil ettiği anlamına gelir:

            | |
Bar: | | | |
                | |

Rakam: 0 1 2 3

Bu sembolojideki sorun, her bir barkodun baş aşağı geçerli, farklı bir barkod olmasıdır: yönelim yanlışsa, anlamını büyük ölçüde değiştirir. Bu nedenle, normalde bir başlatma ve durdurma dizisi uygulanır, böylece tarayıcı okunması gereken yolu hesaplayabilir.

Bu zorluğun amacı için, Avustralya Post tarafından belirtilen start / stop dizisini kullanacağız: her barkod bir 1 0diziyle başlar ve biter .


Meydan okuma

Göreviniz, pozitif bir tamsayı verilen N, onu ASCII 4 durumlu bir barkoda dönüştüren bir program veya işlev yazmaktır ; burada her çubuk (başlangıç ​​/ durdurma dizileri hariç) temel 4 temsilinde bir basamağı temsil eder N.

Örnek:

Tamsayı göz önüne alındığında, 19623ilk önce onu temel 4 temsili haline dönüştürürüz 10302213.

Daha sonra her basamağı ilgili çubuğa eşlerdik:

1 0 3 0 2 2 1 3

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

Son olarak, start / stop dizilerini ekleyeceğiz:

Başlangıç: Bitiş:
1 0 1 0

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

Çıkan barkod programın çıktısı olmalıdır.


Kurallar:

  • Girdi, dilinizin standart tamsayı boyut aralığında, pozitif bir tamsayı olacaktır.
  • Çıktı:
    • Bir satır listesi veya yeni satırlar içeren bir dize olabilir.
    • Şekil bozulmadan kaldığı sürece, önde gelen veya sondaki yeni satırları / boşlukları içerebilir.
    • Barkodu yukarıdaki formatta göstermelidir - çubuk çizerken boru karakterini ( |) ve boşluk karakterini ( ) kullanmalı ve her dik çubuk arasında 1 boşluk olmalıdır.
  • Bu , yani en kısa program (bayt cinsinden) kazanır!

Test Kılıfları

4095:

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

4096:

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

7313145:

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

Önde gelen alanlara izin verilir mi? ;)
Outgolfer Erik

@FlipTack Bu sembolojinin sorunu - Boondock Azizlerini görmediniz, değil mi?
Lord Farquaad

@EriktheOutgolfer Gerçek bir barkod, bir 2D karakter matrisi olarak, bozulmamış olduğu sürece, gerektiği kadar önce veya sonra birçok boşluğa sahip olabilir.
FlipTack


Çıktının başında sıfır olabilir mi?
user230118 23

Yanıtlar:



9

MATL , 34 30 29 28 bayt

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

Çevrimiçi deneyin!

açıklama

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

Jöle , 16 15 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

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.

Bu dize 15 unicode karakter uzunluğunda, nasıl 15 bayt olabilir?
jmster


@jmster Bunlar gerçek karakter değil. Program bu anımsatıcılara sahip 15 spesifik bayttır. Bubblegum ile karşılaştırın, çoğunlukla benziyor .......ama her nokta farklı bir bayt anlamına geliyor.
FrownyFrog

Neden bitsel olarak VEYA eklemek yerine?
FrownyFrog

@ FrownyFrog Her ikisi de işe yarar. Bir sonraki adım ikiliye dönüşüm olduğundan, bitsel bir operatörle gittim.
Dennis


7

Octave , 78 77 75 74 70 69 bayt

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

Çevrimiçi deneyin!

Orijinal yaklaşımın aksine, bu temel 4 değerlerini ikili eşdeğerlerine eşlemek için basit bir arama tablosu kullanır. Arama tablosu ayrıca her sayı arasına (tüm boşlukların çubuğuna eşleyen) arasına sıfır ekleyerek her çubuk arasındaki boşluğu ekler.

Arama tablosu doğrudan çubuklarla şu şekilde eşleşir:

   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

İkiliden gelen |ve  şimdi dönüşüm , şu iki karakterin bir dizgisine indekslenerek yapılır - temelde ikili dönüşüm için arama tablosu ile aynı prensip.


* 1 bayt kaydedildi, teşekkürler @LuisMendo


Orijinal:

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

Çevrimiçi deneyin!

Barkodu dizge olarak döndüren isimsiz işlev.

Bu, base4 basamağına 4 eklersek, o zaman 1/2 bitleri ile ikiliye dönüştürülen sayıyla çubuk / alanı temsil edebileceğimiz gerçeğine dayanır:

   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

Golf bir perspektiften hileli parça bar arasındaki boşluk ekleme ve dönüştürmektedir 0/1için '|'/' '.


1
@LuisMendo zeki! Teşekkürler.
Tom Carpenter,

7

JavaScript (ES6), 89 87 83 bayt

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

Test durumları

Nasıl?

Not : Aşağıdaki sürümde, şablon değişmezleri standart dizelerle değiştirilmiştir, böylece kod doğru girintili olabilir.

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

Bu cevabı açıklamayı görmek isterim, bazı garip şeyler oluyor: P
Brian H.

@BrianH. Bir açıklama ekledim.
Arnauld,

4

R , 154 109 bayt

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

Çevrimiçi deneyin!

catBir matris oluşturmak ve kullanmak write, 6'yı üsse 4 farklı bir dönüşümden kullanmak yerine indeksleyerek ve kullanarak tüm bayt gruplarını kurtardı.

İndeksleme, bazı diğer cevapların aksine bazı modüler aritmetik kullanılarak gerçekleştirilir, ancak R 1-temelli indeksleme kullandığından, aritmetik biraz farklıdır.

Açıklama:

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

Kömür , 50 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

Nθ

Bir numara giriniz.

F²⊞υι

Durdurma sırasını önceden tanımlanmış boş listeye itin.

¿θ

Eğer sayı pozitifse,

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

arka arkaya 4 tabanına dönüştürmek için art arda divmod uygulayın,

  ⊞υθ

Aksi takdirde sadece itin.

F²⊞υι

Başlangıç ​​sırasını listeye itin.

E⟦ |¦|¦  ||⟧

Üç dizgiyi eşleyin. Her dize 0123, her satırın rakamları için barkod çevirisini gösterir .

⪫E⮌υ§ιλω

Basamakların üzerinde eşleştirin (normal sıraya geri döndürülür), çeviriyi kullanarak bunları çubuklara veya boşluklara dönüştürün, ardından sonuçları ayrı satırlarda örtülü olarak basılan üç dizeye birleştirin.


3

Japt , 32 31 bayt

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

Çevrimiçi test edin!

Bundan henüz tatmin olmadım, ama bu bir başlangıç ​​...

açıklama

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 baytınız bu karışıklık konusunda kendimi biraz daha iyi hissettiriyor ! Hem servis yaparken hem de bira içerken golf oynamaya çalışmamalıyım!
Shaggy,

3

Haskell , 91 90 bayt

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

Çevrimiçi deneyin! Satır listesini döndürür.


İlk satır için aynı bayt sayısı alternatifi:

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

3

J , 57 49 47 bayt

FrownyFrog sayesinde 10 bayt!

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

Nasıl çalışır:

1 0,4&#.inv,1,0: - Sayıyı temel 4 basamaklı bir listeye dönüştürür, listenin başına ve sonuna 1 0 ekler.

((#:2 6 3 7){' |') - şifreleme için arama tablosu, ikili 0, 1 - '|' arasındaki alana karşılık gelir.

{~ - yukarıdaki arama tablosundan bir dize seçerek tabanı 4 basamağını şifreler (argüman ters)

|: - elde edilen diziyi 3 sütundan 3 satıra dönüştürür

[: - çatal kapakları

,.2{."0 - çubukların arasına boşluk koyar

Çevrimiçi deneyin!


@ FrownyFrog Teşekkürler!
Galen Ivanov

2

APL + WIN, 63 bayt

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

Açıklama:

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

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

Çevrimiçi deneyin!

Bu, daha önce kullandığım yöntemden sadece bir bayt daha kısa olan Dennis'in yaklaşımının yarım limanıdır (ki bundan çok mutluyum):

05AB1E , 20 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır?

4BT.øS2 ‰ í1ýøT “| ‡ € S »| Tam program STDIN'den girdi alır, STDOUT'a çıkar.

4B | 4 tabanına dönüştürün.
  T | Yığına bir 10 basın.
   .ø | Surrond (10 temele 4 temsili ekleyin ve ekleyin).
     S | Tek tek karakterlere / rakamlara bölün.
                      + ------------------------------------------------- --------------
                      | Bu bölüm önceki sürümde ¸4.ø4в˜ idi, ki
                      | araçlar: 4'lü surround'lar, her birini taban 4'e dönüştürün (4 -> [1, 0])
                      | ve sonunda listeyi derinleştirin.
                      + ------------------------------------------------- --------------
      2 ‰ | Divmod 2 ([N // 2, N% 2]).
        í | Ters (eleman şeklinde).
         1ı | Ortasına 1 ekleyin (element-bilge).
           ø | Devrik.
            T “| ‡ | Çeviriyi (‡) "10" (T) 'den "|" („|) e çevirin.
                 € S »| Izgara olarak biçimlendirin.
                 € S | Her birinin karakterine basın.
                   »| İç listelerine boşluklarla katılırken yeni satırlara katılın.

Ben sordum Adnan ızgara zımbırtısıyla hakkında (05AB1E yaratıcısı) sohbet ve onlar 05AB1E bir özelliğini işaret edilerek, 2 byte tasarruf bana yardımcı: satırbaşıyla çok dimenisional listelerini katılırken, iç listeleri de boşluklar kullanılarak birleştirilir , bu yüzden ðýgereksiz.


2

APL (Dyalog Klasik) , 33 bayt

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

Çevrimiçi deneyin!


Oh, bu şekilde 10 0 ile çevrelenmeniz gerekiyor ...
FrownyFrog

Peki 2⊥⍣¯1nasıl ikili liste alırsın?
FrownyFrog

@ FrownyFrog Çevreleyen tek gerçek yolu yok. Evet, 2⊥⍣¯1"iki kod çözme" nin tersi ("ön" "). Gerektiği kadar bit ile ikili olarak kodlar.
ngn

2

J , 42 40 39 bayt

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

Dennis sayesinde 2 bayt kazandın. Ngn sayesinde 1 bayt.

Çevrimiçi deneyin!

Nasıl çalışır

                                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 bayt

Sayıyı 4 tabanına dönüştürmek için .toString işlevini kullanın ve ardından çıktı satırını satır başına oluşturmak için her satır ve bit yönünde VEYA ile eşitleme yapın. Satır listesini çıkarır.

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
Harita ve bit yönünde OR ile serin bir yaklaşım! Bütün bir baytı kurtarabilirsiniz `10${n.toString(4)}10`:)
Chris M

2

Bash + coreutils, 71 67 bayt

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

Çevrimiçi deneyin!

açıklama

dcTabanın 4, prepending ve birlikte ekleme için biraz dönüştürür 4(içine dönüşler 10çıktıda) kullanılarak ntek bir satırda her şeyi tutmak için.

Gerisi içinde olur 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
Tamamen sed dc sonraki bilgiyi dönüştürme birkaç byte kaydeder tio.run/##S0oszvj/PyVZQTfVJCUlP88@r6CmODVFQb1YX09fTUE/...
Kritixi Lithos

Çok hoş! Öyle bir şey denedim ama xonları değiştirmek için etrafındaki tutma / desen boşluklarını bırakarak zekice davranmanın farklı yollarını denedim ve shepsini bir kerede yaptım ve hiçbir şey daha kısa sürmedi.
Sophia Lechner

@Cowsquack Fikrinize dayanarak iki bayt daha almayı bile başardım!
Sophia Lechner

Transliterasyonunu birleştirerek Güzel fikir, 1
Kritixi Lithos

1

Retina , 83 bayt

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

Çevrimiçi deneyin! Link, daha hızlı test vakalarını içerir. Açıklama:

.+
$*

Birliğe dönüştür.

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

4 tabanına ;s ile ayrılmış tekli sayılar olarak dönüştürün .

^
1;;

Başlatma sırasına baskın yapın.

$
;1;;

;Ayırıcı yerine rakam sonlandırıcısına ve durma sırasına dönüştürerek a ekleyin .

1*;
$.&

Ondalık basamağa dönüştür, ancak her basamağa 1 ekler.

.+
$&¶$&¶$&

Üçlü kopyala.

T`13` `^.+

Birinci satırda, 1s ve 3temsil s ( 0ler ve2 s'yi ) boşluk olur.

T`12` `.+$

Son satırda, 1s ve 2temsil s ( 0ler ve1 s'yi ) boşluk olur.

\d
|

Diğer tüm rakamlar çubuk haline gelir.


1

Pip , 33 31 29 27 26 bayt

25 baytlık kod, -Sbayrak için +1 .

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

Çevrimiçi deneyin!

açıklama

Dört çubuk tipinde bir model gözlemliyoruz:

  • İlk satır, rakam çift ise boşluk, tek ise boru.
  • İkinci sıra daima bir borudur.
  • Üçüncü satır, basamak 0 veya 1 ise boşluk, 2 veya 3 ise boru olur.

Yani:

                           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 bayt

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

Çevrimiçi deneyin!

Biraz daha az korkunç biçimde biçimlendirilmiş (daha az golf oynadı):

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

açıklama

İlk olarak, bir tamsayı okumak ve temel 4 sürümünü çıkarmak için aşağıdaki kodu göz önünde bulundurun:

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

Bu, çıkışın sırasını tersine çevirmek için kuyruk özyineleme kullanır. Her özyinelemeli adım 2 ile biter (son 2 bitin ilmekleri ve 4'e bölünür). Son rakam üssü 4 olan sadece son iki biti gösteren 3 (0b11) ile bitmasked sonucunu verir.

İşlev çağrısı, printfgrubu printfve işlev çağrısını gruplamak için {} (+2 bayt) kullanmanıza gerek kalmaması için izleyen bir argüman olarak (yazdırılmaz, ancak değerlendirilir) eklenir .

Buradaki çözüm bu 4 temel kodunu genişletiyor. İlk olarak, m, n olarak tanımlanır, ancak 4 tabanında, kendisine önceden hazırlanmış ve eklenmiş 10 olacak şekildedir. Daha sonra m basarız.

4 tabanını düzenli olarak basarken, rakamı elde etmek için 3 bit maskesi kullandık. Posta kodunda, en üstteki satır, basamaktaki düşük sıralı bittir (1'lik bir bit maskesi) ve alt sıra, yüksek sıradaki bittir (2'lik bir bit maskesi). Buna göre, riçinde f(n,r)bir bit maskesi var - ana fonksiyonumuz f(m,1)ilk satırı ve f(m,2)son satırı çağırıyor .

Orta çizginin çalışması için (her zaman "|" yazdırın), ||!rkoşullu ekleriz - r 0 ise, her zaman doğru olarak değerlendirilir ve bir "|" yazdırır. Sonra f(m,0)orta çizgiyi ararız .

Sonunda, yeni çizgilerin davranmasını istiyoruz. printfKaynak kodu baytlarına kadar bir ekstra eklemek de pahalıdır, bu yüzden biz var olana başka bir% c belirteci ekleriz printf. n?32:10n 0 (yanlış) ise yeni bir satır, aksi takdirde bir boşluk yazar. Baytları kaydetmek için '\ n' ve '' yerine 32 ve 10 kullanılır.


1
Uyarıları sakıncası yoksa, 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);}
146'ya indirebilirsiniz

1

Ortak Lisp, 191 bayt

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

Çevrimiçi deneyin!


1

PHP, 99 + 1 bayt

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

"[$c*3+$y];

değişmez dizge indeksleme için PHP> = 5.5 ve indekslemenin bir uyarı vermemesi için <7.1 gerektirir.

Pipe ile çalıştırın -nRveya çevrimiçi deneyin .

Sonunu bulmak için bir tane daha yeni satır ekleyin


Uyarı: 7 satırındaki [...] [...] satırında karşılaşılan sayısal olmayan bir değer
RedClover

@Soaku PHP sürümü 5.5 ila 7.0 olmalıdır
Titus,

1

Python 2, 142 126 bayt

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 için büyük teşekkürler!

Diğer cevapların yöntemlerini kopyalamamaya çalıştım ve ... evet.



1

C # (.NET Core) , 160 bayt

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

Çevrimiçi deneyin!

Eminim bazı gelişmeleri kaçırdım.

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 karakterin '3' olmadığını, ikinci satırın olmadığını ve ardından ilk veya üçüncü satırın boşluk içermesi gerekip gerekmediğini görmek için bazı ikili sihirbaz olup olmadığını kontrol eder.


1

Zsh , 156 154 151 133 bayt

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

Çevrimiçi deneyin!

Var-baz 10 girişini alır $x




0

C, 120 bayt

Ne yazık ki, yalnızca Windows üzerinde çalışıyor, çünkü itoastandart olamayacak kadar kolay.

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);}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.